ZGlmZiAtLWdpdCBhLy5iYXplbHJjIGIvLmJhemVscmMKaW5kZXggZTI0YmU4OC4uOGMzMjY2MSAxMDA2NDQKLS0tIGEvLmJhemVscmMKKysrIGIvLmJhemVscmMKQEAgLTMsOCArMywzMyBAQAogYnVpbGQgLS1leHBlcmltZW50YWxfc3RyaWN0X2FjdGlvbl9lbnYKIGJ1aWxkIC0tYWN0aW9uX2Vudj1QQVRICiBidWlsZCAtLWRpc2tfY2FjaGU9fi8uZ2Vycml0Y29kZXJldmlldy9iYXplbC1jYWNoZS9jYXMKLWJ1aWxkIC0tamF2YV90b29sY2hhaW4gLy90b29sczplcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW4KKworIyBCdWlsZHMgdXNpbmcgcmVtb3RlX2pkazExLCBleGVjdXRlcyB1c2luZyByZW1vdGVfamRrMTEgb3IgbG9jYWxfamRrCitidWlsZCAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQgLS1qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKK2J1aWxkIC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTEKK2J1aWxkIC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKKworIyBCdWlsZHMgYW5kIGV4ZWN1dGVzIG9uIFJCRSB1c2luZyByZW1vdGVqZGtfMTEKK2J1aWxkOnJlbW90ZSAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQ6cmVtb3RlIC0tamF2YV9ydW50aW1lX3ZlcnNpb249cmVtb3RlamRrXzExCitidWlsZDpyZW1vdGUgLS10b29sX2phdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQ6cmVtb3RlIC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKKworIyBCdWlsZHMgdXNpbmcgcmVtb3RlX2pkazE3LCBleGVjdXRlcyB1c2luZyByZW1vdGVfamRrMTEgb3IgbG9jYWxfamRrCitidWlsZDpqYXZhMTcgLS1qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOmphdmExNyAtLWphdmFfcnVudGltZV92ZXJzaW9uPXJlbW90ZWpka18xNworYnVpbGQ6amF2YTE3IC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOmphdmExNyAtLXRvb2xfamF2YV9ydW50aW1lX3ZlcnNpb249cmVtb3RlamRrXzE3CisKKyMgQnVpbGRzIGFuZCBleGVjdXRlcyBvbiBSQkUgdXNpbmcgcmVtb3RlamRrXzE3CitidWlsZDpyZW1vdGUxNyAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xNworYnVpbGQ6cmVtb3RlMTcgLS1qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTcKK2J1aWxkOnJlbW90ZTE3IC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOnJlbW90ZTE3IC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTcKIAogdGVzdCAtLWJ1aWxkX3Rlc3RzX29ubHkKIHRlc3QgLS10ZXN0X291dHB1dD1lcnJvcnMKIAoraW1wb3J0ICV3b3Jrc3BhY2UlL3Rvb2xzL3JlbW90ZS1iYXplbHJjCisKZGlmZiAtLWdpdCBhLy5iYXplbHZlcnNpb24gYi8uYmF6ZWx2ZXJzaW9uCmluZGV4IGZjZGIyZTEuLjAwNjJhYzkgMTAwNjQ0Ci0tLSBhLy5iYXplbHZlcnNpb24KKysrIGIvLmJhemVsdmVyc2lvbgpAQCAtMSArMSBAQAotNC4wLjAKKzUuMC4wCmRpZmYgLS1naXQgYS8ubWFpbG1hcCBiLy5tYWlsbWFwCmluZGV4IGYwYmM5OTAuLmYwYWY0OWIgMTAwNjQ0Ci0tLSBhLy5tYWlsbWFwCisrKyBiLy5tYWlsbWFwCkBAIC0xMiw2ICsxMiw3IEBACiBTYcWhYSDFvWl2a292IDxzYXNhLnppdmtvdkBzYXAuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhc2EgWml2a292IDxzYXNhLnppdmtvdkBzYXAuY29tPgogU2HFoWEgxb1pdmtvdiA8c2FzYS56aXZrb3ZAc2FwLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICBTYcWhYSDFvWl2a292IDx6aXZrb3ZAZ21haWwuY29tPgogU2HFoWEgxb1pdmtvdiA8c2FzYS56aXZrb3ZAc2FwLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICBTYXNhIFppdmtvdiA8eml2a292QGdtYWlsLmNvbT4KK1NlYmFzdGlhbiBTY2h1YmVydGggPHNzY2h1YmVydGhAZ21haWwuY29tPiAgICAgICAgICAgICAgICAgIFNlYmFzdGlhbiBTY2h1YmVydGggPHNlYmFzdGlhbi5zY2h1YmVydGhAYm9zY2guaW8+CiBTaGF3biBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+ICAgICAgICAgICAgICAgICAgICAgICAgICBTaGF3biBPLiBQZWFyY2UgPHNvcEBnb29nbGUuY29tPgogU2hhd24gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhd24gUGVhcmNlIDxzb3BAZ29vZ2xlLmNvbT4KIFNoYXduIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4KZGlmZiAtLWdpdCBhL0RFUEVOREVOQ0lFUyBiL0RFUEVOREVOQ0lFUwppbmRleCBlYmJlNDgwLi5iZTdhYjE3IDEwMDY0NAotLS0gYS9ERVBFTkRFTkNJRVMKKysrIGIvREVQRU5ERU5DSUVTCkBAIC0xLDY5ICsxLDcwIEBACiBtYXZlbi9tYXZlbmNlbnRyYWwvYXJnczRqL2FyZ3M0ai8yLjMzLCBNSVQsIGFwcHJvdmVkLCBDUTExMDY4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvY29tLmdvb2dsZS5jb2RlLmdzb24vZ3Nvbi8yLjguNywgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0OTYKLW1hdmVuL21hdmVuY2VudHJhbC9jb20uZ29vZ2xlY29kZS5qYXZhZXdhaC9KYXZhRVdBSC8xLjEuMTIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTExNjU4CittYXZlbi9tYXZlbmNlbnRyYWwvY29tLmdvb2dsZS5jb2RlLmdzb24vZ3Nvbi8yLjguOSwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0OTYKK21hdmVuL21hdmVuY2VudHJhbC9jb20uZ29vZ2xlY29kZS5qYXZhZXdhaC9KYXZhRVdBSC8xLjEuMTMsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTExNjU4CiBtYXZlbi9tYXZlbmNlbnRyYWwvY29tLmpjcmFmdC9qc2NoLzAuMS41NSwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgQ1ExOTQzNQotbWF2ZW4vbWF2ZW5jZW50cmFsL2NvbS5qY3JhZnQvanpsaWIvMS4xLjEsIEJTRC0yLUNsYXVzZSwgYXBwcm92ZWQsIENRNjIxOAorbWF2ZW4vbWF2ZW5jZW50cmFsL2NvbS5qY3JhZnQvanpsaWIvMS4xLjMsIEJTRC0yLUNsYXVzZSwgYXBwcm92ZWQsIENRNjIxOAogbWF2ZW4vbWF2ZW5jZW50cmFsL2NvbW1vbnMtY29kZWMvY29tbW9ucy1jb2RlYy8xLjExLCBBcGFjaGUtMi4wIEFORCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCBDUTE1OTcxCiBtYXZlbi9tYXZlbmNlbnRyYWwvY29tbW9ucy1sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy8xLjIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTEwMTYyCi1tYXZlbi9tYXZlbmNlbnRyYWwvamF2YXguc2VydmxldC9qYXZheC5zZXJ2bGV0LWFwaS8zLjEuMCwgQXBhY2hlLTIuMCBBTkQgKENEREwtMS4xIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCksIGFwcHJvdmVkLCBDUTcyNDgKLW1hdmVuL21hdmVuY2VudHJhbC9qdW5pdC9qdW5pdC80LjEzLCAsIGFwcHJvdmVkLCBDUTIyNzk2Ci1tYXZlbi9tYXZlbmNlbnRyYWwvbG9nNGovbG9nNGovMS4yLjE1LCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1E3ODM3CittYXZlbi9tYXZlbmNlbnRyYWwvamF2YXguc2VydmxldC9qYXZheC5zZXJ2bGV0LWFwaS80LjAuMCwgKENEREwtMS4xIE9SIEdQTC0yLjAtb25seSBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wKSBBTkQgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMTYxMjUKK21hdmVuL21hdmVuY2VudHJhbC9qdW5pdC9qdW5pdC80LjEzLjIsIEVQTC0yLjAsIGFwcHJvdmVkLCBDUTIzNjM2CiBtYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmJ5dGVidWRkeS9ieXRlLWJ1ZGR5LWFnZW50LzEuOS4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgY2xlYXJseWRlZmluZWQKIG1hdmVuL21hdmVuY2VudHJhbC9uZXQuYnl0ZWJ1ZGR5L2J5dGUtYnVkZHkvMS45LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAogbWF2ZW4vbWF2ZW5jZW50cmFsL25ldC5pMnAuY3J5cHRvL2VkZHNhLzAuMy4wLCBDQzAtMS4wLCBhcHByb3ZlZCwgQ1EyMjUzNworbWF2ZW4vbWF2ZW5jZW50cmFsL25ldC5qYXZhLmRldi5qbmEvam5hLXBsYXRmb3JtLzUuOC4wLCBBcGFjaGUtMi4wIE9SIExHUEwtMi4xLW9yLWxhdGVyLCBhcHByb3ZlZCwgQ1EyMzIxOAorbWF2ZW4vbWF2ZW5jZW50cmFsL25ldC5qYXZhLmRldi5qbmEvam5hLzUuOC4wLCBBcGFjaGUtMi4wIE9SIExHUEwtMi4xLW9yLWxhdGVyLCBhcHByb3ZlZCwgQ1EyMzIxNwogbWF2ZW4vbWF2ZW5jZW50cmFsL25ldC5zZi5qb3B0LXNpbXBsZS9qb3B0LXNpbXBsZS80LjYsIE1JVCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5hbnQvYW50LWxhdW5jaGVyLzEuMTAuMTAsIEFwYWNoZS0yLjAgQU5EIFczQyBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1ExNTU2MAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuYW50L2FudC8xLjEwLjEwLCBBcGFjaGUtMi4wIEFORCBXM0MgQU5EIExpY2Vuc2VSZWYtUHVibGljLURvbWFpbiwgYXBwcm92ZWQsIENRMTU1NjAKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmNvbW1vbnMvY29tbW9ucy1jb21wcmVzcy8xLjIwLCBBcGFjaGUtMi4wIEFORCBCU0QtMy1DbGF1c2UgQU5EIExpY2Vuc2VSZWYtUHVibGljLURvbWFpbiwgYXBwcm92ZWQsIENRMjE3NzEKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmFudC9hbnQtbGF1bmNoZXIvMS4xMC4xMiwgQXBhY2hlLTIuMCBBTkQgVzNDIEFORCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTE1NTYwCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5hbnQvYW50LzEuMTAuMTIsIEFwYWNoZS0yLjAgQU5EIFczQyBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1ExNTU2MAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuY29tbW9ucy9jb21tb25zLWNvbXByZXNzLzEuMjEsIEFwYWNoZS0yLjAgQU5EIEJTRC0zLUNsYXVzZSBBTkQgYnppcDItMS4wLjYgQU5EIExpY2Vuc2VSZWYtUHVibGljLURvbWFpbiwgYXBwcm92ZWQsIENRMjM3MTAKIG1hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmNvbW1vbnMvY29tbW9ucy1tYXRoMy8zLjIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMvaHR0cGNsaWVudC80LjUuMTMsIEFwYWNoZS0yLjAgQU5EIExpY2Vuc2VSZWYtUHVibGljLURvbWFpbiwgYXBwcm92ZWQsIENRMjM1MjcKIG1hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzL2h0dHBjb3JlLzQuNC4xNCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM1MjgKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLnNzaGQvc3NoZC1jb21tb24vMi43LjAsIEFwYWNoZS0yLjAgYW5kIElTQywgYXBwcm92ZWQsIENRMjM0NjkKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLnNzaGQvc3NoZC1jb3JlLzIuNy4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzQ2OQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLW9zZ2kvMi43LjAsIEFwYWNoZS0yLjAgYW5kIElTQywgYXBwcm92ZWQsIENRMjM0NjkKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLnNzaGQvc3NoZC1zZnRwLzIuNy4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzQ3MAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLWNvbW1vbi8yLjguMCwgQXBhY2hlLTIuMCBBTkQgSVNDLCBhcHByb3ZlZCwgIzIzNDkKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLnNzaGQvc3NoZC1jb3JlLzIuOC4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgIzIzMzEKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLnNzaGQvc3NoZC1vc2dpLzIuOC4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzg5MgorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLXNmdHAvMi44LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTIzODkzCiBtYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFzc2VydGovYXNzZXJ0ai1jb3JlLzMuMjAuMiwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmJvdW5jeWNhc3RsZS9iY3BnLWpkazE1b24vMS42OSwgTUlUIGFuZCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzQ3MgotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmNwa2l4LWpkazE1b24vMS42OSwgTUlULCBhcHByb3ZlZCwgQ1EyMzQ3MwotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmNwcm92LWpkazE1b24vMS42OSwgTUlULCBhcHByb3ZlZCwgQ1EyMzQ3MQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmN1dGlsLWpkazE1b24vMS42OSwgTUlULCBhcHByb3ZlZCwgQ1EyMzQ3NAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LWh0dHAvOS40LjQzLnYyMDIxMDYyOSwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LWlvLzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1zZWN1cml0eS85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktc2VydmVyLzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1zZXJ2bGV0LzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS11dGlsLWFqYXgvOS40LjQzLnYyMDIxMDYyOSwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXV0aWwvOS40LjQzLnYyMDIxMDYyOSwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuYW50LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5wZ20vNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnVpLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuaGFtY3Jlc3QvaGFtY3Jlc3QtY29yZS8xLjMsIEJTRC0yLUNsYXVzZSwgYXBwcm92ZWQsIENRNzA2MwotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5oYW1jcmVzdC9oYW1jcmVzdC8yLjIsIEJTRC0yLUNsYXVzZSwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm1vY2tpdG8vbW9ja2l0by1jb3JlLzIuMjMuMCwgTUlULCBhcHByb3ZlZCwgQ1ExNzk3NgorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmNwZy1qZGsxNW9uLzEuNzAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCAjMTcxMworbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmNwa2l4LWpkazE1b24vMS43MCwgTUlULCBhcHByb3ZlZCwgY2xlYXJseWRlZmluZWQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcHJvdi1qZGsxNW9uLzEuNzAsIE1JVCwgYXBwcm92ZWQsICMxNzEyCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmJvdW5jeWNhc3RsZS9iY3V0aWwtamRrMTVvbi8xLjcwLCBNSVQsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5LnRvb2xjaGFpbi9qZXR0eS1zZXJ2bGV0LWFwaS80LjAuNiwgRVBMLTIuMCBPUiBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgcnQuamV0dHkKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1odHRwLzEwLjAuNiwgRVBMLTIuMCBPUiBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgcnQuamV0dHkKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1pby8xMC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktc2VjdXJpdHkvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlcnZlci8xMC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktc2VydmxldC8xMC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktdXRpbC8xMC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0LzYuMi4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuYW50LzYuMi4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS82LjIuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy82LjIuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLzYuMi4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwLzYuMi4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoLzYuMi4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLzYuMi4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC82LjIuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnBnbS82LjIuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLzYuMi4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC50ZXN0LzYuMi4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQudWkvNi4yLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC82LjIuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmhhbWNyZXN0L2hhbWNyZXN0LWNvcmUvMS4zLCBCU0QtMi1DbGF1c2UsIGFwcHJvdmVkLCBDUTExNDI5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm1vY2tpdG8vbW9ja2l0by1jb3JlLzIuMjMuMCwgQXBhY2hlLTIuMCBBTkQgTUlULCBhcHByb3ZlZCwgIzk1OAogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5vYmplbmVzaXMvb2JqZW5lc2lzLzIuNiwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMTU0NzgKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcub3Blbmpkay5qbWgvam1oLWNvcmUvMS4zMiwgR1BMLTIuMCwgYXBwcm92ZWQsIENRMjM0OTkKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcub3Blbmpkay5qbWgvam1oLWdlbmVyYXRvci1hbm5wcm9jZXNzLzEuMzIsIEdQTC0yLjAsIGFwcHJvdmVkLCBDUTIzNTAwCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9zZ2kvb3JnLm9zZ2kuY29yZS80LjMuMSwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMTAxMTEKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuc2xmNGovamNsLW92ZXItc2xmNGovMS43LjMwLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1ExMjg0MworbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5vcGVuamRrLmptaC9qbWgtY29yZS8xLjMyLCBHUEwtMi4wLW9ubHkgd2l0aCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCwgYXBwcm92ZWQsICM5NTkKK21hdmVuL21hdmVuY2VudHJhbC9vcmcub3Blbmpkay5qbWgvam1oLWdlbmVyYXRvci1hbm5wcm9jZXNzLzEuMzIsIEdQTC0yLjAtb25seSB3aXRoIENsYXNzcGF0aC1leGNlcHRpb24tMi4wLCBhcHByb3ZlZCwgIzk2MgorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5vc2dpL29yZy5vc2dpLmNvcmUvNi4wLjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCAjMTc5NAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5zbGY0ai9qY2wtb3Zlci1zbGY0ai8xLjcuMzIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTEyODQzCiBtYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnNsZjRqL3NsZjRqLWFwaS8xLjcuMzAsIE1JVCwgYXBwcm92ZWQsIENRMTMzNjgKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuc2xmNGovc2xmNGotbG9nNGoxMi8xLjcuMzAsIE1JVCwgYXBwcm92ZWQsIENRNzY2NQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5zbGY0ai9zbGY0ai1zaW1wbGUvMS43LjMwLCBNSVQsIGFwcHJvdmVkLCBDUTc5NTIKIG1hdmVuL21hdmVuY2VudHJhbC9vcmcudHVrYWFuaS94ei8xLjksIExpY2Vuc2VSZWYtUHVibGljLURvbWFpbiwgYXBwcm92ZWQsIENRMjM0OTgKZGlmZiAtLWdpdCBhL1dPUktTUEFDRSBiL1dPUktTUEFDRQppbmRleCBmNzhhMTU5Li5jY2UxMzE2IDEwMDY0NAotLS0gYS9XT1JLU1BBQ0UKKysrIGIvV09SS1NQQUNFCkBAIC0xLDIzICsxLDYgQEAKIHdvcmtzcGFjZShuYW1lID0gImpnaXQiKQogCiBsb2FkKCJAYmF6ZWxfdG9vbHMvL3Rvb2xzL2J1aWxkX2RlZnMvcmVwbzpodHRwLmJ6bCIsICJodHRwX2FyY2hpdmUiKQotCi1odHRwX2FyY2hpdmUoCi0gICAgbmFtZSA9ICJiYXplbF9za3lsaWIiLAotICAgIHNoYTI1NiA9ICIyZWE4YTVlZDJiNDQ4YmFmNGE2ODU1ZDNjZTA0OWM0YzQ1MmE2NDcwYjFlZmQxNTA0ZmRiN2MxYzEzNGQyMjBhIiwKLSAgICBzdHJpcF9wcmVmaXggPSAiYmF6ZWwtc2t5bGliLTAuOC4wIiwKLSAgICB1cmxzID0gWyJodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC1za3lsaWIvYXJjaGl2ZS8wLjguMC50YXIuZ3oiXSwKLSkKLQotIyBDaGVjayBCYXplbCB2ZXJzaW9uIHdoZW4gaW52b2tlZCBieSBCYXplbCBkaXJlY3RseQotbG9hZCgiLy90b29sczpiYXplbGlza192ZXJzaW9uLmJ6bCIsICJiYXplbGlza192ZXJzaW9uIikKLQotYmF6ZWxpc2tfdmVyc2lvbihuYW1lID0gImJhemVsaXNrX3ZlcnNpb24iKQotCi1sb2FkKCJAYmF6ZWxpc2tfdmVyc2lvbi8vOmNoZWNrLmJ6bCIsICJjaGVja19iYXplbF92ZXJzaW9uIikKLQotY2hlY2tfYmF6ZWxfdmVyc2lvbigpCi0KIGxvYWQoIi8vdG9vbHM6YmF6bGV0cy5iemwiLCAibG9hZF9iYXpsZXRzIikKIAogbG9hZF9iYXpsZXRzKGNvbW1pdCA9ICJmMzBhOTkyZGE5ZmM4NTVkY2U4MTk4NzVhZmI1OWY5ZGQ2Zjg2MGNkIikKQEAgLTI4LDMyICsxMSwxOCBAQAogKQogCiBodHRwX2FyY2hpdmUoCi0gICAgbmFtZSA9ICJvcGVuamRrMTVfbGludXhfYXJjaGl2ZSIsCi0gICAgYnVpbGRfZmlsZV9jb250ZW50ID0gIiIiCi1qYXZhX3J1bnRpbWUobmFtZSA9ICdydW50aW1lJywgc3JjcyA9ICBnbG9iKFsnKionXSksIHZpc2liaWxpdHkgPSBbJy8vdmlzaWJpbGl0eTpwdWJsaWMnXSkKLWV4cG9ydHNfZmlsZXMoWyJXT1JLU1BBQ0UiXSwgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdKQotIiIiLAotICAgIHNoYTI1NiA9ICIwYTM4ZjExMzhjMTVhNGYyNDNiNzVlYjgyZjhlZjQwODU1YWZjYzQwMmUzYzJhNmRlOTdjZTgyMzUwMTFiMWFkIiwKLSAgICBzdHJpcF9wcmVmaXggPSAienVsdTE1LjI3LjE3LWNhLWpkazE1LjAuMC1saW51eF94NjQiLAorICAgIG5hbWUgPSAicmJlX2pkazExIiwKKyAgICBzaGEyNTYgPSAiNzY2Nzk2ZGU3MTkxNjExOGU1MjhiOWY0MzM0YzI5YzljOWI0ZTkyNjIyN2JmMzI2NGRlZTU1NWU2YTQzMDZjOCIsCisgICAgc3RyaXBfcHJlZml4ID0gInJiZV9hdXRvY29uZmlnLTIuMC4wIiwKICAgICB1cmxzID0gWwotICAgICAgICAiaHR0cHM6Ly9taXJyb3IuYmF6ZWwuYnVpbGQvY2RuLmF6dWwuY29tL3p1bHUvYmluL3p1bHUxNS4yNy4xNy1jYS1qZGsxNS4wLjAtbGludXhfeDY0LnRhci5neiIsCi0gICAgICAgICJodHRwczovL2Nkbi5henVsLmNvbS96dWx1L2Jpbi96dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLWxpbnV4X3g2NC50YXIuZ3oiLAorICAgICAgICAiaHR0cHM6Ly9nZXJyaXQtYmF6ZWwuc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9yYmVfYXV0b2NvbmZpZy92Mi4wLjAudGFyLmd6IiwKKyAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZG8vcmJlX2F1dG9jb25maWcvYXJjaGl2ZS92Mi4wLjAudGFyLmd6IiwKICAgICBdLAogKQogCi1odHRwX2FyY2hpdmUoCi0gICAgbmFtZSA9ICJvcGVuamRrMTVfZGFyd2luX2FyY2hpdmUiLAotICAgIGJ1aWxkX2ZpbGVfY29udGVudCA9ICIiIgotamF2YV9ydW50aW1lKG5hbWUgPSAncnVudGltZScsIHNyY3MgPSAgZ2xvYihbJyoqJ10pLCB2aXNpYmlsaXR5ID0gWycvL3Zpc2liaWxpdHk6cHVibGljJ10pCi1leHBvcnRzX2ZpbGVzKFsiV09SS1NQQUNFIl0sIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKLSIiIiwKLSAgICBzaGEyNTYgPSAiZjgwYjJlMDUxMmQ5ZDhhOTJiZTI0NDk3MzM0Yzk3NGJmZWNjOGM4OThmYzIxNWNlMGU3NjU5NGYwMDQzNzQ4MiIsCi0gICAgc3RyaXBfcHJlZml4ID0gInp1bHUxNS4yNy4xNy1jYS1qZGsxNS4wLjAtbWFjb3N4X3g2NCIsCi0gICAgdXJscyA9IFsKLSAgICAgICAgImh0dHBzOi8vbWlycm9yLmJhemVsLmJ1aWxkL2Nkbi5henVsLmNvbS96dWx1L2Jpbi96dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLW1hY29zeF94NjQudGFyLmd6IiwKLSAgICAgICAgImh0dHBzOi8vY2RuLmF6dWwuY29tL3p1bHUvYmluL3p1bHUxNS4yNy4xNy1jYS1qZGsxNS4wLjAtbWFjb3N4X3g2NC50YXIuZ3oiLAotICAgIF0sCi0pCityZWdpc3Rlcl90b29sY2hhaW5zKCIvL3Rvb2xzOmVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTFfZGVmaW5pdGlvbiIpCisKK3JlZ2lzdGVyX3Rvb2xjaGFpbnMoIi8vdG9vbHM6ZXJyb3JfcHJvbmVfd2FybmluZ3NfdG9vbGNoYWluX2phdmExN19kZWZpbml0aW9uIikKIAogSk1IX1ZFUlMgPSAiMS4zMiIKIApAQCAtOTksOCArNjgsOCBAQAogCiBtYXZlbl9qYXIoCiAgICAgbmFtZSA9ICJqemxpYiIsCi0gICAgYXJ0aWZhY3QgPSAiY29tLmpjcmFmdDpqemxpYjoxLjEuMSIsCi0gICAgc2hhMSA9ICJhMTU1MTM3MzMxNWZmYzJmOTYxMzBhMGU1NzA0Zjc0ZTE1MTc3N2JhIiwKKyAgICBhcnRpZmFjdCA9ICJjb20uamNyYWZ0Omp6bGliOjEuMS4zIiwKKyAgICBzaGExID0gImMwMTQyOGVmYTcxNzYyNGY3YWFiZjRkZjMxOTkzOWRkYTk2NDZiMmQiLAogKQogCiBtYXZlbl9qYXIoCkBAIC0xMjMsMTQgKzkyLDE0IEBACiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gInNzaGQtb3NnaSIsCi0gICAgYXJ0aWZhY3QgPSAib3JnLmFwYWNoZS5zc2hkOnNzaGQtb3NnaToyLjcuMCIsCi0gICAgc2hhMSA9ICJhMTAxYWFkMGY3OWFkNDI0NDk4MDk4ZjdlOTFjMzlkM2Q5MjE3N2MxIiwKKyAgICBhcnRpZmFjdCA9ICJvcmcuYXBhY2hlLnNzaGQ6c3NoZC1vc2dpOjIuOC4wIiwKKyAgICBzaGExID0gImIyYTU5YjczYzA0NWY0MGQ1NzIyYjkxNjBkNGY5MDlhNjQ2ZDg2YzkiLAogKQogCiBtYXZlbl9qYXIoCiAgICAgbmFtZSA9ICJzc2hkLXNmdHAiLAotICAgIGFydGlmYWN0ID0gIm9yZy5hcGFjaGUuc3NoZDpzc2hkLXNmdHA6Mi43LjAiLAotICAgIHNoYTEgPSAiMGM5ZWZmNzE0NWUyMGIzMzhjMWRkNmFjYTM2YmE5M2VkN2MwMTQ3YyIsCisgICAgYXJ0aWZhY3QgPSAib3JnLmFwYWNoZS5zc2hkOnNzaGQtc2Z0cDoyLjguMCIsCisgICAgc2hhMSA9ICJkM2NkOWJjOGQzMzViM2VkMWE4NmQyOTY1ZGViNGQyMDJkZTI3NDQyIiwKICkKIAogbWF2ZW5famFyKApAQCAtMTcxLDggKzE0MCw4IEBACiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gInNlcnZsZXQtYXBpIiwKLSAgICBhcnRpZmFjdCA9ICJqYXZheC5zZXJ2bGV0OmphdmF4LnNlcnZsZXQtYXBpOjMuMS4wIiwKLSAgICBzaGExID0gIjNjZDYzZDA3NTQ5Nzc1MTc4NGIyZmE4NGJlNTk0MzJmNDkwNWJmN2MiLAorICAgIGFydGlmYWN0ID0gImphdmF4LnNlcnZsZXQ6amF2YXguc2VydmxldC1hcGk6NC4wLjAiLAorICAgIHNoYTEgPSAiNjAyMDBhZmZjMmZlMDE2NTEzNmVkMzY5MGZhZjAwYjY2YWVkNTgxYSIsCiApCiAKIG1hdmVuX2phcigKQEAgLTIzOSw4ICsyMDgsOCBAQAogCiBtYXZlbl9qYXIoCiAgICAgbmFtZSA9ICJnc29uIiwKLSAgICBhcnRpZmFjdCA9ICJjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuOC44IiwKLSAgICBzaGExID0gIjQzMWZjM2NiYzBmZjgxYWJkYmZkZTA3MDA2Mjc0MTA4OWMzYmE4NzQiLAorICAgIGFydGlmYWN0ID0gImNvbS5nb29nbGUuY29kZS5nc29uOmdzb246Mi44LjkiLAorICAgIHNoYTEgPSAiOGE0MzJjMWQ2ODI1NzgxZTIxYTAyZGIyZTJjMzNjNWZkZTI4MzNiOSIsCiApCiAKIEpFVFRZX1ZFUiA9ICIxMC4wLjYiCkBAIC0yOTQsMzIgKzI2MywzMiBAQAogICAgIHNyY19zaGExID0gImYzNWY1NTI1YTVkMzBkYzEyMzdiODU0NTdkNzU4ZDU3OGUzY2U4ZDAiLAogKQogCi1CT1VOQ1lDQVNUTEVfVkVSID0gIjEuNjkiCitCT1VOQ1lDQVNUTEVfVkVSID0gIjEuNzAiCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjcGciLAogICAgIGFydGlmYWN0ID0gIm9yZy5ib3VuY3ljYXN0bGU6YmNwZy1qZGsxNW9uOiIgKyBCT1VOQ1lDQVNUTEVfVkVSLAotICAgIHNoYTEgPSAiZDk5YTA4YzNmNjUxYjI2ZThlYjY2OGU5NDFiMGJiZDJjMDllY2UwOCIsCi0gICAgc3JjX3NoYTEgPSAiZGUxZmMyNjFiNDRhOGViNjA1ODM0MTNhMzFmZmM5OGNlM2RjZTM4YiIsCisgICAgc2hhMSA9ICIwNjJmNzJlYzA2ZjMxYTZjMzFhM2YzMzU1ZmNlMDM4NGIyMTEyNmQ3IiwKKyAgICBzcmNfc2hhMSA9ICI5ZGVlNzNhZDkyNjc1MmVlM2I0MjFhN2RjNDUzMTI4NzE2NmNjZjM2IiwKICkKIAogbWF2ZW5famFyKAogICAgIG5hbWUgPSAiYmNwcm92IiwKICAgICBhcnRpZmFjdCA9ICJvcmcuYm91bmN5Y2FzdGxlOmJjcHJvdi1qZGsxNW9uOiIgKyBCT1VOQ1lDQVNUTEVfVkVSLAotICAgIHNoYTEgPSAiOTFlMTYyODI1MWNmM2NhOTAwOTNjZTlkMGZlNjdlNWI3ZGFiMzg1MCIsCi0gICAgc3JjX3NoYTEgPSAiNjdkYzY0NzY4NDVmNmIyOWNiNTIwYjVkZjYxZGI2NWFlNTY3MThlNCIsCisgICAgc2hhMSA9ICI0NjM2YTBkMDFmNzRhY2FmMjgwODJmYjYyYjMxN2YxMDgwMTE4MzcxIiwKKyAgICBzcmNfc2hhMSA9ICI2MjQ1ZTE1ZGQ0N2U1ZmMzM2NmZjI3NWRmNjE2NjJlMGE4ZTU5NThmIiwKICkKIAogbWF2ZW5famFyKAogICAgIG5hbWUgPSAiYmN1dGlsIiwKICAgICBhcnRpZmFjdCA9ICJvcmcuYm91bmN5Y2FzdGxlOmJjdXRpbC1qZGsxNW9uOiIgKyBCT1VOQ1lDQVNUTEVfVkVSLAotICAgIHNoYTEgPSAiYzNlZGY5M2QzNDZlOTdmNjRmMDQxZTQ0OGU3NDU1YzM5YzdlZmY2NCIsCi0gICAgc3JjX3NoYTEgPSAiZGVlYjNmYmJmMzczZTA1ZTJhMjA5NDFmOWE4Y2U5MGU5YWVhYjNkMiIsCisgICAgc2hhMSA9ICI1NDI4MGU3MTk1YTc0MzBkNzkxMWRlZDkzZmMwMWUwNzMwMGI5NTI2IiwKKyAgICBzcmNfc2hhMSA9ICI0YWY0YTZjOTJiOGVhMDc4ODViMjdkODUzNmI4MWI4NTU0OTdmNGViIiwKICkKIAogbWF2ZW5famFyKAogICAgIG5hbWUgPSAiYmNwa2l4IiwKICAgICBhcnRpZmFjdCA9ICJvcmcuYm91bmN5Y2FzdGxlOmJjcGtpeC1qZGsxNW9uOiIgKyBCT1VOQ1lDQVNUTEVfVkVSLAotICAgIHNoYTEgPSAiNDVjMzZmYjcyZmFmYjBiNjg4YzZhZjc5NWU2Y2M4MDNmNmY3OWVlNSIsCi0gICAgc3JjX3NoYTEgPSAiOGJjNTIxNDQwMTQ1OWJkOTFlZWE4MTZiNTE2MDc5ZGEzODM3NGU5MCIsCisgICAgc2hhMSA9ICJmODFlNWFmNDk1NzFhOWQ1YTEwOWE4OGYyMzlhNzNjZTg3MDU1NDE3IiwKKyAgICBzcmNfc2hhMSA9ICI0MmY5ZGU1M2E5MWIyMGJjMDZlODg0ODJjNTdmZDk3ZTVhODQyNTBkIiwKICkKZGlmZiAtLWdpdCBhL2xpYi9CVUlMRCBiL2xpYi9CVUlMRAppbmRleCAwMGM5MWUzLi42YmU5ZTU3IDEwMDY0NAotLS0gYS9saWIvQlVJTEQKKysrIGIvbGliL0JVSUxECkBAIC05Nyw3ICs5Nyw3IEBACiBqYXZhX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJqbmEiLAogICAgIHZpc2liaWxpdHkgPSBbCi0gICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ6X19wa2dfXyIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudDpfX3BrZ19fIiwKICAgICBdLAogICAgIGV4cG9ydHMgPSBbIkBqbmEvL2phciJdLAogKQpAQCAtMTA1LDcgKzEwNSw3IEBACiBqYXZhX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJqbmEtcGxhdGZvcm0iLAogICAgIHZpc2liaWxpdHkgPSBbCi0gICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ6X19wa2dfXyIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudDpfX3BrZ19fIiwKICAgICBdLAogICAgIGV4cG9ydHMgPSBbIkBqbmEtcGxhdGZvcm0vL2phciJdLAogKQpAQCAtMjc3LDcgKzI3Nyw2IEBACiAKIGphdmFfbGlicmFyeSgKICAgICBuYW1lID0gInNsZjRqLXNpbXBsZSIsCi0gICAgdGVzdG9ubHkgPSAxLAogICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKICAgICBleHBvcnRzID0gWyJAc2xmNGotc2ltcGxlLy9qYXIiXSwKICkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9wb20ueG1sCmluZGV4IGM1ZDkyZmMuLmFkYmVlNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvcG9tLnhtbApAQCAtMzgsNiArMzgsNyBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEwLjEyPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYmVuY2htYXJrcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9iZW5jaG1hcmtzL0dldFJlZnNCZW5jaG1hcmsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuYmVuY2htYXJrcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9iZW5jaG1hcmtzL0dldFJlZnNCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjYyN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2JlbmNobWFya3MvR2V0UmVmc0JlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBMdWNhIE1pbGFuZXNpbyA8bHVjYS5taWxhbmVzaW9AZ21haWwuY29tPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmJlbmNobWFya3M7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkluTWVtb3J5UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5GaWxlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkJlbmNobWFyazsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk91dHB1dFRpbWVVbml0OworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2NvcGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNldHVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuVGVhckRvd247CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLldhcm11cDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguaW5mcmEuQmxhY2tob2xlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIuUnVubmVyOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIuUnVubmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zQnVpbGRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5UeXBlLkNSRUFURTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZUNvbW1hbmQuVHlwZS5VUERBVEU7CisKK0BTdGF0ZShTY29wZS5UaHJlYWQpCitwdWJsaWMgY2xhc3MgR2V0UmVmc0JlbmNobWFyayB7CisKKwlUaHJlYWRMb2NhbFJhbmRvbSBicmFuY2hJbmRleCA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKTsKKworCUBTdGF0ZShTY29wZS5CZW5jaG1hcmspCisJcHVibGljIHN0YXRpYyBjbGFzcyBCZW5jaG1hcmtTdGF0ZSB7CisKKwkJQFBhcmFtKHsgInRydWUiLCAiZmFsc2UiIH0pCisJCWJvb2xlYW4gdXNlUmVmVGFibGU7CisKKwkJQFBhcmFtKHsgIjEwMCIsICIyNTAwIiwgIjEwMDAwIiwgIjUwMDAwIiB9KQorCQlpbnQgbnVtQnJhbmNoZXM7CisKKwkJQFBhcmFtKHsgInRydWUiLCAiZmFsc2UiIH0pCisJCWJvb2xlYW4gdHJ1c3RGb2xkZXJTdGF0OworCisJCUxpc3Q8U3RyaW5nPiBicmFuY2hlcyA9IG5ldyBBcnJheUxpc3Q8PihudW1CcmFuY2hlcyk7CisKKwkJUGF0aCB0ZXN0RGlyOworCisJCVJlcG9zaXRvcnkgcmVwbzsKKworCQlAU2V0dXAKKwkJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJCXB1YmxpYyB2b2lkIHNldHVwQmVuY2htYXJrKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24geworCQkJU3RyaW5nIGZpcnN0QnJhbmNoID0gImZpcnN0YnJhbmNoIjsKKwkJCXRlc3REaXIgPSBGaWxlcy5jcmVhdGVEaXJlY3RvcnkoUGF0aHMuZ2V0KCJ0ZXN0cmVwb3MiKSk7CisJCQlTdHJpbmcgcmVwb05hbWUgPSAiYnJhbmNoZXMtIiArIG51bUJyYW5jaGVzICsgIi10cnVzdEZvbGRlclN0YXQtIgorCQkJCQkrIHRydXN0Rm9sZGVyU3RhdCArICItIiArIHJlZkRhdGFiYXNlVHlwZSgpOworCQkJUGF0aCB3b3JrRGlyID0gdGVzdERpci5yZXNvbHZlKHJlcG9OYW1lKTsKKwkJCVBhdGggcmVwb1BhdGggPSB3b3JrRGlyLnJlc29sdmUoIi5naXQiKTsKKwkJCUdpdCBnaXQgPSBHaXQuaW5pdCgpLnNldERpcmVjdG9yeSh3b3JrRGlyLnRvRmlsZSgpKS5jYWxsKCk7CisJCQlSZXZDb21taXQgZmlyc3RDb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiRmlyc3QgY29tbWl0IikKKwkJCQkJLmNhbGwoKTsKKwkJCWdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKGZpcnN0QnJhbmNoKS5jYWxsKCk7CisKKwkJCVN0b3JlZENvbmZpZyBjZmcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJaWYgKHVzZVJlZlRhYmxlKSB7CisJCQkJKChGaWxlUmVwb3NpdG9yeSkgZ2l0LmdldFJlcG9zaXRvcnkoKSkuY29udmVydFJlZlN0b3JhZ2UoCisJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX1JFRl9TVE9SQUdFX1JFRlRBQkxFLCBmYWxzZSwKKwkJCQkJCWZhbHNlKTsKKwkJCX0gZWxzZSB7CisJCQkJY2ZnLnNldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVEZPTERFUlNUQVQsCisJCQkJCQl0cnVzdEZvbGRlclN0YXQpOworCQkJfQorCQkJY2ZnLnNldEludChDb25maWdDb25zdGFudHMuQ09ORklHX1JFQ0VJVkVfU0VDVElPTiwgbnVsbCwKKwkJCQkJIm1heENvbW1hbmRCeXRlcyIsIEludGVnZXIuTUFYX1ZBTFVFKTsKKwkJCWNmZy5zYXZlKCk7CisKKwkJCXJlcG8gPSBSZXBvc2l0b3J5Q2FjaGUub3BlbihSZXBvc2l0b3J5Q2FjaGUuRmlsZUtleQorCQkJCQkubGVuaWVudChyZXBvUGF0aC50b0ZpbGUoKSwgRlMuREVURUNURUQpKTsKKworCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmVwYXJpbmcgdGVzdCIpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCItIHJlcG9zaXRvcnk6IFx0XHQiICsgcmVwb1BhdGgpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCItIHJlZkRhdGFiYXNlOiBcdFx0IiArIHJlZkRhdGFiYXNlVHlwZSgpKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiLSB0cnVzdEZvbGRlclN0YXQ6IFx0IiArIHRydXN0Rm9sZGVyU3RhdCk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0gYnJhbmNoZXM6IFx0XHQiICsgbnVtQnJhbmNoZXMpOworCisJCQlCYXRjaFJlZlVwZGF0ZSB1ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLm5ld0JhdGNoVXBkYXRlKCk7CisKKwkJCWJyYW5jaGVzID0gSW50U3RyZWFtLnJhbmdlKDAsIG51bUJyYW5jaGVzKQorCQkJCQkubWFwVG9PYmooaSAtPiAiYnJhbmNoLyIgKyBpICUgMTAwICsgIi8iICsgaSkKKwkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQlmb3IgKFN0cmluZyBicmFuY2ggOiBicmFuY2hlcykgeworCQkJCXUuYWRkQ29tbWFuZChuZXcgUmVjZWl2ZUNvbW1hbmQoT2JqZWN0SWQuemVyb0lkKCksCisJCQkJCQlmaXJzdENvbW1pdC50b09iamVjdElkKCksIENvbnN0YW50cy5SX0hFQURTICsgYnJhbmNoLAorCQkJCQkJQ1JFQVRFKSk7CisJCQl9CisKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworCQkJU3lzdGVtLm91dC5wcmludCgKKwkJCQkJU3RyaW5nLmZvcm1hdCgiQ3JlYXRpbmcgJWQgYnJhbmNoZXMgLi4uICIsIG51bUJyYW5jaGVzKSk7CisKKwkJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7CisJCQkJdS5leGVjdXRlKHJ3LCBuZXcgVGV4dFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCX0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRE9ORSIpOworCQl9CisKKwkJcHJpdmF0ZSBTdHJpbmcgcmVmRGF0YWJhc2VUeXBlKCkgeworCQkJcmV0dXJuIHVzZVJlZlRhYmxlID8gInJlZnRhYmxlIiA6ICJyZWZkaXIiOworCQl9CisKKwkJQFRlYXJEb3duCisJCXB1YmxpYyB2b2lkIHRlYXJkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXJlcG8uY2xvc2UoKTsKKwkJCUZpbGVVdGlscy5kZWxldGUodGVzdERpci50b0ZpbGUoKSwKKwkJCQkJRmlsZVV0aWxzLlJFQ1VSU0lWRSB8IEZpbGVVdGlscy5SRVRSWSk7CisJCX0KKwl9CisKKwlAQmVuY2htYXJrCisJQEJlbmNobWFya01vZGUoeyBNb2RlLkF2ZXJhZ2VUaW1lIH0pCisJQE91dHB1dFRpbWVVbml0KFRpbWVVbml0Lk1JQ1JPU0VDT05EUykKKwlAV2FybXVwKGl0ZXJhdGlvbnMgPSAyLCB0aW1lID0gMTAwLCB0aW1lVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUykKKwlATWVhc3VyZW1lbnQoaXRlcmF0aW9ucyA9IDIsIHRpbWUgPSAxMCwgdGltZVVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTKQorCXB1YmxpYyB2b2lkIHRlc3RHZXRFeGFjdFJlZihCbGFja2hvbGUgYmxhY2tob2xlLCBCZW5jaG1hcmtTdGF0ZSBzdGF0ZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBicmFuY2hOYW1lID0gc3RhdGUuYnJhbmNoZXMKKwkJCQkuZ2V0KGJyYW5jaEluZGV4Lm5leHRJbnQoc3RhdGUubnVtQnJhbmNoZXMpKTsKKwkJYmxhY2tob2xlLmNvbnN1bWUoc3RhdGUucmVwby5leGFjdFJlZihicmFuY2hOYW1lKSk7CisJfQorCisJQEJlbmNobWFyaworCUBCZW5jaG1hcmtNb2RlKHsgTW9kZS5BdmVyYWdlVGltZSB9KQorCUBPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5NSUNST1NFQ09ORFMpCisJQFdhcm11cChpdGVyYXRpb25zID0gMiwgdGltZSA9IDEwMCwgdGltZVVuaXQgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCisJQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSAyLCB0aW1lID0gMTAsIHRpbWVVbml0ID0gVGltZVVuaXQuU0VDT05EUykKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVmc0J5UHJlZml4KEJsYWNraG9sZSBibGFja2hvbGUsIEJlbmNobWFya1N0YXRlIHN0YXRlKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGJyYW5jaFByZWZpeCA9ICJyZWZzL2hlYWRzL2JyYW5jaC8iICsgYnJhbmNoSW5kZXgubmV4dEludCgxMDApCisJCQkJKyAiLyI7CisJCWJsYWNraG9sZS5jb25zdW1lKAorCQkJCXN0YXRlLnJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgoYnJhbmNoUHJlZml4KSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFJ1bm5lckV4Y2VwdGlvbiB7CisJCU9wdGlvbnMgb3B0ID0gbmV3IE9wdGlvbnNCdWlsZGVyKCkKKwkJCQkuaW5jbHVkZShHZXRSZWZzQmVuY2htYXJrLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkKKwkJCQkvLyAuYWRkUHJvZmlsZXIoU3RhY2tQcm9maWxlci5jbGFzcykKKwkJCQkvLyAuYWRkUHJvZmlsZXIoR0NQcm9maWxlci5jbGFzcykKKwkJCQkuZm9ya3MoMSkuanZtQXJncygiLWVhIikuYnVpbGQoKTsKKwkJbmV3IFJ1bm5lcihvcHQpLnJ1bigpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvQlVJTEQgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L0JVSUxECmluZGV4IDM1YjEyNWYuLjllNTgxM2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvQlVJTEQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9CVUlMRApAQCAtMTAsOCArMTAsOCBAQAoganVuaXRfdGVzdHMoCiAgICAgbmFtZSA9ICJiYyIsCiAgICAgc3JjcyA9IGdsb2IoWyJ0c3QvKiovKi5qYXZhIl0pLAotICAgIHJlc291cmNlX2phcnMgPSBbIjp0c3RfcnNyYyJdLAogICAgIHRhZ3MgPSBbImJjIl0sCisgICAgcnVudGltZV9kZXBzID0gWyI6dHN0X3JzcmMiXSwKICAgICBkZXBzID0gWwogICAgICAgICAiLy9saWI6YmNwZyIsCiAgICAgICAgICIvL2xpYjpiY3Byb3YiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTbWFydEh0dHBUb29scy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTbWFydEh0dHBUb29scy5qYXZhCmluZGV4IDAxMmY5YTMuLmYxMTU1ZGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvR2l0U21hcnRIdHRwVG9vbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNtYXJ0SHR0cFRvb2xzLmphdmEKQEAgLTE1OCwxMSArMTU4LDExIEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJfQogCiAJCWlmIChpc0luZm9SZWZzKHJlcSkpIHsKLQkJCXNlbmRJbmZvUmVmc0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0KTsKKwkJCXNlbmRJbmZvUmVmc0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0LCBodHRwU3RhdHVzKTsKIAkJfSBlbHNlIGlmIChpc1VwbG9hZFBhY2socmVxKSkgewotCQkJc2VuZFVwbG9hZFBhY2tFcnJvcihyZXEsIHJlcywgdGV4dEZvckdpdCk7CisJCQlzZW5kVXBsb2FkUGFja0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0LCBodHRwU3RhdHVzKTsKIAkJfSBlbHNlIGlmIChpc1JlY2VpdmVQYWNrKHJlcSkpIHsKLQkJCXNlbmRSZWNlaXZlUGFja0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0KTsKKwkJCXNlbmRSZWNlaXZlUGFja0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0LCBodHRwU3RhdHVzKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChodHRwU3RhdHVzIDwgNDAwKQogCQkJCVNlcnZsZXRVdGlscy5jb25zdW1lUmVxdWVzdEJvZHkocmVxKTsKQEAgLTE3MSwyOSArMTcxLDMyIEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRJbmZvUmVmc0Vycm9yKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0JCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRleHRGb3JHaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRleHRGb3JHaXQsIGludCBodHRwU3RhdHVzKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTI4KTsKIAkJUGFja2V0TGluZU91dCBwY2sgPSBuZXcgUGFja2V0TGluZU91dChidWYpOwogCQlTdHJpbmcgc3ZjID0gcmVxLmdldFBhcmFtZXRlcigic2VydmljZSIpOwogCQlwY2sud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgIlxuIik7CiAJCXBjay5lbmQoKTsKIAkJcGNrLndyaXRlU3RyaW5nKCJFUlIgIiArIHRleHRGb3JHaXQpOwotCQlzZW5kKHJlcSwgcmVzLCBpbmZvUmVmc1Jlc3VsdFR5cGUoc3ZjKSwgYnVmLnRvQnl0ZUFycmF5KCkpOworCQlzZW5kKHJlcSwgcmVzLCBpbmZvUmVmc1Jlc3VsdFR5cGUoc3ZjKSwgYnVmLnRvQnl0ZUFycmF5KCksIGh0dHBTdGF0dXMpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgc2VuZFVwbG9hZFBhY2tFcnJvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0LCBpbnQgaHR0cFN0YXR1cykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIERvIG5vdCB1c2Ugc2lkZWJhbmQuIFNpZGViYW5kIGlzIGFjY2VwdGFibGUgb25seSB3aGlsZSBwYWNrZmlsZSBpcwogCQkvLyBiZWluZyBzZW50LiBPdGhlciBwbGFjZXMsIGxpa2UgYWNrbm93bGVkZ2VtZW50IHNlY3Rpb24sIGRvIG5vdAogCQkvLyBzdXBwb3J0IHNpZGViYW5kLiBVc2UgYW4gZXJyb3IgcGFja2V0LgogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMjgpOwogCQlQYWNrZXRMaW5lT3V0IHBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KGJ1Zik7CiAJCXdyaXRlUGFja2V0KHBja091dCwgdGV4dEZvckdpdCk7Ci0JCXNlbmQocmVxLCByZXMsIFVQTE9BRF9QQUNLX1JFU1VMVF9UWVBFLCBidWYudG9CeXRlQXJyYXkoKSk7CisJCXNlbmQocmVxLCByZXMsIFVQTE9BRF9QQUNLX1JFU1VMVF9UWVBFLCBidWYudG9CeXRlQXJyYXkoKSwgaHR0cFN0YXR1cyk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kUmVjZWl2ZVBhY2tFcnJvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0LCBpbnQgaHR0cFN0YXR1cykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEyOCk7CiAJCVBhY2tldExpbmVPdXQgcGNrT3V0ID0gbmV3IFBhY2tldExpbmVPdXQoYnVmKTsKIApAQCAtMjEyLDcgKzIxNSw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZFJlY2VpdmVQYWNrRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJCXdyaXRlU2lkZUJhbmQoYnVmLCB0ZXh0Rm9yR2l0KTsKIAkJZWxzZQogCQkJd3JpdGVQYWNrZXQocGNrT3V0LCB0ZXh0Rm9yR2l0KTsKLQkJc2VuZChyZXEsIHJlcywgUkVDRUlWRV9QQUNLX1JFU1VMVF9UWVBFLCBidWYudG9CeXRlQXJyYXkoKSk7CisJCXNlbmQocmVxLCByZXMsIFJFQ0VJVkVfUEFDS19SRVNVTFRfVFlQRSwgYnVmLnRvQnl0ZUFycmF5KCksIGh0dHBTdGF0dXMpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZWNlaXZlUGFja1NpZGVCYW5kKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKQEAgLTI0Niw5ICsyNDksOSBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUGFja2V0KFBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgdGV4dEZvckdpdCkKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCi0JCQlTdHJpbmcgdHlwZSwgYnl0ZVtdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCVN0cmluZyB0eXBlLCBieXRlW10gYnVmLCBpbnQgaHR0cFN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJU2VydmxldFV0aWxzLmNvbnN1bWVSZXF1ZXN0Qm9keShyZXEpOwotCQlyZXMuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOworCQlyZXMuc2V0U3RhdHVzKGh0dHBTdGF0dXMpOwogCQlyZXMuc2V0Q29udGVudFR5cGUodHlwZSk7CiAJCXJlcy5zZXRDb250ZW50TGVuZ3RoKGJ1Zi5sZW5ndGgpOwogCQl0cnkgKE91dHB1dFN0cmVhbSBvcyA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhCmluZGV4IDI3NTliOGEuLjIzYTM5OGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEKQEAgLTEwLDYgKzEwLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyOwogCitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUOwogaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU47CiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKIGltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEOwpAQCAtNDgsNiArNDksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcGxvYWRQYWNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2tJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LldhbnROb3RWYWxpZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5VcGxvYWRQYWNrRmFjdG9yeTsKQEAgLTE1MSw2ICsxNTMsMTYgQEAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKIAkJfQogCX0KIAorCXByaXZhdGUgc3RhdGljIGludCBzdGF0dXNDb2RlRm9yVGhyb3dhYmxlKFRocm93YWJsZSBlcnJvcikgeworCQlpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIFNDX0ZPUkJJRERFTjsKKwkJfQorCQlpZiAoZXJyb3IgaW5zdGFuY2VvZiBXYW50Tm90VmFsaWRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBTQ19CQURfUkVRVUVTVDsKKwkJfQorCQlyZXR1cm4gU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworCX0KKwogCXByaXZhdGUgZmluYWwgVXBsb2FkUGFja0Vycm9ySGFuZGxlciBoYW5kbGVyOwogCiAJVXBsb2FkUGFja1NlcnZsZXQoQE51bGxhYmxlIFVwbG9hZFBhY2tFcnJvckhhbmRsZXIgaGFuZGxlcikgewpAQCAtMTY5LDYgKzE4MSw3IEBAIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkKIAogCQlVcGxvYWRQYWNrUnVubmFibGUgciA9ICgpIC0+IHsKIAkJCVVwbG9hZFBhY2sgdXAgPSAoVXBsb2FkUGFjaykgcmVxLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSEFORExFUik7CisJCQkvLyB0byBiZSBleHBsaWNpdGx5IGNsb3NlZCBieSBjYWxsZXIKIAkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJCQlTbWFydE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgU21hcnRPdXRwdXRTdHJlYW0ocmVxLCByc3AsIGZhbHNlKSB7CiAJCQkJQE92ZXJyaWRlCkBAIC0xOTUsNiArMjA4LDggQEAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWxvZyh1cC5nZXRSZXBvc2l0b3J5KCksIGUuZ2V0Q2F1c2UoKSk7CiAJCQkJY29uc3VtZVJlcXVlc3RCb2R5KHJlcSk7CiAJCQkJb3V0LmNsb3NlKCk7CisJCQl9IGZpbmFsbHkgeworCQkJCXVwLmNsb3NlKCk7CiAJCQl9CiAJCX07CiAKQEAgLTIxNSw5ICsyMzAsMTIgQEAgcHJpdmF0ZSB2b2lkIGRlZmF1bHRVcGxvYWRQYWNrSGFuZGxlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQkJbG9nKHVwLmdldFJlcG9zaXRvcnkoKSwgZSk7CiAJCQlpZiAoIXJzcC5pc0NvbW1pdHRlZCgpKSB7CiAJCQkJcnNwLnJlc2V0KCk7Ci0JCQkJU3RyaW5nIG1zZyA9IGUgaW5zdGFuY2VvZiBQYWNrUHJvdG9jb2xFeGNlcHRpb24gPyBlLmdldE1lc3NhZ2UoKQotCQkJCQkJOiBudWxsOwotCQkJCXNlbmRFcnJvcihyZXEsIHJzcCwgU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBtc2cpOworCQkJCVN0cmluZyBtc2cgPSBudWxsOworCQkJCWlmIChlIGluc3RhbmNlb2YgUGFja1Byb3RvY29sRXhjZXB0aW9uCisJCQkJCQl8fCBlIGluc3RhbmNlb2YgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24pIHsKKwkJCQkJbXNnID0gZS5nZXRNZXNzYWdlKCk7CisJCQkJfQorCQkJCXNlbmRFcnJvcihyZXEsIHJzcCwgc3RhdHVzQ29kZUZvclRocm93YWJsZShlKSwgbXNnKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IGE5MDlmMTMuLmExMmE2NjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvYnVpbGQucHJvcGVydGllcwpAQCAtNCw1ICs0LDQgQEAKIGJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCiAgICAgICAgICAgICAgICAuLFwKICAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1hZGRpdGlvbmFsLmJ1bmRsZXMgPSBvcmcuYXBhY2hlLmxvZzRqLFwKLSAgICAgICAgICAgICAgICAgICAgIG9yZy5zbGY0ai5iaW5kaW5nLmxvZzRqMTIKK2FkZGl0aW9uYWwuYnVuZGxlcyA9IG9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0hvb2tNZXNzYWdlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0hvb2tNZXNzYWdlVGVzdC5qYXZhCmluZGV4IGRiOWYyYWUuLjIwZGUyNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Ib29rTWVzc2FnZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSG9va01lc3NhZ2VUZXN0LmphdmEKQEAgLTk3LDYgKzk3LDcgQEAgcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXBvc2l0b3J5IGRiKQogCQlzZXJ2ZXIuc2V0VXAoKTsKIAogCQlyZW1vdGVSZXBvc2l0b3J5ID0gc3JjLmdldFJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UocmVtb3RlUmVwb3NpdG9yeSk7CiAJCXJlbW90ZVVSSSA9IHRvVVJJaXNoKGFwcCwgc3JjTmFtZSk7CiAKIAkJU3RvcmVkQ29uZmlnIGNmZyA9IHJlbW90ZVJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEKaW5kZXggZGYwOTNjMS4uMzQzOGM1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwpAQCAtMzA4LDcgKzMwOSwxMCBAQCBwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW90ZV9TbWFydF9VcGxvYWRQYWNrRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlmYWlsKCJjb25uZWN0aW9uIG9wZW5lZCBldmVuIHRob3VnaCBzZXJ2aWNlIGRpc2FibGVkIik7CiAJCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZXJyKSB7CiAJCQkJU3RyaW5nIGV4cCA9IHNtYXJ0QXV0aE5vbmVVUkkgKyAiOiAiCi0JCQkJCQkrIEpHaXRUZXh0LmdldCgpLnNlcnZpY2VOb3RFbmFibGVkTm9OYW1lOworCQkJCQkJKyBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuc2VydmljZU5vdFBlcm1pdHRlZCwKKwkJCQkJCQkJc21hcnRBdXRoTm9uZVVSSS50b1N0cmluZygpICsgIi8iLAorCQkJCQkJCQkiZ2l0LXVwbG9hZC1wYWNrIik7CiAJCQkJYXNzZXJ0RXF1YWxzKGV4cCwgZXJyLmdldE1lc3NhZ2UoKSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9NZWFzdXJlUGFja1NpemVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvTWVhc3VyZVBhY2tTaXplVGVzdC5qYXZhCmluZGV4IDlmZmExOWUuLjAwMGVlY2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9NZWFzdXJlUGFja1NpemVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L01lYXN1cmVQYWNrU2l6ZVRlc3QuamF2YQpAQCAtOTAsNiArOTAsNyBAQCBwdWJsaWMgUmVjZWl2ZVBhY2sgY3JlYXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFJlcG9zaXRvcnkgZGIpCiAJCXNlcnZlci5zZXRVcCgpOwogCiAJCXJlbW90ZVJlcG9zaXRvcnkgPSBzcmMuZ2V0UmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShyZW1vdGVSZXBvc2l0b3J5KTsKIAkJcmVtb3RlVVJJID0gdG9VUklpc2goYXBwLCBzcmNOYW1lKTsKIAogCQlTdG9yZWRDb25maWcgY2ZnID0gcmVtb3RlUmVwb3NpdG9yeS5nZXRDb25maWcoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TbWFydENsaWVudFNtYXJ0U2VydmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEKaW5kZXggODg3ZTk3MC4uOGYzODg4ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LlNlcnZsZXRIb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlRyYW5zcG9ydENvbmZpZ0NhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5VbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuR2l0U2VydmxldDsKQEAgLTQ5Niw4ICs0OTYsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW90ZV9CYWROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQl0Lm9wZW5GZXRjaCgpOwogCQkJCWZhaWwoImZldGNoIGNvbm5lY3Rpb24gb3BlbmVkIik7Ci0JCQl9IGNhdGNoIChSZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uIG5vdEZvdW5kKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKHVyaSArICI6IEdpdCByZXBvc2l0b3J5IG5vdCBmb3VuZCIsCisJCQl9IGNhdGNoIChOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24gbm90Rm91bmQpIHsKKwkJCQlhc3NlcnRFcXVhbHModXJpICsgIjogIiArIHVyaQorCQkJCQkJKyAiL2luZm8vcmVmcz9zZXJ2aWNlPWdpdC11cGxvYWQtcGFjayBub3QgZm91bmQ6IE5vdCBGb3VuZCIsCiAJCQkJCQlub3RGb3VuZC5nZXRNZXNzYWdlKCkpOwogCQkJfQogCQl9CkBAIC01MTAsNyArNTExLDcgQEAgcHVibGljIHZvaWQgdGVzdExpc3RSZW1vdGVfQmFkTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGpvaW4odXJpLCAiaW5mby9yZWZzIiksIGluZm8uZ2V0UGF0aCgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGluZm8uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CiAJCWFzc2VydEVxdWFscygiZ2l0LXVwbG9hZC1wYWNrIiwgaW5mby5nZXRQYXJhbWV0ZXIoInNlcnZpY2UiKSk7Ci0JCWFzc2VydEVxdWFscygyMDAsIGluZm8uZ2V0U3RhdHVzKCkpOworCQlhc3NlcnRFcXVhbHMoNDA0LCBpbmZvLmdldFN0YXR1cygpKTsKIAkJYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi94LWdpdC11cGxvYWQtcGFjay1hZHZlcnRpc2VtZW50IiwKIAkJCQlpbmZvLmdldFJlc3BvbnNlSGVhZGVyKEhEUl9DT05URU5UX1RZUEUpKTsKIAl9CkBAIC01MzYsOCArNTM3LDkgQEAgcHVibGljIHZvaWQgdGVzdEZldGNoQnlTSEExVW5yZWFjaGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KAogCQkJCQkJCQkJbmV3IFJlZlNwZWModW5yZWFjaGFibGVDb21taXQubmFtZSgpKSkpKTsKIAkJCWFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoCi0JCQkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZUNvbW1pdC5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJCQkJIkJhZCBSZXF1ZXN0IikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSg0MDApOwogCX0KIAogCUBUZXN0CkBAIC01NTgsOCArNTYwLDkgQEAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFJlZj4gZ2V0QWR2ZXJ0aXNlZFJlZnMoUmVwb3NpdG9yeSByZXBvc2l0b3J5LAogCQkJCQkoKSAtPiB0LmZldGNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCiAJCQkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmVmU3BlYyhBLm5hbWUoKSkpKSk7CiAJCQlhc3NlcnRUcnVlKAotCQkJCQllLmdldE1lc3NhZ2UoKS5jb250YWlucygid2FudCAiICsgQS5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJCQkJZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkJhZCBSZXF1ZXN0IikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSg0MDApOwogCX0KIAogCUBUZXN0CkBAIC05MTYsNiArOTE5LDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDbG9uZV9SZWRpcmVjdE9uUG9zdEZvcmJpZGRlbigpIHRocm93cyBFeGNlcHRpb24gewogCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkgewogCQkJYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygiMzAxIikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSgzMDEpOwogCX0KIAogCUBUZXN0CkBAIC05MzQsNiArOTM4LDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDbG9uZV9SZWRpcmVjdEZvcmJpZGRlbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0VHJ1ZSgKIAkJCQkJZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImh0dHAuZm9sbG93UmVkaXJlY3RzIGlzIGZhbHNlIikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSgzMDEpOwogCX0KIAogCXByaXZhdGUgdm9pZCBhc3NlcnRGZXRjaFJlcXVlc3RzKExpc3Q8QWNjZXNzRXZlbnQ+IHJlcXVlc3RzLCBpbnQgaW5kZXgpIHsKQEAgLTE2MDUsOCArMTYxMCw5IEBAIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkV2FudCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJZmFpbCgiU2VydmVyIGFjY2VwdGVkIHdhbnQgIiArIGlkLm5hbWUoKSk7CiAJCX0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlcnIpIHsKIAkJCWFzc2VydFRydWUoZXJyLmdldE1lc3NhZ2UoKQotCQkJCQkuY29udGFpbnMoIndhbnQgIiArIGlkLm5hbWUoKSArICIgbm90IHZhbGlkIikpOworCQkJCQkuY29udGFpbnMoIkJhZCBSZXF1ZXN0IikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSg0MDApOwogCX0KIAogCUBUZXN0CkBAIC0xNjUwLDcgKzE2NTYsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hfUmVmc1VucmVhZGFibGVPblVwbG9hZCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWZhaWwoIlN1Y2Nlc3NmdWxseSBzZXJ2ZWQgcmVmIHdpdGggdmFsdWUgIiArIGMuZ2V0UmVmKG1hc3RlcikpOwogCQkJfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGVycikgewogCQkJCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIG1lc3NhZ2UgIiArIGVyci5nZXRNZXNzYWdlKCksCi0JCQkJCQllcnIuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IiKSk7CisJCQkJCQllcnIuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJTZXJ2ZXIgRXJyb3IiKSk7CiAJCQl9CiAJCX0gZmluYWxseSB7CiAJCQlub1JlZlNlcnZlci50ZWFyRG93bigpOwpAQCAtMTgyMSw2ICsxODI3LDExIEBAIHB1YmxpYyB2b2lkIHRlc3RQdXNoX0NodW5rZWRFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQkJCS5nZXRSZXNwb25zZUhlYWRlcihIRFJfQ09OVEVOVF9UWVBFKSk7CiAJfQogCisJcHJpdmF0ZSB2b2lkIGFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZShpbnQgc3RhdHVzQ29kZSkgeworCQlMaXN0PEFjY2Vzc0V2ZW50PiByZXF1ZXN0cyA9IGdldFJlcXVlc3RzKCk7CisJCWFzc2VydEVxdWFscyhzdGF0dXNDb2RlLCByZXF1ZXN0cy5nZXQocmVxdWVzdHMuc2l6ZSgpIC0gMSkuZ2V0U3RhdHVzKCkpOworCX0KKwogCXByaXZhdGUgdm9pZCBlbmFibGVSZWNlaXZlUGFjaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0b3JlZENvbmZpZyBjZmcgPSByZW1vdGVSZXBvc2l0b3J5LmdldENvbmZpZygpOwogCQljZmcuc2V0Qm9vbGVhbigiaHR0cCIsIG51bGwsICJyZWNlaXZlcGFjayIsIHRydWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvSHR0cFRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9IdHRwVGVzdENhc2UuamF2YQppbmRleCAzZTdjODRmLi44NzdiOTE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9IdHRwVGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9IdHRwVGVzdENhc2UuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5GaWxlUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwpAQCAtODAsNyArODEsOSBAQCBwcm90ZWN0ZWQgQXBwU2VydmVyIGNyZWF0ZVNlcnZlcigpIHsKIAkgKi8KIAlwcm90ZWN0ZWQgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gY3JlYXRlVGVzdFJlcG9zaXRvcnkoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0UmVwb3NpdG9yeTw+KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpOworCQlmaW5hbCBGaWxlUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UocmVwb3NpdG9yeSk7CisJCXJldHVybiBuZXcgVGVzdFJlcG9zaXRvcnk8PihyZXBvc2l0b3J5KTsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvUmVjb3JkaW5nTG9nZ2VyLmphdmEKaW5kZXggOWMzYzk4MC4uYWY2MzA4NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvUmVjb3JkaW5nTG9nZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvUmVjb3JkaW5nTG9nZ2VyLmphdmEKQEAgLTE4MCwxMSArMTgwLDE1IEBAIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZykgewogCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgd2FybihTdHJpbmcgZm9ybWF0LCBPYmplY3QgYXJnKSB7Ci0JCXdhcm4oZm9ybWF0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oYXJnKSk7CisJCWFkZFdhcm5pbmdzKGZvcm1hdCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKGFyZykpOwogCX0KIAogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIGZvcm1hdCwgT2JqZWN0Li4uIGFyZ3VtZW50cykgeworCQlhZGRXYXJuaW5ncyhmb3JtYXQsIGFyZ3VtZW50cyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFdhcm5pbmdzKFN0cmluZyBmb3JtYXQsIE9iamVjdC4uLiBhcmd1bWVudHMpIHsKIAkJc3luY2hyb25pemVkICh3YXJuaW5ncykgewogCQkJaW50IGkgPSAwOwogCQkJaW50IGluZGV4ID0gZm9ybWF0LmluZGV4T2YoInt9Iik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDgxMzE5NWYuLmY4MGY4NmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC04LDMxICs4LDMxIEBACiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKLUltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5maWxlLnZpcnR1YWxmczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5pbzt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5sb2dnaW5nO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwudGhyZWFkczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29yZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGguZ3NzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aC5rZXlib2FyZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGgucGFzc3dvcmQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5jb21tYW5kO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuc2Vzc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLnNoZWxsO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuc3Vic3lzdGVtO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZnRwO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZnRwLnNlcnZlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5maWxlLnZpcnR1YWxmczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5pbzt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5sb2dnaW5nO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwudGhyZWFkczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29yZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGguZ3NzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aC5rZXlib2FyZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGgucGFzc3dvcmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5jb21tYW5kO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuc2Vzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLnNoZWxsO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuc3Vic3lzdGVtO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZnRwO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZnRwLnNlcnZlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9wb20ueG1sCmluZGV4IGZlNTM4NDcuLjJkNGNhZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvcG9tLnhtbApAQCAtNTUsNiArNTUsMTYgQEAKICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3NoZDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPnNzaGQtc2Z0cDwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7YXBhY2hlLXNzaGQtdmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNzaGQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNzaGQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNzaGQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNzaGQtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKaW5kZXggNDk0ZDJmMy4uYTNjNWIxMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCkBAIC00NSw2ICs0NSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVzdE5hbWU7CiAKIC8qKgogICogSlVuaXQgVGVzdENhc2Ugd2l0aCBzcGVjaWFsaXplZCBzdXBwb3J0IGZvciB0ZW1wb3JhcnkgbG9jYWwgcmVwb3NpdG9yeS4KQEAgLTg0LDE4ICs4NiwzMyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlwcml2YXRlIEZpbGUgdG1wOwogCiAJLyoqCisJICogVGhlIGN1cnJlbnQgdGVzdCBuYW1lLgorCSAqLworCUBSdWxlCisJcHVibGljIFRlc3ROYW1lIGN1cnJlbnRUZXN0ID0gbmV3IFRlc3ROYW1lKCk7CisKKwlwcml2YXRlIFN0cmluZyBnZXRUZXN0TmFtZSgpIHsKKwkJU3RyaW5nIG5hbWUgPSBjdXJyZW50VGVzdC5nZXRNZXRob2ROYW1lKCk7CisJCW5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIlteYS16QS1aMC05XSIsICJfIik7CisJCW5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIl9fKyIsICJfIik7CisJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIl8iKSkgeworCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOworCQl9CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgogCSAqIFNldHVwIHRlc3QKIAkgKgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCiAJQEJlZm9yZQogCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRtcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImpnaXRfdGVzdF8iLCAiX3RtcCIpOworCQl0bXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJqZ2l0XyIgKyBnZXRUZXN0TmFtZSgpICsgJ18nLCAiX3RtcCIpOwogCQlDbGVhbnVwVGhyZWFkLmRlbGV0ZU9uU2h1dGRvd24odG1wKTsKIAkJaWYgKCF0bXAuZGVsZXRlKCkgfHwgIXRtcC5ta2RpcigpKSB7CiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgIiArIHRtcCk7CiAJCX0KLQogCQltb2NrU3lzdGVtUmVhZGVyID0gbmV3IE1vY2tTeXN0ZW1SZWFkZXIoKTsKIAkJU3lzdGVtUmVhZGVyLnNldEluc3RhbmNlKG1vY2tTeXN0ZW1SZWFkZXIpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1B1c2hUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1B1c2hUZXN0LmphdmEKaW5kZXggNzBjMDQ2My4uMDY3MDhiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9QdXNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvUHVzaFRlc3QuamF2YQpAQCAtMTEsNiArMTEsNyBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKQEAgLTI5LDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVSZXBvc2l0b3J5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZTcGVjOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlBhdGhGaWx0ZXI7CkBAIC0xMjgsNCArMTMwLDE4IEBAIHB1YmxpYyB2b2lkIHRlc3RQdXNoU2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJc2VydmVyLmdldFJlcXVlc3RzKCkudG9TdHJpbmcoKSk7CiAJfQogCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlQnJhbmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBicmFuY2ggPSAibmV3LWJyYW5jaCI7CisJCWdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKGJyYW5jaCkuY2FsbCgpOworCisJCVN0cmluZyBkZXN0UmVmID0gQ29uc3RhbnRzLlJfSEVBRFMgKyBicmFuY2g7CisJCWdpdC5wdXNoKCkuc2V0UmVmU3BlY3MobmV3IFJlZlNwZWMoKS5zZXRTb3VyY2UoYnJhbmNoKS5zZXREZXN0aW5hdGlvbihkZXN0UmVmKSkuY2FsbCgpOworCisJCS8vIFNob3VsZCBub3QgZmFpbCBvbiBwdXNoLgorCQlnaXQuYnJhbmNoRGVsZXRlKCkuc2V0QnJhbmNoTmFtZXMoYnJhbmNoKS5zZXRGb3JjZSh0cnVlKS5jYWxsKCk7CisJCWdpdC5wdXNoKCkuc2V0UmVmU3BlY3MobmV3IFJlZlNwZWMoKS5zZXRTb3VyY2UobnVsbCkuc2V0RGVzdGluYXRpb24oZGVzdFJlZikpLmNhbGwoKTsKKworCQlhc3NlcnRUcnVlKHNlcnZlci5nZXRSZXF1ZXN0cygpLmlzRW1wdHkoKSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvT2JqZWN0RG93bmxvYWRMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvT2JqZWN0RG93bmxvYWRMaXN0ZW5lci5qYXZhCmluZGV4IGNjNTc5NDcuLmQ0MjcwMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL09iamVjdERvd25sb2FkTGlzdGVuZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9PYmplY3REb3dubG9hZExpc3RlbmVyLmphdmEKQEAgLTgxLDYgKzgxLDcgQEAgcHVibGljIE9iamVjdERvd25sb2FkTGlzdGVuZXIoRmlsZUxmc1JlcG9zaXRvcnkgcmVwb3NpdG9yeSwKIAkgKgogCSAqIFdyaXRlIGZpbGUgY29udGVudAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJGaW5hbGx5IikKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBvbldyaXRlUG9zc2libGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3aGlsZSAob3V0LmlzUmVhZHkoKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDZmMmE4OS4uMGI5M2FmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0xMyw5ICsxMywxMiBAQAogIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCiAgb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCiAgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0NvbmZpZ0dpdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0NvbmZpZ0dpdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM0MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzQ29uZmlnR2l0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBNYXR0aGlhcyBGcm9tbWUgPG1mcm9tbWVAZHNwYWNlLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5SZXNldENvbW1hbmQuUmVzZXRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWwuTGZzQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBpZiB0aGUgbGZzIGNvbmZpZyBpcyB1c2VkIGluIHRoZSBjb3JyZWN0IHdheSBkdXJpbmcgY2hlY2tvdXQuCisgKgorICogVHdvIGxmcy1maWxlcyBhcmUgY3JlYXRlZCwgb25lIHRoYXQgY29tZXMgYmVmb3JlIC5naXRhdHRyaWJ1dGVzIGFuZAorICogLmxmc2NvbmZpZyBpbiBnaXQgb3JkZXIgKCIuYWFhLnR4dCIpIGFuZCBvbmUgdGhhdCBjb21lcyBhZnRlciAoInp6ei50eHQiKS4KKyAqCisgKiBEdXJpbmcgY2hlY2tvdXQvcmVzZXQgaXQgaXMgdGVzdGVkIGlmIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIGxmcyBjb25maWcKKyAqIGlzIHVzZWQuCisgKgorICogVE9ETzogVGhlIGN1cnJlbnQgYmVoYXZpb3Igc2VlbXMgYSBsaXR0bGUgYml0IHN0cmFuZ2UvdW5pbnR1aXRpdmUuIFNvbWUgZmlsZXMKKyAqIGFyZSBjaGVja2VkIG91dCBiZWZvcmUgYW5kIHNvbWUgYWZ0ZXIgdGhlIGNvbmZpZyBmaWxlcy4gVGhpcyBsZWFkcyB0byB0aGUKKyAqIGJlaGF2aW9yLCB0aGF0IGR1cmluZyBhIHNpbmdsZSBjb21tYW5kIHRoZSBjb25maWcgY2hhbmdlcy4gU2luY2UgdGhpcyBzZWVtcworICogdG8gYmUgdGhlIHNhbWUgd2F5IGluIG5hdGl2ZSBnaXQsIHRoZSBiZWhhdmlvciBpcyBhY2NlcHRlZCBmb3Igbm93LgorICoKKyAqLworcHVibGljIGNsYXNzIExmc0NvbmZpZ0dpdFRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNVURHRV9OQU1FID0gb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkJVSUxUSU5fRklMVEVSX1BSRUZJWAorCQkJKyBDb25zdGFudHMuQVRUUl9GSUxURVJfRFJJVkVSX1BSRUZJWAorCQkJKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0U7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEZTX1NFUlZFUl9VUkkxID0gImh0dHBzOi8vbGZzLnNlcnZlcjEvdGVzdC91cmkiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1NFUlZFUl9VUkwxID0gTEZTX1NFUlZFUl9VUkkxCisJCQkrIFByb3RvY29sLk9CSkVDVFNfTEZTX0VORFBPSU5UOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExGU19TRVJWRVJfVVJJMiA9ICJodHRwczovL2xmcy5zZXJ2ZXIyL3Rlc3QvdXJpIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9TRVJWRVJfVVJMMiA9IExGU19TRVJWRVJfVVJJMgorCQkJKyBQcm90b2NvbC5PQkpFQ1RTX0xGU19FTkRQT0lOVDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRlNfU0VSVkVSX1VSSTMgPSAiaHR0cHM6Ly9sZnMuc2VydmVyMy90ZXN0L3VyaSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfU0VSVkVSX1VSTDMgPSBMRlNfU0VSVkVSX1VSSTMKKwkJCSsgUHJvdG9jb2wuT0JKRUNUU19MRlNfRU5EUE9JTlQ7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFLRV9MRlNfUE9JTlRFUjEgPSAidmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxXG4iCisJCQkrICJvaWQgc2hhMjU2OjZjZTlmYWI1MmVlOWE2YzRjMDk3ZGVmNGUwNDljNmFjZGViYTQ0Yzk5ZDI2ZTgzYmE4MGFkZWMxNDczYzliMmRcbiIKKwkJCSsgInNpemUgMjUzOTUyXG4iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfTEZTX1BPSU5URVIyID0gInZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MVxuIgorCQkJKyAib2lkIHNoYTI1NjphNGI3MTFjZDk4OTg2M2FlMjAzODc1OGE2MjY3MjEzODM0N2FiYmJhZTQwNzZhN2FkM2E1NDVmZGE3ZDA4ZjgyXG4iCisJCQkrICJzaXplIDY3MDcyXG4iOworCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGNoZWNrb3V0VVJMcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJc3RhdGljIGNsYXNzIFNtdWRnZUZpbHRlck1vY2sgZXh0ZW5kcyBGaWx0ZXJDb21tYW5kIHsKKwkJcHVibGljIFNtdWRnZUZpbHRlck1vY2soUmVwb3NpdG9yeSBkYiwgSW5wdXRTdHJlYW0gaW4sCisJCQkJT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXN1cGVyKGluLCBvdXQpOworCQkJSHR0cENvbm5lY3Rpb24gbGZzU2VydmVyQ29ubiA9IExmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oZGIsCisJCQkJCUh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULCBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpOworCQkJY2hlY2tvdXRVUkxzLmFkZChsZnNTZXJ2ZXJDb25uLmdldFVSTCgpLnRvU3RyaW5nKCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCS8vIFN0dXBpZCBubyBpbXBsCisJCQlpbi50cmFuc2ZlclRvKG91dCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbExmcygpIHsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKFNNVURHRV9OQU1FLCBTbXVkZ2VGaWx0ZXJNb2NrOjpuZXcpOworCX0KKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxmcygpIHsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnVucmVnaXN0ZXIoU01VREdFX05BTUUpOworCX0KKworCXByaXZhdGUgR2l0IGdpdDsKKworCUBPdmVycmlkZQorCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlnaXQgPSBuZXcgR2l0KGRiKTsKKwkJLy8gY29tbWl0IHNvbWV0aGluZworCQl3cml0ZVRyYXNoRmlsZSgiVGVzdC50eHQiLCAiSGVsbG8gd29ybGQiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJUZXN0LnR4dCIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkluaXRpYWwgY29tbWl0IikuY2FsbCgpOworCQkvLyBwcmVwYXJlIHRoZSBjb25maWcgZm9yIExGUworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgImxmcyIsICJzbXVkZ2UiLCBTTVVER0VfTkFNRSk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYsICJmYWxzZSIpOworCQljb25maWcuc2F2ZSgpOworCisJCWZpbGVCZWZvcmUgPSBudWxsOworCQlmaWxlQWZ0ZXIgPSBudWxsOworCQljb25maWdGaWxlID0gbnVsbDsKKwkJZ2l0QXR0cmlidXRlc0ZpbGUgPSBudWxsOworCX0KKworCUZpbGUgZmlsZUJlZm9yZTsKKworCUZpbGUgZmlsZUFmdGVyOworCisJRmlsZSBjb25maWdGaWxlOworCisJRmlsZSBnaXRBdHRyaWJ1dGVzRmlsZTsKKworCXByaXZhdGUgdm9pZCBjcmVhdGVMZnNGaWxlcyhTdHJpbmcgbGZzUG9pbnRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vRmlsZSB0byBiZSBjaGVja2VkIG91dCBiZWZvcmUgbGZzIGNvbmZpZworCQlTdHJpbmcgZmlsZU5hbWVCZWZvcmUgPSAiLmFhYS50eHQiOworCQlmaWxlQmVmb3JlID0gd3JpdGVUcmFzaEZpbGUoZmlsZU5hbWVCZWZvcmUsIGxmc1BvaW50ZXIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oZmlsZU5hbWVCZWZvcmUpLmNhbGwoKTsKKworCQkvLyBGaWxlIHRvIGJlIGNoZWNrZWQgb3V0IGFmdGVyIGxmcyBjb25maWcKKwkJU3RyaW5nIGZpbGVOYW1lQWZ0ZXIgPSAienp6LnR4dCI7CisJCWZpbGVBZnRlciA9IHdyaXRlVHJhc2hGaWxlKGZpbGVOYW1lQWZ0ZXIsIGxmc1BvaW50ZXIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oZmlsZU5hbWVBZnRlcikuY2FsbCgpOworCisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJDb21taXQgTEZTIFBvaW50ZXIgZmlsZXMiKS5jYWxsKCk7CisJfQorCisKKwlwcml2YXRlIFN0cmluZyBhZGRMZnNDb25maWdGaWxlcyhTdHJpbmcgbGZzU2VydmVyVXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQWRkIGNvbmZpZyBmaWxlcyB0byB0aGUgcmVwbworCQlTdHJpbmcgbGZzQ29uZmlnMSA9IGNyZWF0ZUxmc0NvbmZpZyhsZnNTZXJ2ZXJVcmwpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKS5jYWxsKCk7CisJCS8vIE1vZGlmeSBnaXRhdHRyaWJ1dGVzIG9uIHNlY29uZCBjYWxsLCB0byBmb3JjZSBjaGVja291dCB0b28uCisJCWlmIChnaXRBdHRyaWJ1dGVzRmlsZSA9PSBudWxsKSB7CisJCQlnaXRBdHRyaWJ1dGVzRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCIuZ2l0YXR0cmlidXRlcyIsCisJCQkJIioudHh0IGZpbHRlcj1sZnMiKTsKKwkJfSBlbHNlIHsKKwkJCWdpdEF0dHJpYnV0ZXNGaWxlID0gd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwKKwkJCQkJIioudHh0IGZpbHRlcj1sZnNcbiIpOworCQl9CisKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuZ2l0YXR0cmlidXRlcyIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkNvbW1pdCBjb25maWcgZmlsZXMiKS5jYWxsKCk7CisJCXJldHVybiBsZnNDb25maWcxOworCX0KKworCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUxmc0NvbmZpZyhTdHJpbmcgbGZzU2VydmVyVXJsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgbGZzQ29uZmlnMSA9ICJbbGZzXVxuICAgIHVybCA9ICIgKyBsZnNTZXJ2ZXJVcmw7CisJCWNvbmZpZ0ZpbGUgPSB3cml0ZVRyYXNoRmlsZShDb25zdGFudHMuRE9UX0xGU19DT05GSUcsIGxmc0NvbmZpZzEpOworCQlyZXR1cm4gbGZzQ29uZmlnMTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrb3V0TGZzT2JqZWN0c19yZXNldCgpIHRocm93cyBFeGNlcHRpb24geworCQljcmVhdGVMZnNGaWxlcyhGQUtFX0xGU19QT0lOVEVSMSk7CisJCVN0cmluZyBsZnNDb25maWcxID0gYWRkTGZzQ29uZmlnRmlsZXMoTEZTX1NFUlZFUl9VUkkxKTsKKworCQkvLyBEZWxldGUgZmlsZXMgdG8gZm9yY2UgYWN0aW9uIG9uIHJlc2V0CisJCWFzc2VydFRydWUoY29uZmlnRmlsZS5kZWxldGUoKSk7CisJCWFzc2VydFRydWUoZmlsZUJlZm9yZS5kZWxldGUoKSk7CisJCWFzc2VydFRydWUoZmlsZUFmdGVyLmRlbGV0ZSgpKTsKKworCQlhc3NlcnRUcnVlKGdpdEF0dHJpYnV0ZXNGaWxlLmRlbGV0ZSgpKTsKKworCQkvLyBjcmVhdGUgY29uZmlnIGZpbGUgd2l0aCBkaWZmZXJlbnQgdXJsCisJCWNyZWF0ZUxmc0NvbmZpZyhMRlNfU0VSVkVSX1VSSTMpOworCisJCWNoZWNrb3V0VVJMcy5jbGVhcigpOworCQlnaXQucmVzZXQoKS5zZXRNb2RlKFJlc2V0VHlwZS5IQVJEKS5jYWxsKCk7CisKKwkJY2hlY2tGaWxlKGNvbmZpZ0ZpbGUsIGxmc0NvbmZpZzEpOworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjEpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMSk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGNoZWNrb3V0VVJMcy5zaXplKCkpOworCQkvLyBUT0RPOiBTaG91bGQgbWF5IGJlIEVYUEVDVEVEX1NFUlZSX1VSTDEKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwzLCBjaGVja291dFVSTHMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwxLCBjaGVja291dFVSTHMuZ2V0KDEpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrb3V0TGZzT2JqZWN0c19CcmFuY2hTd2l0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIGEgbmV3IGJyYW5jaCAiVVJMMSIgYW5kIGFkZCBjb25maWcgZmlsZXMKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLnNldE5hbWUoIlVSTDEiKS5jYWxsKCk7CisKKwkJY3JlYXRlTGZzRmlsZXMoRkFLRV9MRlNfUE9JTlRFUjEpOworCQlTdHJpbmcgbGZzQ29uZmlnMSA9IGFkZExmc0NvbmZpZ0ZpbGVzKExGU19TRVJWRVJfVVJJMSk7CisKKwkJLy8gQ3JlYXRlIGEgc2Vjb25kIG5ldyBicmFuY2ggIlVSTDIiIGFuZCBhZGQgY29uZmlnIGZpbGVzCisJCWdpdC5jaGVja291dCgpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5zZXROYW1lKCJVUkwyIikuY2FsbCgpOworCisJCWNyZWF0ZUxmc0ZpbGVzKEZBS0VfTEZTX1BPSU5URVIyKTsKKwkJU3RyaW5nIGxmc0NvbmZpZzIgPSBhZGRMZnNDb25maWdGaWxlcyhMRlNfU0VSVkVSX1VSSTIpOworCisJCWNoZWNrRmlsZShjb25maWdGaWxlLCBsZnNDb25maWcyKTsKKwkJY2hlY2tGaWxlKGZpbGVCZWZvcmUsIEZBS0VfTEZTX1BPSU5URVIyKTsKKwkJY2hlY2tGaWxlKGZpbGVBZnRlciwgRkFLRV9MRlNfUE9JTlRFUjIpOworCisJCWNoZWNrb3V0VVJMcy5jbGVhcigpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJVUkwxIikuY2FsbCgpOworCisJCWNoZWNrRmlsZShjb25maWdGaWxlLCBsZnNDb25maWcxKTsKKwkJY2hlY2tGaWxlKGZpbGVCZWZvcmUsIEZBS0VfTEZTX1BPSU5URVIxKTsKKwkJY2hlY2tGaWxlKGZpbGVBZnRlciwgRkFLRV9MRlNfUE9JTlRFUjEpOworCisJCWFzc2VydEVxdWFscygyLCBjaGVja291dFVSTHMuc2l6ZSgpKTsKKwkJLy8gVE9ETzogU2hvdWxkIG1heSBiZSBFWFBFQ1RFRF9TRVJWUl9VUkwxCisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMiwgY2hlY2tvdXRVUkxzLmdldCgwKSk7CisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMSwgY2hlY2tvdXRVUkxzLmdldCgxKSk7CisKKwkJY2hlY2tvdXRVUkxzLmNsZWFyKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIlVSTDIiKS5jYWxsKCk7CisKKwkJY2hlY2tGaWxlKGNvbmZpZ0ZpbGUsIGxmc0NvbmZpZzIpOworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjIpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMik7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGNoZWNrb3V0VVJMcy5zaXplKCkpOworCQkvLyBUT0RPOiBTaG91bGQgbWF5IGJlIEVYUEVDVEVEX1NFUlZSX1VSTDIKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwxLCBjaGVja291dFVSTHMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwyLCBjaGVja291dFVSTHMuZ2V0KDEpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrb3V0TGZzT2JqZWN0c19CcmFuY2hTd2l0Y2hfTW9kaWZpZWRMb2NhbCgpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBDcmVhdGUgYSBuZXcgYnJhbmNoICJVUkwxIiBhbmQgYWRkIGNvbmZpZyBmaWxlcworCQlnaXQuY2hlY2tvdXQoKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuc2V0TmFtZSgiVVJMMSIpLmNhbGwoKTsKKworCQljcmVhdGVMZnNGaWxlcyhGQUtFX0xGU19QT0lOVEVSMSk7CisJCWFkZExmc0NvbmZpZ0ZpbGVzKExGU19TRVJWRVJfVVJJMSk7CisKKwkJLy8gQ3JlYXRlIGEgc2Vjb25kIG5ldyBicmFuY2ggIlVSTDIiIGFuZCBhZGQgY29uZmlnIGZpbGVzCisJCWdpdC5jaGVja291dCgpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5zZXROYW1lKCJVUkwyIikuY2FsbCgpOworCisJCWNyZWF0ZUxmc0ZpbGVzKEZBS0VfTEZTX1BPSU5URVIyKTsKKwkJYWRkTGZzQ29uZmlnRmlsZXMoTEZTX1NFUlZFUl9VUkkxKTsKKworCQkvLyBjcmVhdGUgY29uZmlnIGZpbGUgd2l0aCBkaWZmZXJlbnQgdXJsCisJCWFzc2VydFRydWUoY29uZmlnRmlsZS5kZWxldGUoKSk7CisJCVN0cmluZyBsZnNDb25maWczID0gY3JlYXRlTGZzQ29uZmlnKExGU19TRVJWRVJfVVJJMyk7CisKKwkJY2hlY2tGaWxlKGNvbmZpZ0ZpbGUsIGxmc0NvbmZpZzMpOworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjIpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMik7CisKKwkJY2hlY2tvdXRVUkxzLmNsZWFyKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIlVSTDEiKS5jYWxsKCk7CisKKwkJY2hlY2tGaWxlKGZpbGVCZWZvcmUsIEZBS0VfTEZTX1BPSU5URVIxKTsKKwkJY2hlY2tGaWxlKGZpbGVBZnRlciwgRkFLRV9MRlNfUE9JTlRFUjEpOworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMyk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGNoZWNrb3V0VVJMcy5zaXplKCkpOworCisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMywgY2hlY2tvdXRVUkxzLmdldCgwKSk7CisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMywgY2hlY2tvdXRVUkxzLmdldCgxKSk7CisKKwkJY2hlY2tvdXRVUkxzLmNsZWFyKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIlVSTDIiKS5jYWxsKCk7CisKKwkJY2hlY2tGaWxlKGZpbGVCZWZvcmUsIEZBS0VfTEZTX1BPSU5URVIyKTsKKwkJY2hlY2tGaWxlKGZpbGVBZnRlciwgRkFLRV9MRlNfUE9JTlRFUjIpOworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMyk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGNoZWNrb3V0VVJMcy5zaXplKCkpOworCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDMsIGNoZWNrb3V0VVJMcy5nZXQoMCkpOworCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDMsIGNoZWNrb3V0VVJMcy5nZXQoMSkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0dpdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0dpdFRlc3QuamF2YQppbmRleCA4OTY0MzEwLi4zZTgzYzhlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNHaXRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzR2l0VGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgMjAyMiBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtNjgsNiArNjgsMjcgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAl9CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCcmFuY2hTd2l0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoImFicmFuY2giKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImFicmFuY2giKS5jYWxsKCk7CisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS5iaW4iLCAiYWFhIik7CisJCXdyaXRlVHJhc2hGaWxlKCIuZ2l0YXR0cmlidXRlcyIsICJhLmJpbiBmaWx0ZXI9bGZzIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFjb21taXQiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoImJicmFuY2giKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJicmFuY2giKS5jYWxsKCk7CisJCUZpbGUgYkZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYi5iaW4iLCAiYmJiIik7CisJCXdyaXRlVHJhc2hGaWxlKCIuZ2l0YXR0cmlidXRlcyIsICJiLmJpbiBmaWx0ZXI9bGZzIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImJjb21taXQiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImFicmFuY2giKS5jYWxsKCk7CisJCWNoZWNrRmlsZShhRmlsZSwgImFhYSIpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJiYnJhbmNoIikuY2FsbCgpOworCQljaGVja0ZpbGUoYkZpbGUsICJiYmIiKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGNoZWNrb3V0Tm9uTGZzUG9pbnRlcigpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgY29udGVudCA9ICJzaXplX3RcbnNvbWVfZnVuY3Rpb24odm9pZCogcHRyKTtcbiI7CiAJCUZpbGUgc21hbGxGaWxlID0gd3JpdGVUcmFzaEZpbGUoIlRlc3QudHh0IiwgY29udGVudCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0Nvbm5lY3Rpb25GYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZGNiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiBOYWlsIFNhbWF0b3YgPHNhbmFpbEB5YW5kZXgucnU+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuUmVtb3RlQWRkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLkNsZWFuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLlByb3RvY29sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLlNtdWRnZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VUklpc2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBMZnNDb25uZWN0aW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNVURHRV9OQU1FID0gb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkJVSUxUSU5fRklMVEVSX1BSRUZJWAorCQkJKyBDb25zdGFudHMuQVRUUl9GSUxURVJfRFJJVkVSX1BSRUZJWAorCQkJKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0U7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5fTkFNRSA9IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5CVUlMVElOX0ZJTFRFUl9QUkVGSVgKKwkJCSsgQ29uc3RhbnRzLkFUVFJfRklMVEVSX0RSSVZFUl9QUkVGSVgKKwkJCSsgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkFUVFJfRklMVEVSX1RZUEVfQ0xFQU47CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTEZTX1NFUlZFUl9VUkwxID0gImh0dHBzOi8vbGZzLnNlcnZlcjEvdGVzdC91cmkiOworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExGU19TRVJWRVJfVVJMMiA9ICJodHRwczovL2xmcy5zZXJ2ZXIyL3Rlc3QvdXJpIjsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBPUklHSU5fVVJMID0gImh0dHBzOi8vZ2l0LnNlcnZlci90ZXN0L3VyaSI7CisKKwlwcml2YXRlIEdpdCBnaXQ7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbExmcygpIHsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKFNNVURHRV9OQU1FLCBTbXVkZ2VGaWx0ZXIuRkFDVE9SWSk7CisJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS5yZWdpc3RlcihDTEVBTl9OQU1FLCBDbGVhbkZpbHRlci5GQUNUT1JZKTsKKwl9CisKKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVMZnMoKSB7CisJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS51bnJlZ2lzdGVyKFNNVURHRV9OQU1FKTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnVucmVnaXN0ZXIoQ0xFQU5fTkFNRSk7CisJfQorCisJQE92ZXJyaWRlCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCWdpdCA9IG5ldyBHaXQoZGIpOworCisJCS8vIEp1c3QgdG8gaGF2ZSBhIG5vbiBlbXB0eSByZXBvCisJCXdyaXRlVHJhc2hGaWxlKCJUZXN0LnR4dCIsICJIZWxsbyB3b3JsZCBmcm9tIHRoZSBMRlMgRmFjdG9yeSBUZXN0Iik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiVGVzdC50eHQiKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJJbml0aWFsIGNvbW1pdCIpLmNhbGwoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxmc1VybEZyb21SZW1vdGVVcmxXaXRoRG90R2l0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFkZFJlbW90ZVVybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby5naXQiKTsKKwkJY2hlY2tMZnNVcmwoImh0dHBzOi8vbG9jYWxob3N0L3JlcG8uZ2l0L2luZm8vbGZzIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsZnNVcmxGcm9tUmVtb3RlVXJsV2l0aG91dERvdEdpdCgpIHRocm93cyBFeGNlcHRpb24geworCQlhZGRSZW1vdGVVcmwoImh0dHBzOi8vbG9jYWxob3N0L3JlcG8iKTsKKwkJY2hlY2tMZnNVcmwoImh0dHBzOi8vbG9jYWxob3N0L3JlcG8uZ2l0L2luZm8vbGZzIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsZnNVcmxGcm9tTG9jYWxDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWRkUmVtb3RlVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvIik7CisKKwkJU3RvcmVkQ29uZmlnIGNmZyA9ICgoUmVwb3NpdG9yeSkgZGIpLmdldENvbmZpZygpOworCQljZmcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfU0VDVElPTl9MRlMsCisJCQkJbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwsCisJCQkJImh0dHBzOi8vbG9jYWxob3N0L3JlcG8vbGZzIik7CisJCWNmZy5zYXZlKCk7CisKKwkJY2hlY2tMZnNVcmwoImh0dHBzOi8vbG9jYWxob3N0L3JlcG8vbGZzIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsZnNVcmxGcm9tT3JpZ2luQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFkZFJlbW90ZVVybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwbyIpOworCisJCVN0b3JlZENvbmZpZyBjZmcgPSAoKFJlcG9zaXRvcnkpIGRiKS5nZXRDb25maWcoKTsKKwkJY2ZnLnNldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fTEZTLAorCQkJCW9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FLAorCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCwKKwkJCQkiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby9sZnMiKTsKKwkJY2ZnLnNhdmUoKTsKKworCQljaGVja0xmc1VybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby9sZnMiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxmc1VybE5vdENvbmZpZ3VyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0VGhyb3dzKExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uY2xhc3MsCisJCQkJKCkgLT4gTGZzQ29ubmVjdGlvbkZhY3RvcnkuZ2V0TGZzQ29ubmVjdGlvbihkYiwKKwkJCQlIdHRwU3VwcG9ydC5NRVRIT0RfUE9TVCwgUHJvdG9jb2wuT1BFUkFUSU9OX0RPV05MT0FEKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fbGZzdXJsX2xmc2NvbmZpZ0Zyb21Xb3JraW5nRGlyKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQl3cml0ZUxmc0NvbmZpZygpOworCQljaGVja0xmc1VybChMRlNfU0VSVkVSX1VSTDEpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tHZXRMZnNDb25uZWN0aW9uX2xmc3VybF9sZnNjb25maWdGcm9tSW5kZXgoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihDb25zdGFudHMuRE9UX0xGU19DT05GSUcpLmNhbGwoKTsKKwkJZGVsZXRlVHJhc2hGaWxlKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRyk7CisJCWNoZWNrTGZzVXJsKExGU19TRVJWRVJfVVJMMSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fbGZzdXJsX2xmc2NvbmZpZ0Zyb21IRUFEKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQl3cml0ZUxmc0NvbmZpZygpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJDb21taXQgTEZTIENvbmZpZyIpLmNhbGwoKTsKKworCQkvKgorCQkgKiByZWFkaW5nIC5sZnNjb25maWcgZnJvbSBIRUFEIHNlZW1zIG9ubHkgdGVzdGFibGUgdXNpbmcgYSBiYXJlIHJlcG8sCisJCSAqIHNpbmNlIG90aGVyd2lzZSB3b3JraW5nIHRyZWUgb3IgaW5kZXggYXJlIHVzZWQKKwkJICovCisJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdEJhcmVSZXBvIik7CisJCXRyeSAoUmVwb3NpdG9yeSBiYXJlUmVwb0RiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCisJCQkJLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLnNldEJhcmUodHJ1ZSkKKwkJCQkuY2FsbCgpLmdldFJlcG9zaXRvcnkoKSkgeworCisJCQljaGVja0xmc1VybChMRlNfU0VSVkVSX1VSTDEpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fcmVtb3RlX2xmc2NvbmZpZ0Zyb21Xb3JraW5nRGlyKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlhZGRSZW1vdGVVcmwoT1JJR0lOX1VSTCk7CisJCXdyaXRlTGZzQ29uZmlnKExGU19TRVJWRVJfVVJMMSwgImxmcyIsIERFRkFVTFRfUkVNT1RFX05BTUUsICJ1cmwiKTsKKwkJY2hlY2tMZnNVcmwoTEZTX1NFUlZFUl9VUkwxKTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHRoZSBjb25maWcgZmlsZSBwcmVjZWRlbmNlLgorCSAqCisJICogQ2hlY2tpbmcgb25seSB3aXRoIHRoZSBsb2NhbCByZXBvc2l0b3J5IGNvbmZpZyBpcyBzdWZmaWNpZW50IHNpbmNlIGZyb20KKwkgKiB0aGF0IHBvaW50IHRoZSAibm9ybWFsIiBwcmVjZWRlbmNlIGlzIHVzZWQuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tHZXRMZnNDb25uZWN0aW9uX0NvbmZpZ0ZpbGVQcmVjZWRlbmNlX2xmc2NvbmZpZ0Zyb21Xb3JraW5nRGlyKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQl3cml0ZUxmc0NvbmZpZygpOworCQljaGVja0xmc1VybChMRlNfU0VSVkVSX1VSTDEpOworCisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfU0VDVElPTl9MRlMsIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMLCBMRlNfU0VSVkVSX1VSTDIpOworCQljb25maWcuc2F2ZSgpOworCisJCWNoZWNrTGZzVXJsKExGU19TRVJWRVJfVVJMMik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fSW52YWxpZExmc0NvbmZpZ19Xb3JraW5nRGlyKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQl3cml0ZUludmFsaWRMZnNDb25maWcoKTsKKwkJTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBhY3R1YWxFeGNlcHRpb24gPSBhc3NlcnRUaHJvd3MoCisJCQkJTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4geworCQkJTGZzQ29ubmVjdGlvbkZhY3RvcnkuZ2V0TGZzQ29ubmVjdGlvbihkYiwgSHR0cFN1cHBvcnQuTUVUSE9EX1BPU1QsCisJCQkJCVByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRCk7CisJCX0pOworCQlhc3NlcnRUcnVlKGdldFN0YWNrVHJhY2UoYWN0dWFsRXhjZXB0aW9uKQorCQkJCS5jb250YWlucygiSW52YWxpZCBsaW5lIGluIGNvbmZpZyBmaWxlIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tHZXRMZnNDb25uZWN0aW9uX0ludmFsaWRMZnNDb25maWdfSW5kZXgoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlSW52YWxpZExmc0NvbmZpZygpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKS5jYWxsKCk7CisJCWRlbGV0ZVRyYXNoRmlsZShDb25zdGFudHMuRE9UX0xGU19DT05GSUcpOworCQlMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uIGFjdHVhbEV4Y2VwdGlvbiA9IGFzc2VydFRocm93cygKKwkJCQlMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQlMZnNDb25uZWN0aW9uRmFjdG9yeS5nZXRMZnNDb25uZWN0aW9uKGRiLCBIdHRwU3VwcG9ydC5NRVRIT0RfUE9TVCwKKwkJCQkJUHJvdG9jb2wuT1BFUkFUSU9OX0RPV05MT0FEKTsKKwkJfSk7CisJCWFzc2VydFRydWUoZ2V0U3RhY2tUcmFjZShhY3R1YWxFeGNlcHRpb24pCisJCQkJLmNvbnRhaW5zKCJJbnZhbGlkIGxpbmUgaW4gY29uZmlnIGZpbGUiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fSW52YWxpZExmc0NvbmZpZ19IRUFEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlSW52YWxpZExmc0NvbmZpZygpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJDb21taXQgTEZTIENvbmZpZyIpLmNhbGwoKTsKKworCQkvKgorCQkgKiByZWFkaW5nIC5sZnNjb25maWcgZnJvbSBIRUFEIHNlZW1zIG9ubHkgdGVzdGFibGUgdXNpbmcgYSBiYXJlIHJlcG8sCisJCSAqIHNpbmNlIG90aGVyd2lzZSB3b3JraW5nIHRyZWUgb3IgaW5kZXggYXJlIHVzZWQKKwkJICovCisJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdEJhcmVSZXBvIik7CisJCXRyeSAoUmVwb3NpdG9yeSBiYXJlUmVwb0RiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCisJCQkJLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLnNldEJhcmUodHJ1ZSkKKwkJCQkuY2FsbCgpLmdldFJlcG9zaXRvcnkoKSkgeworCQkJTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBhY3R1YWxFeGNlcHRpb24gPSBhc3NlcnRUaHJvd3MoCisJCQkJCUxmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IHsKKwkJCQkJCUxmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oZGIsCisJCQkJCQkJCUh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULAorCQkJCQkJCQlQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpOworCQkJCQl9KTsKKwkJCWFzc2VydFRydWUoZ2V0U3RhY2tUcmFjZShhY3R1YWxFeGNlcHRpb24pCisJCQkJCS5jb250YWlucygiSW52YWxpZCBsaW5lIGluIGNvbmZpZyBmaWxlIikpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFJlbW90ZVVybChTdHJpbmcgcmVtb3RVcmwpIHRocm93cyBFeGNlcHRpb24geworCQlSZW1vdGVBZGRDb21tYW5kIGFkZCA9IGdpdC5yZW1vdGVBZGQoKTsKKwkJYWRkLnNldFVyaShuZXcgVVJJaXNoKHJlbW90VXJsKSk7CisJCWFkZC5zZXROYW1lKG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FKTsKKwkJYWRkLmNhbGwoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgcHJvdmlkZWQgZXhjZXB0aW9uIGFzIHN0cmluZworCSAqCisJICogQHBhcmFtIGFjdHVhbEV4Y2VwdGlvbgorCSAqIEByZXR1cm4gVGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSBhcyBzdHJpbmcKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRTdGFja1RyYWNlKEV4Y2VwdGlvbiBhY3R1YWxFeGNlcHRpb24pIHsKKwkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7CisJCWFjdHVhbEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UocHcpOworCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVMZnNDb25maWcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl3cml0ZUxmc0NvbmZpZyhMRlNfU0VSVkVSX1VSTDEsICJsZnMiLCAidXJsIik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlTGZzQ29uZmlnKFN0cmluZyBsZnNVcmwsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgbmFtZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKGxmc1VybCwgc2VjdGlvbiwgbnVsbCwgbmFtZSk7CisJfQorCisJLyoKKwkgKiBXcml0ZSBzaW1wbGUgbGZzIGNvbmZpZyB3aXRoIHNpbmdsZSBlbnRyeS4gRG8gbm90IHVzZSBGaWxlQmFzZWRDb25maWcgdG8KKwkgKiBhdm9pZCBpbnRyb2R1Y2luZyBuZXcgZGVwZW5kZW5jeSAoZm9yIG5vdykuCisJICovCisJcHJpdmF0ZSB2b2lkIHdyaXRlTGZzQ29uZmlnKFN0cmluZyBsZnNVcmwsIFN0cmluZyBzZWN0aW9uLAorCQkJU3RyaW5nIHN1YnNlY3Rpb24sIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmdCdWlsZGVyIGNvbmZpZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWNvbmZpZy5hcHBlbmQoIlsiKTsKKwkJY29uZmlnLmFwcGVuZChzZWN0aW9uKTsKKwkJaWYgKHN1YnNlY3Rpb24gIT0gbnVsbCkgeworCQkJY29uZmlnLmFwcGVuZCgiIFwiIik7CisJCQljb25maWcuYXBwZW5kKHN1YnNlY3Rpb24pOworCQkJY29uZmlnLmFwcGVuZCgiXCIiKTsKKwkJfQorCQljb25maWcuYXBwZW5kKCJdXG4iKTsKKwkJY29uZmlnLmFwcGVuZCgiICAgICIpOworCQljb25maWcuYXBwZW5kKG5hbWUpOworCQljb25maWcuYXBwZW5kKCIgPSAiKTsKKwkJY29uZmlnLmFwcGVuZChsZnNVcmwpOworCQl3cml0ZVRyYXNoRmlsZShDb25zdGFudHMuRE9UX0xGU19DT05GSUcsIGNvbmZpZy50b1N0cmluZygpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVJbnZhbGlkTGZzQ29uZmlnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJd3JpdGVUcmFzaEZpbGUoQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHLAorCQkJCSJ7bGZzXVxuICAgIHVybCA9ICIgKyBMRlNfU0VSVkVSX1VSTDEpOworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja0xmc1VybChTdHJpbmcgbGZzVXJsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlIdHRwQ29ubmVjdGlvbiBsZnNTZXJ2ZXJDb25uOworCQlsZnNTZXJ2ZXJDb25uID0gTGZzQ29ubmVjdGlvbkZhY3RvcnkuZ2V0TGZzQ29ubmVjdGlvbihkYiwKKwkJCQlIdHRwU3VwcG9ydC5NRVRIT0RfUE9TVCwgUHJvdG9jb2wuT1BFUkFUSU9OX0RPV05MT0FEKTsKKworCQlhc3NlcnRFcXVhbHMobGZzVXJsICsgUHJvdG9jb2wuT0JKRUNUU19MRlNfRU5EUE9JTlQsCisJCQkJbGZzU2VydmVyQ29ubi5nZXRVUkwoKS50b1N0cmluZygpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDFkNWY3NmYuLmQxOWY2MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0xNyw2ICsxNyw3IEBACiAgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LnByb3BlcnRpZXMKaW5kZXggMGUwMGYxNC4uYzRjMGRhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzVGV4dC5wcm9wZXJ0aWVzCkBAIC0xLDE5ICsxLDE4IEBACiBjb3JydXB0TG9uZ09iamVjdD1UaGUgY29udGVudCBoYXNoICcnezB9Jycgb2YgdGhlIGxvbmcgb2JqZWN0ICcnezF9JycgZG9lc24nJ3QgbWF0Y2ggaXRzIGlkLCB0aGUgY29ycnVwdCBvYmplY3Qgd2lsbCBiZSBkZWxldGVkLgotaW5jb3JyZWN0TE9OR19PQkpFQ1RfSURfTEVOR1RIPUluY29ycmVjdCBMT05HX09CSkVDVF9JRF9MRU5HVEguCi1pbmNvbnNpc3RlbnRNZWRpYWZpbGVMZW5ndGg9TWVkaWFmaWxlIHswfSBoYXMgdW5leHBlY3RlZCBsZW5ndGg7IGV4cGVjdGVkIHsxfSBidXQgZm91bmQgezJ9LgorZG90TGZzQ29uZmlnUmVhZEZhaWxlZD1SZWFkaW5nIC5sZnNjb25maWcgZmFpbGVkCiBpbmNvbnNpc3RlbnRDb250ZW50TGVuZ3RoPVVuZXhwZWN0ZWQgY29udGVudCBsZW5ndGggcmVwb3J0ZWQgYnkgTEZTIHNlcnZlciAoezB9KSwgZXhwZWN0ZWQgezF9IGJ1dCByZXBvcnRlZCB3YXMgezJ9CitpbmNvbnNpc3RlbnRNZWRpYWZpbGVMZW5ndGg9TWVkaWFmaWxlIHswfSBoYXMgdW5leHBlY3RlZCBsZW5ndGg7IGV4cGVjdGVkIHsxfSBidXQgZm91bmQgezJ9LgoraW5jb3JyZWN0TE9OR19PQkpFQ1RfSURfTEVOR1RIPUluY29ycmVjdCBMT05HX09CSkVDVF9JRF9MRU5HVEguCiBpbnZhbGlkTG9uZ0lkPUludmFsaWQgaWQ6IHswfQogaW52YWxpZExvbmdJZExlbmd0aD1JbnZhbGlkIGlkIGxlbmd0aCB7MH07IHNob3VsZCBiZSB7MX0KK2xmc0ZhaWxlZFRvR2V0UmVwb3NpdG9yeT1mYWlsZWQgdG8gZ2V0IHJlcG9zaXRvcnkgezB9CitsZnNOb0Rvd25sb2FkVXJsPU5lZWQgdG8gZG93bmxvYWQgb2JqZWN0IGZyb20gTEZTIHNlcnZlciBidXQgY291bGRuJ3QgZGV0ZXJtaW5lIExGUyBzZXJ2ZXIgVVJMCitsZnNVbmF1dGhvcml6ZWQ9Tm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSBvcGVyYXRpb24gezB9IG9uIHJlcG9zaXRvcnkgezF9CiBsZnNVbmF2YWlsYWJsZT1MRlMgaXMgbm90IGF2YWlsYWJsZSBmb3IgcmVwb3NpdG9yeSB7MH0KK21pc3NpbmdMb2NhbE9iamVjdD1Mb2NhbCBPYmplY3QgezB9IGlzIG1pc3NpbmcKIHByb3RvY29sRXJyb3I9TEZTIFByb3RvY29sIEVycm9yIHswfTogezF9Ci1yZXF1aXJlZEhhc2hGdW5jdGlvbk5vdEF2YWlsYWJsZT1SZXF1aXJlZCBoYXNoIGZ1bmN0aW9uIHswfSBub3QgYXZhaWxhYmxlLgogcmVwb3NpdG9yeU5vdEZvdW5kPVJlcG9zaXRvcnkgezB9IG5vdCBmb3VuZAogcmVwb3NpdG9yeVJlYWRPbmx5PVJlcG9zaXRvcnkgezB9IGlzIHJlYWQtb25seQotbGZzVW5hdmFpbGFibGU9TEZTIGlzIG5vdCBhdmFpbGFibGUgZm9yIHJlcG9zaXRvcnkgezB9Ci1sZnNVbmF0aG9yaXplZD1Ob3QgYXV0aG9yaXplZCB0byBwZXJmb3JtIG9wZXJhdGlvbiB7MH0gb24gcmVwb3NpdG9yeSB7MX0KLWxmc0ZhaWxlZFRvR2V0UmVwb3NpdG9yeT1mYWlsZWQgdG8gZ2V0IHJlcG9zaXRvcnkgezB9Ci1sZnNOb0Rvd25sb2FkVXJsPSJOZWVkIHRvIGRvd25sb2FkIG9iamVjdCBmcm9tIExGUyBzZXJ2ZXIgYnV0IGNvdWxkbid0IGRldGVybWluZSBMRlMgc2VydmVyIFVSTCIKK3JlcXVpcmVkSGFzaEZ1bmN0aW9uTm90QXZhaWxhYmxlPVJlcXVpcmVkIGhhc2ggZnVuY3Rpb24gezB9IG5vdCBhdmFpbGFibGUuCiBzZXJ2ZXJGYWlsdXJlPVdoZW4gdHJ5aW5nIHRvIG9wZW4gYSBjb25uZWN0aW9uIHRvIHswfSB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yIGNvZGUuIHJjPXsxfQotd3JvbmdBbW91dE9mRGF0YVJlY2VpdmVkPVdoaWxlIGRvd25sb2FkaW5nIGRhdGEgZnJvbSB0aGUgY29udGVudCBzZXJ2ZXIgezB9IHsxfSBieXRlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2hpbGUgezJ9IGhhdmUgYmVlbiBleHBlY3RlZAotdXNlckNvbmZpZ0ludmFsaWQ9IlVzZXIgY29uZmlnIGZpbGUgezB9IGludmFsaWQgezF9IgotbWlzc2luZ0xvY2FsT2JqZWN0PSJMb2NhbCBPYmplY3QgezB9IGlzIG1pc3NpbmciClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQord3JvbmdBbW91bnRPZkRhdGFSZWNlaXZlZD1XaGlsZSBkb3dubG9hZGluZyBkYXRhIGZyb20gdGhlIGNvbnRlbnQgc2VydmVyIHswfSB7MX0gYnl0ZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdoaWxlIHsyfSBoYXZlIGJlZW4gZXhwZWN0ZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQcmVQdXNoSG9vay5qYXZhCmluZGV4IGQ2Y2U4NTUuLjliM2Q2MDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQcmVQdXNoSG9vay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQcmVQdXNoSG9vay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNywgTWFya3VzIER1ZnQgPG1hcmt1cy5kdWZ0QHNzaS1zY2hhZWZlci5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMiBNYXJrdXMgRHVmdCA8bWFya3VzLmR1ZnRAc3NpLXNjaGFlZmVyLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAxLDggKzEwMSwxMCBAQCBwdWJsaWMgU3RyaW5nIGNhbGwoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEFib3J0ZWRCeUhvb2tFeGNlcHRpb24gewogCQl9CiAJCUh0dHBDb25uZWN0aW9uIGFwaSA9IExmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oCiAJCQkJZ2V0UmVwb3NpdG9yeSgpLCBNRVRIT0RfUE9TVCwgT1BFUkFUSU9OX1VQTE9BRCk7Ci0JCU1hcDxTdHJpbmcsIExmc1BvaW50ZXI+IG9pZDJwdHIgPSByZXF1ZXN0QmF0Y2hVcGxvYWQoYXBpLCB0b1B1c2gpOwotCQl1cGxvYWRDb250ZW50cyhhcGksIG9pZDJwdHIpOworCQlpZiAoIWlzRHJ5UnVuKCkpIHsKKwkJCU1hcDxTdHJpbmcsIExmc1BvaW50ZXI+IG9pZDJwdHIgPSByZXF1ZXN0QmF0Y2hVcGxvYWQoYXBpLCB0b1B1c2gpOworCQkJdXBsb2FkQ29udGVudHMoYXBpLCBvaWQycHRyKTsKKwkJfQogCQlyZXR1cm4gRU1QVFk7CiAKIAl9CkBAIC0xMTMsNiArMTE1LDkgQEAgcHJpdmF0ZSBTZXQ8TGZzUG9pbnRlcj4gZmluZE9iamVjdHNUb1B1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAKIAkJdHJ5IChPYmplY3RXYWxrIHdhbGsgPSBuZXcgT2JqZWN0V2FsayhnZXRSZXBvc2l0b3J5KCkpKSB7CiAJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1cCA6IHJlZnMpIHsKKwkJCQlpZiAodXAuaXNEZWxldGUoKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CiAJCQkJd2Fsay5zZXRSZXdyaXRlUGFyZW50cyhmYWxzZSk7CiAJCQkJZXhjbHVkZVJlbW90ZVJlZnMod2Fsayk7CiAJCQkJd2Fsay5tYXJrU3RhcnQod2Fsay5wYXJzZUNvbW1pdCh1cC5nZXROZXdPYmplY3RJZCgpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEKaW5kZXggMzQxMTg4Ny4uYzI2YTFiZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9TbXVkZ2VGaWx0ZXIuamF2YQpAQCAtMjA1LDcgKzIwNSw3IEBAIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxQYXRoPiBkb3dubG9hZExmc1Jlc291cmNlKExmcyBsZnMsIFJlcG9zaXRvcnkgZGIsCiAJCQkJCWxvbmcgYnl0ZXNDb3BpZWQgPSBGaWxlcy5jb3B5KGNvbnRlbnRJbiwgcGF0aCk7CiAJCQkJCWlmIChieXRlc0NvcGllZCAhPSBvLnNpemUpIHsKIAkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkJTGZzVGV4dC5nZXQoKS53cm9uZ0Ftb3V0T2ZEYXRhUmVjZWl2ZWQsCisJCQkJCQkJCUxmc1RleHQuZ2V0KCkud3JvbmdBbW91bnRPZkRhdGFSZWNlaXZlZCwKIAkJCQkJCQkJY29udGVudFNlcnZlckNvbm4uZ2V0VVJMKCksCiAJCQkJCQkJCUxvbmcudmFsdWVPZihieXRlc0NvcGllZCksCiAJCQkJCQkJCUxvbmcudmFsdWVPZihvLnNpemUpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc1VuYXV0aG9yaXplZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2Vycm9ycy9MZnNVbmF1dGhvcml6ZWQuamF2YQppbmRleCAzNjg4OWRiLi4wZGM2YWVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc1VuYXV0aG9yaXplZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzVW5hdXRob3JpemVkLmphdmEKQEAgLTMxLDcgKzMxLDcgQEAgcHVibGljIGNsYXNzIExmc1VuYXV0aG9yaXplZCBleHRlbmRzIExmc0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBuYW1lLgogCSAqLwogCXB1YmxpYyBMZnNVbmF1dGhvcml6ZWQoU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoTGZzVGV4dC5nZXQoKS5sZnNVbmF0aG9yaXplZCwgb3BlcmF0aW9uLAorCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChMZnNUZXh0LmdldCgpLmxmc1VuYXV0aG9yaXplZCwgb3BlcmF0aW9uLAogCQkJCW5hbWUpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3Y2NiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25maWcuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiwgTWF0dGhpYXMgRnJvbW1lIDxtZnJvbW1lQGRzcGFjZS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQmxvYkJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkhFQUQ7CisKKy8qKgorICogRW5jYXBzdWxhdGUgYWNjZXNzIHRvIHRoZSB7QGNvZGUgLmxmc2NvbmZpZ30uCisgKiA8cD4KKyAqIEFjY29yZGluZyB0byB0aGUgZ2l0IGxmcyBkb2N1bWVudGF0aW9uIHRoZSBvcmRlciB0byBmaW5kIHRoZQorICoge0Bjb2RlIC5sZnNjb25maWd9IGZpbGUgaXM6CisgKiA8L3A+CisgKiA8b2w+CisgKiA8bGk+aW4gdGhlIHJvb3Qgb2YgdGhlIHdvcmtpbmcgdHJlZTwvbGk+CisgKiA8bGk+aW4gdGhlIGluZGV4PC9saT4KKyAqIDxsaT5pbiB0aGUgSEVBRDsgZm9yIGJhcmUgcmVwb3NpdG9yaWVzIHRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgdGhhdCBpcworICogc2VhcmNoZWQ8L2xpPgorICogPC9vbD4KKyAqIDxwPgorICogVmFsdWVzIGZyb20gdGhlIHtAY29kZSAubGZzY29uZmlnfSBhcmUgdXNlZCBvbmx5IGlmIG5vdCBzcGVjaWZpZWQgaW4gYW5vdGhlcgorICogZ2l0IGNvbmZpZyBmaWxlIHRvIGFsbG93IGxvY2FsIG92ZXJyaWRlIHdpdGhvdXQgbW9kaWZpY3Rpb24gb2YgYSBjb21taXR0ZWQKKyAqIGZpbGUuCisgKiA8L3A+CisgKgorICogQHNlZSA8YSBocmVmPQorICogICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2dpdC1sZnMvZ2l0LWxmcy9ibG9iL21haW4vZG9jcy9tYW4vZ2l0LWxmcy1jb25maWcuNS5yb25uIj5Db25maWd1cmF0aW9uCisgKiAgICAgIG9wdGlvbnMgZm9yIGdpdC1sZnM8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBMZnNDb25maWcgeworCXByaXZhdGUgUmVwb3NpdG9yeSBkYjsKKwlwcml2YXRlIENvbmZpZyBkZWxlZ2F0ZTsKKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgTGZzQ29uZmlnLgorCSAqCisJICogQHBhcmFtIGRiCisJICogICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCByZXBvCisJICovCisJcHVibGljIExmc0NvbmZpZyhSZXBvc2l0b3J5IGRiKSB7CisJCXRoaXMuZGIgPSBkYjsKKwl9CisKKwkvKioKKwkgKiBHZXR0ZXIgZm9yIHRoZSBkZWxlZ2F0ZSB0byBhbGxvdyBsYXp5IGluaXRpYWxpemF0aW9uLgorCSAqCisJICogQHJldHVybiB0aGUgZGVsZWdhdGUge0BsaW5rIENvbmZpZ30KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBDb25maWcgZ2V0RGVsZWdhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgeworCQkJZGVsZWdhdGUgPSB0aGlzLmxvYWQoKTsKKwkJfQorCQlyZXR1cm4gZGVsZWdhdGU7CisJfQorCisJLyoqCisJICogUmVhZCB0aGUgLmxmc2NvbmZpZyBmaWxlIGZyb20gdGhlIHJlcG9zaXRvcnkKKwkgKgorCSAqIEFuIGVtcHR5IGNvbmZpZyBpcyByZXR1cm5lZCBiZSBlbXB0eSBpZiBubyBsZnMgY29uZmlnIGV4aXN0cy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGxvYWRlZCBsZnMgY29uZmlnCisJICoKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBDb25maWcgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyByZXN1bHQgPSBudWxsOworCisJCWlmICghZGIuaXNCYXJlKCkpIHsKKwkJCXJlc3VsdCA9IGxvYWRGcm9tV29ya2luZ1RyZWUoKTsKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJCXJlc3VsdCA9IGxvYWRGcm9tSW5kZXgoKTsKKwkJCX0KKwkJfQorCisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gbG9hZEZyb21IZWFkKCk7CisJCX0KKworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IGVtcHR5Q29uZmlnKCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFRyeSB0byByZWFkIHRoZSBsZnMgY29uZmlnIGZyb20gYSBmaWxlIGNhbGxlZCAubGZzY29uZmlnIGF0IHRoZSB0b3AgbGV2ZWwKKwkgKiBvZiB0aGUgd29ya2luZyB0cmVlLgorCSAqCisJICogQHJldHVybiB0aGUgY29uZmlnLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlATnVsbGFibGUKKwlwcml2YXRlIENvbmZpZyBsb2FkRnJvbVdvcmtpbmdUcmVlKCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGUgbGZzQ29uZmlnID0gZGIuZ2V0RlMoKS5yZXNvbHZlKGRiLmdldFdvcmtUcmVlKCksCisJCQkJQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKTsKKwkJaWYgKGxmc0NvbmZpZy5pc0ZpbGUoKSkgeworCQkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IG5ldyBGaWxlQmFzZWRDb25maWcobGZzQ29uZmlnLCBkYi5nZXRGUygpKTsKKwkJCXRyeSB7CisJCQkJY29uZmlnLmxvYWQoKTsKKwkJCQlyZXR1cm4gY29uZmlnOworCQkJfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oCisJCQkJCQlMZnNUZXh0LmdldCgpLmRvdExmc0NvbmZpZ1JlYWRGYWlsZWQsIGUpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFRyeSB0byByZWFkIHRoZSBsZnMgY29uZmlnIGZyb20gYW4gZW50cnkgY2FsbGVkIC5sZnNjb25maWcgY29udGFpbmVkIGluCisJICogdGhlIGluZGV4LgorCSAqCisJICogQHJldHVybiB0aGUgY29uZmlnLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJQE51bGxhYmxlCisJcHJpdmF0ZSBDb25maWcgbG9hZEZyb21JbmRleCgpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJRGlyQ2FjaGVFbnRyeSBlbnRyeSA9IGRiLnJlYWREaXJDYWNoZSgpCisJCQkJCS5nZXRFbnRyeShDb25zdGFudHMuRE9UX0xGU19DT05GSUcpOworCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gbmV3IEJsb2JCYXNlZENvbmZpZyhudWxsLCBkYiwgZW50cnkuZ2V0T2JqZWN0SWQoKSk7CisJCQl9CisJCX0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oCisJCQkJCUxmc1RleHQuZ2V0KCkuZG90TGZzQ29uZmlnUmVhZEZhaWxlZCwgZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVHJ5IHRvIHJlYWQgdGhlIGxmcyBjb25maWcgZnJvbSBhbiBlbnRyeSBjYWxsZWQgLmxmc2NvbmZpZyBjb250YWluZWQgaW4KKwkgKiB0aGUgaGVhZCByZXZpc2lvbi4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNvbmZpZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJQE51bGxhYmxlCisJcHJpdmF0ZSBDb25maWcgbG9hZEZyb21IZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IChSZXZXYWxrIHJldldhbGsgPSBuZXcgUmV2V2FsayhkYikpIHsKKwkJCU9iamVjdElkIGhlYWRDb21taXRJZCA9IGRiLnJlc29sdmUoSEVBRCk7CisJCQlpZiAoaGVhZENvbW1pdElkID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCVJldkNvbW1pdCBjb21taXQgPSByZXZXYWxrLnBhcnNlQ29tbWl0KGhlYWRDb21taXRJZCk7CisJCQlSZXZUcmVlIHRyZWUgPSBjb21taXQuZ2V0VHJlZSgpOworCQkJVHJlZVdhbGsgdHJlZXdhbGsgPSBUcmVlV2Fsay5mb3JQYXRoKGRiLCBDb25zdGFudHMuRE9UX0xGU19DT05GSUcsCisJCQkJCXRyZWUpOworCQkJaWYgKHRyZWV3YWxrICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gbmV3IEJsb2JCYXNlZENvbmZpZyhudWxsLCBkYiwgdHJlZXdhbGsuZ2V0T2JqZWN0SWQoMCkpOworCQkJfQorCQl9IGNhdGNoIChDb25maWdJbnZhbGlkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKAorCQkJCQlMZnNUZXh0LmdldCgpLmRvdExmc0NvbmZpZ1JlYWRGYWlsZWQsIGUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhbiBlbXB0eSBjb25maWcgYXMgZmFsbGJhY2sgdG8gYXZvaWQgbnVsbCBwb2ludGVyIGNoZWNrcy4KKwkgKgorCSAqIEByZXR1cm4gYW4gZW1wdHkgY29uZmlnCisJICovCisJcHJpdmF0ZSBDb25maWcgZW1wdHlDb25maWcoKSB7CisJCXJldHVybiBuZXcgQ29uZmlnKCk7CisJfQorCisJLyoqCisJICogR2V0IHN0cmluZyB2YWx1ZSBvciBudWxsIGlmIG5vdCBmb3VuZC4KKwkgKgorCSAqIEZpcnN0IHRyaWVzIHRvIGZpbmQgdGhlIHZhbHVlIGluIHRoZSBnaXQgY29uZmlnIGZpbGVzLiBJZiBub3QgZm91bmQgdHJpZXMKKwkgKiB0byBmaW5kIGRhdGEgaW4gLmxmc2NvbmZpZy4KKwkgKgorCSAqIEBwYXJhbSBzZWN0aW9uCisJICogICAgICAgICAgICB0aGUgc2VjdGlvbgorCSAqIEBwYXJhbSBzdWJzZWN0aW9uCisJICogICAgICAgICAgICB0aGUgc3Vic2VjdGlvbiBmb3IgdGhlIHZhbHVlCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBrZXkgbmFtZQorCSAqIEByZXR1cm4gYSBTdHJpbmcgdmFsdWUgZnJvbSB0aGUgY29uZmlnLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJQE51bGxhYmxlCisJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoZmluYWwgU3RyaW5nIHNlY3Rpb24sIGZpbmFsIFN0cmluZyBzdWJzZWN0aW9uLAorCQkJZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyByZXN1bHQgPSBkYi5nZXRDb25maWcoKS5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gZ2V0RGVsZWdhdGUoKS5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCmluZGV4IGUyMjE5MTMuLjEyYjY4OGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNywgTWFya3VzIER1ZnQgPG1hcmt1cy5kdWZ0QHNzaS1zY2hhZWZlci5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMiBNYXJrdXMgRHVmdCA8bWFya3VzLmR1ZnRAc3NpLXNjaGFlZmVyLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMzksMTIgKzM5LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlNzaFN1cHBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIFByb3ZpZGVzIG1lYW5zIHRvIGdldCBhIHZhbGlkIExGUyBjb25uZWN0aW9uIGZvciBhIGdpdmVuIHJlcG9zaXRvcnkuCiAgKi8KIHB1YmxpYyBjbGFzcyBMZnNDb25uZWN0aW9uRmFjdG9yeSB7Ci0KIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1NIX0FVVEhfVElNRU9VVF9TRUNPTkRTID0gMzA7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9IVFRQUyA9ICJodHRwcyI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX1NTSCA9ICJzc2giOyAvLyROT04tTkxTLTEkCkBAIC02NCw3ICs2NCw3IEBAIHB1YmxpYyBjbGFzcyBMZnNDb25uZWN0aW9uRmFjdG9yeSB7CiAJICogICAgICAgICAgICBiZSB1c2VkIGZvcgogCSAqIEBwYXJhbSBwdXJwb3NlCiAJICogICAgICAgICAgICB0aGUgYWN0aW9uLCBlLmcuIFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRAotCSAqIEByZXR1cm4gdGhlIHVybCBmb3IgdGhlIGxmcyBzZXJ2ZXIuIGUuZy4KKwkgKiBAcmV0dXJuIHRoZSBjb25uZWN0aW9uIGZvciB0aGUgbGZzIHNlcnZlci4gZS5nLgogCSAqICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZ2l0LWxmcy5naXQvaW5mby9sZnMiCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwpAQCAtOTIsMTMgKzkyLDMwIEBAIHB1YmxpYyBzdGF0aWMgSHR0cENvbm5lY3Rpb24gZ2V0TGZzQ29ubmVjdGlvbihSZXBvc2l0b3J5IGRiLCBTdHJpbmcgbWV0aG9kLAogCQlyZXR1cm4gY29ubmVjdGlvbjsKIAl9CiAKKwkvKioKKwkgKiBHZXQgTEZTIFNlcnZlciBVUkwuCisJICoKKwkgKiBAcGFyYW0gZGIKKwkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRvIHdvcmsgd2l0aAorCSAqIEBwYXJhbSBwdXJwb3NlCisJICogICAgICAgICAgICB0aGUgYWN0aW9uLCBlLmcuIFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRAorCSAqIEBwYXJhbSBhZGRpdGlvbmFsSGVhZGVycworCSAqICAgICAgICAgICAgYWRkaXRpb25hbCBoZWFkZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byBMRlMgc2VydmVyCisJICogQHJldHVybiB0aGUgVVJMIGZvciB0aGUgTEZTIHNlcnZlci4gZS5nLgorCSAqICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZ2l0LWxmcy5naXQvaW5mby9sZnMiCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBMRlMgY29uZmlnIGlzIGludmFsaWQgb3IgY2Fubm90IGJlIGFjY2Vzc2VkCisJICogQHNlZSA8YSBocmVmPQorCSAqICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9naXQtbGZzL2dpdC1sZnMvYmxvYi9tYWluL2RvY3MvYXBpL3NlcnZlci1kaXNjb3ZlcnkubWQiPgorCSAqICAgICAgU2VydmVyIERpc2NvdmVyeSBkb2N1bWVudGF0aW9uPC9hPgorCSAqLwogCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMZnNVcmwoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIHB1cnBvc2UsCiAJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIZWFkZXJzKQotCQkJdGhyb3dzIExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24gewotCQlTdG9yZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlMZnNDb25maWcgY29uZmlnID0gbmV3IExmc0NvbmZpZyhkYik7CiAJCVN0cmluZyBsZnNVcmwgPSBjb25maWcuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfU0VDVElPTl9MRlMsCi0JCQkJbnVsbCwKLQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpOworCQkJCW51bGwsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCk7CisKIAkJRXhjZXB0aW9uIGV4ID0gbnVsbDsKIAkJaWYgKGxmc1VybCA9PSBudWxsKSB7CiAJCQlTdHJpbmcgcmVtb3RlVXJsID0gbnVsbDsKQEAgLTEwNiw2ICsxMjMsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQkJCWxmc1VybCA9IGNvbmZpZy5nZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19TRUNUSU9OX0xGUywKIAkJCQkJCXJlbW90ZSwKIAkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCk7CisKIAkJCQkvLyBUaGlzIGNvdWxkIGJlIGRvbmUgYmV0dGVyIChtb3JlIHByZWNpc2UgbG9naWMpLCBidXQgYWNjb3JkaW5nCiAJCQkJLy8gdG8gaHR0cHM6Ly9naXRodWIuY29tL2dpdC1sZnMvZ2l0LWxmcy9pc3N1ZXMvMTc1OSBnaXQtbGZzCiAJCQkJLy8gZ2VuZXJhbGx5IG9ubHkgc3VwcG9ydHMgJ29yaWdpbicgaW4gYW4gaW50ZWdyYXRlZCB3b3JrZmxvdy4KQEAgLTEyNSw4ICsxNDMsNiBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQkJCQkJfCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIGUpIHsKIAkJCQkJZXggPSBlOwogCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbGZzVXJsID0gbGZzVXJsICsgUHJvdG9jb2wuSU5GT19MRlNfRU5EUE9JTlQ7CiAJCQl9CiAJCX0KIAkJaWYgKGxmc1VybCA9PSBudWxsKSB7CkBAIC0xNDksNyArMTY1LDggQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRpc2NvdmVyTGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOwogCQkJcmV0dXJuIGFjdGlvbi5ocmVmOwogCQl9Ci0JCXJldHVybiByZW1vdGVVcmwgKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKKwkJcmV0dXJuIFN0cmluZ1V0aWxzLm5hbWVXaXRoRG90R2l0KHJlbW90ZVVybCkKKwkJCQkrIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwogCX0KIAogCXByaXZhdGUgc3RhdGljIFByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGdldFNzaEF1dGhlbnRpY2F0aW9uKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LmphdmEKaW5kZXggMWNhMzdhOS4uOGVmOGY1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzVGV4dC5qYXZhCkBAIC0yOCwyMSArMjgsMjEgQEAgcHVibGljIHN0YXRpYyBMZnNUZXh0IGdldCgpIHsKIAogCS8vIEBmb3JtYXR0ZXI6b2ZmCiAJLyoqKi8gcHVibGljIFN0cmluZyBjb3JydXB0TG9uZ09iamVjdDsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIGluY29uc2lzdGVudE1lZGlhZmlsZUxlbmd0aDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRvdExmc0NvbmZpZ1JlYWRGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbmNvbnNpc3RlbnRDb250ZW50TGVuZ3RoOworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5jb25zaXN0ZW50TWVkaWFmaWxlTGVuZ3RoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5jb3JyZWN0TE9OR19PQkpFQ1RfSURfTEVOR1RIOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZExvbmdJZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRMb25nSWRMZW5ndGg7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBsZnNVbmF2YWlsYWJsZTsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIHByb3RvY29sRXJyb3I7Ci0JLyoqKi8gcHVibGljIFN0cmluZyByZXF1aXJlZEhhc2hGdW5jdGlvbk5vdEF2YWlsYWJsZTsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcG9zaXRvcnlOb3RGb3VuZDsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcG9zaXRvcnlSZWFkT25seTsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc1VuYXRob3JpemVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbGZzRmFpbGVkVG9HZXRSZXBvc2l0b3J5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbGZzTm9Eb3dubG9hZFVybDsKLQkvKioqLyBwdWJsaWMgU3RyaW5nIHNlcnZlckZhaWx1cmU7Ci0JLyoqKi8gcHVibGljIFN0cmluZyB3cm9uZ0Ftb3V0T2ZEYXRhUmVjZWl2ZWQ7Ci0JLyoqKi8gcHVibGljIFN0cmluZyB1c2VyQ29uZmlnSW52YWxpZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc1VuYXV0aG9yaXplZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc1VuYXZhaWxhYmxlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbWlzc2luZ0xvY2FsT2JqZWN0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHJvdG9jb2xFcnJvcjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcG9zaXRvcnlOb3RGb3VuZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcG9zaXRvcnlSZWFkT25seTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHJlcXVpcmVkSGFzaEZ1bmN0aW9uTm90QXZhaWxhYmxlOworCS8qKiovIHB1YmxpYyBTdHJpbmcgc2VydmVyRmFpbHVyZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHdyb25nQW1vdW50T2ZEYXRhUmVjZWl2ZWQ7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Db25zdGFudHMuamF2YQppbmRleCAzMjEyYTYzLi45YjQxZWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQ29uc3RhbnRzLmphdmEKQEAgLTgyLDYgKzgyLDEzIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRklMVEVSX0RSSVZFUl9QUkVGSVggPSAibGZzLyI7CiAKIAkvKioKKwkgKiBDb25maWcgZmlsZSBuYW1lIGZvciBsZnMgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9MRlNfQ09ORklHID0gIi5sZnNjb25maWciOworCisJLyoqCiAJICogQ3JlYXRlIGEgbmV3IGRpZ2VzdCBmdW5jdGlvbiBmb3Igb2JqZWN0cy4KIAkgKgogCSAqIEByZXR1cm4gYSBuZXcgZGlnZXN0IG9iamVjdC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWYyNmMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCkBAIC0wLDAgKzEsMiBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2VuY29kaW5nLzxwcm9qZWN0Pj1VVEYtOApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWYyNmMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKQEAgLTAsMCArMSwyIEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvPHByb2plY3Q+PVVURi04CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnkvY2F0ZWdvcnkueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L2NhdGVnb3J5LnhtbAppbmRleCBhZjk1MjNmLi43ZmEyYjgzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnkvY2F0ZWdvcnkueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9jYXRlZ29yeS54bWwKQEAgLTE2NSwxMiArMTY1LDYgQEAKICAgIDxidW5kbGUgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIj4KICAgICAgIDxjYXRlZ29yeSBuYW1lPSJKR2l0LWRlcGVuZGVuY3ktYnVuZGxlcyIvPgogICAgPC9idW5kbGU+Ci0gICA8YnVuZGxlIGlkPSJvcmcuYXBhY2hlLmxvZzRqIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJKR2l0LWRlcGVuZGVuY3ktYnVuZGxlcyIvPgotICAgPC9idW5kbGU+Ci0gICA8YnVuZGxlIGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iSkdpdC1kZXBlbmRlbmN5LWJ1bmRsZXMiLz4KLSAgIDwvYnVuZGxlPgogICAgPGJ1bmRsZSBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiPgogICAgICAgPGNhdGVnb3J5IG5hbWU9IkpHaXQtZGVwZW5kZW5jeS1idW5kbGVzIi8+CiAgICA8L2J1bmRsZT4KQEAgLTIxOSwxMCArMjEzLDEwIEBACiAgICA8YnVuZGxlIGlkPSJvcmcuc2xmNGouYXBpLnNvdXJjZSI+CiAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iSkdpdC1kZXBlbmRlbmN5LWJ1bmRsZXMiLz4KICAgIDwvYnVuZGxlPgotICAgPGJ1bmRsZSBpZD0ib3JnLnNsZjRqLmJpbmRpbmcubG9nNGoxMiI+CisgICA8YnVuZGxlIGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUiPgogICAgICAgPGNhdGVnb3J5IG5hbWU9IkpHaXQtZGVwZW5kZW5jeS1idW5kbGVzIi8+CiAgICA8L2J1bmRsZT4KLSAgIDxidW5kbGUgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLmxvZzRqMTIuc291cmNlIj4KKyAgIDxidW5kbGUgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZS5zb3VyY2UiPgogICAgICAgPGNhdGVnb3J5IG5hbWU9IkpHaXQtZGVwZW5kZW5jeS1idW5kbGVzIi8+CiAgICA8L2J1bmRsZT4KICAgIDxidW5kbGUgaWQ9Im9yZy50dWthYW5pLnh6Ij4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2guZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjI2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCkBAIC0wLDAgKzEsMiBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2VuY29kaW5nLzxwcm9qZWN0Pj1VVEYtOApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjI2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKQEAgLTAsMCArMSwyIEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvPHByb2plY3Q+PVVURi04CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTcudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE3LnRhcmdldAppbmRleCA2ZDk2MDMzLi4zZDRmMjM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTcudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xNy50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtY2JpL3RhcmdldHBsYXRmb3JtLWRzbCAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjE3IiBzZXF1ZW5jZU51bWJlcj0iMTYzODY0ODcyOCI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4xNyIgc2VxdWVuY2VOdW1iZXI9IjE2NTQ1NTA2MzUiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Impha2FydGEuc2VydmxldC1hcGkiIHZlcnNpb249IjQuMC4wIi8+CkBAIC0yMywxMiArMjMsMTIgQEAKICAgICAgIDxyZXBvc2l0b3J5IGlkPSJqZXR0eS0xMC4wLngiIGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvamV0dHkvMTAuMC42LyIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2guc291cmNlIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliIiB2ZXJzaW9uPSIxLjEuMS52MjAxMjA1MTAyMzA1Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYi5zb3VyY2UiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliIiB2ZXJzaW9uPSIxLjEuMy52MjAyMjA1MDItMTgyMCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIuc291cmNlIiB2ZXJzaW9uPSIxLjEuMy52MjAyMjA1MDItMTgyMCIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA1MDMtMDM0MyIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hLnNvdXJjZSIgdmVyc2lvbj0iNS44LjAudjIwMjEwNTAzLTAzNDMiLz4KICAgICAgIDx1bml0IGlkPSJjb20uc3VuLmpuYS5wbGF0Zm9ybSIgdmVyc2lvbj0iNS44LjAudjIwMjEwNDA2LTEwMDQiLz4KQEAgLTM5LDggKzM5LDggQEAKICAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHktYWdlbnQiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNi0xNTM0Ii8+CiAgICAgICA8dW5pdCBpZD0ibmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA2LTE1MzQiLz4KICAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHkuc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDctMTQxMCIvPgotICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhIiB2ZXJzaW9uPSIwLjMuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSIgdmVyc2lvbj0iMC4zLjAudjIwMjEwOTIzLTE0MDEiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuaTJwLmNyeXB0by5lZGRzYSIgdmVyc2lvbj0iMC4zLjAudjIwMjIwNTA2LTEwMjAiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuaTJwLmNyeXB0by5lZGRzYS5zb3VyY2UiIHZlcnNpb249IjAuMy4wLnYyMDIyMDUwNi0xMDIwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5hbnQiIHZlcnNpb249IjEuMTAuMTIudjIwMjExMTAyLTE0NTIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmFudC5zb3VyY2UiIHZlcnNpb249IjEuMTAuMTIudjIwMjExMTAyLTE0NTIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMiIHZlcnNpb249IjEuMTQuMC52MjAyMDA4MTgtMTQyMiIvPgpAQCAtNTEsMjQgKzUxLDIyIEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIiB2ZXJzaW9uPSIxLjIuMC52MjAxODA0MDktMTUwMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudCIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGoiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0aiIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGouc291cmNlIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNzAuMC52MjAyMjA1MDctMTIwOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5zb3VyY2UiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CkBAIC04NSwxMSArODMsMTEgQEAKICAgICAgIDx1bml0IGlkPSJvcmcub2JqZW5lc2lzLnNvdXJjZSIgdmVyc2lvbj0iMi42LjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYXBpIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYXBpLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcubG9nNGoxMiIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMTEwOC0yMDQyIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcubG9nNGoxMi5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDExMDgtMjA0MiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHoiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHouc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgotICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIxMTEyMjE4MTkwMS9yZXBvc2l0b3J5Ii8+CisgICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjIwNTMxMTg1MzEwL3JlcG9zaXRvcnkiLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiIHZlcnNpb249IjAuMC4wIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTcudHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE3LnRwZAppbmRleCBjZDM2NGQzLi45YzgyNGM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTcudHBkCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xNy50cGQKQEAgLTEsNyArMSw3IEBACiB0YXJnZXQgImpnaXQtNC4xNyIgd2l0aCBzb3VyY2UgY29uZmlndXJlUGhhc2UKIAogaW5jbHVkZSAicHJvamVjdHMvamV0dHktMTAuMC54LnRwZCIKLWluY2x1ZGUgIm9yYml0L1IyMDIxMTEyMjE4MTkwMS0yMDIxLTEyLnRwZCIKK2luY2x1ZGUgIm9yYml0L1IyMDIyMDUzMTE4NTMxMC0yMDIyLTA2LnRwZCIKIAogbG9jYXRpb24gImh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvcmVsZWFzZXMvMjAyMC0wOS8iIHsKIAlvcmcuZWNsaXBzZS5vc2dpIGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOC50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTgudGFyZ2V0CmluZGV4IGNiZTI2YmIuLjYwM2ZlZmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOC50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE4LnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZS1jYmkvdGFyZ2V0cGxhdGZvcm0tZHNsIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuMTgiIHNlcXVlbmNlTnVtYmVyPSIxNjM4NjQ4NzI4Ij4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjE4IiBzZXF1ZW5jZU51bWJlcj0iMTY1NDU1MDYzNSI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0iamFrYXJ0YS5zZXJ2bGV0LWFwaSIgdmVyc2lvbj0iNC4wLjAiLz4KQEAgLTIzLDEyICsyMywxMiBAQAogICAgICAgPHJlcG9zaXRvcnkgaWQ9ImpldHR5LTEwLjAueCIgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9qZXR0eS8xMC4wLjYvIi8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2giIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaC5zb3VyY2UiIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliLnNvdXJjZSIgdmVyc2lvbj0iMS4xLjEudjIwMTIwNTEwMjMwNSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4zLnYyMDIyMDUwMi0xODIwIi8+CisgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYi5zb3VyY2UiIHZlcnNpb249IjEuMS4zLnYyMDIyMDUwMi0xODIwIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEiIHZlcnNpb249IjUuOC4wLnYyMDIxMDUwMy0wMzQzIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEuc291cmNlIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA1MDMtMDM0MyIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hLnBsYXRmb3JtIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA0MDYtMTAwNCIvPgpAQCAtMzksOCArMzksOCBAQAogICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudCIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA2LTE1MzQiLz4KICAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHktYWdlbnQuc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDYtMTUzNCIvPgogICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNy0xNDEwIi8+Ci0gICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2EiIHZlcnNpb249IjAuMy4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2Euc291cmNlIiB2ZXJzaW9uPSIwLjMuMC52MjAyMTA5MjMtMTQwMSIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhIiB2ZXJzaW9uPSIwLjMuMC52MjAyMjA1MDYtMTAyMCIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSIgdmVyc2lvbj0iMC4zLjAudjIwMjIwNTA2LTEwMjAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmFudCIgdmVyc2lvbj0iMS4xMC4xMi52MjAyMTExMDItMTQ1MiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuYW50LnNvdXJjZSIgdmVyc2lvbj0iMS4xMC4xMi52MjAyMTExMDItMTQ1MiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYyIgdmVyc2lvbj0iMS4xNC4wLnYyMDIwMDgxOC0xNDIyIi8+CkBAIC01MSwyNCArNTEsMjIgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UiIHZlcnNpb249IjEuMi4wLnYyMDE4MDQwOS0xNTAyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50IiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQuc291cmNlIiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0aiIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0ai5zb3VyY2UiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LnNvdXJjZSIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KQEAgLTg1LDExICs4MywxMSBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5vYmplbmVzaXMuc291cmNlIiB2ZXJzaW9uPSIyLjYuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5hcGkiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5hcGkuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5sb2c0ajEyIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAxMTA4LTIwNDIiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5sb2c0ajEyLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMTEwOC0yMDQyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54eiIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54ei5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+Ci0gICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjExMTIyMTgxOTAxL3JlcG9zaXRvcnkiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjA1MzExODUzMTAvcmVwb3NpdG9yeSIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2Uub3NnaSIgdmVyc2lvbj0iMC4wLjAiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOC50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTgudHBkCmluZGV4IDI3ZjM0NzEuLjFkY2RkOWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOC50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE4LnRwZApAQCAtMSw3ICsxLDcgQEAKIHRhcmdldCAiamdpdC00LjE4IiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQogCiBpbmNsdWRlICJwcm9qZWN0cy9qZXR0eS0xMC4wLngudHBkIgotaW5jbHVkZSAib3JiaXQvUjIwMjExMTIyMTgxOTAxLTIwMjEtMTIudHBkIgoraW5jbHVkZSAib3JiaXQvUjIwMjIwNTMxMTg1MzEwLTIwMjItMDYudHBkIgogCiBsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy8yMDIwLTEyLyIgewogCW9yZy5lY2xpcHNlLm9zZ2kgbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE5LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOS50YXJnZXQKaW5kZXggY2VmZjMwNS4uY2M0MThiMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE5LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTkudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWNiaS90YXJnZXRwbGF0Zm9ybS1kc2wgLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC4xOS1zdGFnaW5nIiBzZXF1ZW5jZU51bWJlcj0iMTYzODY0ODcyOCI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4xOS1zdGFnaW5nIiBzZXF1ZW5jZU51bWJlcj0iMTY1NDU1MDYzMiI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0iamFrYXJ0YS5zZXJ2bGV0LWFwaSIgdmVyc2lvbj0iNC4wLjAiLz4KQEAgLTIzLDEyICsyMywxMiBAQAogICAgICAgPHJlcG9zaXRvcnkgaWQ9ImpldHR5LTEwLjAueCIgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9qZXR0eS8xMC4wLjYvIi8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2giIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaC5zb3VyY2UiIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliLnNvdXJjZSIgdmVyc2lvbj0iMS4xLjEudjIwMTIwNTEwMjMwNSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4zLnYyMDIyMDUwMi0xODIwIi8+CisgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYi5zb3VyY2UiIHZlcnNpb249IjEuMS4zLnYyMDIyMDUwMi0xODIwIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEiIHZlcnNpb249IjUuOC4wLnYyMDIxMDUwMy0wMzQzIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEuc291cmNlIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA1MDMtMDM0MyIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hLnBsYXRmb3JtIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA0MDYtMTAwNCIvPgpAQCAtMzksOCArMzksOCBAQAogICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudCIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA2LTE1MzQiLz4KICAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHktYWdlbnQuc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDYtMTUzNCIvPgogICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNy0xNDEwIi8+Ci0gICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2EiIHZlcnNpb249IjAuMy4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2Euc291cmNlIiB2ZXJzaW9uPSIwLjMuMC52MjAyMTA5MjMtMTQwMSIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhIiB2ZXJzaW9uPSIwLjMuMC52MjAyMjA1MDYtMTAyMCIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSIgdmVyc2lvbj0iMC4zLjAudjIwMjIwNTA2LTEwMjAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmFudCIgdmVyc2lvbj0iMS4xMC4xMi52MjAyMTExMDItMTQ1MiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuYW50LnNvdXJjZSIgdmVyc2lvbj0iMS4xMC4xMi52MjAyMTExMDItMTQ1MiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYyIgdmVyc2lvbj0iMS4xNC4wLnYyMDIwMDgxOC0xNDIyIi8+CkBAIC01MSwyNCArNTEsMjIgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UiIHZlcnNpb249IjEuMi4wLnYyMDE4MDQwOS0xNTAyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50IiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQuc291cmNlIiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0aiIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0ai5zb3VyY2UiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LnNvdXJjZSIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KQEAgLTg1LDExICs4MywxMSBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5vYmplbmVzaXMuc291cmNlIiB2ZXJzaW9uPSIyLjYuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5hcGkiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5hcGkuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5sb2c0ajEyIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAxMTA4LTIwNDIiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5sb2c0ajEyLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMTEwOC0yMDQyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54eiIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54ei5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+Ci0gICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjExMTIyMTgxOTAxL3JlcG9zaXRvcnkiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjA1MzExODUzMTAvcmVwb3NpdG9yeSIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2Uub3NnaSIgdmVyc2lvbj0iMC4wLjAiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOS50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMTkudHBkCmluZGV4IDQxOTk5OTYuLjgwNjg1MWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4xOS50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjE5LnRwZApAQCAtMSw3ICsxLDcgQEAKIHRhcmdldCAiamdpdC00LjE5LXN0YWdpbmciIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCiAKIGluY2x1ZGUgInByb2plY3RzL2pldHR5LTEwLjAueC50cGQiCi1pbmNsdWRlICJvcmJpdC9SMjAyMTExMjIxODE5MDEtMjAyMS0xMi50cGQiCitpbmNsdWRlICJvcmJpdC9SMjAyMjA1MzExODUzMTAtMjAyMi0wNi50cGQiCiAKIGxvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3N0YWdpbmcvMjAyMS0wMy8iIHsKIAlvcmcuZWNsaXBzZS5vc2dpIGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMC50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjAudGFyZ2V0CmluZGV4IGUyZmVkMDYuLmVmY2I1OTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMC50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIwLnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZS1jYmkvdGFyZ2V0cGxhdGZvcm0tZHNsIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuMjAiIHNlcXVlbmNlTnVtYmVyPSIxNjM4NjQ4NzI4Ij4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjIwIiBzZXF1ZW5jZU51bWJlcj0iMTY1NDU1MDYzNCI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0iamFrYXJ0YS5zZXJ2bGV0LWFwaSIgdmVyc2lvbj0iNC4wLjAiLz4KQEAgLTIzLDEyICsyMywxMiBAQAogICAgICAgPHJlcG9zaXRvcnkgaWQ9ImpldHR5LTEwLjAueCIgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9qZXR0eS8xMC4wLjYvIi8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2giIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaC5zb3VyY2UiIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliLnNvdXJjZSIgdmVyc2lvbj0iMS4xLjEudjIwMTIwNTEwMjMwNSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4zLnYyMDIyMDUwMi0xODIwIi8+CisgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYi5zb3VyY2UiIHZlcnNpb249IjEuMS4zLnYyMDIyMDUwMi0xODIwIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEiIHZlcnNpb249IjUuOC4wLnYyMDIxMDUwMy0wMzQzIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEuc291cmNlIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA1MDMtMDM0MyIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hLnBsYXRmb3JtIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA0MDYtMTAwNCIvPgpAQCAtMzksOCArMzksOCBAQAogICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudCIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA2LTE1MzQiLz4KICAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHktYWdlbnQuc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDYtMTUzNCIvPgogICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNy0xNDEwIi8+Ci0gICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2EiIHZlcnNpb249IjAuMy4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2Euc291cmNlIiB2ZXJzaW9uPSIwLjMuMC52MjAyMTA5MjMtMTQwMSIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhIiB2ZXJzaW9uPSIwLjMuMC52MjAyMjA1MDYtMTAyMCIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSIgdmVyc2lvbj0iMC4zLjAudjIwMjIwNTA2LTEwMjAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmFudCIgdmVyc2lvbj0iMS4xMC4xMi52MjAyMTExMDItMTQ1MiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuYW50LnNvdXJjZSIgdmVyc2lvbj0iMS4xMC4xMi52MjAyMTExMDItMTQ1MiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYyIgdmVyc2lvbj0iMS4xNC4wLnYyMDIwMDgxOC0xNDIyIi8+CkBAIC01MSwyNCArNTEsMjIgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UiIHZlcnNpb249IjEuMi4wLnYyMDE4MDQwOS0xNTAyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50IiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQuc291cmNlIiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0aiIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0ai5zb3VyY2UiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LnNvdXJjZSIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KQEAgLTg1LDExICs4MywxMSBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5vYmplbmVzaXMuc291cmNlIiB2ZXJzaW9uPSIyLjYuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5hcGkiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5hcGkuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5sb2c0ajEyIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAxMTA4LTIwNDIiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5sb2c0ajEyLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMTEwOC0yMDQyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54eiIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54ei5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+Ci0gICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjExMTIyMTgxOTAxL3JlcG9zaXRvcnkiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjA1MzExODUzMTAvcmVwb3NpdG9yeSIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2Uub3NnaSIgdmVyc2lvbj0iMC4wLjAiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMC50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjAudHBkCmluZGV4IDM3MTIzZTUuLmEzZWE1ODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMC50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIwLnRwZApAQCAtMSw3ICsxLDcgQEAKIHRhcmdldCAiamdpdC00LjIwIiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQogCiBpbmNsdWRlICJwcm9qZWN0cy9qZXR0eS0xMC4wLngudHBkIgotaW5jbHVkZSAib3JiaXQvUjIwMjExMTIyMTgxOTAxLTIwMjEtMTIudHBkIgoraW5jbHVkZSAib3JiaXQvUjIwMjIwNTMxMTg1MzEwLTIwMjItMDYudHBkIgogCiBsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy8yMDIxLTA2LyIgewogCW9yZy5lY2xpcHNlLm9zZ2kgbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50YXJnZXQKaW5kZXggNGJkNTU0Ni4uODVlZDMxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWNiaS90YXJnZXRwbGF0Zm9ybS1kc2wgLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC4yMSIgc2VxdWVuY2VOdW1iZXI9IjE2Mzg2NDg3MjgiPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuMjEiIHNlcXVlbmNlTnVtYmVyPSIxNjU0NTUwNjM1Ij4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJqYWthcnRhLnNlcnZsZXQtYXBpIiB2ZXJzaW9uPSI0LjAuMCIvPgpAQCAtMjMsMTIgKzIzLDEyIEBACiAgICAgICA8cmVwb3NpdG9yeSBpZD0iamV0dHktMTAuMC54IiBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL2pldHR5LzEwLjAuNi8iLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaCIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoLnNvdXJjZSIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYiIgdmVyc2lvbj0iMS4xLjEudjIwMTIwNTEwMjMwNSIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIuc291cmNlIiB2ZXJzaW9uPSIxLjEuMS52MjAxMjA1MTAyMzA1Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYiIgdmVyc2lvbj0iMS4xLjMudjIwMjIwNTAyLTE4MjAiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliLnNvdXJjZSIgdmVyc2lvbj0iMS4xLjMudjIwMjIwNTAyLTE4MjAiLz4KICAgICAgIDx1bml0IGlkPSJjb20uc3VuLmpuYSIgdmVyc2lvbj0iNS44LjAudjIwMjEwNTAzLTAzNDMiLz4KICAgICAgIDx1bml0IGlkPSJjb20uc3VuLmpuYS5zb3VyY2UiIHZlcnNpb249IjUuOC4wLnYyMDIxMDUwMy0wMzQzIi8+CiAgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEucGxhdGZvcm0iIHZlcnNpb249IjUuOC4wLnYyMDIxMDQwNi0xMDA0Ii8+CkBAIC0zOSw4ICszOSw4IEBACiAgICAgICA8dW5pdCBpZD0ibmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50IiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDYtMTUzNCIvPgogICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudC5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNi0xNTM0Ii8+CiAgICAgICA8dW5pdCBpZD0ibmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA3LTE0MTAiLz4KLSAgICAgIDx1bml0IGlkPSJuZXQuaTJwLmNyeXB0by5lZGRzYSIgdmVyc2lvbj0iMC4zLjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJuZXQuaTJwLmNyeXB0by5lZGRzYS5zb3VyY2UiIHZlcnNpb249IjAuMy4wLnYyMDIxMDkyMy0xNDAxIi8+CisgICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2EiIHZlcnNpb249IjAuMy4wLnYyMDIyMDUwNi0xMDIwIi8+CisgICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2Euc291cmNlIiB2ZXJzaW9uPSIwLjMuMC52MjAyMjA1MDYtMTAyMCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuYW50IiB2ZXJzaW9uPSIxLjEwLjEyLnYyMDIxMTEwMi0xNDUyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5hbnQuc291cmNlIiB2ZXJzaW9uPSIxLjEwLjEyLnYyMDIxMTEwMi0xNDUyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvZGVjIiB2ZXJzaW9uPSIxLjE0LjAudjIwMjAwODE4LTE0MjIiLz4KQEAgLTUxLDI0ICs1MSwyMiBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjAudjIwMTgwNDA5LTE1MDIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudC5zb3VyY2UiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqIiB2ZXJzaW9uPSIxLjIuMTUudjIwMTAxMjA3MDgxNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGouc291cmNlIiB2ZXJzaW9uPSIxLjIuMTUudjIwMTAxMjA3MDgxNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGoiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqLnNvdXJjZSIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNzAuMC52MjAyMjA1MDctMTIwOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjA1MDctMTIwOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjA1MDctMTIwOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3Quc291cmNlIiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgpAQCAtODUsMTEgKzgzLDExIEBACiAgICAgICA8dW5pdCBpZD0ib3JnLm9iamVuZXNpcy5zb3VyY2UiIHZlcnNpb249IjIuNi4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmFwaSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmFwaS5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLmxvZzRqMTIiIHZlcnNpb249IjEuNy4zMC52MjAyMDExMDgtMjA0MiIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLmxvZzRqMTIuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAxMTA4LTIwNDIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZS5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6IiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KLSAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMTExMjIxODE5MDEvcmVwb3NpdG9yeSIvPgorICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIyMDUzMTE4NTMxMC9yZXBvc2l0b3J5Ii8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5vc2dpIiB2ZXJzaW9uPSIwLjAuMCIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50cGQKaW5kZXggMjk0OWU1MC4uMDgwODYwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRwZAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudHBkCkBAIC0xLDcgKzEsNyBAQAogdGFyZ2V0ICJqZ2l0LTQuMjEiIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCiAKIGluY2x1ZGUgInByb2plY3RzL2pldHR5LTEwLjAueC50cGQiCi1pbmNsdWRlICJvcmJpdC9SMjAyMTExMjIxODE5MDEtMjAyMS0xMi50cGQiCitpbmNsdWRlICJvcmJpdC9SMjAyMjA1MzExODUzMTAtMjAyMi0wNi50cGQiCiAKIGxvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzLzIwMjEtMDkvIiB7CiAJb3JnLmVjbGlwc2Uub3NnaSBsYXp5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRhcmdldAppbmRleCA5OGY0NGE4Li5lN2I1YTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtY2JpL3RhcmdldHBsYXRmb3JtLWRzbCAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjIyIiBzZXF1ZW5jZU51bWJlcj0iMTYzODY0ODczNiI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4yMiIgc2VxdWVuY2VOdW1iZXI9IjE2NTQ1NTA2MzQiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Impha2FydGEuc2VydmxldC1hcGkiIHZlcnNpb249IjQuMC4wIi8+CkBAIC0yMywxMiArMjMsMTIgQEAKICAgICAgIDxyZXBvc2l0b3J5IGlkPSJqZXR0eS0xMC4wLngiIGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvamV0dHkvMTAuMC42LyIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOC52MjAyMTEwMjktMDgzOCIvPgotICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CiAgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2guc291cmNlIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KLSAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliIiB2ZXJzaW9uPSIxLjEuMS52MjAxMjA1MTAyMzA1Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYi5zb3VyY2UiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliIiB2ZXJzaW9uPSIxLjEuMy52MjAyMjA1MDItMTgyMCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIuc291cmNlIiB2ZXJzaW9uPSIxLjEuMy52MjAyMjA1MDItMTgyMCIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA1MDMtMDM0MyIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hLnNvdXJjZSIgdmVyc2lvbj0iNS44LjAudjIwMjEwNTAzLTAzNDMiLz4KICAgICAgIDx1bml0IGlkPSJjb20uc3VuLmpuYS5wbGF0Zm9ybSIgdmVyc2lvbj0iNS44LjAudjIwMjEwNDA2LTEwMDQiLz4KQEAgLTM5LDggKzM5LDggQEAKICAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHktYWdlbnQiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNi0xNTM0Ii8+CiAgICAgICA8dW5pdCBpZD0ibmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA2LTE1MzQiLz4KICAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHkuc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDctMTQxMCIvPgotICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhIiB2ZXJzaW9uPSIwLjMuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSIgdmVyc2lvbj0iMC4zLjAudjIwMjEwOTIzLTE0MDEiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuaTJwLmNyeXB0by5lZGRzYSIgdmVyc2lvbj0iMC4zLjAudjIwMjIwNTA2LTEwMjAiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuaTJwLmNyeXB0by5lZGRzYS5zb3VyY2UiIHZlcnNpb249IjAuMy4wLnYyMDIyMDUwNi0xMDIwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5hbnQiIHZlcnNpb249IjEuMTAuMTIudjIwMjExMTAyLTE0NTIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmFudC5zb3VyY2UiIHZlcnNpb249IjEuMTAuMTIudjIwMjExMTAyLTE0NTIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMiIHZlcnNpb249IjEuMTQuMC52MjAyMDA4MTgtMTQyMiIvPgpAQCAtNTEsMjQgKzUxLDIyIEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIiB2ZXJzaW9uPSIxLjIuMC52MjAxODA0MDktMTUwMiIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudCIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE0LnYyMDIxMDEyOC0yMjI1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGoiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0aiIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGouc291cmNlIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwOTIzLTE0MDEiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjY5LjAudjIwMjEwNzEzLTE5MjQiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNzAuMC52MjAyMjA1MDctMTIwOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5zb3VyY2UiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CkBAIC04NSwxMSArODMsMTEgQEAKICAgICAgIDx1bml0IGlkPSJvcmcub2JqZW5lc2lzLnNvdXJjZSIgdmVyc2lvbj0iMi42LjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYXBpIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYXBpLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcubG9nNGoxMiIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMTEwOC0yMDQyIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcubG9nNGoxMi5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDExMDgtMjA0MiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHoiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHouc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgotICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIxMTEyMjE4MTkwMS9yZXBvc2l0b3J5Ii8+CisgICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjIwNTMxMTg1MzEwL3JlcG9zaXRvcnkiLz4KICAgICA8L2xvY2F0aW9uPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiIHZlcnNpb249IjAuMC4wIi8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRwZAppbmRleCBkYjNkYjI4Li41Njk3NTc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudHBkCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50cGQKQEAgLTEsNyArMSw3IEBACiB0YXJnZXQgImpnaXQtNC4yMiIgd2l0aCBzb3VyY2UgY29uZmlndXJlUGhhc2UKIAogaW5jbHVkZSAicHJvamVjdHMvamV0dHktMTAuMC54LnRwZCIKLWluY2x1ZGUgIm9yYml0L1IyMDIxMTEyMjE4MTkwMS0yMDIxLTEyLnRwZCIKK2luY2x1ZGUgIm9yYml0L1IyMDIyMDUzMTE4NTMxMC0yMDIyLTA2LnRwZCIKIAogbG9jYXRpb24gImh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvcmVsZWFzZXMvMjAyMS0xMi8iIHsKIAlvcmcuZWNsaXBzZS5vc2dpIGxhenkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMy50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjMudGFyZ2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMThlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjMudGFyZ2V0CkBAIC0wLDAgKzEsOTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPD9wZGU/PgorPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZS1jYmkvdGFyZ2V0cGxhdGZvcm0tZHNsIC0tPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuMjMiIHNlcXVlbmNlTnVtYmVyPSIxNjU0NTUwNjM0Ij4KKyAgPGxvY2F0aW9ucz4KKyAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KKyAgICAgIDx1bml0IGlkPSJqYWthcnRhLnNlcnZsZXQtYXBpIiB2ZXJzaW9uPSI0LjAuMCIvPgorICAgICAgPHVuaXQgaWQ9Impha2FydGEuc2VydmxldC1hcGkuc291cmNlIiB2ZXJzaW9uPSI0LjAuMCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5Lmh0dHAiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5Lmh0dHAuc291cmNlIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5pbyIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuaW8uc291cmNlIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5zZWN1cml0eSIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuc2VjdXJpdHkuc291cmNlIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5zb3VyY2UiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuc291cmNlIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS51dGlsIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNvdXJjZSIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkudXRpbC5hamF4IiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmFqYXguc291cmNlIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGlkPSJqZXR0eS0xMC4wLngiIGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvamV0dHkvMTAuMC42LyIvPgorICAgIDwvbG9jYXRpb24+CisgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UiIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2guc291cmNlIiB2ZXJzaW9uPSIwLjEuNTUudjIwMTkwNDA0LTE5MDIiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliIiB2ZXJzaW9uPSIxLjEuMy52MjAyMjA1MDItMTgyMCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIuc291cmNlIiB2ZXJzaW9uPSIxLjEuMy52MjAyMjA1MDItMTgyMCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA1MDMtMDM0MyIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hLnNvdXJjZSIgdmVyc2lvbj0iNS44LjAudjIwMjEwNTAzLTAzNDMiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uc3VuLmpuYS5wbGF0Zm9ybSIgdmVyc2lvbj0iNS44LjAudjIwMjEwNDA2LTEwMDQiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uc3VuLmpuYS5wbGF0Zm9ybS5zb3VyY2UiIHZlcnNpb249IjUuOC4wLnYyMDIxMDQwNi0xMDA0Ii8+CisgICAgICA8dW5pdCBpZD0iamF2YWV3YWgiIHZlcnNpb249IjEuMS4xMy52MjAyMTEwMjktMDgzOSIvPgorICAgICAgPHVuaXQgaWQ9ImphdmFld2FoLnNvdXJjZSIgdmVyc2lvbj0iMS4xLjEzLnYyMDIxMTAyOS0wODM5Ii8+CisgICAgICA8dW5pdCBpZD0ibmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5IiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDctMTQxMCIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudCIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA2LTE1MzQiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHktYWdlbnQuc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDYtMTUzNCIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNy0xNDEwIi8+CisgICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2EiIHZlcnNpb249IjAuMy4wLnYyMDIyMDUwNi0xMDIwIi8+CisgICAgICA8dW5pdCBpZD0ibmV0LmkycC5jcnlwdG8uZWRkc2Euc291cmNlIiB2ZXJzaW9uPSIwLjMuMC52MjAyMjA1MDYtMTAyMCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuYW50IiB2ZXJzaW9uPSIxLjEwLjEyLnYyMDIxMTEwMi0xNDUyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5hbnQuc291cmNlIiB2ZXJzaW9uPSIxLjEwLjEyLnYyMDIxMTEwMi0xNDUyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvZGVjIiB2ZXJzaW9uPSIxLjE0LjAudjIwMjAwODE4LTE0MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuc291cmNlIiB2ZXJzaW9uPSIxLjE0LjAudjIwMjAwODE4LTE0MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MiIHZlcnNpb249IjEuMjEuMC52MjAyMTExMDMtMjEwMCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5zb3VyY2UiIHZlcnNpb249IjEuMjEuMC52MjAyMTExMDMtMjEwMCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nIiB2ZXJzaW9uPSIxLjIuMC52MjAxODA0MDktMTUwMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjAudjIwMTgwNDA5LTE1MDIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudC5zb3VyY2UiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0ai5zb3VyY2UiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNzAuMC52MjAyMjA1MDctMTIwOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5zb3VyY2UiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5saWJyYXJ5IiB2ZXJzaW9uPSIxLjMuMC52MjAxODA1MjQtMjI0NiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5saWJyYXJ5LnNvdXJjZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNTI0LTIyNDYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuanVuaXQiIHZlcnNpb249IjQuMTMuMi52MjAyMTEwMTgtMTk1NiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5qdW5pdC5zb3VyY2UiIHZlcnNpb249IjQuMTMuMi52MjAyMTEwMTgtMTk1NiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0aiIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLm1vY2tpdG8iIHZlcnNpb249IjIuMjMuMC52MjAyMDAzMTAtMTY0MiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5tb2NraXRvLnNvdXJjZSIgdmVyc2lvbj0iMi4yMy4wLnYyMDIwMDMxMC0xNjQyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLm9iamVuZXNpcyIgdmVyc2lvbj0iMi42LjAudjIwMTgwNDIwLTE1MTkiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcub2JqZW5lc2lzLnNvdXJjZSIgdmVyc2lvbj0iMi42LjAudjIwMTgwNDIwLTE1MTkiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYXBpIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYXBpLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54eiIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54ei5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+CisgICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjIwNTMxMTg1MzEwL3JlcG9zaXRvcnkiLz4KKyAgICA8L2xvY2F0aW9uPgorICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiIHZlcnNpb249IjAuMC4wIi8+CisgICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy8yMDIyLTAzLyIvPgorICAgIDwvbG9jYXRpb24+CisgIDwvbG9jYXRpb25zPgorPC90YXJnZXQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjMudHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIzLnRwZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ0MjFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIzLnRwZApAQCAtMCwwICsxLDggQEAKK3RhcmdldCAiamdpdC00LjIzIiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQorCitpbmNsdWRlICJwcm9qZWN0cy9qZXR0eS0xMC4wLngudHBkIgoraW5jbHVkZSAib3JiaXQvUjIwMjIwNTMxMTg1MzEwLTIwMjItMDYudHBkIgorCitsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy8yMDIyLTAzLyIgeworCW9yZy5lY2xpcHNlLm9zZ2kgbGF6eQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjI0LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yNC50YXJnZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0NWU4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yNC50YXJnZXQKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8P3BkZT8+Cis8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWNiaS90YXJnZXRwbGF0Zm9ybS1kc2wgLS0+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC4yNCIgc2VxdWVuY2VOdW1iZXI9IjE2NTUzNzUyNTQiPgorICA8bG9jYXRpb25zPgorICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgorICAgICAgPHVuaXQgaWQ9Impha2FydGEuc2VydmxldC1hcGkiIHZlcnNpb249IjQuMC4wIi8+CisgICAgICA8dW5pdCBpZD0iamFrYXJ0YS5zZXJ2bGV0LWFwaS5zb3VyY2UiIHZlcnNpb249IjQuMC4wIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuaHR0cCIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuaHR0cC5zb3VyY2UiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmlvIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5pby5zb3VyY2UiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnNlY3VyaXR5IiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5zZWN1cml0eS5zb3VyY2UiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnNlcnZlciIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLnNvdXJjZSIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuc2VydmxldCIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5zb3VyY2UiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnV0aWwiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc291cmNlIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmFqYXgiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnV0aWwuYWpheC5zb3VyY2UiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHJlcG9zaXRvcnkgaWQ9ImpldHR5LTEwLjAueCIgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9qZXR0eS8xMC4wLjYvIi8+CisgICAgPC9sb2NhdGlvbj4KKyAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2giIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaC5zb3VyY2UiIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4zLnYyMDIyMDUwMi0xODIwIi8+CisgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYi5zb3VyY2UiIHZlcnNpb249IjEuMS4zLnYyMDIyMDUwMi0xODIwIi8+CisgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEiIHZlcnNpb249IjUuOC4wLnYyMDIxMDUwMy0wMzQzIi8+CisgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEuc291cmNlIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA1MDMtMDM0MyIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hLnBsYXRmb3JtIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA0MDYtMTAwNCIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5zdW4uam5hLnBsYXRmb3JtLnNvdXJjZSIgdmVyc2lvbj0iNS44LjAudjIwMjEwNDA2LTEwMDQiLz4KKyAgICAgIDx1bml0IGlkPSJqYXZhZXdhaCIgdmVyc2lvbj0iMS4xLjEzLnYyMDIxMTAyOS0wODM5Ii8+CisgICAgICA8dW5pdCBpZD0iamF2YWV3YWguc291cmNlIiB2ZXJzaW9uPSIxLjEuMTMudjIwMjExMDI5LTA4MzkiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHkiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNy0xNDEwIi8+CisgICAgICA8dW5pdCBpZD0ibmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50IiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDYtMTUzNCIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudC5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNi0xNTM0Ii8+CisgICAgICA8dW5pdCBpZD0ibmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA3LTE0MTAiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuaTJwLmNyeXB0by5lZGRzYSIgdmVyc2lvbj0iMC4zLjAudjIwMjIwNTA2LTEwMjAiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuaTJwLmNyeXB0by5lZGRzYS5zb3VyY2UiIHZlcnNpb249IjAuMy4wLnYyMDIyMDUwNi0xMDIwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5hbnQiIHZlcnNpb249IjEuMTAuMTIudjIwMjExMTAyLTE0NTIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmFudC5zb3VyY2UiIHZlcnNpb249IjEuMTAuMTIudjIwMjExMTAyLTE0NTIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMiIHZlcnNpb249IjEuMTQuMC52MjAyMDA4MTgtMTQyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5zb3VyY2UiIHZlcnNpb249IjEuMTQuMC52MjAyMDA4MTgtMTQyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcyIgdmVyc2lvbj0iMS4yMS4wLnYyMDIxMTEwMy0yMTAwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLnNvdXJjZSIgdmVyc2lvbj0iMS4yMS4wLnYyMDIxMTEwMy0yMTAwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmciIHZlcnNpb249IjEuMi4wLnYyMDE4MDQwOS0xNTAyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIiB2ZXJzaW9uPSIxLjIuMC52MjAxODA0MDktMTUwMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudCIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSIgdmVyc2lvbj0iNC41LjEzLnYyMDIxMDEyOC0yMjI1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cCIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGoiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqLnNvdXJjZSIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDUwNy0xMjA4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LnNvdXJjZSIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmxpYnJhcnkiIHZlcnNpb249IjEuMy4wLnYyMDE4MDUyNC0yMjQ2Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmxpYnJhcnkuc291cmNlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA1MjQtMjI0NiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5qdW5pdCIgdmVyc2lvbj0iNC4xMy4yLnYyMDIxMTAxOC0xOTU2Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmp1bml0LnNvdXJjZSIgdmVyc2lvbj0iNC4xMy4yLnYyMDIxMTAxOC0xOTU2Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGouc291cmNlIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcubW9ja2l0byIgdmVyc2lvbj0iMi4yMy4wLnYyMDIwMDMxMC0xNjQyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLm1vY2tpdG8uc291cmNlIiB2ZXJzaW9uPSIyLjIzLjAudjIwMjAwMzEwLTE2NDIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcub2JqZW5lc2lzIiB2ZXJzaW9uPSIyLjYuMC52MjAxODA0MjAtMTUxOSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5vYmplbmVzaXMuc291cmNlIiB2ZXJzaW9uPSIyLjYuMC52MjAxODA0MjAtMTUxOSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5hcGkiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5hcGkuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZS5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6IiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy50dWthYW5pLnh6LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjA1MzExODUzMTAvcmVwb3NpdG9yeSIvPgorICAgIDwvbG9jYXRpb24+CisgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2Uub3NnaSIgdmVyc2lvbj0iMC4wLjAiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzLzIwMjItMDYvIi8+CisgICAgPC9sb2NhdGlvbj4KKyAgPC9sb2NhdGlvbnM+Cis8L3RhcmdldD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yNC50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjQudHBkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNThhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjQudHBkCkBAIC0wLDAgKzEsOCBAQAordGFyZ2V0ICJqZ2l0LTQuMjQiIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCisKK2luY2x1ZGUgInByb2plY3RzL2pldHR5LTEwLjAueC50cGQiCitpbmNsdWRlICJvcmJpdC9SMjAyMjA1MzExODUzMTAtMjAyMi0wNi50cGQiCisKK2xvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzLzIwMjItMDYvIiB7CisJb3JnLmVjbGlwc2Uub3NnaSBsYXp5Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjUudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjI1LnRhcmdldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWM5ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjI1LnRhcmdldApAQCAtMCwwICsxLDk3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzw/cGRlPz4KKzwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtY2JpL3RhcmdldHBsYXRmb3JtLWRzbCAtLT4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjI1IiBzZXF1ZW5jZU51bWJlcj0iMTY1NTQ1NDM3OCI+CisgIDxsb2NhdGlvbnM+CisgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CisgICAgICA8dW5pdCBpZD0iamFrYXJ0YS5zZXJ2bGV0LWFwaSIgdmVyc2lvbj0iNC4wLjAiLz4KKyAgICAgIDx1bml0IGlkPSJqYWthcnRhLnNlcnZsZXQtYXBpLnNvdXJjZSIgdmVyc2lvbj0iNC4wLjAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5odHRwIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5odHRwLnNvdXJjZSIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuaW8iIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmlvLnNvdXJjZSIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuc2VjdXJpdHkiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnNlY3VyaXR5LnNvdXJjZSIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuc2VydmVyIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuc291cmNlIiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0IiB2ZXJzaW9uPSIxMC4wLjYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LnNvdXJjZSIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkudXRpbCIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkudXRpbC5zb3VyY2UiIHZlcnNpb249IjEwLjAuNiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LnV0aWwuYWpheCIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkudXRpbC5hamF4LnNvdXJjZSIgdmVyc2lvbj0iMTAuMC42Ii8+CisgICAgICA8cmVwb3NpdG9yeSBpZD0iamV0dHktMTAuMC54IiBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL2pldHR5LzEwLjAuNi8iLz4KKyAgICA8L2xvY2F0aW9uPgorICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgorICAgICAgPHVuaXQgaWQ9ImNvbS5nb29nbGUuZ3NvbiIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24uc291cmNlIiB2ZXJzaW9uPSIyLjguOS52MjAyMjAxMTEtMTQwOSIvPgorICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaCIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CisgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qc2NoLnNvdXJjZSIgdmVyc2lvbj0iMC4xLjU1LnYyMDE5MDQwNC0xOTAyIi8+CisgICAgICA8dW5pdCBpZD0iY29tLmpjcmFmdC5qemxpYiIgdmVyc2lvbj0iMS4xLjMudjIwMjIwNTAyLTE4MjAiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0Lmp6bGliLnNvdXJjZSIgdmVyc2lvbj0iMS4xLjMudjIwMjIwNTAyLTE4MjAiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uc3VuLmpuYSIgdmVyc2lvbj0iNS44LjAudjIwMjEwNTAzLTAzNDMiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uc3VuLmpuYS5zb3VyY2UiIHZlcnNpb249IjUuOC4wLnYyMDIxMDUwMy0wMzQzIi8+CisgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEucGxhdGZvcm0iIHZlcnNpb249IjUuOC4wLnYyMDIxMDQwNi0xMDA0Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLnN1bi5qbmEucGxhdGZvcm0uc291cmNlIiB2ZXJzaW9uPSI1LjguMC52MjAyMTA0MDYtMTAwNCIvPgorICAgICAgPHVuaXQgaWQ9ImphdmFld2FoIiB2ZXJzaW9uPSIxLjEuMTMudjIwMjExMDI5LTA4MzkiLz4KKyAgICAgIDx1bml0IGlkPSJqYXZhZXdhaC5zb3VyY2UiIHZlcnNpb249IjEuMS4xMy52MjAyMTEwMjktMDgzOSIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeSIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA3LTE0MTAiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHktYWdlbnQiIHZlcnNpb249IjEuOS4wLnYyMDE4MTEwNi0xNTM0Ii8+CisgICAgICA8dW5pdCBpZD0ibmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50LnNvdXJjZSIgdmVyc2lvbj0iMS45LjAudjIwMTgxMTA2LTE1MzQiLz4KKyAgICAgIDx1bml0IGlkPSJuZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHkuc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAxODExMDctMTQxMCIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhIiB2ZXJzaW9uPSIwLjMuMC52MjAyMjA1MDYtMTAyMCIvPgorICAgICAgPHVuaXQgaWQ9Im5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSIgdmVyc2lvbj0iMC4zLjAudjIwMjIwNTA2LTEwMjAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmFudCIgdmVyc2lvbj0iMS4xMC4xMi52MjAyMTExMDItMTQ1MiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuYW50LnNvdXJjZSIgdmVyc2lvbj0iMS4xMC4xMi52MjAyMTExMDItMTQ1MiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYyIgdmVyc2lvbj0iMS4xNC4wLnYyMDIwMDgxOC0xNDIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLnNvdXJjZSIgdmVyc2lvbj0iMS4xNC4wLnYyMDIwMDgxOC0xNDIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzIiB2ZXJzaW9uPSIxLjIxLjAudjIwMjExMTAzLTIxMDAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3Muc291cmNlIiB2ZXJzaW9uPSIxLjIxLjAudjIwMjExMTAzLTIxMDAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyIgdmVyc2lvbj0iMS4yLjAudjIwMTgwNDA5LTE1MDIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UiIHZlcnNpb249IjEuMi4wLnYyMDE4MDQwOS0xNTAyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50IiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQuc291cmNlIiB2ZXJzaW9uPSI0LjUuMTMudjIwMjEwMTI4LTIyMjUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlLnNvdXJjZSIgdmVyc2lvbj0iNC40LjE1LnYyMDIyMDIwOS0yMzQ1Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLm9zZ2kuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0aiIgdmVyc2lvbj0iMy4yMC4yLnYyMDIxMDcwNi0xMTA0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFzc2VydGouc291cmNlIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGciIHZlcnNpb249IjEuNzAuMC52MjAyMjA1MDctMTIwOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZy5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjA1MDctMTIwOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92IiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwNTA3LTEyMDgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjA1MDctMTIwOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbC5zb3VyY2UiIHZlcnNpb249IjEuNzAuMC52MjAyMjAxMDUtMTUyMiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3Quc291cmNlIiB2ZXJzaW9uPSIyLjIuMC52MjAyMTA3MTEtMDgyMSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QubGlicmFyeSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNTI0LTIyNDYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QubGlicmFyeS5zb3VyY2UiIHZlcnNpb249IjEuMy4wLnYyMDE4MDUyNC0yMjQ2Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmp1bml0IiB2ZXJzaW9uPSI0LjEzLjIudjIwMjExMDE4LTE5NTYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuanVuaXQuc291cmNlIiB2ZXJzaW9uPSI0LjEzLjIudjIwMjExMDE4LTE5NTYiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGoiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5tb2NraXRvIiB2ZXJzaW9uPSIyLjIzLjAudjIwMjAwMzEwLTE2NDIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcubW9ja2l0by5zb3VyY2UiIHZlcnNpb249IjIuMjMuMC52MjAyMDAzMTAtMTY0MiIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5vYmplbmVzaXMiIHZlcnNpb249IjIuNi4wLnYyMDE4MDQyMC0xNTE5Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLm9iamVuZXNpcy5zb3VyY2UiIHZlcnNpb249IjIuNi4wLnYyMDE4MDQyMC0xNTE5Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmFwaSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmFwaS5zb3VyY2UiIHZlcnNpb249IjEuNy4zMC52MjAyMDAyMDQtMjE1MCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSIgdmVyc2lvbj0iMS43LjMwLnYyMDIwMDIwNC0yMTUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHoiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLnR1a2FhbmkueHouc291cmNlIiB2ZXJzaW9uPSIxLjkuMC52MjAyMTA2MjQtMTI1OSIvPgorICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzL2Ryb3BzL1IyMDIyMDUzMTE4NTMxMC9yZXBvc2l0b3J5Ii8+CisgICAgPC9sb2NhdGlvbj4KKyAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KKyAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5vc2dpIiB2ZXJzaW9uPSIwLjAuMCIvPgorICAgICAgPHJlcG9zaXRvcnkgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvc3RhZ2luZy8yMDIyLTA5LyIvPgorICAgIDwvbG9jYXRpb24+CisgIDwvbG9jYXRpb25zPgorPC90YXJnZXQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjUudHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjI1LnRwZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE1Nzc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjI1LnRwZApAQCAtMCwwICsxLDggQEAKK3RhcmdldCAiamdpdC00LjI1IiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQorCitpbmNsdWRlICJwcm9qZWN0cy9qZXR0eS0xMC4wLngudHBkIgoraW5jbHVkZSAib3JiaXQvUjIwMjIwNTMxMTg1MzEwLTIwMjItMDYudHBkIgorCitsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9zdGFnaW5nLzIwMjItMDkvIiB7CisJb3JnLmVjbGlwc2Uub3NnaSBsYXp5Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAyMTEyMTMxNzM4MTMtMjAyMS0xMi50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAyMTEyMTMxNzM4MTMtMjAyMS0xMi50cGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3Yzg0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDIxMTIxMzE3MzgxMy0yMDIxLTEyLnRwZApAQCAtMCwwICsxLDY5IEBACit0YXJnZXQgIlIyMDIxMTIxMzE3MzgxMy0yMDIxLTEyIiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQorLy8gc2VlIGh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzLworCitsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjExMjEzMTczODEzL3JlcG9zaXRvcnkiIHsKKwljb20uZ29vZ2xlLmdzb24gWzIuOC44LnYyMDIxMTAyOS0wODM4LDIuOC44LnYyMDIxMTAyOS0wODM4XQorCWNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UgWzIuOC44LnYyMDIxMTAyOS0wODM4LDIuOC44LnYyMDIxMTAyOS0wODM4XQorCWNvbS5qY3JhZnQuanNjaCBbMC4xLjU1LnYyMDE5MDQwNC0xOTAyLDAuMS41NS52MjAxOTA0MDQtMTkwMl0KKwljb20uamNyYWZ0LmpzY2guc291cmNlIFswLjEuNTUudjIwMTkwNDA0LTE5MDIsMC4xLjU1LnYyMDE5MDQwNC0xOTAyXQorCWNvbS5qY3JhZnQuanpsaWIgWzEuMS4xLnYyMDEyMDUxMDIzMDUsMS4xLjEudjIwMTIwNTEwMjMwNV0KKwljb20uamNyYWZ0Lmp6bGliLnNvdXJjZSBbMS4xLjEudjIwMTIwNTEwMjMwNSwxLjEuMS52MjAxMjA1MTAyMzA1XQorCWNvbS5zdW4uam5hIFs1LjguMC52MjAyMTA1MDMtMDM0Myw1LjguMC52MjAyMTA1MDMtMDM0M10KKwljb20uc3VuLmpuYS5zb3VyY2UgWzUuOC4wLnYyMDIxMDUwMy0wMzQzLDUuOC4wLnYyMDIxMDUwMy0wMzQzXQorCWNvbS5zdW4uam5hLnBsYXRmb3JtIFs1LjguMC52MjAyMTA0MDYtMTAwNCw1LjguMC52MjAyMTA0MDYtMTAwNF0KKwljb20uc3VuLmpuYS5wbGF0Zm9ybS5zb3VyY2UgWzUuOC4wLnYyMDIxMDQwNi0xMDA0LDUuOC4wLnYyMDIxMDQwNi0xMDA0XQorCWphdmFld2FoIFsxLjEuMTMudjIwMjExMDI5LTA4MzksMS4xLjEzLnYyMDIxMTAyOS0wODM5XQorCWphdmFld2FoLnNvdXJjZSBbMS4xLjEzLnYyMDIxMTAyOS0wODM5LDEuMS4xMy52MjAyMTEwMjktMDgzOV0KKwluZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHkgWzEuOS4wLnYyMDE4MTEwNy0xNDEwLDEuOS4wLnYyMDE4MTEwNy0xNDEwXQorCW5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudCBbMS45LjAudjIwMTgxMTA2LTE1MzQsMS45LjAudjIwMTgxMTA2LTE1MzRdCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50LnNvdXJjZSBbMS45LjAudjIwMTgxMTA2LTE1MzQsMS45LjAudjIwMTgxMTA2LTE1MzRdCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LnNvdXJjZSBbMS45LjAudjIwMTgxMTA3LTE0MTAsMS45LjAudjIwMTgxMTA3LTE0MTBdCisJbmV0LmkycC5jcnlwdG8uZWRkc2EgWzAuMy4wLnYyMDIxMDkyMy0xNDAxLDAuMy4wLnYyMDIxMDkyMy0xNDAxXQorCW5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSBbMC4zLjAudjIwMjEwOTIzLTE0MDEsMC4zLjAudjIwMjEwOTIzLTE0MDFdCisJb3JnLmFwYWNoZS5hbnQgWzEuMTAuMTIudjIwMjExMTAyLTE0NTIsMS4xMC4xMi52MjAyMTExMDItMTQ1Ml0KKwlvcmcuYXBhY2hlLmFudC5zb3VyY2UgWzEuMTAuMTIudjIwMjExMTAyLTE0NTIsMS4xMC4xMi52MjAyMTExMDItMTQ1Ml0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMgWzEuMTQuMC52MjAyMDA4MTgtMTQyMiwxLjE0LjAudjIwMjAwODE4LTE0MjJdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLnNvdXJjZSBbMS4xNC4wLnYyMDIwMDgxOC0xNDIyLDEuMTQuMC52MjAyMDA4MTgtMTQyMl0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MgWzEuMjEuMC52MjAyMTExMDMtMjEwMCwxLjIxLjAudjIwMjExMTAzLTIxMDBdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLnNvdXJjZSBbMS4yMS4wLnYyMDIxMTEwMy0yMTAwLDEuMjEuMC52MjAyMTExMDMtMjEwMF0KKwlvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyBbMS4yLjAudjIwMTgwNDA5LTE1MDIsMS4yLjAudjIwMTgwNDA5LTE1MDJdCisJb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIFsxLjIuMC52MjAxODA0MDktMTUwMiwxLjIuMC52MjAxODA0MDktMTUwMl0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQgWzQuNS4xMy52MjAyMTAxMjgtMjIyNSw0LjUuMTMudjIwMjEwMTI4LTIyMjVdCisJb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSBbNC41LjEzLnYyMDIxMDEyOC0yMjI1LDQuNS4xMy52MjAyMTAxMjgtMjIyNV0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIFs0LjQuMTQudjIwMjEwMTI4LTIyMjUsNC40LjE0LnYyMDIxMDEyOC0yMjI1XQorCW9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIFs0LjQuMTQudjIwMjEwMTI4LTIyMjUsNC40LjE0LnYyMDIxMDEyOC0yMjI1XQorCW9yZy5hcGFjaGUuc3NoZC5vc2dpIFsyLjcuMC52MjAyMTA2MjMtMDYxOCwyLjcuMC52MjAyMTA2MjMtMDYxOF0KKwlvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UgWzIuNy4wLnYyMDIxMDYyMy0wNjE4LDIuNy4wLnYyMDIxMDYyMy0wNjE4XQorCW9yZy5hcGFjaGUuc3NoZC5zZnRwIFsyLjcuMC52MjAyMTA2MjMtMDYxOCwyLjcuMC52MjAyMTA2MjMtMDYxOF0KKwlvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UgWzIuNy4wLnYyMDIxMDYyMy0wNjE4LDIuNy4wLnYyMDIxMDYyMy0wNjE4XQorCW9yZy5hc3NlcnRqIFszLjIwLjIudjIwMjEwNzA2LTExMDQsMy4yMC4yLnYyMDIxMDcwNi0xMTA0XQorCW9yZy5hc3NlcnRqLnNvdXJjZSBbMy4yMC4yLnYyMDIxMDcwNi0xMTA0LDMuMjAuMi52MjAyMTA3MDYtMTEwNF0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGcgWzEuNjkuMC52MjAyMTA3MTMtMTkyNCwxLjY5LjAudjIwMjEwNzEzLTE5MjRdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSBbMS42OS4wLnYyMDIxMDcxMy0xOTI0LDEuNjkuMC52MjAyMTA3MTMtMTkyNF0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCBbMS42OS4wLnYyMDIxMDcxMy0xOTI0LDEuNjkuMC52MjAyMTA3MTMtMTkyNF0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UgWzEuNjkuMC52MjAyMTA3MTMtMTkyNCwxLjY5LjAudjIwMjEwNzEzLTE5MjRdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YgWzEuNjkuMC52MjAyMTA5MjMtMTQwMSwxLjY5LjAudjIwMjEwOTIzLTE0MDFdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIFsxLjY5LjAudjIwMjEwOTIzLTE0MDEsMS42OS4wLnYyMDIxMDkyMy0xNDAxXQorCW9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIFsxLjY5LjAudjIwMjEwNzEzLTE5MjQsMS42OS4wLnYyMDIxMDcxMy0xOTI0XQorCW9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSBbMS42OS4wLnYyMDIxMDcxMy0xOTI0LDEuNjkuMC52MjAyMTA3MTMtMTkyNF0KKwlvcmcuaGFtY3Jlc3QgWzIuMi4wLnYyMDIxMDcxMS0wODIxLDIuMi4wLnYyMDIxMDcxMS0wODIxXQorCW9yZy5oYW1jcmVzdC5zb3VyY2UgWzIuMi4wLnYyMDIxMDcxMS0wODIxLDIuMi4wLnYyMDIxMDcxMS0wODIxXQorCW9yZy5oYW1jcmVzdC5jb3JlIFsxLjMuMC52MjAxODA0MjAtMTUxOSwxLjMuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UgWzEuMy4wLnYyMDE4MDQyMC0xNTE5LDEuMy4wLnYyMDE4MDQyMC0xNTE5XQorCW9yZy5oYW1jcmVzdC5saWJyYXJ5IFsxLjMuMC52MjAxODA1MjQtMjI0NiwxLjMuMC52MjAxODA1MjQtMjI0Nl0KKwlvcmcuaGFtY3Jlc3QubGlicmFyeS5zb3VyY2UgWzEuMy4wLnYyMDE4MDUyNC0yMjQ2LDEuMy4wLnYyMDE4MDUyNC0yMjQ2XQorCW9yZy5qdW5pdCBbNC4xMy4yLnYyMDIxMTAxOC0xOTU2LDQuMTMuMi52MjAyMTEwMTgtMTk1Nl0KKwlvcmcuanVuaXQuc291cmNlIFs0LjEzLjIudjIwMjExMDE4LTE5NTYsNC4xMy4yLnYyMDIxMTAxOC0xOTU2XQorCW9yZy5rb2hzdWtlLmFyZ3M0aiBbMi4zMy4wLnYyMDE2MDMyMy0yMjE4LDIuMzMuMC52MjAxNjAzMjMtMjIxOF0KKwlvcmcua29oc3VrZS5hcmdzNGouc291cmNlIFsyLjMzLjAudjIwMTYwMzIzLTIyMTgsMi4zMy4wLnYyMDE2MDMyMy0yMjE4XQorCW9yZy5tb2NraXRvIFsyLjIzLjAudjIwMjAwMzEwLTE2NDIsMi4yMy4wLnYyMDIwMDMxMC0xNjQyXQorCW9yZy5tb2NraXRvLnNvdXJjZSBbMi4yMy4wLnYyMDIwMDMxMC0xNjQyLDIuMjMuMC52MjAyMDAzMTAtMTY0Ml0KKwlvcmcub2JqZW5lc2lzIFsyLjYuMC52MjAxODA0MjAtMTUxOSwyLjYuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcub2JqZW5lc2lzLnNvdXJjZSBbMi42LjAudjIwMTgwNDIwLTE1MTksMi42LjAudjIwMTgwNDIwLTE1MTldCisJb3JnLnNsZjRqLmFwaSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcuc2xmNGouYXBpLnNvdXJjZSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcuc2xmNGouYmluZGluZy5zaW1wbGUgWzEuNy4zMC52MjAyMDAyMDQtMjE1MCwxLjcuMzAudjIwMjAwMjA0LTIxNTBdCisJb3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcudHVrYWFuaS54eiBbMS45LjAudjIwMjEwNjI0LTEyNTksMS45LjAudjIwMjEwNjI0LTEyNTldCisJb3JnLnR1a2FhbmkueHouc291cmNlIFsxLjkuMC52MjAyMTA2MjQtMTI1OSwxLjkuMC52MjAyMTA2MjQtMTI1OV0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDIyMDMwMjE3MjIzMy0yMDIyLTAzLnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDIyMDMwMjE3MjIzMy0yMDIyLTAzLnRwZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWZjNjg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMjIwMzAyMTcyMjMzLTIwMjItMDMudHBkCkBAIC0wLDAgKzEsNjkgQEAKK3RhcmdldCAiUjIwMjIwMzAyMTcyMjMzIiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQorLy8gc2VlIGh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvb3JiaXQvZG93bmxvYWRzLworCitsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjIwMzAyMTcyMjMzL3JlcG9zaXRvcnkiIHsKKwljb20uZ29vZ2xlLmdzb24gWzIuOC45LnYyMDIyMDExMS0xNDA5LDIuOC45LnYyMDIyMDExMS0xNDA5XQorCWNvbS5nb29nbGUuZ3Nvbi5zb3VyY2UgWzIuOC45LnYyMDIyMDExMS0xNDA5LDIuOC45LnYyMDIyMDExMS0xNDA5XQorCWNvbS5qY3JhZnQuanNjaCBbMC4xLjU1LnYyMDE5MDQwNC0xOTAyLDAuMS41NS52MjAxOTA0MDQtMTkwMl0KKwljb20uamNyYWZ0LmpzY2guc291cmNlIFswLjEuNTUudjIwMTkwNDA0LTE5MDIsMC4xLjU1LnYyMDE5MDQwNC0xOTAyXQorCWNvbS5qY3JhZnQuanpsaWIgWzEuMS4xLnYyMDEyMDUxMDIzMDUsMS4xLjEudjIwMTIwNTEwMjMwNV0KKwljb20uamNyYWZ0Lmp6bGliLnNvdXJjZSBbMS4xLjEudjIwMTIwNTEwMjMwNSwxLjEuMS52MjAxMjA1MTAyMzA1XQorCWNvbS5zdW4uam5hIFs1LjguMC52MjAyMTA1MDMtMDM0Myw1LjguMC52MjAyMTA1MDMtMDM0M10KKwljb20uc3VuLmpuYS5zb3VyY2UgWzUuOC4wLnYyMDIxMDUwMy0wMzQzLDUuOC4wLnYyMDIxMDUwMy0wMzQzXQorCWNvbS5zdW4uam5hLnBsYXRmb3JtIFs1LjguMC52MjAyMTA0MDYtMTAwNCw1LjguMC52MjAyMTA0MDYtMTAwNF0KKwljb20uc3VuLmpuYS5wbGF0Zm9ybS5zb3VyY2UgWzUuOC4wLnYyMDIxMDQwNi0xMDA0LDUuOC4wLnYyMDIxMDQwNi0xMDA0XQorCWphdmFld2FoIFsxLjEuMTMudjIwMjExMDI5LTA4MzksMS4xLjEzLnYyMDIxMTAyOS0wODM5XQorCWphdmFld2FoLnNvdXJjZSBbMS4xLjEzLnYyMDIxMTAyOS0wODM5LDEuMS4xMy52MjAyMTEwMjktMDgzOV0KKwluZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHkgWzEuOS4wLnYyMDE4MTEwNy0xNDEwLDEuOS4wLnYyMDE4MTEwNy0xNDEwXQorCW5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudCBbMS45LjAudjIwMTgxMTA2LTE1MzQsMS45LjAudjIwMTgxMTA2LTE1MzRdCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50LnNvdXJjZSBbMS45LjAudjIwMTgxMTA2LTE1MzQsMS45LjAudjIwMTgxMTA2LTE1MzRdCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LnNvdXJjZSBbMS45LjAudjIwMTgxMTA3LTE0MTAsMS45LjAudjIwMTgxMTA3LTE0MTBdCisJbmV0LmkycC5jcnlwdG8uZWRkc2EgWzAuMy4wLnYyMDIxMDkyMy0xNDAxLDAuMy4wLnYyMDIxMDkyMy0xNDAxXQorCW5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSBbMC4zLjAudjIwMjEwOTIzLTE0MDEsMC4zLjAudjIwMjEwOTIzLTE0MDFdCisJb3JnLmFwYWNoZS5hbnQgWzEuMTAuMTIudjIwMjExMTAyLTE0NTIsMS4xMC4xMi52MjAyMTExMDItMTQ1Ml0KKwlvcmcuYXBhY2hlLmFudC5zb3VyY2UgWzEuMTAuMTIudjIwMjExMTAyLTE0NTIsMS4xMC4xMi52MjAyMTExMDItMTQ1Ml0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMgWzEuMTQuMC52MjAyMDA4MTgtMTQyMiwxLjE0LjAudjIwMjAwODE4LTE0MjJdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLnNvdXJjZSBbMS4xNC4wLnYyMDIwMDgxOC0xNDIyLDEuMTQuMC52MjAyMDA4MTgtMTQyMl0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MgWzEuMjEuMC52MjAyMTExMDMtMjEwMCwxLjIxLjAudjIwMjExMTAzLTIxMDBdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLnNvdXJjZSBbMS4yMS4wLnYyMDIxMTEwMy0yMTAwLDEuMjEuMC52MjAyMTExMDMtMjEwMF0KKwlvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyBbMS4yLjAudjIwMTgwNDA5LTE1MDIsMS4yLjAudjIwMTgwNDA5LTE1MDJdCisJb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIFsxLjIuMC52MjAxODA0MDktMTUwMiwxLjIuMC52MjAxODA0MDktMTUwMl0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQgWzQuNS4xMy52MjAyMTAxMjgtMjIyNSw0LjUuMTMudjIwMjEwMTI4LTIyMjVdCisJb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSBbNC41LjEzLnYyMDIxMDEyOC0yMjI1LDQuNS4xMy52MjAyMTAxMjgtMjIyNV0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIFs0LjQuMTUudjIwMjIwMjA5LTIzNDUsNC40LjE1LnYyMDIyMDIwOS0yMzQ1XQorCW9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIFs0LjQuMTUudjIwMjIwMjA5LTIzNDUsNC40LjE1LnYyMDIyMDIwOS0yMzQ1XQorCW9yZy5hcGFjaGUuc3NoZC5vc2dpIFsyLjguMC52MjAyMTEyMjctMTc1MCwyLjguMC52MjAyMTEyMjctMTc1MF0KKwlvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UgWzIuOC4wLnYyMDIxMTIyNy0xNzUwLDIuOC4wLnYyMDIxMTIyNy0xNzUwXQorCW9yZy5hcGFjaGUuc3NoZC5zZnRwIFsyLjguMC52MjAyMTEyMjctMTc1MCwyLjguMC52MjAyMTEyMjctMTc1MF0KKwlvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UgWzIuOC4wLnYyMDIxMTIyNy0xNzUwLDIuOC4wLnYyMDIxMTIyNy0xNzUwXQorCW9yZy5hc3NlcnRqIFszLjIwLjIudjIwMjEwNzA2LTExMDQsMy4yMC4yLnYyMDIxMDcwNi0xMTA0XQorCW9yZy5hc3NlcnRqLnNvdXJjZSBbMy4yMC4yLnYyMDIxMDcwNi0xMTA0LDMuMjAuMi52MjAyMTA3MDYtMTEwNF0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGcgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuaGFtY3Jlc3QgWzIuMi4wLnYyMDIxMDcxMS0wODIxLDIuMi4wLnYyMDIxMDcxMS0wODIxXQorCW9yZy5oYW1jcmVzdC5zb3VyY2UgWzIuMi4wLnYyMDIxMDcxMS0wODIxLDIuMi4wLnYyMDIxMDcxMS0wODIxXQorCW9yZy5oYW1jcmVzdC5jb3JlIFsxLjMuMC52MjAxODA0MjAtMTUxOSwxLjMuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UgWzEuMy4wLnYyMDE4MDQyMC0xNTE5LDEuMy4wLnYyMDE4MDQyMC0xNTE5XQorCW9yZy5oYW1jcmVzdC5saWJyYXJ5IFsxLjMuMC52MjAxODA1MjQtMjI0NiwxLjMuMC52MjAxODA1MjQtMjI0Nl0KKwlvcmcuaGFtY3Jlc3QubGlicmFyeS5zb3VyY2UgWzEuMy4wLnYyMDE4MDUyNC0yMjQ2LDEuMy4wLnYyMDE4MDUyNC0yMjQ2XQorCW9yZy5qdW5pdCBbNC4xMy4yLnYyMDIxMTAxOC0xOTU2LDQuMTMuMi52MjAyMTEwMTgtMTk1Nl0KKwlvcmcuanVuaXQuc291cmNlIFs0LjEzLjIudjIwMjExMDE4LTE5NTYsNC4xMy4yLnYyMDIxMTAxOC0xOTU2XQorCW9yZy5rb2hzdWtlLmFyZ3M0aiBbMi4zMy4wLnYyMDE2MDMyMy0yMjE4LDIuMzMuMC52MjAxNjAzMjMtMjIxOF0KKwlvcmcua29oc3VrZS5hcmdzNGouc291cmNlIFsyLjMzLjAudjIwMTYwMzIzLTIyMTgsMi4zMy4wLnYyMDE2MDMyMy0yMjE4XQorCW9yZy5tb2NraXRvIFsyLjIzLjAudjIwMjAwMzEwLTE2NDIsMi4yMy4wLnYyMDIwMDMxMC0xNjQyXQorCW9yZy5tb2NraXRvLnNvdXJjZSBbMi4yMy4wLnYyMDIwMDMxMC0xNjQyLDIuMjMuMC52MjAyMDAzMTAtMTY0Ml0KKwlvcmcub2JqZW5lc2lzIFsyLjYuMC52MjAxODA0MjAtMTUxOSwyLjYuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcub2JqZW5lc2lzLnNvdXJjZSBbMi42LjAudjIwMTgwNDIwLTE1MTksMi42LjAudjIwMTgwNDIwLTE1MTldCisJb3JnLnNsZjRqLmFwaSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcuc2xmNGouYXBpLnNvdXJjZSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcuc2xmNGouYmluZGluZy5zaW1wbGUgWzEuNy4zMC52MjAyMDAyMDQtMjE1MCwxLjcuMzAudjIwMjAwMjA0LTIxNTBdCisJb3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcudHVrYWFuaS54eiBbMS45LjAudjIwMjEwNjI0LTEyNTksMS45LjAudjIwMjEwNjI0LTEyNTldCisJb3JnLnR1a2FhbmkueHouc291cmNlIFsxLjkuMC52MjAyMTA2MjQtMTI1OSwxLjkuMC52MjAyMTA2MjQtMTI1OV0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDIyMDUzMTE4NTMxMC0yMDIyLTA2LnRwZCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDIyMDUzMTE4NTMxMC0yMDIyLTA2LnRwZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzc0NDk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMjIwNTMxMTg1MzEwLTIwMjItMDYudHBkCkBAIC0wLDAgKzEsNjkgQEAKK3RhcmdldCAiUjIwMjIwNTMxMTg1MzEwLTIwMjItMDYiIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCisvLyBzZWUgaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvCisKK2xvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjA1MzExODUzMTAvcmVwb3NpdG9yeSIgeworCWNvbS5nb29nbGUuZ3NvbiBbMi44LjkudjIwMjIwMTExLTE0MDksMi44LjkudjIwMjIwMTExLTE0MDldCisJY29tLmdvb2dsZS5nc29uLnNvdXJjZSBbMi44LjkudjIwMjIwMTExLTE0MDksMi44LjkudjIwMjIwMTExLTE0MDldCisJY29tLmpjcmFmdC5qc2NoIFswLjEuNTUudjIwMTkwNDA0LTE5MDIsMC4xLjU1LnYyMDE5MDQwNC0xOTAyXQorCWNvbS5qY3JhZnQuanNjaC5zb3VyY2UgWzAuMS41NS52MjAxOTA0MDQtMTkwMiwwLjEuNTUudjIwMTkwNDA0LTE5MDJdCisJY29tLmpjcmFmdC5qemxpYiBbMS4xLjMudjIwMjIwNTAyLTE4MjAsMS4xLjMudjIwMjIwNTAyLTE4MjBdCisJY29tLmpjcmFmdC5qemxpYi5zb3VyY2UgWzEuMS4zLnYyMDIyMDUwMi0xODIwLDEuMS4zLnYyMDIyMDUwMi0xODIwXQorCWNvbS5zdW4uam5hIFs1LjguMC52MjAyMTA1MDMtMDM0Myw1LjguMC52MjAyMTA1MDMtMDM0M10KKwljb20uc3VuLmpuYS5zb3VyY2UgWzUuOC4wLnYyMDIxMDUwMy0wMzQzLDUuOC4wLnYyMDIxMDUwMy0wMzQzXQorCWNvbS5zdW4uam5hLnBsYXRmb3JtIFs1LjguMC52MjAyMTA0MDYtMTAwNCw1LjguMC52MjAyMTA0MDYtMTAwNF0KKwljb20uc3VuLmpuYS5wbGF0Zm9ybS5zb3VyY2UgWzUuOC4wLnYyMDIxMDQwNi0xMDA0LDUuOC4wLnYyMDIxMDQwNi0xMDA0XQorCWphdmFld2FoIFsxLjEuMTMudjIwMjExMDI5LTA4MzksMS4xLjEzLnYyMDIxMTAyOS0wODM5XQorCWphdmFld2FoLnNvdXJjZSBbMS4xLjEzLnYyMDIxMTAyOS0wODM5LDEuMS4xMy52MjAyMTEwMjktMDgzOV0KKwluZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHkgWzEuOS4wLnYyMDE4MTEwNy0xNDEwLDEuOS4wLnYyMDE4MTEwNy0xNDEwXQorCW5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeS1hZ2VudCBbMS45LjAudjIwMTgxMTA2LTE1MzQsMS45LjAudjIwMTgxMTA2LTE1MzRdCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50LnNvdXJjZSBbMS45LjAudjIwMTgxMTA2LTE1MzQsMS45LjAudjIwMTgxMTA2LTE1MzRdCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LnNvdXJjZSBbMS45LjAudjIwMTgxMTA3LTE0MTAsMS45LjAudjIwMTgxMTA3LTE0MTBdCisJbmV0LmkycC5jcnlwdG8uZWRkc2EgWzAuMy4wLnYyMDIyMDUwNi0xMDIwLDAuMy4wLnYyMDIyMDUwNi0xMDIwXQorCW5ldC5pMnAuY3J5cHRvLmVkZHNhLnNvdXJjZSBbMC4zLjAudjIwMjIwNTA2LTEwMjAsMC4zLjAudjIwMjIwNTA2LTEwMjBdCisJb3JnLmFwYWNoZS5hbnQgWzEuMTAuMTIudjIwMjExMTAyLTE0NTIsMS4xMC4xMi52MjAyMTExMDItMTQ1Ml0KKwlvcmcuYXBhY2hlLmFudC5zb3VyY2UgWzEuMTAuMTIudjIwMjExMTAyLTE0NTIsMS4xMC4xMi52MjAyMTExMDItMTQ1Ml0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMgWzEuMTQuMC52MjAyMDA4MTgtMTQyMiwxLjE0LjAudjIwMjAwODE4LTE0MjJdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLnNvdXJjZSBbMS4xNC4wLnYyMDIwMDgxOC0xNDIyLDEuMTQuMC52MjAyMDA4MTgtMTQyMl0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MgWzEuMjEuMC52MjAyMTExMDMtMjEwMCwxLjIxLjAudjIwMjExMTAzLTIxMDBdCisJb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLnNvdXJjZSBbMS4yMS4wLnYyMDIxMTEwMy0yMTAwLDEuMjEuMC52MjAyMTExMDMtMjEwMF0KKwlvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyBbMS4yLjAudjIwMTgwNDA5LTE1MDIsMS4yLjAudjIwMTgwNDA5LTE1MDJdCisJb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlIFsxLjIuMC52MjAxODA0MDktMTUwMiwxLjIuMC52MjAxODA0MDktMTUwMl0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQgWzQuNS4xMy52MjAyMTAxMjgtMjIyNSw0LjUuMTMudjIwMjEwMTI4LTIyMjVdCisJb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY2xpZW50LnNvdXJjZSBbNC41LjEzLnYyMDIxMDEyOC0yMjI1LDQuNS4xMy52MjAyMTAxMjgtMjIyNV0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjb3JlIFs0LjQuMTUudjIwMjIwMjA5LTIzNDUsNC40LjE1LnYyMDIyMDIwOS0yMzQ1XQorCW9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIFs0LjQuMTUudjIwMjIwMjA5LTIzNDUsNC40LjE1LnYyMDIyMDIwOS0yMzQ1XQorCW9yZy5hcGFjaGUuc3NoZC5vc2dpIFsyLjguMC52MjAyMTEyMjctMTc1MCwyLjguMC52MjAyMTEyMjctMTc1MF0KKwlvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UgWzIuOC4wLnYyMDIxMTIyNy0xNzUwLDIuOC4wLnYyMDIxMTIyNy0xNzUwXQorCW9yZy5hcGFjaGUuc3NoZC5zZnRwIFsyLjguMC52MjAyMTEyMjctMTc1MCwyLjguMC52MjAyMTEyMjctMTc1MF0KKwlvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zb3VyY2UgWzIuOC4wLnYyMDIxMTIyNy0xNzUwLDIuOC4wLnYyMDIxMTIyNy0xNzUwXQorCW9yZy5hc3NlcnRqIFszLjIwLjIudjIwMjEwNzA2LTExMDQsMy4yMC4yLnYyMDIxMDcwNi0xMTA0XQorCW9yZy5hc3NlcnRqLnNvdXJjZSBbMy4yMC4yLnYyMDIxMDcwNi0xMTA0LDMuMjAuMi52MjAyMTA3MDYtMTEwNF0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGcgWzEuNzAuMC52MjAyMjA1MDctMTIwOCwxLjcwLjAudjIwMjIwNTA3LTEyMDhdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSBbMS43MC4wLnYyMDIyMDUwNy0xMjA4LDEuNzAuMC52MjAyMjA1MDctMTIwOF0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeC5zb3VyY2UgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YgWzEuNzAuMC52MjAyMjA1MDctMTIwOCwxLjcwLjAudjIwMjIwNTA3LTEyMDhdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIFsxLjcwLjAudjIwMjIwNTA3LTEyMDgsMS43MC4wLnYyMDIyMDUwNy0xMjA4XQorCW9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsIFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuaGFtY3Jlc3QgWzIuMi4wLnYyMDIxMDcxMS0wODIxLDIuMi4wLnYyMDIxMDcxMS0wODIxXQorCW9yZy5oYW1jcmVzdC5zb3VyY2UgWzIuMi4wLnYyMDIxMDcxMS0wODIxLDIuMi4wLnYyMDIxMDcxMS0wODIxXQorCW9yZy5oYW1jcmVzdC5jb3JlIFsxLjMuMC52MjAxODA0MjAtMTUxOSwxLjMuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UgWzEuMy4wLnYyMDE4MDQyMC0xNTE5LDEuMy4wLnYyMDE4MDQyMC0xNTE5XQorCW9yZy5oYW1jcmVzdC5saWJyYXJ5IFsxLjMuMC52MjAxODA1MjQtMjI0NiwxLjMuMC52MjAxODA1MjQtMjI0Nl0KKwlvcmcuaGFtY3Jlc3QubGlicmFyeS5zb3VyY2UgWzEuMy4wLnYyMDE4MDUyNC0yMjQ2LDEuMy4wLnYyMDE4MDUyNC0yMjQ2XQorCW9yZy5qdW5pdCBbNC4xMy4yLnYyMDIxMTAxOC0xOTU2LDQuMTMuMi52MjAyMTEwMTgtMTk1Nl0KKwlvcmcuanVuaXQuc291cmNlIFs0LjEzLjIudjIwMjExMDE4LTE5NTYsNC4xMy4yLnYyMDIxMTAxOC0xOTU2XQorCW9yZy5rb2hzdWtlLmFyZ3M0aiBbMi4zMy4wLnYyMDE2MDMyMy0yMjE4LDIuMzMuMC52MjAxNjAzMjMtMjIxOF0KKwlvcmcua29oc3VrZS5hcmdzNGouc291cmNlIFsyLjMzLjAudjIwMTYwMzIzLTIyMTgsMi4zMy4wLnYyMDE2MDMyMy0yMjE4XQorCW9yZy5tb2NraXRvIFsyLjIzLjAudjIwMjAwMzEwLTE2NDIsMi4yMy4wLnYyMDIwMDMxMC0xNjQyXQorCW9yZy5tb2NraXRvLnNvdXJjZSBbMi4yMy4wLnYyMDIwMDMxMC0xNjQyLDIuMjMuMC52MjAyMDAzMTAtMTY0Ml0KKwlvcmcub2JqZW5lc2lzIFsyLjYuMC52MjAxODA0MjAtMTUxOSwyLjYuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcub2JqZW5lc2lzLnNvdXJjZSBbMi42LjAudjIwMTgwNDIwLTE1MTksMi42LjAudjIwMTgwNDIwLTE1MTldCisJb3JnLnNsZjRqLmFwaSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcuc2xmNGouYXBpLnNvdXJjZSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcuc2xmNGouYmluZGluZy5zaW1wbGUgWzEuNy4zMC52MjAyMDAyMDQtMjE1MCwxLjcuMzAudjIwMjAwMjA0LTIxNTBdCisJb3JnLnNsZjRqLmJpbmRpbmcuc2ltcGxlLnNvdXJjZSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcudHVrYWFuaS54eiBbMS45LjAudjIwMjEwNjI0LTEyNTksMS45LjAudjIwMjEwNjI0LTEyNTldCisJb3JnLnR1a2FhbmkueHouc291cmNlIFsxLjkuMC52MjAyMTA2MjQtMTI1OSwxLjkuMC52MjAyMTA2MjQtMTI1OV0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sCmluZGV4IDY3NDRmNmIuLjcxZDJlOTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbApAQCAtMjIsMzEgKzIyLDQgQEAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC50YXJnZXQ8L2FydGlmYWN0SWQ+CiAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CiAgIDxuYW1lPkpHaXQgVGFyZ2V0IFBsYXRmb3JtPC9uYW1lPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmF0dGFjaC1hcnRpZmFjdHM8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5hdHRhY2gtYXJ0aWZhY3Q8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdHM+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0PgotICAgICAgICAgICAgICAgICAgPGZpbGU+JHt0YXJnZXQtcGxhdGZvcm19LnRhcmdldDwvZmlsZT4KLSAgICAgICAgICAgICAgICAgIDx0eXBlPnRhcmdldDwvdHlwZT4KLSAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPiR7dGFyZ2V0LXBsYXRmb3JtfTwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICA8L2FydGlmYWN0PgotICAgICAgICAgICAgICA8L2FydGlmYWN0cz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgogPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sCmluZGV4IGUyYjdiNzkuLjYwMjA2NjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbApAQCAtMjMsNyArMjMsNyBAQAogCiAgIDxwcm9wZXJ0aWVzPgogICAgIDxqYXZhLnZlcnNpb24+MTE8L2phdmEudmVyc2lvbj4KLSAgICA8dHljaG8tdmVyc2lvbj4yLjUuMDwvdHljaG8tdmVyc2lvbj4KKyAgICA8dHljaG8tdmVyc2lvbj4yLjYuMDwvdHljaG8tdmVyc2lvbj4KICAgICA8dHljaG8tZXh0cmFzLXZlcnNpb24+JHt0eWNoby12ZXJzaW9ufTwvdHljaG8tZXh0cmFzLXZlcnNpb24+CiAgICAgPHRhcmdldC1wbGF0Zm9ybT5qZ2l0LTQuMTc8L3RhcmdldC1wbGF0Zm9ybT4KICAgPC9wcm9wZXJ0aWVzPgpAQCAtMjMxLDEyICsyMzEsNyBAQAogICAgICAgICAgICAgPHJlc29sdmVyPnAyPC9yZXNvbHZlcj4KICAgICAgICAgICAgIDxwb21EZXBlbmRlbmNpZXM+Y29uc2lkZXI8L3BvbURlcGVuZGVuY2llcz4KICAgICAgICAgICAgIDx0YXJnZXQ+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdD4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGFyZ2V0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj4ke3RhcmdldC1wbGF0Zm9ybX08L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgIDwvYXJ0aWZhY3Q+CisgICAgICAgICAgICAgIDxmaWxlPiR7cHJvamVjdC5iYXNlZGlyfS8uLi9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC8ke3RhcmdldC1wbGF0Zm9ybX0udGFyZ2V0PC9maWxlPgogICAgICAgICAgICAgPC90YXJnZXQ+CiAgICAgICAgICAgICA8ZW52aXJvbm1lbnRzPgogICAgICAgICAgICAgICA8ZW52aXJvbm1lbnQ+CkBAIC0yNjQsNiArMjU5LDExIEBACiAgICAgICAgICAgICAgICAgPHdzPmNvY29hPC93cz4KICAgICAgICAgICAgICAgICA8YXJjaD54ODZfNjQ8L2FyY2g+CiAgICAgICAgICAgICAgIDwvZW52aXJvbm1lbnQ+CisgICAgICAgICAgICAgIDxlbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgICA8b3M+bWFjb3N4PC9vcz4KKyAgICAgICAgICAgICAgICA8d3M+Y29jb2E8L3dzPgorICAgICAgICAgICAgICAgIDxhcmNoPmFhcmNoNjQ8L2FyY2g+CisgICAgICAgICAgICAgIDwvZW52aXJvbm1lbnQ+CiAgICAgICAgICAgICA8L2Vudmlyb25tZW50cz4KICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgIDwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggOWY5ZWU0Ni4uMjNmN2MzNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0xMiw3ICsxMiw4IEBACiAgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjcuMC4wIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCiAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKQEAgLTI2LDcgKzI3LDcgQEAKICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCi0gb3JnLmhhbWNyZXN0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAorIG9yZy5oYW1jcmVzdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcua29oc3VrZS5hcmdzNGo7dmVyc2lvbj0iWzIuMzMuMCwzLjAuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlVGVzdC5qYXZhCmluZGV4IDRiYWQ3M2IuLmM3ODU0NDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlVGVzdC5qYXZhCkBAIC04OSw2ICs4OSwzMSBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVDb21taXRNYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29tbWl0TWF0Y2hBYmJyZXYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW5pdGlhbENvbW1pdEFuZFRhZygpOworCQlzZWNvbmRDb21taXQoKTsKKwkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsgInYxLjAtMS1nNTZmNmNlYmRmM2Y1IiwgIiIgfSwKKwkJCQlleGVjdXRlKCJnaXQgZGVzY3JpYmUgLS1hYmJyZXYgMTIgLS1tYXRjaCB2MS4qIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29tbWl0TWF0Y2hBYmJyZXZNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW5pdGlhbENvbW1pdEFuZFRhZygpOworCQlzZWNvbmRDb21taXQoKTsKKwkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsgInYxLjAtMS1nNTZmNiIsICIiIH0sCisJCQkJZXhlY3V0ZSgiZ2l0IGRlc2NyaWJlIC0tYWJicmV2IC01IC0tbWF0Y2ggdjEuKiIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZXNjcmliZUNvbW1pdE1hdGNoQWJicmV2TWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluaXRpYWxDb21taXRBbmRUYWcoKTsKKwkJc2Vjb25kQ29tbWl0KCk7CisJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7CisJCQkJInYxLjAtMS1nNTZmNmNlYmRmM2Y1Y2VlZWNkODAzMzY1YWJmMDk5NmZiMWZhMDA2ZCIsICIiIH0sCisJCQkJZXhlY3V0ZSgiZ2l0IGRlc2NyaWJlIC0tYWJicmV2IDUwIC0tbWF0Y2ggdjEuKiIpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3REZXNjcmliZUNvbW1pdE1hdGNoMigpIHRocm93cyBFeGNlcHRpb24gewogCQlpbml0aWFsQ29tbWl0QW5kVGFnKCk7CiAJCXNlY29uZENvbW1pdCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZlRvb2xUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbFRlc3QuamF2YQppbmRleCBlN2JmNDg0Li5mMDkwOGNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbFRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEsIFNpbWVvbiBBbmRyZWV2IDxzaW1lb24uZGFuYWlsb3YuYW5kcmVldkBnbWFpbC5jb20+IGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEtMjAyMiwgU2ltZW9uIEFuZHJlZXYgPHNpbWVvbi5kYW5haWxvdi5hbmRyZWV2QGdtYWlsLmNvbT4gYW5kIG90aGVycy4KICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTksNzIgKzksMTQ3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfRElGRlRPT0xfU0VDVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19ESUZGX1NFQ1RJT047CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NNRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFJPTVBUOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UT09MOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2wuQ29tbWFuZExpbmVEaWZmVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5DTElSZXBvc2l0b3J5VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LkNtZExpbmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LlN1YmNvbW1hbmRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sLkRpZmZUb29sczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2wuRXh0ZXJuYWxEaWZmVG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQXJndW1lbnQ7CiAKIC8qKgogICogVGVzdGluZyB0aGUge0Bjb2RlIGRpZmZ0b29sfSBjb21tYW5kLgogICovCi1wdWJsaWMgY2xhc3MgRGlmZlRvb2xUZXN0IGV4dGVuZHMgQ0xJUmVwb3NpdG9yeVRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEdpdENsaUpHaXRXcmFwcGVyUGFyc2VyIHsKLQkJQEFyZ3VtZW50KGluZGV4ID0gMCwgbWV0YVZhciA9ICJtZXRhVmFyX2NvbW1hbmQiLCByZXF1aXJlZCA9IHRydWUsIGhhbmRsZXIgPSBTdWJjb21tYW5kSGFuZGxlci5jbGFzcykKLQkJVGV4dEJ1aWx0aW4gc3ViY29tbWFuZDsKK3B1YmxpYyBjbGFzcyBEaWZmVG9vbFRlc3QgZXh0ZW5kcyBUb29sVGVzdENhc2UgewogCi0JCUBBcmd1bWVudChpbmRleCA9IDEsIG1ldGFWYXIgPSAibWV0YVZhcl9hcmciKQotCQlMaXN0PFN0cmluZz4gYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KFN0cmluZy4uLiBhcmdzKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNMSUdpdENvbW1hbmQuUmVzdWx0IHJlc3VsdCA9IG5ldyBDTElHaXRDb21tYW5kLlJlc3VsdCgpOwotCi0JCUdpdENsaUpHaXRXcmFwcGVyUGFyc2VyIGJlYW4gPSBuZXcgR2l0Q2xpSkdpdFdyYXBwZXJQYXJzZXIoKTsKLQkJQ21kTGluZVBhcnNlciBjbHAgPSBuZXcgQ21kTGluZVBhcnNlcihiZWFuKTsKLQkJY2xwLnBhcnNlQXJndW1lbnQoYXJncyk7Ci0KLQkJVGV4dEJ1aWx0aW4gY21kID0gYmVhbi5zdWJjb21tYW5kOwotCQljbWQuaW5pdFJhdyhkYiwgbnVsbCwgbnVsbCwgcmVzdWx0Lm91dCwgcmVzdWx0LmVycik7Ci0JCWNtZC5leGVjdXRlKGJlYW4uYXJndW1lbnRzLnRvQXJyYXkobmV3IFN0cmluZ1tiZWFuLmFyZ3VtZW50cy5zaXplKCldKSk7Ci0JCWlmIChjbWQuZ2V0T3V0cHV0V3JpdGVyKCkgIT0gbnVsbCkgewotCQkJY21kLmdldE91dHB1dFdyaXRlcigpLmZsdXNoKCk7Ci0JCX0KLQkJaWYgKGNtZC5nZXRFcnJvcldyaXRlcigpICE9IG51bGwpIHsKLQkJCWNtZC5nZXRFcnJvcldyaXRlcigpLmZsdXNoKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC5vdXRMaW5lcygpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JcHJpdmF0ZSBHaXQgZ2l0OworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUZGX1RPT0wgPSBDT05GSUdfRElGRlRPT0xfU0VDVElPTjsKIAogCUBPdmVycmlkZQogCUBCZWZvcmUKIAlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zZXRVcCgpOwotCQlnaXQgPSBuZXcgR2l0KGRiKTsKLQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwgY29tbWl0IikuY2FsbCgpOworCQljb25maWd1cmVFY2hvVG9vbChUT09MX05BTUUpOworCX0KKworCUBUZXN0KGV4cGVjdGVkID0gRGllLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RVbmRlZmluZWRUb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b29sTmFtZSA9ICJ1bmRlZmluZWQiOworCQlTdHJpbmdbXSBjb25mbGljdGluZ0ZpbGVuYW1lcyA9IGNyZWF0ZVVuc3RhZ2VkQ2hhbmdlcygpOworCisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZEVycm9ycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKFN0cmluZyBjaGFuZ2VkRmlsZW5hbWUgOiBjb25mbGljdGluZ0ZpbGVuYW1lcykgeworCQkJZXhwZWN0ZWRFcnJvcnMuYWRkKCJFeHRlcm5hbCBkaWZmIHRvb2wgaXMgbm90IGRlZmluZWQ6ICIgKyB0b29sTmFtZSk7CisJCQlleHBlY3RlZEVycm9ycy5hZGQoImNvbXBhcmUgb2YgIiArIGNoYW5nZWRGaWxlbmFtZSArICIgZmFpbGVkIik7CisJCX0KKworCQlydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KGV4cGVjdGVkRXJyb3JzLCBESUZGX1RPT0wsICItLW5vLXByb21wdCIsCisJCQkJIi0tdG9vbCIsIHRvb2xOYW1lKTsKKwkJZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIHRvIGJlIHRocm93biBkdWUgdG8gdW5kZWZpbmVkIGV4dGVybmFsIHRvb2wiKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IERpZS5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0VXNlclRvb2xXaXRoQ29tbWFuZE5vdEZvdW5kRXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvb2xOYW1lID0gImN1c3RvbVRvb2wiOworCisJCWludCBlcnJvclJldHVybkNvZGUgPSAxMjc7IC8vIGNvbW1hbmQgbm90IGZvdW5kCisJCVN0cmluZyBjb21tYW5kID0gImV4aXQgIiArIGVycm9yUmV0dXJuQ29kZTsKKworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIHRvb2xOYW1lLCBDT05GSUdfS0VZX0NNRCwKKwkJCQljb21tYW5kKTsKKworCQljcmVhdGVNZXJnZUNvbmZsaWN0KCk7CisJCXJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoRElGRl9UT09MLCAiLS1uby1wcm9tcHQiLCAiLS10b29sIiwgdG9vbE5hbWUpOworCisJCWZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gZHVlIHRvIGV4dGVybmFsIHRvb2wgZXhpdGluZyB3aXRoIGVycm9yIGNvZGU6ICIKKwkJCQkrIGVycm9yUmV0dXJuQ29kZSk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBEaWUuY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdEVtcHR5VG9vbE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzdW1lTGludXhQbGF0Zm9ybSgpOworCisJCVN0cmluZyBlbXB0eVRvb2xOYW1lID0gIiI7CisKKwkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQkvLyB0aGUgZGVmYXVsdCBkaWZmIHRvb2wgaXMgY29uZmlndXJlZCB3aXRob3V0IGEgc3Vic2VjdGlvbgorCQlTdHJpbmcgc3Vic2VjdGlvbiA9IG51bGw7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZfU0VDVElPTiwgc3Vic2VjdGlvbiwgQ09ORklHX0tFWV9UT09MLAorCQkJCWVtcHR5VG9vbE5hbWUpOworCisJCWNyZWF0ZVVuc3RhZ2VkQ2hhbmdlcygpOworCisJCVN0cmluZyBhcmF4aXNFcnJvckxpbmUgPSAiY29tcGFyZTogdW5yZWNvZ25pemVkIG9wdGlvbiBgLXdhaXQnIEAgZXJyb3IvY29tcGFyZS5jL0NvbXBhcmVJbWFnZUNvbW1hbmQvMTEyMy4iOworCQlTdHJpbmdbXSBleHBlY3RlZEVycm9yT3V0cHV0ID0geyBhcmF4aXNFcnJvckxpbmUsIGFyYXhpc0Vycm9yTGluZSwgfTsKKwkJcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhBcnJheXMuYXNMaXN0KGV4cGVjdGVkRXJyb3JPdXRwdXQpLCBESUZGX1RPT0wsCisJCQkJIi0tbm8tcHJvbXB0Iik7CisJCWZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gZHVlIHRvIGV4dGVybmFsIHRvb2wgZXhpdGluZyB3aXRoIGFuIGVycm9yIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9vbFdpdGhQcm9tcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gaW5wdXRMaW5lcyA9IHsKKwkJCQkieSIsIC8vIGFjY2VwdCBsYXVuY2hpbmcgZGlmZiB0b29sCisJCQkJInkiLCAvLyBhY2NlcHQgbGF1bmNoaW5nIGRpZmYgdG9vbAorCQl9OworCisJCVN0cmluZ1tdIGNvbmZsaWN0aW5nRmlsZW5hbWVzID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWRDb21wYXJlT3V0cHV0KGNvbmZsaWN0aW5nRmlsZW5hbWVzKTsKKworCQlTdHJpbmcgb3B0aW9uID0gIi0tdG9vbCI7CisKKwkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBjcmVhdGVJbnB1dFN0cmVhbShpbnB1dExpbmVzKTsKKwkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCisJCQkJZXhwZWN0ZWRPdXRwdXQsIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoaW5wdXRTdHJlYW0sCisJCQkJCQlESUZGX1RPT0wsICItLXByb21wdCIsIG9wdGlvbiwgVE9PTF9OQU1FKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9vbEFib3J0TGF1bmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGlucHV0TGluZXMgPSB7CisJCQkJInkiLCAvLyBhY2NlcHQgbGF1bmNoaW5nIGRpZmYgdG9vbAorCQkJCSJuIiwgLy8gZG9uJ3QgbGF1bmNoIGRpZmYgdG9vbAorCQl9OworCisJCVN0cmluZ1tdIGNvbmZsaWN0aW5nRmlsZW5hbWVzID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7CisJCWludCBhYm9ydEluZGV4ID0gMTsKKwkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZEFib3J0T3V0cHV0KGNvbmZsaWN0aW5nRmlsZW5hbWVzLCBhYm9ydEluZGV4KTsKKworCQlTdHJpbmcgb3B0aW9uID0gIi0tdG9vbCI7CisKKwkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBjcmVhdGVJbnB1dFN0cmVhbShpbnB1dExpbmVzKTsKKwkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCisJCQkJZXhwZWN0ZWRPdXRwdXQsCisJCQkJcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhpbnB1dFN0cmVhbSwgRElGRl9UT09MLCAiLS1wcm9tcHQiLCBvcHRpb24sCisJCQkJCQlUT09MX05BTUUpKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IERpZS5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0Tm90RGVmaW5lZFRvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7CisKKwkJcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhESUZGX1RPT0wsICItLXRvb2wiLCAidW5kZWZpbmVkIik7CisJCWZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBydW4gdW5kZWZpbmVkIHRvb2wiKTsKIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RUb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJldkNvbW1pdCBjb21taXQgPSBjcmVhdGVVbnN0YWdlZENoYW5nZXMoKTsKLQkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBnZXRSZXBvc2l0b3J5Q2hhbmdlcyhjb21taXQpOwotCQlTdHJpbmdbXSBleHBlY3RlZE91dHB1dCA9IGdldEV4cGVjdGVkRGlmZlRvb2xPdXRwdXQoY2hhbmdlcyk7CisJCVN0cmluZ1tdIGNvbmZsaWN0RmlsZW5hbWVzID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWRUb29sT3V0cHV0Tm9Qcm9tcHQoY29uZmxpY3RGaWxlbmFtZXMpOwogCiAJCVN0cmluZ1tdIG9wdGlvbnMgPSB7CiAJCQkJIi0tdG9vbCIsCkBAIC04NCw2OSArMTU5LDg4IEBAIHB1YmxpYyB2b2lkIHRlc3RUb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZvciAoU3RyaW5nIG9wdGlvbiA6IG9wdGlvbnMpIHsKIAkJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAogCQkJCQlleHBlY3RlZE91dHB1dCwKLQkJCQkJcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdygiZGlmZnRvb2wiLCBvcHRpb24sCi0JCQkJCQkJInNvbWVfdG9vbCIpKTsKKwkJCQkJcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhESUZGX1RPT0wsIG9wdGlvbiwKKwkJCQkJCQlUT09MX05BTUUpKTsKIAkJfQogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFRvb2xUcnVzdEV4aXRDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJldkNvbW1pdCBjb21taXQgPSBjcmVhdGVVbnN0YWdlZENoYW5nZXMoKTsKLQkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBnZXRSZXBvc2l0b3J5Q2hhbmdlcyhjb21taXQpOwotCQlTdHJpbmdbXSBleHBlY3RlZE91dHB1dCA9IGdldEV4cGVjdGVkRGlmZlRvb2xPdXRwdXQoY2hhbmdlcyk7CisJCVN0cmluZ1tdIGNvbmZsaWN0aW5nRmlsZW5hbWVzID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWRUb29sT3V0cHV0Tm9Qcm9tcHQoY29uZmxpY3RpbmdGaWxlbmFtZXMpOwogCiAJCVN0cmluZ1tdIG9wdGlvbnMgPSB7ICItLXRvb2wiLCAiLXQiLCB9OwogCiAJCWZvciAoU3RyaW5nIG9wdGlvbiA6IG9wdGlvbnMpIHsKIAkJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAotCQkJCQlleHBlY3RlZE91dHB1dCwgcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdygiZGlmZnRvb2wiLAotCQkJCQkJCSItLXRydXN0LWV4aXQtY29kZSIsIG9wdGlvbiwgInNvbWVfdG9vbCIpKTsKKwkJCQkJZXhwZWN0ZWRPdXRwdXQsIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoRElGRl9UT09MLAorCQkJCQkJCSItLXRydXN0LWV4aXQtY29kZSIsIG9wdGlvbiwgVE9PTF9OQU1FKSk7CiAJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RUb29sTm9HdWlOb1Byb21wdE5vVHJ1c3RFeGl0Y29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXZDb21taXQgY29tbWl0ID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7Ci0JCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gZ2V0UmVwb3NpdG9yeUNoYW5nZXMoY29tbWl0KTsKLQkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZERpZmZUb29sT3V0cHV0KGNoYW5nZXMpOworCQlTdHJpbmdbXSBjb25mbGljdGluZ0ZpbGVuYW1lcyA9IGNyZWF0ZVVuc3RhZ2VkQ2hhbmdlcygpOworCQlTdHJpbmdbXSBleHBlY3RlZE91dHB1dCA9IGdldEV4cGVjdGVkVG9vbE91dHB1dE5vUHJvbXB0KGNvbmZsaWN0aW5nRmlsZW5hbWVzKTsKIAogCQlTdHJpbmdbXSBvcHRpb25zID0geyAiLS10b29sIiwgIi10IiwgfTsKIAogCQlmb3IgKFN0cmluZyBvcHRpb24gOiBvcHRpb25zKSB7CiAJCQlhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoIkluY29ycmVjdCBvdXRwdXQgZm9yIG9wdGlvbjogIiArIG9wdGlvbiwKLQkJCQkJZXhwZWN0ZWRPdXRwdXQsIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoImRpZmZ0b29sIiwKKwkJCQkJZXhwZWN0ZWRPdXRwdXQsIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoRElGRl9UT09MLAogCQkJCQkJCSItLW5vLWd1aSIsICItLW5vLXByb21wdCIsICItLW5vLXRydXN0LWV4aXQtY29kZSIsCi0JCQkJCQkJb3B0aW9uLCAic29tZV90b29sIikpOworCQkJCQkJCW9wdGlvbiwgVE9PTF9OQU1FKSk7CiAJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RUb29sQ2FjaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJldkNvbW1pdCBjb21taXQgPSBjcmVhdGVTdGFnZWRDaGFuZ2VzKCk7Ci0JCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gZ2V0UmVwb3NpdG9yeUNoYW5nZXMoY29tbWl0KTsKLQkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZERpZmZUb29sT3V0cHV0KGNoYW5nZXMpOworCQlTdHJpbmdbXSBjb25mbGljdGluZ0ZpbGVuYW1lcyA9IGNyZWF0ZVN0YWdlZENoYW5nZXMoKTsKKwkJUGF0dGVybltdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWRDYWNoZWRUb29sT3V0cHV0Tm9Qcm9tcHQoY29uZmxpY3RpbmdGaWxlbmFtZXMpOwogCiAJCVN0cmluZ1tdIG9wdGlvbnMgPSB7ICItLWNhY2hlZCIsICItLXN0YWdlZCIsIH07CiAKIAkJZm9yIChTdHJpbmcgb3B0aW9uIDogb3B0aW9ucykgewotCQkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCi0JCQkJCWV4cGVjdGVkT3V0cHV0LCBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KCJkaWZmdG9vbCIsCi0JCQkJCQkJb3B0aW9uLCAiLS10b29sIiwgInNvbWVfdG9vbCIpKTsKKwkJCWFzc2VydEFycmF5T2ZNYXRjaGluZ0xpbmVzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCisJCQkJCWV4cGVjdGVkT3V0cHV0LCBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KERJRkZfVE9PTCwKKwkJCQkJCQlvcHRpb24sICItLXRvb2wiLCBUT09MX05BTUUpKTsKIAkJfQogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFRvb2xIZWxwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbW1hbmRMaW5lRGlmZlRvb2xbXSBkZWZhdWx0VG9vbHMgPSBDb21tYW5kTGluZURpZmZUb29sLnZhbHVlcygpOwogCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRPdXRwdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJZXhwZWN0ZWRPdXRwdXQuYWRkKCJnaXQgZGlmZnRvb2wgLS10b29sPTx0b29sPiBtYXkgYmUgc2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiIpOwotCQlmb3IgKENvbW1hbmRMaW5lRGlmZlRvb2wgZGVmYXVsdFRvb2wgOiBkZWZhdWx0VG9vbHMpIHsKLQkJCVN0cmluZyB0b29sTmFtZSA9IGRlZmF1bHRUb29sLm5hbWUoKTsKKworCQlEaWZmVG9vbHMgZGlmZlRvb2xzID0gbmV3IERpZmZUb29scyhkYik7CisJCU1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHByZWRlZmluZWRUb29scyA9IGRpZmZUb29scworCQkJCS5nZXRQcmVkZWZpbmVkVG9vbHModHJ1ZSk7CisJCUxpc3Q8RXh0ZXJuYWxEaWZmVG9vbD4gYXZhaWxhYmxlVG9vbHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTGlzdDxFeHRlcm5hbERpZmZUb29sPiBub3RBdmFpbGFibGVUb29scyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKEV4dGVybmFsRGlmZlRvb2wgdG9vbCA6IHByZWRlZmluZWRUb29scy52YWx1ZXMoKSkgeworCQkJaWYgKHRvb2wuaXNBdmFpbGFibGUoKSkgeworCQkJCWF2YWlsYWJsZVRvb2xzLmFkZCh0b29sKTsKKwkJCX0gZWxzZSB7CisJCQkJbm90QXZhaWxhYmxlVG9vbHMuYWRkKHRvb2wpOworCQkJfQorCQl9CisKKwkJZXhwZWN0ZWRPdXRwdXQuYWRkKAorCQkJCSInZ2l0IGRpZmZ0b29sIC0tdG9vbD08dG9vbD4nIG1heSBiZSBzZXQgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Iik7CisJCWZvciAoRXh0ZXJuYWxEaWZmVG9vbCB0b29sIDogYXZhaWxhYmxlVG9vbHMpIHsKKwkJCVN0cmluZyB0b29sTmFtZSA9IHRvb2wuZ2V0TmFtZSgpOworCQkJZXhwZWN0ZWRPdXRwdXQuYWRkKHRvb2xOYW1lKTsKKwkJfQorCQlTdHJpbmcgY3VzdG9tVG9vbEhlbHBMaW5lID0gVE9PTF9OQU1FICsgIi4iICsgQ09ORklHX0tFWV9DTUQgKyAiICIKKwkJCQkrIGdldEVjaG9Db21tYW5kKCk7CisJCWV4cGVjdGVkT3V0cHV0LmFkZCgidXNlci1kZWZpbmVkOiIpOworCQlleHBlY3RlZE91dHB1dC5hZGQoY3VzdG9tVG9vbEhlbHBMaW5lKTsKKwkJZXhwZWN0ZWRPdXRwdXQuYWRkKAorCQkJCSJUaGUgZm9sbG93aW5nIHRvb2xzIGFyZSB2YWxpZCwgYnV0IG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlOiIpOworCQlmb3IgKEV4dGVybmFsRGlmZlRvb2wgdG9vbCA6IG5vdEF2YWlsYWJsZVRvb2xzKSB7CisJCQlTdHJpbmcgdG9vbE5hbWUgPSB0b29sLmdldE5hbWUoKTsKIAkJCWV4cGVjdGVkT3V0cHV0LmFkZCh0b29sTmFtZSk7CiAJCX0KIAkJU3RyaW5nW10gdXNlckRlZmluZWRUb29sc0hlbHAgPSB7Ci0JCQkJInVzZXItZGVmaW5lZDoiLAotCQkJCSJUaGUgZm9sbG93aW5nIHRvb2xzIGFyZSB2YWxpZCwgYnV0IG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlOiIsCiAJCQkJIlNvbWUgb2YgdGhlIHRvb2xzIGxpc3RlZCBhYm92ZSBvbmx5IHdvcmsgaW4gYSB3aW5kb3dlZCIsCiAJCQkJImVudmlyb25tZW50LiBJZiBydW4gaW4gYSB0ZXJtaW5hbC1vbmx5IHNlc3Npb24sIHRoZXkgd2lsbCBmYWlsLiIsCiAJCX07CkBAIC0xNTQsNTIgKzI0OCw5OSBAQCBwdWJsaWMgdm9pZCB0ZXN0VG9vbEhlbHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlTdHJpbmcgb3B0aW9uID0gIi0tdG9vbC1oZWxwIjsKIAkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCi0JCQkJZXhwZWN0ZWRPdXRwdXQudG9BcnJheShuZXcgU3RyaW5nWzBdKSwgcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdygiZGlmZnRvb2wiLCBvcHRpb24pKTsKKwkJCQlleHBlY3RlZE91dHB1dC50b0FycmF5KG5ldyBTdHJpbmdbMF0pLAorCQkJCXJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoRElGRl9UT09MLCBvcHRpb24pKTsKIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBjcmVhdGVVbnN0YWdlZENoYW5nZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJd3JpdGVUcmFzaEZpbGUoImEiLCAiSGVsbG8gd29ybGQgYSIpOwotCQl3cml0ZVRyYXNoRmlsZSgiYiIsICJIZWxsbyB3b3JsZCBiIik7Ci0JCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKLQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJmaWxlcyBhICYgYiIpLmNhbGwoKTsKLQkJd3JpdGVUcmFzaEZpbGUoImEiLCAiTmV3IEhlbGxvIHdvcmxkIGEiKTsKLQkJd3JpdGVUcmFzaEZpbGUoImIiLCAiTmV3IEhlbGxvIHdvcmxkIGIiKTsKLQkJcmV0dXJuIGNvbW1pdDsKKwlwcml2YXRlIHZvaWQgY29uZmlndXJlRWNob1Rvb2woU3RyaW5nIHRvb2xOYW1lKSB7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJLy8gdGhlIGRlZmF1bHQgZGlmZiB0b29sIGlzIGNvbmZpZ3VyZWQgd2l0aG91dCBhIHN1YnNlY3Rpb24KKwkJU3RyaW5nIHN1YnNlY3Rpb24gPSBudWxsOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGX1NFQ1RJT04sIHN1YnNlY3Rpb24sIENPTkZJR19LRVlfVE9PTCwKKwkJCQl0b29sTmFtZSk7CisKKwkJU3RyaW5nIGNvbW1hbmQgPSBnZXRFY2hvQ29tbWFuZCgpOworCisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIHRvb2xOYW1lLCBDT05GSUdfS0VZX0NNRCwKKwkJCQljb21tYW5kKTsKKwkJLyoKKwkJICogcHJldmVudCBwcm9tcHRzIGFzIHdlIGFyZSBydW5uaW5nIGluIHRlc3RzIGFuZCB0aGVyZSBpcyBubyB1c2VyIHRvCisJCSAqIGludGVyYWN0IHdpdGggb24gdGhlIGNvbW1hbmQgbGluZQorCQkgKi8KKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgdG9vbE5hbWUsIENPTkZJR19LRVlfUFJPTVBULAorCQkJCVN0cmluZy52YWx1ZU9mKGZhbHNlKSk7CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgY3JlYXRlU3RhZ2VkQ2hhbmdlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXZDb21taXQgY29tbWl0ID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7Ci0JCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKLQkJcmV0dXJuIGNvbW1pdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBnZXRSZXBvc2l0b3J5Q2hhbmdlcyhSZXZDb21taXQgY29tbWl0KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKTsKLQkJdHcuYWRkVHJlZShjb21taXQuZ2V0VHJlZSgpKTsKLQkJRmlsZVRyZWVJdGVyYXRvciBtb2RpZmllZFRyZWUgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7Ci0JCXR3LmFkZFRyZWUobW9kaWZpZWRUcmVlKTsKLQkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBEaWZmRW50cnkuc2Nhbih0dyk7Ci0JCXJldHVybiBjaGFuZ2VzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0RXhwZWN0ZWREaWZmVG9vbE91dHB1dChMaXN0PERpZmZFbnRyeT4gY2hhbmdlcykgewotCQlTdHJpbmdbXSBleHBlY3RlZFRvb2xPdXRwdXQgPSBuZXcgU3RyaW5nW2NoYW5nZXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLnNpemUoKTsgKytpKSB7Ci0JCQlEaWZmRW50cnkgY2hhbmdlID0gY2hhbmdlcy5nZXQoaSk7Ci0JCQlTdHJpbmcgbmV3UGF0aCA9IGNoYW5nZS5nZXROZXdQYXRoKCk7Ci0JCQlTdHJpbmcgb2xkUGF0aCA9IGNoYW5nZS5nZXRPbGRQYXRoKCk7Ci0JCQlTdHJpbmcgbmV3SWROYW1lID0gY2hhbmdlLmdldE5ld0lkKCkubmFtZSgpOwotCQkJU3RyaW5nIG9sZElkTmFtZSA9IGNoYW5nZS5nZXRPbGRJZCgpLm5hbWUoKTsKLQkJCVN0cmluZyBleHBlY3RlZExpbmUgPSAiTVx0IiArIG5ld1BhdGggKyAiICgiICsgbmV3SWROYW1lICsgIikiCi0JCQkJCSsgIlx0IiArIG9sZFBhdGggKyAiICgiICsgb2xkSWROYW1lICsgIikiOwotCQkJZXhwZWN0ZWRUb29sT3V0cHV0W2ldID0gZXhwZWN0ZWRMaW5lOworCXByaXZhdGUgU3RyaW5nW10gZ2V0RXhwZWN0ZWRUb29sT3V0cHV0Tm9Qcm9tcHQoU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMpIHsKKwkJU3RyaW5nW10gZXhwZWN0ZWRUb29sT3V0cHV0ID0gbmV3IFN0cmluZ1tjb25mbGljdGluZ0ZpbGVuYW1lcy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZsaWN0aW5nRmlsZW5hbWVzLmxlbmd0aDsgKytpKSB7CisJCQlTdHJpbmcgbmV3UGF0aCA9IGNvbmZsaWN0aW5nRmlsZW5hbWVzW2ldOworCQkJUGF0aCBmdWxsUGF0aCA9IGdldEZ1bGxQYXRoKG5ld1BhdGgpOworCQkJZXhwZWN0ZWRUb29sT3V0cHV0W2ldID0gZnVsbFBhdGgudG9TdHJpbmcoKTsKIAkJfQogCQlyZXR1cm4gZXhwZWN0ZWRUb29sT3V0cHV0OwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKFN0cmluZyBmYWlsTWVzc2FnZSwKLQkJCVN0cmluZ1tdIGV4cGVjdGVkLCBTdHJpbmdbXSBhY3R1YWwpIHsKLQkJYXNzZXJ0RXF1YWxzKGZhaWxNZXNzYWdlLCB0b1N0cmluZyhleHBlY3RlZCksIHRvU3RyaW5nKGFjdHVhbCkpOworCXByaXZhdGUgUGF0dGVybltdIGdldEV4cGVjdGVkQ2FjaGVkVG9vbE91dHB1dE5vUHJvbXB0KFN0cmluZ1tdIGNvbmZsaWN0aW5nRmlsZW5hbWVzKSB7CisJCVN0cmluZyB0bXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CisJCWlmICh0bXBEaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7CisJCQl0bXBEaXIgPSB0bXBEaXIuc3Vic3RyaW5nKDAsIHRtcERpci5sZW5ndGgoKSAtIDEpOworCQl9CisJCVBhdHRlcm4gZW1wdHlQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIiKTsKKwkJTGlzdDxQYXR0ZXJuPiBleHBlY3RlZFRvb2xPdXRwdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25mbGljdGluZ0ZpbGVuYW1lcy5sZW5ndGg7ICsraSkgeworCQkJU3RyaW5nIGNoYW5nZWRGaWxlbmFtZSA9IGNvbmZsaWN0aW5nRmlsZW5hbWVzW2ldOworCQkJUGF0aCBmdWxsUGF0aCA9IGdldEZ1bGxQYXRoKGNoYW5nZWRGaWxlbmFtZSk7CisJCQlTdHJpbmcgZmlsZW5hbWUgPSBmdWxsUGF0aC5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCk7CisJCQlTdHJpbmcgcmVnZXhwID0gdG1wRGlyICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgZmlsZW5hbWUKKwkJCQkJKyAiX1JFTU9URV8uKiI7CisJCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXhwKTsKKwkJCWV4cGVjdGVkVG9vbE91dHB1dC5hZGQocGF0dGVybik7CisJCQlleHBlY3RlZFRvb2xPdXRwdXQuYWRkKGVtcHR5UGF0dGVybik7CisJCX0KKwkJZXhwZWN0ZWRUb29sT3V0cHV0LmFkZChlbXB0eVBhdHRlcm4pOworCQlyZXR1cm4gZXhwZWN0ZWRUb29sT3V0cHV0LnRvQXJyYXkobmV3IFBhdHRlcm5bMF0pOworCX0KKworCXByaXZhdGUgU3RyaW5nW10gZ2V0RXhwZWN0ZWRDb21wYXJlT3V0cHV0KFN0cmluZ1tdIGNvbmZsaWN0aW5nRmlsZW5hbWVzKSB7CisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpbnQgbiA9IGNvbmZsaWN0aW5nRmlsZW5hbWVzLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJCVN0cmluZyBjaGFuZ2VkRmlsZW5hbWUgPSBjb25mbGljdGluZ0ZpbGVuYW1lc1tpXTsKKwkJCWV4cGVjdGVkLmFkZCgKKwkJCQkJIlZpZXdpbmcgKCIgKyAoaSArIDEpICsgIi8iICsgbiArICIpOiAnIiArIGNoYW5nZWRGaWxlbmFtZQorCQkJCQkJCSsgIiciKTsKKwkJCWV4cGVjdGVkLmFkZCgiTGF1bmNoICciICsgVE9PTF9OQU1FICsgIicgW1kvbl0/Iik7CisJCQlQYXRoIGZ1bGxQYXRoID0gZ2V0RnVsbFBhdGgoY2hhbmdlZEZpbGVuYW1lKTsKKwkJCWV4cGVjdGVkLmFkZChmdWxsUGF0aC50b1N0cmluZygpKTsKKwkJfQorCQlyZXR1cm4gZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZ1tdIGdldEV4cGVjdGVkQWJvcnRPdXRwdXQoU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMsCisJCQlpbnQgYWJvcnRJbmRleCkgeworCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaW50IG4gPSBjb25mbGljdGluZ0ZpbGVuYW1lcy5sZW5ndGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisJCQlTdHJpbmcgY2hhbmdlZEZpbGVuYW1lID0gY29uZmxpY3RpbmdGaWxlbmFtZXNbaV07CisJCQlleHBlY3RlZC5hZGQoCisJCQkJCSJWaWV3aW5nICgiICsgKGkgKyAxKSArICIvIiArIG4gKyAiKTogJyIgKyBjaGFuZ2VkRmlsZW5hbWUKKwkJCQkJCQkrICInIik7CisJCQlleHBlY3RlZC5hZGQoIkxhdW5jaCAnIiArIFRPT0xfTkFNRSArICInIFtZL25dPyIpOworCQkJaWYgKGkgPT0gYWJvcnRJbmRleCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJUGF0aCBmdWxsUGF0aCA9IGdldEZ1bGxQYXRoKGNoYW5nZWRGaWxlbmFtZSk7CisJCQlleHBlY3RlZC5hZGQoZnVsbFBhdGgudG9TdHJpbmcoKSk7CisJCX0KKwkJcmV0dXJuIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVjaG9Db21tYW5kKCkgeworCQkvKgorCQkgKiB1c2UgJ1JFTU9URScgcGxhY2Vob2xkZXIsIGFzIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBmaWxlIHBhdGgKKwkJICogd2l0aGluIHRoZSByZXBvc2l0b3J5LgorCQkgKi8KKwkJcmV0dXJuICIoZWNobyBcIiRSRU1PVEVcIikiOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2hUZXN0LmphdmEKaW5kZXggNTY0YmQ1Zi4uMWM2Yjc4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2hUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2hUZXN0LmphdmEKQEAgLTMzLDYgKzMzLDcgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwgY29tbWl0IikuY2FsbCgpOwogCiAJCVJlcG9zaXRvcnkgcmVtb3RlUmVwb3NpdG9yeSA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKHJlbW90ZVJlcG9zaXRvcnkpOwogCQlyZW1vdGVHaXQgPSBuZXcgR2l0KHJlbW90ZVJlcG9zaXRvcnkpOwogCiAJCS8vIHNldHVwIHRoZSBmaXJzdCByZXBvc2l0b3J5IHRvIGZldGNoIGZyb20gdGhlIHNlY29uZCByZXBvc2l0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZVRvb2xUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZVRvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRjNGYyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlVG9vbFRlc3QuamF2YQpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiwgU2ltZW9uIEFuZHJlZXYgPHNpbWVvbi5kYW5haWxvdi5hbmRyZWV2QGdtYWlsLmNvbT4gYW5kIG90aGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NNRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFJPTVBUOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UT09MOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX01FUkdFX1NFQ1RJT047CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sLkV4dGVybmFsTWVyZ2VUb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbC5NZXJnZVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RpbmcgdGhlIHtAY29kZSBtZXJnZXRvb2x9IGNvbW1hbmQuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXJnZVRvb2xUZXN0IGV4dGVuZHMgVG9vbFRlc3RDYXNlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9UT09MID0gQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OOworCisJQE92ZXJyaWRlCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCWNvbmZpZ3VyZUVjaG9Ub29sKFRPT0xfTkFNRSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VW5kZWZpbmVkVG9vbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdG9vbE5hbWUgPSAidW5kZWZpbmVkIjsKKwkJU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMgPSBjcmVhdGVNZXJnZUNvbmZsaWN0KCk7CisKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkRXJyb3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoU3RyaW5nIGNvbmZsaWN0aW5nRmlsZW5hbWUgOiBjb25mbGljdGluZ0ZpbGVuYW1lcykgeworCQkJZXhwZWN0ZWRFcnJvcnMuYWRkKCJFeHRlcm5hbCBtZXJnZSB0b29sIGlzIG5vdCBkZWZpbmVkOiAiICsgdG9vbE5hbWUpOworCQkJZXhwZWN0ZWRFcnJvcnMuYWRkKCJtZXJnZSBvZiAiICsgY29uZmxpY3RpbmdGaWxlbmFtZSArICIgZmFpbGVkIik7CisJCX0KKworCQlydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KGV4cGVjdGVkRXJyb3JzLCBNRVJHRV9UT09MLAorCQkJCSItLW5vLXByb21wdCIsICItLXRvb2wiLCB0b29sTmFtZSk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBEaWUuY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdFVzZXJUb29sV2l0aENvbW1hbmROb3RGb3VuZEVycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b29sTmFtZSA9ICJjdXN0b21Ub29sIjsKKworCQlpbnQgZXJyb3JSZXR1cm5Db2RlID0gMTI3OyAvLyBjb21tYW5kIG5vdCBmb3VuZAorCQlTdHJpbmcgY29tbWFuZCA9ICJleGl0ICIgKyBlcnJvclJldHVybkNvZGU7CisKKwkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiwgdG9vbE5hbWUsIENPTkZJR19LRVlfQ01ELAorCQkJCWNvbW1hbmQpOworCisJCWNyZWF0ZU1lcmdlQ29uZmxpY3QoKTsKKwkJcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhNRVJHRV9UT09MLCAiLS1uby1wcm9tcHQiLCAiLS10b29sIiwKKwkJCQl0b29sTmFtZSk7CisKKwkJZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIHRvIGJlIHRocm93biBkdWUgdG8gZXh0ZXJuYWwgdG9vbCBleGl0aW5nIHdpdGggZXJyb3IgY29kZTogIgorCQkJCSsgZXJyb3JSZXR1cm5Db2RlKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVRvb2xOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc3VtZUxpbnV4UGxhdGZvcm0oKTsKKworCQlTdHJpbmcgZW1wdHlUb29sTmFtZSA9ICIiOworCisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJLy8gdGhlIGRlZmF1bHQgbWVyZ2UgdG9vbCBpcyBjb25maWd1cmVkIHdpdGhvdXQgYSBzdWJzZWN0aW9uCisJCVN0cmluZyBzdWJzZWN0aW9uID0gbnVsbDsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VfU0VDVElPTiwgc3Vic2VjdGlvbiwgQ09ORklHX0tFWV9UT09MLAorCQkJCWVtcHR5VG9vbE5hbWUpOworCisJCWNyZWF0ZU1lcmdlQ29uZmxpY3QoKTsKKworCQlTdHJpbmcgYXJheGlzRXJyb3JMaW5lID0gImNvbXBhcmU6IHVucmVjb2duaXplZCBvcHRpb24gYC13YWl0JyBAIGVycm9yL2NvbXBhcmUuYy9Db21wYXJlSW1hZ2VDb21tYW5kLzExMjMuIjsKKwkJU3RyaW5nW10gZXhwZWN0ZWRFcnJvck91dHB1dCA9IHsgYXJheGlzRXJyb3JMaW5lLCBhcmF4aXNFcnJvckxpbmUsIH07CisJCXJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoQXJyYXlzLmFzTGlzdChleHBlY3RlZEVycm9yT3V0cHV0KSwKKwkJCQlNRVJHRV9UT09MLCAiLS1uby1wcm9tcHQiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBYm9ydE1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGlucHV0TGluZXMgPSB7CisJCQkJInkiLCAvLyBzdGFydCB0b29sIGZvciBtZXJnZSByZXNvbHV0aW9uCisJCQkJIm4iLCAvLyBkb24ndCBhY2NlcHQgbWVyZ2UgdG9vbCByZXN1bHQKKwkJCQkibiIsIC8vIGRvbid0IGNvbnRpbnVlIHJlc29sdXRpb24KKwkJfTsKKwkJU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMgPSBjcmVhdGVNZXJnZUNvbmZsaWN0KCk7CisJCWludCBhYm9ydEluZGV4ID0gMTsKKwkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZEFib3J0TWVyZ2VPdXRwdXQoCisJCQkJY29uZmxpY3RpbmdGaWxlbmFtZXMsCisJCQkJYWJvcnRJbmRleCk7CisKKwkJU3RyaW5nIG9wdGlvbiA9ICItLXRvb2wiOworCisJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gY3JlYXRlSW5wdXRTdHJlYW0oaW5wdXRMaW5lcyk7CisJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAorCQkJCWV4cGVjdGVkT3V0cHV0LCBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KGlucHV0U3RyZWFtLAorCQkJCQkJTUVSR0VfVE9PTCwgIi0tcHJvbXB0Iiwgb3B0aW9uLCBUT09MX05BTUUpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBYm9ydExhdW5jaCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSBpbnB1dExpbmVzID0geworCQkJCSJuIiwgLy8gYWJvcnQgbWVyZ2UgdG9vbCBsYXVuY2gKKwkJfTsKKwkJU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMgPSBjcmVhdGVNZXJnZUNvbmZsaWN0KCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWRBYm9ydExhdW5jaE91dHB1dCgKKwkJCQljb25mbGljdGluZ0ZpbGVuYW1lcyk7CisKKwkJU3RyaW5nIG9wdGlvbiA9ICItLXRvb2wiOworCisJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gY3JlYXRlSW5wdXRTdHJlYW0oaW5wdXRMaW5lcyk7CisJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAorCQkJCWV4cGVjdGVkT3V0cHV0LCBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KGlucHV0U3RyZWFtLAorCQkJCQkJTUVSR0VfVE9PTCwgIi0tcHJvbXB0Iiwgb3B0aW9uLCBUT09MX05BTUUpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNZXJnZUNvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGlucHV0TGluZXMgPSB7CisJCQkJInkiLCAvLyBzdGFydCB0b29sIGZvciBtZXJnZSByZXNvbHV0aW9uCisJCQkJInkiLCAvLyBhY2NlcHQgbWVyZ2UgcmVzdWx0IGFzIHN1Y2Nlc3NmdWwKKwkJCQkieSIsIC8vIHN0YXJ0IHRvb2wgZm9yIG1lcmdlIHJlc29sdXRpb24KKwkJCQkieSIsIC8vIGFjY2VwdCBtZXJnZSByZXN1bHQgYXMgc3VjY2Vzc2Z1bAorCQl9OworCQlTdHJpbmdbXSBjb25mbGljdGluZ0ZpbGVuYW1lcyA9IGNyZWF0ZU1lcmdlQ29uZmxpY3QoKTsKKwkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZE1lcmdlQ29uZmxpY3RPdXRwdXQoCisJCQkJY29uZmxpY3RpbmdGaWxlbmFtZXMpOworCisJCVN0cmluZyBvcHRpb24gPSAiLS10b29sIjsKKworCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGNyZWF0ZUlucHV0U3RyZWFtKGlucHV0TGluZXMpOworCQlhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoIkluY29ycmVjdCBvdXRwdXQgZm9yIG9wdGlvbjogIiArIG9wdGlvbiwKKwkJCQlleHBlY3RlZE91dHB1dCwgcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhpbnB1dFN0cmVhbSwKKwkJCQkJCU1FUkdFX1RPT0wsICItLXByb21wdCIsIG9wdGlvbiwgVE9PTF9OQU1FKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlZENvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGlucHV0TGluZXMgPSB7CisJCQkJImQiLCAvLyBjaG9vc2UgZGVsZXRlIG9wdGlvbiB0byByZXNvbHZlIGNvbmZsaWN0CisJCQkJIm0iLCAvLyBjaG9vc2UgbWVyZ2Ugb3B0aW9uIHRvIHJlc29sdmUgY29uZmxpY3QKKwkJfTsKKwkJU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMgPSBjcmVhdGVEZWxldGVkQ29uZmxpY3QoKTsKKwkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZERlbGV0ZWRDb25mbGljdE91dHB1dCgKKwkJCQljb25mbGljdGluZ0ZpbGVuYW1lcyk7CisKKwkJU3RyaW5nIG9wdGlvbiA9ICItLXRvb2wiOworCisJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gY3JlYXRlSW5wdXRTdHJlYW0oaW5wdXRMaW5lcyk7CisJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAorCQkJCWV4cGVjdGVkT3V0cHV0LCBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KGlucHV0U3RyZWFtLAorCQkJCQkJTUVSR0VfVE9PTCwgIi0tcHJvbXB0Iiwgb3B0aW9uLCBUT09MX05BTUUpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROb0NvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZVN0YWdlZENoYW5nZXMoKTsKKwkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSB7ICJObyBmaWxlcyBuZWVkIG1lcmdpbmciIH07CisKKwkJU3RyaW5nW10gb3B0aW9ucyA9IHsgIi0tdG9vbCIsICItdCIsIH07CisKKwkJZm9yIChTdHJpbmcgb3B0aW9uIDogb3B0aW9ucykgeworCQkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCisJCQkJCWV4cGVjdGVkT3V0cHV0LAorCQkJCQlydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KE1FUkdFX1RPT0wsIG9wdGlvbiwgVE9PTF9OQU1FKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNZXJnZUNvbmZsaWN0Tm9Qcm9tcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMgPSBjcmVhdGVNZXJnZUNvbmZsaWN0KCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWRNZXJnZUNvbmZsaWN0T3V0cHV0Tm9Qcm9tcHQoCisJCQkJY29uZmxpY3RpbmdGaWxlbmFtZXMpOworCisJCVN0cmluZyBvcHRpb24gPSAiLS10b29sIjsKKworCQlhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoIkluY29ycmVjdCBvdXRwdXQgZm9yIG9wdGlvbjogIiArIG9wdGlvbiwKKwkJCQlleHBlY3RlZE91dHB1dCwKKwkJCQlydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KE1FUkdFX1RPT0wsIG9wdGlvbiwgVE9PTF9OQU1FKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDb25mbGljdE5vR3VpTm9Qcm9tcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMgPSBjcmVhdGVNZXJnZUNvbmZsaWN0KCk7CisJCVN0cmluZ1tdIGV4cGVjdGVkT3V0cHV0ID0gZ2V0RXhwZWN0ZWRNZXJnZUNvbmZsaWN0T3V0cHV0Tm9Qcm9tcHQoCisJCQkJY29uZmxpY3RpbmdGaWxlbmFtZXMpOworCisJCVN0cmluZyBvcHRpb24gPSAiLS10b29sIjsKKworCQlhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoIkluY29ycmVjdCBvdXRwdXQgZm9yIG9wdGlvbjogIiArIG9wdGlvbiwKKwkJCQlleHBlY3RlZE91dHB1dCwgcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhNRVJHRV9UT09MLAorCQkJCQkJIi0tbm8tZ3VpIiwgIi0tbm8tcHJvbXB0Iiwgb3B0aW9uLCBUT09MX05BTUUpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb29sSGVscCgpIHRocm93cyBFeGNlcHRpb24geworCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRPdXRwdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlNZXJnZVRvb2xzIGRpZmZUb29scyA9IG5ldyBNZXJnZVRvb2xzKGRiKTsKKwkJTWFwPFN0cmluZywgRXh0ZXJuYWxNZXJnZVRvb2w+IHByZWRlZmluZWRUb29scyA9IGRpZmZUb29scworCQkJCS5nZXRQcmVkZWZpbmVkVG9vbHModHJ1ZSk7CisJCUxpc3Q8RXh0ZXJuYWxNZXJnZVRvb2w+IGF2YWlsYWJsZVRvb2xzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUxpc3Q8RXh0ZXJuYWxNZXJnZVRvb2w+IG5vdEF2YWlsYWJsZVRvb2xzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoRXh0ZXJuYWxNZXJnZVRvb2wgdG9vbCA6IHByZWRlZmluZWRUb29scy52YWx1ZXMoKSkgeworCQkJaWYgKHRvb2wuaXNBdmFpbGFibGUoKSkgeworCQkJCWF2YWlsYWJsZVRvb2xzLmFkZCh0b29sKTsKKwkJCX0gZWxzZSB7CisJCQkJbm90QXZhaWxhYmxlVG9vbHMuYWRkKHRvb2wpOworCQkJfQorCQl9CisKKwkJZXhwZWN0ZWRPdXRwdXQuYWRkKAorCQkJCSInZ2l0IG1lcmdldG9vbCAtLXRvb2w9PHRvb2w+JyBtYXkgYmUgc2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiIpOworCQlmb3IgKEV4dGVybmFsTWVyZ2VUb29sIHRvb2wgOiBhdmFpbGFibGVUb29scykgeworCQkJU3RyaW5nIHRvb2xOYW1lID0gdG9vbC5nZXROYW1lKCk7CisJCQlleHBlY3RlZE91dHB1dC5hZGQodG9vbE5hbWUpOworCQl9CisJCVN0cmluZyBjdXN0b21Ub29sSGVscExpbmUgPSBUT09MX05BTUUgKyAiLiIgKyBDT05GSUdfS0VZX0NNRCArICIgIgorCQkJCSsgZ2V0RWNob0NvbW1hbmQoKTsKKwkJZXhwZWN0ZWRPdXRwdXQuYWRkKCJ1c2VyLWRlZmluZWQ6Iik7CisJCWV4cGVjdGVkT3V0cHV0LmFkZChjdXN0b21Ub29sSGVscExpbmUpOworCQlleHBlY3RlZE91dHB1dC5hZGQoCisJCQkJIlRoZSBmb2xsb3dpbmcgdG9vbHMgYXJlIHZhbGlkLCBidXQgbm90IGN1cnJlbnRseSBhdmFpbGFibGU6Iik7CisJCWZvciAoRXh0ZXJuYWxNZXJnZVRvb2wgdG9vbCA6IG5vdEF2YWlsYWJsZVRvb2xzKSB7CisJCQlTdHJpbmcgdG9vbE5hbWUgPSB0b29sLmdldE5hbWUoKTsKKwkJCWV4cGVjdGVkT3V0cHV0LmFkZCh0b29sTmFtZSk7CisJCX0KKwkJU3RyaW5nW10gdXNlckRlZmluZWRUb29sc0hlbHAgPSB7CisJCQkJIlNvbWUgb2YgdGhlIHRvb2xzIGxpc3RlZCBhYm92ZSBvbmx5IHdvcmsgaW4gYSB3aW5kb3dlZCIsCisJCQkJImVudmlyb25tZW50LiBJZiBydW4gaW4gYSB0ZXJtaW5hbC1vbmx5IHNlc3Npb24sIHRoZXkgd2lsbCBmYWlsLiIsIH07CisJCWV4cGVjdGVkT3V0cHV0LmFkZEFsbChBcnJheXMuYXNMaXN0KHVzZXJEZWZpbmVkVG9vbHNIZWxwKSk7CisKKwkJU3RyaW5nIG9wdGlvbiA9ICItLXRvb2wtaGVscCI7CisJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAorCQkJCWV4cGVjdGVkT3V0cHV0LnRvQXJyYXkobmV3IFN0cmluZ1swXSksCisJCQkJcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhNRVJHRV9UT09MLCBvcHRpb24pKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY29uZmlndXJlRWNob1Rvb2woU3RyaW5nIHRvb2xOYW1lKSB7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJLy8gdGhlIGRlZmF1bHQgbWVyZ2UgdG9vbCBpcyBjb25maWd1cmVkIHdpdGhvdXQgYSBzdWJzZWN0aW9uCisJCVN0cmluZyBzdWJzZWN0aW9uID0gbnVsbDsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VfU0VDVElPTiwgc3Vic2VjdGlvbiwgQ09ORklHX0tFWV9UT09MLAorCQkJCXRvb2xOYW1lKTsKKworCQlTdHJpbmcgY29tbWFuZCA9IGdldEVjaG9Db21tYW5kKCk7CisKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VUT09MX1NFQ1RJT04sIHRvb2xOYW1lLCBDT05GSUdfS0VZX0NNRCwKKwkJCQljb21tYW5kKTsKKwkJLyoKKwkJICogcHJldmVudCBwcm9tcHRzIGFzIHdlIGFyZSBydW5uaW5nIGluIHRlc3RzIGFuZCB0aGVyZSBpcyBubyB1c2VyIHRvCisJCSAqIGludGVyYWN0IHdpdGggb24gdGhlIGNvbW1hbmQgbGluZQorCQkgKi8KKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VUT09MX1NFQ1RJT04sIHRvb2xOYW1lLCBDT05GSUdfS0VZX1BST01QVCwKKwkJCQlTdHJpbmcudmFsdWVPZihmYWxzZSkpOworCX0KKworCXByaXZhdGUgU3RyaW5nW10gZ2V0RXhwZWN0ZWRNZXJnZUNvbmZsaWN0T3V0cHV0Tm9Qcm9tcHQoCisJCQlTdHJpbmdbXSBjb25mbGljdEZpbGVuYW1lcykgeworCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZXhwZWN0ZWQuYWRkKCJNZXJnaW5nOiIpOworCQlmb3IgKFN0cmluZyBjb25mbGljdEZpbGVuYW1lIDogY29uZmxpY3RGaWxlbmFtZXMpIHsKKwkJCWV4cGVjdGVkLmFkZChjb25mbGljdEZpbGVuYW1lKTsKKwkJfQorCQlmb3IgKFN0cmluZyBjb25mbGljdEZpbGVuYW1lIDogY29uZmxpY3RGaWxlbmFtZXMpIHsKKwkJCWV4cGVjdGVkLmFkZCgiTm9ybWFsIG1lcmdlIGNvbmZsaWN0IGZvciAnIiArIGNvbmZsaWN0RmlsZW5hbWUKKwkJCQkJKyAiJzoiKTsKKwkJCWV4cGVjdGVkLmFkZCgie2xvY2FsfTogbW9kaWZpZWQgZmlsZSIpOworCQkJZXhwZWN0ZWQuYWRkKCJ7cmVtb3RlfTogbW9kaWZpZWQgZmlsZSIpOworCQkJUGF0aCBmaWxlUGF0aCA9IGdldEZ1bGxQYXRoKGNvbmZsaWN0RmlsZW5hbWUpOworCQkJZXhwZWN0ZWQuYWRkKGZpbGVQYXRoLnRvU3RyaW5nKCkpOworCQkJZXhwZWN0ZWQuYWRkKGNvbmZsaWN0RmlsZW5hbWUgKyAiIHNlZW1zIHVuY2hhbmdlZC4iKTsKKwkJfQorCQlyZXR1cm4gZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRFeHBlY3RlZEFib3J0TGF1bmNoT3V0cHV0KAorCQkJU3RyaW5nW10gY29uZmxpY3RGaWxlbmFtZXMpIHsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWV4cGVjdGVkLmFkZCgiTWVyZ2luZzoiKTsKKwkJZm9yIChTdHJpbmcgY29uZmxpY3RGaWxlbmFtZSA6IGNvbmZsaWN0RmlsZW5hbWVzKSB7CisJCQlleHBlY3RlZC5hZGQoY29uZmxpY3RGaWxlbmFtZSk7CisJCX0KKwkJaWYgKGNvbmZsaWN0RmlsZW5hbWVzLmxlbmd0aCA+IDEpIHsKKwkJCVN0cmluZyBjb25mbGljdEZpbGVuYW1lID0gY29uZmxpY3RGaWxlbmFtZXNbMF07CisJCQlleHBlY3RlZC5hZGQoCisJCQkJCSJOb3JtYWwgbWVyZ2UgY29uZmxpY3QgZm9yICciICsgY29uZmxpY3RGaWxlbmFtZSArICInOiIpOworCQkJZXhwZWN0ZWQuYWRkKCJ7bG9jYWx9OiBtb2RpZmllZCBmaWxlIik7CisJCQlleHBlY3RlZC5hZGQoIntyZW1vdGV9OiBtb2RpZmllZCBmaWxlIik7CisJCQlleHBlY3RlZC5hZGQoIkhpdCByZXR1cm4gdG8gc3RhcnQgbWVyZ2UgcmVzb2x1dGlvbiB0b29sICgiCisJCQkJCSsgVE9PTF9OQU1FICsgIik6Iik7CisJCX0KKwkJcmV0dXJuIGV4cGVjdGVkLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdbXSBnZXRFeHBlY3RlZEFib3J0TWVyZ2VPdXRwdXQoCisJCQlTdHJpbmdbXSBjb25mbGljdEZpbGVuYW1lcywgaW50IGFib3J0SW5kZXgpIHsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWV4cGVjdGVkLmFkZCgiTWVyZ2luZzoiKTsKKwkJZm9yIChTdHJpbmcgY29uZmxpY3RGaWxlbmFtZSA6IGNvbmZsaWN0RmlsZW5hbWVzKSB7CisJCQlleHBlY3RlZC5hZGQoY29uZmxpY3RGaWxlbmFtZSk7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25mbGljdEZpbGVuYW1lcy5sZW5ndGg7ICsraSkgeworCQkJaWYgKGkgPT0gYWJvcnRJbmRleCkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQlTdHJpbmcgY29uZmxpY3RGaWxlbmFtZSA9IGNvbmZsaWN0RmlsZW5hbWVzW2ldOworCQkJZXhwZWN0ZWQuYWRkKAorCQkJCQkiTm9ybWFsIG1lcmdlIGNvbmZsaWN0IGZvciAnIiArIGNvbmZsaWN0RmlsZW5hbWUgKyAiJzoiKTsKKwkJCWV4cGVjdGVkLmFkZCgie2xvY2FsfTogbW9kaWZpZWQgZmlsZSIpOworCQkJZXhwZWN0ZWQuYWRkKCJ7cmVtb3RlfTogbW9kaWZpZWQgZmlsZSIpOworCQkJUGF0aCBmdWxsUGF0aCA9IGdldEZ1bGxQYXRoKGNvbmZsaWN0RmlsZW5hbWUpOworCQkJZXhwZWN0ZWQuYWRkKCJIaXQgcmV0dXJuIHRvIHN0YXJ0IG1lcmdlIHJlc29sdXRpb24gdG9vbCAoIgorCQkJCQkrIFRPT0xfTkFNRSArICIpOiAiICsgZnVsbFBhdGgpOworCQkJZXhwZWN0ZWQuYWRkKGNvbmZsaWN0RmlsZW5hbWUgKyAiIHNlZW1zIHVuY2hhbmdlZC4iKTsKKwkJCWV4cGVjdGVkLmFkZCgiV2FzIHRoZSBtZXJnZSBzdWNjZXNzZnVsIFt5L25dPyIpOworCQkJaWYgKGkgPCBjb25mbGljdEZpbGVuYW1lcy5sZW5ndGggLSAxKSB7CisJCQkJZXhwZWN0ZWQuYWRkKAorCQkJCQkJIlx0Q29udGludWUgbWVyZ2luZyBvdGhlciB1bnJlc29sdmVkIHBhdGhzIFt5L25dPyIpOworCQkJfQorCQl9CisJCXJldHVybiBleHBlY3RlZC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworCX0KKworCXByaXZhdGUgU3RyaW5nW10gZ2V0RXhwZWN0ZWRNZXJnZUNvbmZsaWN0T3V0cHV0KAorCQkJU3RyaW5nW10gY29uZmxpY3RGaWxlbmFtZXMpIHsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWV4cGVjdGVkLmFkZCgiTWVyZ2luZzoiKTsKKwkJZm9yIChTdHJpbmcgY29uZmxpY3RGaWxlbmFtZSA6IGNvbmZsaWN0RmlsZW5hbWVzKSB7CisJCQlleHBlY3RlZC5hZGQoY29uZmxpY3RGaWxlbmFtZSk7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25mbGljdEZpbGVuYW1lcy5sZW5ndGg7ICsraSkgeworCQkJU3RyaW5nIGNvbmZsaWN0RmlsZW5hbWUgPSBjb25mbGljdEZpbGVuYW1lc1tpXTsKKwkJCWV4cGVjdGVkLmFkZCgiTm9ybWFsIG1lcmdlIGNvbmZsaWN0IGZvciAnIiArIGNvbmZsaWN0RmlsZW5hbWUKKwkJCQkJKyAiJzoiKTsKKwkJCWV4cGVjdGVkLmFkZCgie2xvY2FsfTogbW9kaWZpZWQgZmlsZSIpOworCQkJZXhwZWN0ZWQuYWRkKCJ7cmVtb3RlfTogbW9kaWZpZWQgZmlsZSIpOworCQkJUGF0aCBmaWxlUGF0aCA9IGdldEZ1bGxQYXRoKGNvbmZsaWN0RmlsZW5hbWUpOworCQkJZXhwZWN0ZWQuYWRkKCJIaXQgcmV0dXJuIHRvIHN0YXJ0IG1lcmdlIHJlc29sdXRpb24gdG9vbCAoIgorCQkJCQkrIFRPT0xfTkFNRSArICIpOiAiICsgZmlsZVBhdGgpOworCQkJZXhwZWN0ZWQuYWRkKGNvbmZsaWN0RmlsZW5hbWUgKyAiIHNlZW1zIHVuY2hhbmdlZC4iKTsKKwkJCWV4cGVjdGVkLmFkZCgiV2FzIHRoZSBtZXJnZSBzdWNjZXNzZnVsIFt5L25dPyIpOworCQkJaWYgKGkgPCBjb25mbGljdEZpbGVuYW1lcy5sZW5ndGggLSAxKSB7CisJCQkJLy8gZXhwZWN0ZWQuYWRkKAorCQkJCS8vICJcdENvbnRpbnVlIG1lcmdpbmcgb3RoZXIgdW5yZXNvbHZlZCBwYXRocyBbeS9uXT8iKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRFeHBlY3RlZERlbGV0ZWRDb25mbGljdE91dHB1dCgKKwkJCVN0cmluZ1tdIGNvbmZsaWN0RmlsZW5hbWVzKSB7CisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlleHBlY3RlZC5hZGQoIk1lcmdpbmc6Iik7CisJCWZvciAoU3RyaW5nIG1lcmdlQ29uZmxpY3RGaWxlbmFtZSA6IGNvbmZsaWN0RmlsZW5hbWVzKSB7CisJCQlleHBlY3RlZC5hZGQobWVyZ2VDb25mbGljdEZpbGVuYW1lKTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZsaWN0RmlsZW5hbWVzLmxlbmd0aDsgKytpKSB7CisJCQlTdHJpbmcgY29uZmxpY3RGaWxlbmFtZSA9IGNvbmZsaWN0RmlsZW5hbWVzW2ldOworCQkJZXhwZWN0ZWQuYWRkKGNvbmZsaWN0RmlsZW5hbWUgKyAiIHNlZW1zIHVuY2hhbmdlZC4iKTsKKwkJCWV4cGVjdGVkLmFkZCgie2xvY2FsfTogZGVsZXRlZCIpOworCQkJZXhwZWN0ZWQuYWRkKCJ7cmVtb3RlfTogbW9kaWZpZWQgZmlsZSIpOworCQkJZXhwZWN0ZWQuYWRkKCJVc2UgKG0pb2RpZmllZCBvciAoZCllbGV0ZWQgZmlsZSwgb3IgKGEpYm9ydD8iKTsKKwkJfQorCQlyZXR1cm4gZXhwZWN0ZWQudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RWNob0NvbW1hbmQoKSB7CisJCS8qCisJCSAqIHVzZSAnTUVSR0VEJyBwbGFjZWhvbGRlciwgYXMgYm90aCAnTE9DQUwnIGFuZCAnUkVNT1RFJyB3aWxsIGJlCisJCSAqIHJlcGxhY2VkIHdpdGggZnVsbCBwYXRocyB0byBhIHRlbXBvcmFyeSBmaWxlIGR1cmluZyBzb21lIG9mIHRoZSB0ZXN0cworCQkgKi8KKwkJcmV0dXJuICIoZWNobyBcIiRNRVJHRURcIikiOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Rvb2xUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vVG9vbFRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2YjM4YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Rvb2xUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBTaW1lb24gQW5kcmVldiA8c2ltZW9uLmRhbmFpbG92LmFuZHJlZXZAZ21haWwuY29tPiBhbmQgb3RoZXJzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNMSVJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuQ21kTGluZVBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuU3ViY29tbWFuZEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3lzdGVtUmVhZGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQXJndW1lbnQ7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkNtZExpbmVFeGNlcHRpb247CisKKy8qKgorICogQmFzZSB0ZXN0IGNhc2UgZm9yIHRoZSB7QGNvZGUgZGlmZnRvb2x9IGFuZCB7QGNvZGUgbWVyZ2V0b29sfSBjb21tYW5kcy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRvb2xUZXN0Q2FzZSBleHRlbmRzIENMSVJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEdpdENsaUpHaXRXcmFwcGVyUGFyc2VyIHsKKwkJQEFyZ3VtZW50KGluZGV4ID0gMCwgbWV0YVZhciA9ICJtZXRhVmFyX2NvbW1hbmQiLCByZXF1aXJlZCA9IHRydWUsIGhhbmRsZXIgPSBTdWJjb21tYW5kSGFuZGxlci5jbGFzcykKKwkJVGV4dEJ1aWx0aW4gc3ViY29tbWFuZDsKKworCQlAQXJndW1lbnQoaW5kZXggPSAxLCBtZXRhVmFyID0gIm1ldGFWYXJfYXJnIikKKwkJTGlzdDxTdHJpbmc+IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTkFNRSA9ICJzb21lX3Rvb2wiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQlJBTkNIX05BTUUgPSAidGVzdF9icmFuY2giOworCisJcHJpdmF0ZSBHaXQgZ2l0OworCisJQE92ZXJyaWRlCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCWdpdCA9IG5ldyBHaXQoZGIpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CisJCWdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKFRFU1RfQlJBTkNIX05BTUUpLmNhbGwoKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nW10gcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhTdHJpbmcuLi4gYXJncykKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7IC8vIG5vIGlucHV0IHN0cmVhbQorCQlyZXR1cm4gcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhpbnB1dFN0cmVhbSwgYXJncyk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZ1tdIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoCisJCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRFcnJvck91dHB1dCwgU3RyaW5nLi4uIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7IC8vIG5vIGlucHV0IHN0cmVhbQorCQlyZXR1cm4gcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhpbnB1dFN0cmVhbSwgZXhwZWN0ZWRFcnJvck91dHB1dCwKKwkJCQlhcmdzKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nW10gcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdyhJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwKKwkJCVN0cmluZy4uLiBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkRXJyb3JPdXRwdXQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJcmV0dXJuIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoaW5wdXRTdHJlYW0sIGV4cGVjdGVkRXJyb3JPdXRwdXQsCisJCQkJYXJncyk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZ1tdIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sCisJCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRFcnJvck91dHB1dCwgU3RyaW5nLi4uIGFyZ3MpCisJCQl0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiwgRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCUNMSUdpdENvbW1hbmQuUmVzdWx0IHJlc3VsdCA9IG5ldyBDTElHaXRDb21tYW5kLlJlc3VsdCgpOworCisJCUdpdENsaUpHaXRXcmFwcGVyUGFyc2VyIGJlYW4gPSBuZXcgR2l0Q2xpSkdpdFdyYXBwZXJQYXJzZXIoKTsKKwkJQ21kTGluZVBhcnNlciBjbHAgPSBuZXcgQ21kTGluZVBhcnNlcihiZWFuKTsKKwkJY2xwLnBhcnNlQXJndW1lbnQoYXJncyk7CisKKwkJVGV4dEJ1aWx0aW4gY21kID0gYmVhbi5zdWJjb21tYW5kOworCQljbWQuaW5pdFJhdyhkYiwgbnVsbCwgaW5wdXRTdHJlYW0sIHJlc3VsdC5vdXQsIHJlc3VsdC5lcnIpOworCQljbWQuZXhlY3V0ZShiZWFuLmFyZ3VtZW50cy50b0FycmF5KG5ldyBTdHJpbmdbYmVhbi5hcmd1bWVudHMuc2l6ZSgpXSkpOworCQlpZiAoY21kLmdldE91dHB1dFdyaXRlcigpICE9IG51bGwpIHsKKwkJCWNtZC5nZXRPdXRwdXRXcml0ZXIoKS5mbHVzaCgpOworCQl9CisJCWlmIChjbWQuZ2V0RXJyb3JXcml0ZXIoKSAhPSBudWxsKSB7CisJCQljbWQuZ2V0RXJyb3JXcml0ZXIoKS5mbHVzaCgpOworCQl9CisKKwkJTGlzdDxTdHJpbmc+IGVyckxpbmVzID0gcmVzdWx0LmVyckxpbmVzKCkuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKGwgLT4gIWwuaXNCbGFuaygpKSAvLyB3ZSBjYXJlIG9ubHkgYWJvdXQgZXJyb3IgbWVzc2FnZXMKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBubyBzdGFuZGFyZCBlcnJvciBvdXRwdXQgZnJvbSB0b29sIiwKKwkJCQlleHBlY3RlZEVycm9yT3V0cHV0LnRvU3RyaW5nKCksIGVyckxpbmVzLnRvU3RyaW5nKCkpOworCisJCXJldHVybiByZXN1bHQub3V0TGluZXMoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworCX0KKworCXByb3RlY3RlZCBTdHJpbmdbXSBjcmVhdGVNZXJnZUNvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGNyZWF0ZSBmaWxlcyBvbiBpbml0aWFsIGJyYW5jaAorCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKFRFU1RfQlJBTkNIX05BTUUpLmNhbGwoKTsKKwkJd3JpdGVUcmFzaEZpbGUoImRpcjEvYSIsICJIZWxsbyB3b3JsZCBhIik7CisJCXdyaXRlVHJhc2hGaWxlKCJkaXIyL2IiLCAiSGVsbG8gd29ybGQgYiIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJmaWxlcyBhICYgYiBhZGRlZCIpLmNhbGwoKTsKKwkJLy8gY3JlYXRlIGFub3RoZXIgYnJhbmNoIGFuZCBjaGFuZ2UgZmlsZXMKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoImJyYW5jaF8xIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2hfMSIpLmNhbGwoKTsKKwkJd3JpdGVUcmFzaEZpbGUoImRpcjEvYSIsICJIZWxsbyB3b3JsZCBhIDEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoImRpcjIvYiIsICJIZWxsbyB3b3JsZCBiIDEiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlSZXZDb21taXQgY29tbWl0MSA9IGdpdC5jb21taXQoKQorCQkJCS5zZXRNZXNzYWdlKCJmaWxlcyBhICYgYiBtb2RpZmllZCBjb21taXQgMSIpLmNhbGwoKTsKKwkJLy8gY2hlY2tvdXQgaW5pdGlhbCBicmFuY2gKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZShURVNUX0JSQU5DSF9OQU1FKS5jYWxsKCk7CisJCS8vIGNyZWF0ZSBhbm90aGVyIGJyYW5jaCBhbmQgY2hhbmdlIGZpbGVzCisJCWdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKCJicmFuY2hfMiIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNoXzIiKS5jYWxsKCk7CisJCXdyaXRlVHJhc2hGaWxlKCJkaXIxL2EiLCAiSGVsbG8gd29ybGQgYSAyIik7CisJCXdyaXRlVHJhc2hGaWxlKCJkaXIyL2IiLCAiSGVsbG8gd29ybGQgYiAyIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImZpbGVzIGEgJiBiIG1vZGlmaWVkIGNvbW1pdCAyIikuY2FsbCgpOworCQkvLyBjaGVycnktcGljayBjb25mbGljdGluZyBjaGFuZ2VzCisJCWdpdC5jaGVycnlQaWNrKCkuaW5jbHVkZShjb21taXQxKS5jYWxsKCk7CisJCVN0cmluZ1tdIGNvbmZsaWN0aW5nRmlsZW5hbWVzID0geyAiZGlyMS9hIiwgImRpcjIvYiIgfTsKKwkJcmV0dXJuIGNvbmZsaWN0aW5nRmlsZW5hbWVzOworCX0KKworCXByb3RlY3RlZCBTdHJpbmdbXSBjcmVhdGVEZWxldGVkQ29uZmxpY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gY3JlYXRlIGZpbGVzIG9uIGluaXRpYWwgYnJhbmNoCisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoVEVTVF9CUkFOQ0hfTkFNRSkuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiZGlyMS9hIiwgIkhlbGxvIHdvcmxkIGEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoImRpcjIvYiIsICJIZWxsbyB3b3JsZCBiIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImZpbGVzIGEgJiBiIGFkZGVkIikuY2FsbCgpOworCQkvLyBjcmVhdGUgYW5vdGhlciBicmFuY2ggYW5kIGNoYW5nZSBmaWxlcworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiYnJhbmNoXzEiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaF8xIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiZGlyMS9hIiwgIkhlbGxvIHdvcmxkIGEgMSIpOworCQl3cml0ZVRyYXNoRmlsZSgiZGlyMi9iIiwgIkhlbGxvIHdvcmxkIGIgMSIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCVJldkNvbW1pdCBjb21taXQxID0gZ2l0LmNvbW1pdCgpCisJCQkJLnNldE1lc3NhZ2UoImZpbGVzIGEgJiBiIG1vZGlmaWVkIGNvbW1pdCAxIikuY2FsbCgpOworCQkvLyBjaGVja291dCBpbml0aWFsIGJyYW5jaAorCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKFRFU1RfQlJBTkNIX05BTUUpLmNhbGwoKTsKKwkJLy8gY3JlYXRlIGFub3RoZXIgYnJhbmNoIGFuZCBjaGFuZ2UgZmlsZXMKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoImJyYW5jaF8yIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2hfMiIpLmNhbGwoKTsKKwkJZ2l0LnJtKCkuYWRkRmlsZXBhdHRlcm4oImRpcjEvYSIpLmNhbGwoKTsKKwkJZ2l0LnJtKCkuYWRkRmlsZXBhdHRlcm4oImRpcjIvYiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImZpbGVzIGEgJiBiIGRlbGV0ZWQgY29tbWl0IDIiKS5jYWxsKCk7CisJCS8vIGNoZXJyeS1waWNrIGNvbmZsaWN0aW5nIGNoYW5nZXMKKwkJZ2l0LmNoZXJyeVBpY2soKS5pbmNsdWRlKGNvbW1pdDEpLmNhbGwoKTsKKwkJU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMgPSB7ICJkaXIxL2EiLCAiZGlyMi9iIiB9OworCQlyZXR1cm4gY29uZmxpY3RpbmdGaWxlbmFtZXM7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZ1tdIGNyZWF0ZVVuc3RhZ2VkQ2hhbmdlcygpIHRocm93cyBFeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZSgiZGlyMS9hIiwgIkhlbGxvIHdvcmxkIGEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoImRpcjIvYiIsICJIZWxsbyB3b3JsZCBiIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImZpbGVzIGEgJiBiIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiZGlyMS9hIiwgIk5ldyBIZWxsbyB3b3JsZCBhIik7CisJCXdyaXRlVHJhc2hGaWxlKCJkaXIyL2IiLCAiTmV3IEhlbGxvIHdvcmxkIGIiKTsKKwkJU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMgPSB7ICJkaXIxL2EiLCAiZGlyMi9iIiB9OworCQlyZXR1cm4gY29uZmxpY3RpbmdGaWxlbmFtZXM7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZ1tdIGNyZWF0ZVN0YWdlZENoYW5nZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gY29uZmxpY3RpbmdGaWxlbmFtZXMgPSBjcmVhdGVVbnN0YWdlZENoYW5nZXMoKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlyZXR1cm4gY29uZmxpY3RpbmdGaWxlbmFtZXM7CisJfQorCisJcHJvdGVjdGVkIExpc3Q8RGlmZkVudHJ5PiBnZXRSZXBvc2l0b3J5Q2hhbmdlcyhSZXZDb21taXQgY29tbWl0KQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKTsKKwkJdHcuYWRkVHJlZShjb21taXQuZ2V0VHJlZSgpKTsKKwkJRmlsZVRyZWVJdGVyYXRvciBtb2RpZmllZFRyZWUgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCXR3LmFkZFRyZWUobW9kaWZpZWRUcmVlKTsKKwkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBEaWZmRW50cnkuc2Nhbih0dyk7CisJCXJldHVybiBjaGFuZ2VzOworCX0KKworCXByb3RlY3RlZCBQYXRoIGdldEZ1bGxQYXRoKFN0cmluZyByZXBvc2l0b3J5RmlsZW5hbWUpIHsKKwkJUGF0aCBkb3RHaXRQYXRoID0gZGIuZ2V0RGlyZWN0b3J5KCkudG9QYXRoKCk7CisJCVBhdGggcmVwb3NpdG9yeVJvb3QgPSBkb3RHaXRQYXRoLmdldFBhcmVudCgpOworCQlQYXRoIHJlcG9zaXRvcnlGaWxlUGF0aCA9IHJlcG9zaXRvcnlSb290LnJlc29sdmUocmVwb3NpdG9yeUZpbGVuYW1lKTsKKwkJcmV0dXJuIHJlcG9zaXRvcnlGaWxlUGF0aDsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIElucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKFN0cmluZ1tdIGlucHV0TGluZXMpIHsKKwkJcmV0dXJuIGNyZWF0ZUlucHV0U3RyZWFtKEFycmF5cy5hc0xpc3QoaW5wdXRMaW5lcykpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oTGlzdDxTdHJpbmc+IGlucHV0TGluZXMpIHsKKwkJU3RyaW5nIGlucHV0ID0gU3RyaW5nLmpvaW4oU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSwgaW5wdXRMaW5lcyk7CisJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpOworCQlyZXR1cm4gaW5wdXRTdHJlYW07CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5T2ZMaW5lc0VxdWFscyhTdHJpbmcgZmFpbE1lc3NhZ2UsCisJCQlTdHJpbmdbXSBleHBlY3RlZCwgU3RyaW5nW10gYWN0dWFsKSB7CisJCWFzc2VydEVxdWFscyhmYWlsTWVzc2FnZSwgdG9TdHJpbmcoZXhwZWN0ZWQpLCB0b1N0cmluZyhhY3R1YWwpKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYXNzZXJ0QXJyYXlPZk1hdGNoaW5nTGluZXMoU3RyaW5nIGZhaWxNZXNzYWdlLAorCQkJUGF0dGVybltdIGV4cGVjdGVkLCBTdHJpbmdbXSBhY3R1YWwpIHsKKwkJYXNzZXJ0RXF1YWxzKGZhaWxNZXNzYWdlICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKQorCQkJCSsgIkV4cGVjdGVkIGFuZCBhY3R1YWwgbGluZXMgY291bnQgZG9uJ3QgbWF0Y2guIEV4cGVjdGVkOiAiCisJCQkJKyBBcnJheXMuYXNMaXN0KGV4cGVjdGVkKSArICIsIGFjdHVhbDogIgorCQkJCSsgQXJyYXlzLmFzTGlzdChhY3R1YWwpLCBleHBlY3RlZC5sZW5ndGgsIGFjdHVhbC5sZW5ndGgpOworCQlpbnQgbiA9IGV4cGVjdGVkLmxlbmd0aDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJCVBhdHRlcm4gZXhwZWN0ZWRQYXR0ZXJuID0gZXhwZWN0ZWRbaV07CisJCQlTdHJpbmcgYWN0dWFsTGluZSA9IGFjdHVhbFtpXTsKKwkJCU1hdGNoZXIgbWF0Y2hlciA9IGV4cGVjdGVkUGF0dGVybi5tYXRjaGVyKGFjdHVhbExpbmUpOworCQkJYm9vbGVhbiBtYXRjaGVzID0gbWF0Y2hlci5tYXRjaGVzKCk7CisJCQlhc3NlcnRUcnVlKGZhaWxNZXNzYWdlICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSArICJMaW5lICIgKyBpICsgIiAnIgorCQkJCQkrIGFjdHVhbExpbmUgKyAiJyBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm46ICIKKwkJCQkJKyBleHBlY3RlZFBhdHRlcm4gKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpICsgIkV4cGVjdGVkOiAiCisJCQkJCSsgQXJyYXlzLmFzTGlzdChleHBlY3RlZCkgKyAiLCBhY3R1YWw6ICIKKwkJCQkJKyBBcnJheXMuYXNMaXN0KGFjdHVhbCksCisJCQkJCW1hdGNoZXMpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFzc3VtZUxpbnV4UGxhdGZvcm0oKSB7CisJCUFzc3VtZS5hc3N1bWVUcnVlKCJUaGlzIHRlc3QgY2FuIHJ1biBvbmx5IGluIExpbnV4IHRlc3RzIiwKKwkJCQlTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc0xpbnV4KCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL3NlcnZpY2VzL29yZy5lY2xpcHNlLmpnaXQucGdtLlRleHRCdWlsdGluIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvc2VydmljZXMvb3JnLmVjbGlwc2UuamdpdC5wZ20uVGV4dEJ1aWx0aW4KaW5kZXggOGM0NDc2NC4uZWExZDFlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvc2VydmljZXMvb3JnLmVjbGlwc2UuamdpdC5wZ20uVGV4dEJ1aWx0aW4KKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvc2VydmljZXMvb3JnLmVjbGlwc2UuamdpdC5wZ20uVGV4dEJ1aWx0aW4KQEAgLTI1LDYgKzI1LDcgQEAKIG9yZy5lY2xpcHNlLmpnaXQucGdtLkxzVHJlZQogb3JnLmVjbGlwc2UuamdpdC5wZ20uTWVyZ2UKIG9yZy5lY2xpcHNlLmpnaXQucGdtLk1lcmdlQmFzZQorb3JnLmVjbGlwc2UuamdpdC5wZ20uTWVyZ2VUb29sCiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5QdXNoCiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5SZWNlaXZlUGFjawogb3JnLmVjbGlwc2UuamdpdC5wZ20uUmVmbG9nCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vYnVpbGQucHJvcGVydGllcwppbmRleCA0YjM4MTE0Li4zMDJkZGVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL2J1aWxkLnByb3BlcnRpZXMKQEAgLTYsNCArNiw0IEBACiAgICAgICAgICAgICAgICAuLFwKICAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKICAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKyAgICAgICAgICAgICAgIHJlc291cmNlcy9zaW1wbGVsb2dnZXIucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwKaW5kZXggNWNhYzA2Zi4uZTU0MWUxYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sCkBAIC0xMDMsMTIgKzEwMyw3IEBACiAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgorICAgICAgPGFydGlmYWN0SWQ+c2xmNGotc2ltcGxlPC9hcnRpZmFjdElkPgogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5NmM1YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotbG9nNGoucm9vdExvZ2dlcj1XQVJOLCBzdGRlcnIKLQotbG9nNGouYXBwZW5kZXIuc3RkZXJyPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5zdGRlcnIuVGFyZ2V0PVN5c3RlbS5lcnIKLWxvZzRqLmFwcGVuZGVyLnN0ZGVyci5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5zdGRlcnIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke3l5eXktTU0tZGQgSEg6bW06c3N9ICUtNXAgJWN7MX06JUwgLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMKaW5kZXggZDUxZGFhZi4uYjE0NTMxYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzCkBAIC01OCw5ICs1OCwxMSBAQAogZGF0ZUluZm89RGF0ZTogICB7MH0KIGRlbGV0ZWRCcmFuY2g9RGVsZXRlZCBicmFuY2ggezB9CiBkZWxldGVkUmVtb3RlQnJhbmNoPURlbGV0ZWQgcmVtb3RlIGJyYW5jaCB7MH0KLWRpZmZUb29sSGVscFNldFRvRm9sbG93aW5nPSdnaXQgZGlmZnRvb2wgLS10b29sPTx0b29sPicgbWF5IGJlIHNldCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbnswfVxuXHR1c2VyLWRlZmluZWQ6XG57MX1cblRoZSBmb2xsb3dpbmcgdG9vbHMgYXJlIHZhbGlkLCBidXQgbm90IGN1cnJlbnRseSBhdmFpbGFibGU6XG57Mn1cblNvbWUgb2YgdGhlIHRvb2xzIGxpc3RlZCBhYm92ZSBvbmx5IHdvcmsgaW4gYSB3aW5kb3dlZFxuZW52aXJvbm1lbnQuIElmIHJ1biBpbiBhIHRlcm1pbmFsLW9ubHkgc2Vzc2lvbiwgdGhleSB3aWxsIGZhaWwuCi1kaWZmVG9vbExhdW5jaD1WaWV3aW5nICh7MH0vezF9KTogJ3syfSdcbkxhdW5jaCAnezN9JyBbWS9uXT8KLWRpZmZUb29sRGllZD1leHRlcm5hbCBkaWZmIGRpZWQsIHN0b3BwaW5nIGF0IHswfQorZGlmZlRvb2xIZWxwU2V0VG9Gb2xsb3dpbmc9JydnaXQgZGlmZnRvb2wgLS10b29sPTx0b29sPicnIG1heSBiZSBzZXQgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6XG57MH1cblx0dXNlci1kZWZpbmVkOlxuezF9XG5UaGUgZm9sbG93aW5nIHRvb2xzIGFyZSB2YWxpZCwgYnV0IG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlOlxuezJ9XG5Tb21lIG9mIHRoZSB0b29scyBsaXN0ZWQgYWJvdmUgb25seSB3b3JrIGluIGEgd2luZG93ZWRcbmVudmlyb25tZW50LiBJZiBydW4gaW4gYSB0ZXJtaW5hbC1vbmx5IHNlc3Npb24sIHRoZXkgd2lsbCBmYWlsLgorZGlmZlRvb2xMYXVuY2g9Vmlld2luZyAoezB9L3sxfSk6ICcnezJ9JydcbkxhdW5jaCAnJ3szfScnIFtZL25dPworZGlmZlRvb2xEaWVkPWV4dGVybmFsIGRpZmYgZGllZCwgc3RvcHBpbmcgYXQgcGF0aCAnJ3swfScnIGR1ZSB0byBleGNlcHRpb246IHsxfQorZGlmZlRvb2xQcm9tcHRUb29sTmFtZT1UaGlzIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGJlY2F1c2UgJ2RpZmYudG9vbCcgaXMgbm90IGNvbmZpZ3VyZWQuXG5TZWUgJ2dpdCBkaWZmdG9vbCAtLXRvb2wtaGVscCcgb3IgJ2dpdCBoZWxwIGNvbmZpZycgZm9yIG1vcmUgZGV0YWlscy5cbidnaXQgZGlmZnRvb2wnIHdpbGwgbm93IGF0dGVtcHQgdG8gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRvb2xzOlxuezB9XG4KK2RpZmZUb29sVW5rbm93blRvb2xOYW1lPVVua25vd24gZGlmZiB0b29sICd7MH0nCiBkb2VzTm90RXhpc3Q9ezB9IGRvZXMgbm90IGV4aXN0CiBkb250T3ZlcndyaXRlTG9jYWxDaGFuZ2VzPWVycm9yOiBZb3VyIGxvY2FsIGNoYW5nZXMgdG8gdGhlIGZvbGxvd2luZyBmaWxlIHdvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5IG1lcmdlOgogZXZlcnl0aGluZ1VwVG9EYXRlPUV2ZXJ5dGhpbmcgdXAtdG8tZGF0ZQpAQCAtOTEsNiArOTMsMjQgQEAKIGxvZ05vU2lnbmF0dXJlVmVyaWZpZXI9Ik5vIHNpZ25hdHVyZSB2ZXJpZmllciBhdmFpbGFibGUiCiBtZXJnZUNvbmZsaWN0PUNPTkZMSUNUKGNvbnRlbnQpOiBNZXJnZSBjb25mbGljdCBpbiB7MH0KIG1lcmdlQ2hlY2tvdXRDb25mbGljdD1lcnJvcjogWW91ciBsb2NhbCBjaGFuZ2VzIHRvIHRoZSBmb2xsb3dpbmcgZmlsZXMgd291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgbWVyZ2U6CittZXJnZVRvb2xIZWxwU2V0VG9Gb2xsb3dpbmc9JydnaXQgbWVyZ2V0b29sIC0tdG9vbD08dG9vbD4nJyBtYXkgYmUgc2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuezB9XG5cdHVzZXItZGVmaW5lZDpcbnsxfVxuVGhlIGZvbGxvd2luZyB0b29scyBhcmUgdmFsaWQsIGJ1dCBub3QgY3VycmVudGx5IGF2YWlsYWJsZTpcbnsyfVxuU29tZSBvZiB0aGUgdG9vbHMgbGlzdGVkIGFib3ZlIG9ubHkgd29yayBpbiBhIHdpbmRvd2VkXG5lbnZpcm9ubWVudC4gSWYgcnVuIGluIGEgdGVybWluYWwtb25seSBzZXNzaW9uLCB0aGV5IHdpbGwgZmFpbC4KK21lcmdlVG9vbExhdW5jaD1IaXQgcmV0dXJuIHRvIHN0YXJ0IG1lcmdlIHJlc29sdXRpb24gdG9vbCAoezB9KToKK21lcmdlVG9vbERpZWQ9bG9jYWwgb3IgcmVtb3RlIGNhbm5vdCBiZSBmb3VuZCBpbiBjYWNoZSwgc3RvcHBpbmcgYXQgezB9CittZXJnZVRvb2xOb0ZpbGVzPU5vIGZpbGVzIG5lZWQgbWVyZ2luZworbWVyZ2VUb29sTWVyZ2luZz1NZXJnaW5nOlxuezB9CittZXJnZVRvb2xVbmtub3duQ29uZmxpY3Q9XG5Vbmtub3duIG1lcmdlIGNvbmZsaWN0IGZvciAnJ3swfScnOgorbWVyZ2VUb29sTm9ybWFsQ29uZmxpY3Q9XG5Ob3JtYWwgbWVyZ2UgY29uZmxpY3QgZm9yICcnezB9Jyc6XG4gICd7J2xvY2FsJ30nOiBtb2RpZmllZCBmaWxlXG4gICd7J3JlbW90ZSd9JzogbW9kaWZpZWQgZmlsZQorbWVyZ2VUb29sTWVyZ2VGYWlsZWQ9bWVyZ2Ugb2YgezB9IGZhaWxlZAorbWVyZ2VUb29sRXhlY3V0aW9uRXJyb3I9ZXhjdXRpb24gZXJyb3IKK21lcmdlVG9vbEZpbGVVbmNoYW5nZWQ9XG57MH0gc2VlbXMgdW5jaGFuZ2VkLgorbWVyZ2VUb29sRGVsZXRlZENvbmZsaWN0PVxuRGVsZXRlZCBtZXJnZSBjb25mbGljdCBmb3IgJyd7MH0nJzoKK21lcmdlVG9vbERlbGV0ZWRDb25mbGljdEJ5VXM9ICB7bG9jYWx9OiBkZWxldGVkXG4gIHtyZW1vdGV9OiBtb2RpZmllZCBmaWxlCittZXJnZVRvb2xEZWxldGVkQ29uZmxpY3RCeVRoZW09ICB7bG9jYWx9OiBtb2RpZmllZCBmaWxlXG4gIHtyZW1vdGV9OiBkZWxldGVkCittZXJnZVRvb2xDb250aW51ZVVucmVzb2x2ZWRQYXRocz1cbkNvbnRpbnVlIG1lcmdpbmcgb3RoZXIgdW5yZXNvbHZlZCBwYXRocyBbeS9uXT8KK21lcmdlVG9vbFdhc01lcmdlU3VjY2Vzc2Z1bGw9V2FzIHRoZSBtZXJnZSBzdWNjZXNzZnVsIFt5L25dPworbWVyZ2VUb29sRGVsZXRlZE1lcmdlRGVjaXNpb249VXNlIChtKW9kaWZpZWQgb3IgKGQpZWxldGVkIGZpbGUsIG9yIChhKWJvcnQ/CittZXJnZVRvb2xQcm9tcHRUb29sTmFtZT1UaGlzIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGJlY2F1c2UgJ21lcmdlLnRvb2wnIGlzIG5vdCBjb25maWd1cmVkLlxuU2VlICdnaXQgbWVyZ2V0b29sIC0tdG9vbC1oZWxwJyBvciAnZ2l0IGhlbHAgY29uZmlnJyBmb3IgbW9yZSBkZXRhaWxzLlxuJ2dpdCBtZXJnZXRvb2wnIHdpbGwgbm93IGF0dGVtcHQgdG8gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRvb2xzOlxuezB9XG4KK21lcmdlVG9vbFVua25vd25Ub29sTmFtZT1Vbmtub3duIG1lcmdlIHRvb2wgJ3swfScKIG1lcmdlRmFpbGVkPUF1dG9tYXRpYyBtZXJnZSBmYWlsZWQ7IGZpeCBjb25mbGljdHMgYW5kIHRoZW4gY29tbWl0IHRoZSByZXN1bHQKIG1lcmdlQ2hlY2tvdXRGYWlsZWQ9UGxlYXNlLCBjb21taXQgeW91ciBjaGFuZ2VzIG9yIHN0YXNoIHRoZW0gYmVmb3JlIHlvdSBjYW4gbWVyZ2UuCiBtZXJnZU1hZGVCeT1NZXJnZSBtYWRlIGJ5IHRoZSAnJ3swfScnIHN0cmF0ZWd5LgpAQCAtMjI5LDYgKzI0OSw3IEBACiB1bnN1cHBvcnRlZE9wZXJhdGlvbj1VbnN1cHBvcnRlZCBvcGVyYXRpb246IHswfQogdW50cmFja2VkRmlsZXM9VW50cmFja2VkIGZpbGVzOgogdXBkYXRpbmc9VXBkYXRpbmcgezB9Li57MX0KK3VzYWdlX0FiYnJldj1JbnN0ZWFkIG9mIHVzaW5nIHRoZSBkZWZhdWx0IG51bWJlciBvZiBoZXhhZGVjaW1hbCBkaWdpdHMgKHdoaWNoIHdpbGwgdmFyeSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSByZXBvc2l0b3J5IHdpdGggYSBkZWZhdWx0IG9mIDcpIG9mIHRoZSBhYmJyZXZpYXRlZCBvYmplY3QgbmFtZSwgdXNlIDxuPiBkaWdpdHMsIG9yIGFzIG1hbnkgZGlnaXRzIGFzIG5lZWRlZCB0byBmb3JtIGEgdW5pcXVlIG9iamVjdCBuYW1lLiBBbiA8bj4gb2YgMCB3aWxsIHN1cHByZXNzIGxvbmcgZm9ybWF0LCBvbmx5IHNob3dpbmcgdGhlIGNsb3Nlc3QgdGFnLgogdXNhZ2VfQWdncmVzc2l2ZT1UaGlzIG9wdGlvbiB3aWxsIGNhdXNlIGdjIHRvIG1vcmUgYWdncmVzc2l2ZWx5IG9wdGltaXplIHRoZSByZXBvc2l0b3J5IGF0IHRoZSBleHBlbnNlIG9mIHRha2luZyBtdWNoIG1vcmUgdGltZQogdXNhZ2VfQWx3YXlzRmFsbGJhY2s9U2hvdyB1bmlxdWVseSBhYmJyZXZpYXRlZCBjb21taXQgb2JqZWN0IGFzIGZhbGxiYWNrCiB1c2FnZV9iYXJlQ2xvbmU9TWFrZSBhIGJhcmUgR2l0IHJlcG9zaXRvcnkuIFRoYXQgaXMsIGluc3RlYWQgb2YgY3JlYXRpbmcgW0RJUkVDVE9SWV0gYW5kIHBsYWNpbmcgdGhlIGFkbWluaXN0cmF0aXZlIGZpbGVzIGluIFtESVJFQ1RPUlldLy5naXQsIG1ha2UgdGhlIFtESVJFQ1RPUlldIGl0c2VsZiB0aGUgJEdJVF9ESVIuCkBAIC0yNTQsNiArMjc1LDcgQEAKIHVzYWdlX0djPUNsZWFudXAgdW5uZWNlc3NhcnkgZmlsZXMgYW5kIG9wdGltaXplIHRoZSBsb2NhbCByZXBvc2l0b3J5CiB1c2FnZV9HbG9nPVZpZXcgY29tbWl0IGhpc3RvcnkgYXMgYSBncmFwaAogdXNhZ2VfRGlmZkd1aVRvb2w9V2hlbiBnaXQtZGlmZnRvb2wgaXMgaW52b2tlZCB3aXRoIHRoZSAtZyBvciAtLWd1aSBvcHRpb24gdGhlIGRlZmF1bHQgZGlmZiB0b29sIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBjb25maWd1cmVkIGRpZmYuZ3VpdG9vbCB2YXJpYWJsZSBpbnN0ZWFkIG9mIGRpZmYudG9vbC4KK3VzYWdlX01lcmdlR3VpVG9vbD1XaGVuIGdpdC1tZXJnZXRvb2wgaXMgaW52b2tlZCB3aXRoIHRoZSAtZyBvciAtLWd1aSBvcHRpb24gdGhlIGRlZmF1bHQgbWVyZ2UgdG9vbCB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgY29uZmlndXJlZCBtZXJnZS5ndWl0b29sIHZhcmlhYmxlIGluc3RlYWQgb2YgbWVyZ2UudG9vbC4KIHVzYWdlX25vR3VpPVRoZSAtLW5vLWd1aSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgLWcgb3IgLS1ndWkgc2V0dGluZy4KIHVzYWdlX0luZGV4UGFjaz1CdWlsZCBwYWNrIGluZGV4IGZpbGUgZm9yIGFuIGV4aXN0aW5nIHBhY2tlZCBhcmNoaXZlCiB1c2FnZV9MRlNEaXJlY3Rvcnk9RGlyZWN0b3J5IHRvIHN0b3JlIGxhcmdlIG9iamVjdHMKQEAgLTMwMiw2ICszMjQsNyBAQAogdXNhZ2VfU3RvcFRyYWNraW5nQUZpbGU9U3RvcCB0cmFja2luZyBhIGZpbGUKIHVzYWdlX1RleHRIYXNoRnVuY3Rpb25zPVNjYW4gcmVwb3NpdG9yeSB0byBjb21wdXRlIG1heGltdW0gbnVtYmVyIG9mIGNvbGxpc2lvbnMgZm9yIGhhc2ggZnVuY3Rpb25zCiB1c2FnZV9Ub29sRm9yRGlmZj1Vc2UgdGhlIGRpZmYgdG9vbCBzcGVjaWZpZWQgYnkgPHRvb2w+LiBSdW4gZ2l0IGRpZmZ0b29sIC0tdG9vbC1oZWxwIGZvciB0aGUgbGlzdCBvZiB2YWxpZCA8dG9vbD4gc2V0dGluZ3MuXG5JZiBhIGRpZmYgdG9vbCBpcyBub3Qgc3BlY2lmaWVkLCBnaXQgZGlmZnRvb2wgd2lsbCB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZGlmZi50b29sLgordXNhZ2VfVG9vbEZvck1lcmdlPVVzZSB0aGUgbWVyZ2UgcmVzb2x1dGlvbiBwcm9ncmFtIHNwZWNpZmllZCBieSA8dG9vbD4uIFJ1biBnaXQgbWVyZ2V0b29sIC0tdG9vbC1oZWxwIGZvciB0aGUgbGlzdCBvZiB2YWxpZCA8dG9vbD4gc2V0dGluZ3MuXG5JZiBhIG1lcmdlIHJlc29sdXRpb24gcHJvZ3JhbSBpcyBub3Qgc3BlY2lmaWVkLCBnaXQgbWVyZ2V0b29sIHdpbGwgdXNlIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIG1lcmdlLnRvb2wuCiB1c2FnZV9VcGRhdGVSZW1vdGVSZXBvc2l0b3J5RnJvbUxvY2FsUmVmcz1VcGRhdGUgcmVtb3RlIHJlcG9zaXRvcnkgZnJvbSBsb2NhbCByZWZzCiB1c2FnZV9Vc2VBbGw9VXNlIGFsbCByZWZzIGZvdW5kIGluIHJlZnMvCiB1c2FnZV9Vc2VUYWdzPVVzZSBhbnkgdGFnIGluY2x1ZGluZyBsaWdodHdlaWdodCB0YWdzCkBAIC0zNDksNiArMzcyLDcgQEAKIHVzYWdlX2RldGVjdFJlbmFtZXM9ZGV0ZWN0IHJlbmFtZWQgZmlsZXMKIHVzYWdlX2RpZmZBbGdvcml0aG09dGhlIGRpZmYgYWxnb3JpdGhtIHRvIHVzZS4gQ3VycmVudGx5IHN1cHBvcnRlZCBhcmU6ICdteWVycycsICdoaXN0b2dyYW0nCiB1c2FnZV9EaWZmVG9vbD1naXQgZGlmZnRvb2wgaXMgYSBHaXQgY29tbWFuZCB0aGF0IGFsbG93cyB5b3UgdG8gY29tcGFyZSBhbmQgZWRpdCBmaWxlcyBiZXR3ZWVuIHJldmlzaW9ucyB1c2luZyBjb21tb24gZGlmZiB0b29scy5cbmdpdCBkaWZmdG9vbCBpcyBhIGZyb250ZW5kIHRvIGdpdCBkaWZmIGFuZCBhY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYW5kIGFyZ3VtZW50cy4KK3VzYWdlX01lcmdlVG9vbD1naXQtbWVyZ2V0b29sIC0gUnVuIG1lcmdlIGNvbmZsaWN0IHJlc29sdXRpb24gdG9vbHMgdG8gcmVzb2x2ZSBtZXJnZSBjb25mbGljdHMuXG5Vc2UgZ2l0IG1lcmdldG9vbCB0byBydW4gb25lIG9mIHNldmVyYWwgbWVyZ2UgdXRpbGl0aWVzIHRvIHJlc29sdmUgbWVyZ2UgY29uZmxpY3RzLiBJdCBpcyB0eXBpY2FsbHkgcnVuIGFmdGVyIGdpdCBtZXJnZS4KIHVzYWdlX2RpcmVjdG9yaWVzVG9FeHBvcnQ9ZGlyZWN0b3JpZXMgdG8gZXhwb3J0CiB1c2FnZV9kaXNhYmxlVGhlU2VydmljZUluQWxsUmVwb3NpdG9yaWVzPWRpc2FibGUgdGhlIHNlcnZpY2UgaW4gYWxsIHJlcG9zaXRvcmllcwogdXNhZ2VfZGlzcGxheUFMaXN0T2ZBbGxSZWdpc3RlcmVkSmdpdENvbW1hbmRzPURpc3BsYXkgYSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGpnaXQgY29tbWFuZHMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9zaW1wbGVsb2dnZXIucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9zaW1wbGVsb2dnZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGMxOWNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL3NpbXBsZWxvZ2dlci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNiBAQAorb3JnLnNsZjRqLnNpbXBsZUxvZ2dlci5kZWZhdWx0TG9nTGV2ZWw9d2Fybgorb3JnLnNsZjRqLnNpbXBsZUxvZ2dlci5sb2dGaWxlPVN5c3RlbS5lcnIKK29yZy5zbGY0ai5zaW1wbGVMb2dnZXIuc2hvd0RhdGVUaW1lPXRydWUKK29yZy5zbGY0ai5zaW1wbGVMb2dnZXIuZGF0ZVRpbWVGb3JtYXQ9eXl5eS1NTS1kZCBISDptbTpzcworb3JnLnNsZjRqLnNpbXBsZUxvZ2dlci5zaG93VGhyZWFkTmFtZT10cnVlCitvcmcuc2xmNGouc2ltcGxlTG9nZ2VyLnNob3dMb2dOYW1lPXRydWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CbGFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JsYW1lLmphdmEKaW5kZXggMmI0OWNmNy4uMWEzYTJmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JsYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JsYW1lLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuSW50ZWdlci52YWx1ZU9mOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTG9uZy52YWx1ZU9mOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEg7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTE2LDcgKzExNyw4IEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHsKIAogCQlib29sZWFuIGF1dG9BYmJyZXYgPSBhYmJyZXYgPT0gMDsKIAkJaWYgKGFiYnJldiA9PSAwKSB7Ci0JCQlhYmJyZXYgPSBkYi5nZXRDb25maWcoKS5nZXRJbnQoImNvcmUiLCAiYWJicmV2IiwgNyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJYWJicmV2ID0gZGIuZ2V0Q29uZmlnKCkuZ2V0SW50KCJjb3JlIiwgImFiYnJldiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpOwogCQl9CiAJCWlmICghc2hvd0JsYW5rQm91bmRhcnkpIHsKIAkJCXJvb3QgPSBkYi5nZXRDb25maWcoKS5nZXRCb29sZWFuKCJibGFtZSIsICJibGFua2JvdW5kYXJ5IiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlLmphdmEKaW5kZXggOGFhMTE5YS4uMTE2ZGIwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlLmphdmEKQEAgLTQ0LDYgKzQ0LDkgQEAgY2xhc3MgRGVzY3JpYmUgZXh0ZW5kcyBUZXh0QnVpbHRpbiB7CiAJQE9wdGlvbihuYW1lID0gIi0tbWF0Y2giLCB1c2FnZSA9ICJ1c2FnZV9NYXRjaCIsIG1ldGFWYXIgPSAibWV0YVZhcl9wYXR0ZXJuIikKIAlwcml2YXRlIExpc3Q8U3RyaW5nPiBwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCisJQE9wdGlvbihuYW1lID0gIi0tYWJicmV2IiwgdXNhZ2UgPSAidXNhZ2VfQWJicmV2IikKKwlwcml2YXRlIEludGVnZXIgYWJicmV2OworCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB7CkBAIC01Nyw2ICs2MCw5IEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHsKIAkJCWNtZC5zZXRUYWdzKHVzZVRhZ3MpOwogCQkJY21kLnNldEFsd2F5cyhhbHdheXMpOwogCQkJY21kLnNldE1hdGNoKHBhdHRlcm5zLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOworCQkJaWYgKGFiYnJldiAhPSBudWxsKSB7CisJCQkJY21kLnNldEFiYnJldihhYmJyZXYuaW50VmFsdWUoKSk7CisJCQl9CiAJCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKIAkJCXRyeSB7CiAJCQkJcmVzdWx0ID0gY21kLmNhbGwoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUb29sLmphdmEKaW5kZXggZDI2ODQyYy4uODdjNzE3OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUb29sLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUb29sLmphdmEKQEAgLTEsNSArMSw2IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMiwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxOSwgVGltIE5ldW1hbm4gPHRpbS5uZXVtYW5uQGFkdmFudGVzdC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwyNCArMTIsNDAgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkhFQUQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGsuT3BlcmF0aW9uVHlwZS5DSEVDS09VVF9PUDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5Db250ZW50U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5Db250ZW50U291cmNlLlBhaXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5LlNpZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUNoZWNrb3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVDaGVja291dC5DaGVja291dE1ldGFkYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5BbWJpZ3VvdXNPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vV29ya1RyZWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmV2aXNpb25TeW50YXhFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sLkRpZmZUb29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2wuRXh0ZXJuYWxEaWZmVG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2wuRmlsZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sLlByb21wdENvbnRpbnVlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2wuVG9vbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZy5Fb2xTdHJlYW1UeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdFJlYWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwpAQCAtMzYsMTEgKzUzLDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWwuQm9vbGVhblRyaVN0YXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsLkNMSVRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LlBhdGhUcmVlRmlsdGVySGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQ2Fub25pY2FsVHJlZVBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLldvcmtpbmdUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5Xb3JraW5nVHJlZU9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuUGF0aEZpbHRlckdyb3VwOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlRyZWVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUy5FeGVjdXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQXJndW1lbnQ7CiBpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKIApAQCAtNTYsOSArNzksMTMgQEAgY2xhc3MgRGlmZlRvb2wgZXh0ZW5kcyBUZXh0QnVpbHRpbiB7CiAJQEFyZ3VtZW50KGluZGV4ID0gMSwgbWV0YVZhciA9ICJtZXRhVmFyX3RyZWVpc2giKQogCXByaXZhdGUgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbmV3VHJlZTsKIAorCXByaXZhdGUgT3B0aW9uYWw8U3RyaW5nPiB0b29sTmFtZSA9IE9wdGlvbmFsLmVtcHR5KCk7CisKIAlAT3B0aW9uKG5hbWUgPSAiLS10b29sIiwgYWxpYXNlcyA9IHsKIAkJCSItdCIgfSwgbWV0YVZhciA9ICJtZXRhVmFyX3Rvb2wiLCB1c2FnZSA9ICJ1c2FnZV9Ub29sRm9yRGlmZiIpCi0JcHJpdmF0ZSBTdHJpbmcgdG9vbE5hbWU7CisJdm9pZCBzZXRUb29sTmFtZShTdHJpbmcgbmFtZSkgeworCQl0b29sTmFtZSA9IE9wdGlvbmFsLm9mKG5hbWUpOworCX0KIAogCUBPcHRpb24obmFtZSA9ICItLWNhY2hlZCIsIGFsaWFzZXMgPSB7ICItLXN0YWdlZCIgfSwgdXNhZ2UgPSAidXNhZ2VfY2FjaGVkIikKIAlwcml2YXRlIGJvb2xlYW4gY2FjaGVkOwpAQCAtNzgsMTYgKzEwNSwxNiBAQCB2b2lkIG5vUHJvbXB0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CiAJQE9wdGlvbihuYW1lID0gIi0tdG9vbC1oZWxwIiwgdXNhZ2UgPSAidXNhZ2VfdG9vbEhlbHAiKQogCXByaXZhdGUgYm9vbGVhbiB0b29sSGVscDsKIAotCXByaXZhdGUgQm9vbGVhblRyaVN0YXRlIGd1aSA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKwlwcml2YXRlIGJvb2xlYW4gZ3VpID0gZmFsc2U7CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1ndWkiLCBhbGlhc2VzID0geyAiLWciIH0sIHVzYWdlID0gInVzYWdlX0RpZmZHdWlUb29sIikKIAl2b2lkIHNldEd1aShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgewotCQlndWkgPSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwkJZ3VpID0gdHJ1ZTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1uby1ndWkiLCB1c2FnZSA9ICJ1c2FnZV9ub0d1aSIpCiAJdm9pZCBub0d1aShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgewotCQlndWkgPSBCb29sZWFuVHJpU3RhdGUuRkFMU0U7CisJCWd1aSA9IGZhbHNlOwogCX0KIAogCXByaXZhdGUgQm9vbGVhblRyaVN0YXRlIHRydXN0RXhpdENvZGUgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7CkBAIC0xMDUsMTEgKzEzMiwxNSBAQCB2b2lkIG5vVHJ1c3RFeGl0Q29kZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgewogCUBPcHRpb24obmFtZSA9ICItLSIsIG1ldGFWYXIgPSAibWV0YVZhcl9wYXRocyIsIGhhbmRsZXIgPSBQYXRoVHJlZUZpbHRlckhhbmRsZXIuY2xhc3MpCiAJcHJpdmF0ZSBUcmVlRmlsdGVyIHBhdGhGaWx0ZXIgPSBUcmVlRmlsdGVyLkFMTDsKIAorCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgaW5wdXRSZWFkZXI7CisKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBpbml0KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGdpdERpcikgewogCQlzdXBlci5pbml0KHJlcG9zaXRvcnksIGdpdERpcik7CiAJCWRpZmZGbXQgPSBuZXcgRGlmZkZvcm1hdHRlcihuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cykpOwogCQlkaWZmVG9vbHMgPSBuZXcgRGlmZlRvb2xzKHJlcG9zaXRvcnkpOworCQlpbnB1dFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5zLAorCQkJCVN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRDaGFyc2V0KCkpKTsKIAl9CiAKIAlAT3ZlcnJpZGUKQEAgLTExOCwyMyArMTQ5LDEyIEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHsKIAkJCWlmICh0b29sSGVscCkgewogCQkJCXNob3dUb29sSGVscCgpOwogCQkJfSBlbHNlIHsKLQkJCQlib29sZWFuIHNob3dQcm9tcHQgPSBkaWZmVG9vbHMuaXNJbnRlcmFjdGl2ZSgpOwotCQkJCWlmIChwcm9tcHQgIT0gQm9vbGVhblRyaVN0YXRlLlVOU0VUKSB7Ci0JCQkJCXNob3dQcm9tcHQgPSBwcm9tcHQgPT0gQm9vbGVhblRyaVN0YXRlLlRSVUU7Ci0JCQkJfQotCQkJCVN0cmluZyB0b29sTmFtZVByb21wdCA9IHRvb2xOYW1lOwotCQkJCWlmIChzaG93UHJvbXB0KSB7Ci0JCQkJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKHRvb2xOYW1lUHJvbXB0KSkgewotCQkJCQkJdG9vbE5hbWVQcm9tcHQgPSBkaWZmVG9vbHMuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7Ci0JCQkJCX0KLQkJCQl9CiAJCQkJLy8gZ2V0IHRoZSBjaGFuZ2VkIGZpbGVzCiAJCQkJTGlzdDxEaWZmRW50cnk+IGZpbGVzID0gZ2V0RmlsZXMoKTsKIAkJCQlpZiAoZmlsZXMuc2l6ZSgpID4gMCkgewotCQkJCQljb21wYXJlKGZpbGVzLCBzaG93UHJvbXB0LCB0b29sTmFtZVByb21wdCk7CisJCQkJCWNvbXBhcmUoZmlsZXMpOwogCQkJCX0KIAkJCX0KLQkJCW91dHcuZmx1c2goKTsKIAkJfSBjYXRjaCAoUmV2aXNpb25TeW50YXhFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBkaWUoZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9IGZpbmFsbHkgewpAQCAtMTQyLDc2ICsxNjIsMTMxIEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3Q8RGlmZkVudHJ5PiBmaWxlcywgYm9vbGVhbiBzaG93UHJvbXB0LAotCQkJU3RyaW5nIHRvb2xOYW1lUHJvbXB0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGludCBmaWxlSW5kZXggPSAwOyBmaWxlSW5kZXggPCBmaWxlcy5zaXplKCk7IGZpbGVJbmRleCsrKSB7Ci0JCQlEaWZmRW50cnkgZW50ID0gZmlsZXMuZ2V0KGZpbGVJbmRleCk7Ci0JCQlTdHJpbmcgbWVyZ2VkRmlsZVBhdGggPSBlbnQuZ2V0TmV3UGF0aCgpOwotCQkJaWYgKG1lcmdlZEZpbGVQYXRoLmVxdWFscyhEaWZmRW50cnkuREVWX05VTEwpKSB7Ci0JCQkJbWVyZ2VkRmlsZVBhdGggPSBlbnQuZ2V0T2xkUGF0aCgpOworCXByaXZhdGUgdm9pZCBpbmZvcm1Vc2VyTm9Ub29sKExpc3Q8U3RyaW5nPiB0b29scykgeworCQl0cnkgeworCQkJU3RyaW5nQnVpbGRlciB0b29sTmFtZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJZm9yIChTdHJpbmcgbmFtZSA6IHRvb2xzKSB7CisJCQkJdG9vbE5hbWVzLmFwcGVuZChuYW1lICsgIiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQotCQkJLy8gY2hlY2sgaWYgdXNlciB3YW50cyB0byBsYXVuY2ggY29tcGFyZQotCQkJYm9vbGVhbiBsYXVuY2hDb21wYXJlID0gdHJ1ZTsKLQkJCWlmIChzaG93UHJvbXB0KSB7Ci0JCQkJbGF1bmNoQ29tcGFyZSA9IGlzTGF1bmNoQ29tcGFyZShmaWxlSW5kZXggKyAxLCBmaWxlcy5zaXplKCksCi0JCQkJCQltZXJnZWRGaWxlUGF0aCwgdG9vbE5hbWVQcm9tcHQpOwotCQkJfQotCQkJaWYgKGxhdW5jaENvbXBhcmUpIHsKLQkJCQlzd2l0Y2ggKGVudC5nZXRDaGFuZ2VUeXBlKCkpIHsKLQkJCQljYXNlIE1PRElGWToKLQkJCQkJb3V0dy5wcmludGxuKCJNXHQiICsgZW50LmdldE5ld1BhdGgoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyAiICgiICsgZW50LmdldE5ld0lkKCkubmFtZSgpICsgIikiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCSsgIlx0IiArIGVudC5nZXRPbGRQYXRoKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgIiAoIiArIGVudC5nZXRPbGRJZCgpLm5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpbnQgcmV0ID0gZGlmZlRvb2xzLmNvbXBhcmUoZW50LmdldE5ld1BhdGgoKSwKLQkJCQkJCQllbnQuZ2V0T2xkUGF0aCgpLCBlbnQuZ2V0TmV3SWQoKS5uYW1lKCksCi0JCQkJCQkJZW50LmdldE9sZElkKCkubmFtZSgpLCB0b29sTmFtZSwgcHJvbXB0LCBndWksCi0JCQkJCQkJdHJ1c3RFeGl0Q29kZSk7Ci0JCQkJCWlmIChyZXQgIT0gMCkgewotCQkJCQkJdGhyb3cgZGllKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQlDTElUZXh0LmdldCgpLmRpZmZUb29sRGllZCwgbWVyZ2VkRmlsZVBhdGgpKTsKKwkJCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJQ0xJVGV4dC5nZXQoKS5kaWZmVG9vbFByb21wdFRvb2xOYW1lLCB0b29sTmFtZXMpKTsKKwkJCW91dHcuZmx1c2goKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IG91dHB1dCB0ZXh0IiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCXByaXZhdGUgY2xhc3MgQ291bnRpbmdQcm9tcHRDb250aW51ZUhhbmRsZXIKKwkJCWltcGxlbWVudHMgUHJvbXB0Q29udGludWVIYW5kbGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBpbnQgZmlsZUluZGV4OworCisJCXByaXZhdGUgZmluYWwgaW50IGZpbGVDb3VudDsKKworCQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlTmFtZTsKKworCQlwdWJsaWMgQ291bnRpbmdQcm9tcHRDb250aW51ZUhhbmRsZXIoaW50IGZpbGVJbmRleCwgaW50IGZpbGVDb3VudCwKKwkJCQlTdHJpbmcgZmlsZU5hbWUpIHsKKwkJCXRoaXMuZmlsZUluZGV4ID0gZmlsZUluZGV4OworCQkJdGhpcy5maWxlQ291bnQgPSBmaWxlQ291bnQ7CisJCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CisJCX0KKworCQlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIHByb21wdChTdHJpbmcgdG9vbFRvTGF1bmNoTmFtZSkgeworCQkJdHJ5IHsKKwkJCQlib29sZWFuIGxhdW5jaENvbXBhcmUgPSB0cnVlOworCQkJCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLmRpZmZUb29sTGF1bmNoLAorCQkJCQkJZmlsZUluZGV4LCBmaWxlQ291bnQsIGZpbGVOYW1lLCB0b29sVG9MYXVuY2hOYW1lKQorCQkJCQkJKyAiICIpOyAvLyROT04tTkxTLTEkCisJCQkJb3V0dy5mbHVzaCgpOworCQkJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gaW5wdXRSZWFkZXI7CisJCQkJU3RyaW5nIGxpbmUgPSBudWxsOworCQkJCWlmICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQkJaWYgKCFsaW5lLmVxdWFsc0lnbm9yZUNhc2UoIlkiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlsYXVuY2hDb21wYXJlID0gZmFsc2U7CiAJCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7CiAJCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gbGF1bmNoQ29tcGFyZTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgb3V0cHV0IHRleHQiLCBlKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCi0JcHJpdmF0ZSBib29sZWFuIGlzTGF1bmNoQ29tcGFyZShpbnQgZmlsZUluZGV4LCBpbnQgZmlsZUNvdW50LAotCQkJU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgdG9vbE5hbWVQcm9tcHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gbGF1bmNoQ29tcGFyZSA9IHRydWU7Ci0JCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLmRpZmZUb29sTGF1bmNoLAotCQkJCWZpbGVJbmRleCwgZmlsZUNvdW50LCBmaWxlTmFtZSwgdG9vbE5hbWVQcm9tcHQpKTsKLQkJb3V0dy5mbHVzaCgpOwotCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5zKSk7Ci0JCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJaWYgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJaWYgKCFsaW5lLmVxdWFsc0lnbm9yZUNhc2UoIlkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbGF1bmNoQ29tcGFyZSA9IGZhbHNlOworCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3Q8RGlmZkVudHJ5PiBmaWxlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQ29udGVudFNvdXJjZS5QYWlyIHNvdXJjZVBhaXIgPSBuZXcgQ29udGVudFNvdXJjZS5QYWlyKHNvdXJjZShvbGRUcmVlKSwKKwkJCQlzb3VyY2UobmV3VHJlZSkpOworCQl0cnkgeworCQkJZm9yIChpbnQgZmlsZUluZGV4ID0gMDsgZmlsZUluZGV4IDwgZmlsZXMuc2l6ZSgpOyBmaWxlSW5kZXgrKykgeworCQkJCURpZmZFbnRyeSBlbnQgPSBmaWxlcy5nZXQoZmlsZUluZGV4KTsKKworCQkJCVN0cmluZyBmaWxlUGF0aCA9IGVudC5nZXROZXdQYXRoKCk7CisJCQkJaWYgKGZpbGVQYXRoLmVxdWFscyhEaWZmRW50cnkuREVWX05VTEwpKSB7CisJCQkJCWZpbGVQYXRoID0gZW50LmdldE9sZFBhdGgoKTsKKwkJCQl9CisKKwkJCQl0cnkgeworCQkJCQlGaWxlRWxlbWVudCBsb2NhbCA9IGNyZWF0ZUZpbGVFbGVtZW50KAorCQkJCQkJCUZpbGVFbGVtZW50LlR5cGUuTE9DQUwsIHNvdXJjZVBhaXIsIFNpZGUuT0xELCBlbnQpOworCQkJCQlGaWxlRWxlbWVudCByZW1vdGUgPSBjcmVhdGVGaWxlRWxlbWVudCgKKwkJCQkJCQlGaWxlRWxlbWVudC5UeXBlLlJFTU9URSwgc291cmNlUGFpciwgU2lkZS5ORVcsIGVudCk7CisKKwkJCQkJUHJvbXB0Q29udGludWVIYW5kbGVyIHByb21wdENvbnRpbnVlSGFuZGxlciA9IG5ldyBDb3VudGluZ1Byb21wdENvbnRpbnVlSGFuZGxlcigKKwkJCQkJCQlmaWxlSW5kZXggKyAxLCBmaWxlcy5zaXplKCksIGZpbGVQYXRoKTsKKworCQkJCQlPcHRpb25hbDxFeGVjdXRpb25SZXN1bHQ+IG9wdGlvbmFsUmVzdWx0ID0gZGlmZlRvb2xzCisJCQkJCQkJLmNvbXBhcmUobG9jYWwsIHJlbW90ZSwgdG9vbE5hbWUsIHByb21wdCwgZ3VpLAorCQkJCQkJCQkJdHJ1c3RFeGl0Q29kZSwgcHJvbXB0Q29udGludWVIYW5kbGVyLAorCQkJCQkJCQkJdGhpczo6aW5mb3JtVXNlck5vVG9vbCk7CisKKwkJCQkJaWYgKG9wdGlvbmFsUmVzdWx0LmlzUHJlc2VudCgpKSB7CisJCQkJCQlFeGVjdXRpb25SZXN1bHQgcmVzdWx0ID0gb3B0aW9uYWxSZXN1bHQuZ2V0KCk7CisJCQkJCQkvLyBUT0RPOiBjaGVjayBob3cgdG8gcmV0dXJuIHRoZSBleGl0LWNvZGUgb2YgdGhlIHRvb2wKKwkJCQkJCS8vIHRvIGpnaXQgLyBqYXZhIHJ1bnRpbWUgPworCQkJCQkJLy8gaW50IHJjID0uLi4KKwkJCQkJCUNoYXJzZXQgZGVmYXVsdENoYXJzZXQgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKQorCQkJCQkJCQkuZ2V0RGVmYXVsdENoYXJzZXQoKTsKKwkJCQkJCW91dHcucHJpbnRsbigKKwkJCQkJCQkJbmV3IFN0cmluZyhyZXN1bHQuZ2V0U3Rkb3V0KCkudG9CeXRlQXJyYXkoKSwKKwkJCQkJCQkJCQlkZWZhdWx0Q2hhcnNldCkpOworCQkJCQkJb3V0dy5mbHVzaCgpOworCQkJCQkJZXJydy5wcmludGxuKAorCQkJCQkJCQluZXcgU3RyaW5nKHJlc3VsdC5nZXRTdGRlcnIoKS50b0J5dGVBcnJheSgpLAorCQkJCQkJCQkJCWRlZmF1bHRDaGFyc2V0KSk7CisJCQkJCQllcnJ3LmZsdXNoKCk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChUb29sRXhjZXB0aW9uIGUpIHsKKwkJCQkJb3V0dy5wcmludGxuKGUuZ2V0UmVzdWx0U3Rkb3V0KCkpOworCQkJCQlvdXR3LmZsdXNoKCk7CisJCQkJCWVycncucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CisJCQkJCWVycncuZmx1c2goKTsKKwkJCQkJdGhyb3cgZGllKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUNMSVRleHQuZ2V0KCkuZGlmZlRvb2xEaWVkLCBmaWxlUGF0aCwgZSksIGUpOworCQkJCX0KIAkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXNvdXJjZVBhaXIuY2xvc2UoKTsKIAkJfQotCQlyZXR1cm4gbGF1bmNoQ29tcGFyZTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgc2hvd1Rvb2xIZWxwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gcHJlZGVmVG9vbHMgPSBkaWZmVG9vbHMKKwkJCQkuZ2V0UHJlZGVmaW5lZFRvb2xzKHRydWUpOwogCQlTdHJpbmdCdWlsZGVyIGF2YWlsYWJsZVRvb2xOYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoU3RyaW5nIG5hbWUgOiBkaWZmVG9vbHMuZ2V0QXZhaWxhYmxlVG9vbHMoKS5rZXlTZXQoKSkgewotCQkJYXZhaWxhYmxlVG9vbE5hbWVzLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJcdFx0JXNcbiIsIG5hbWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9CiAJCVN0cmluZ0J1aWxkZXIgbm90QXZhaWxhYmxlVG9vbE5hbWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChTdHJpbmcgbmFtZSA6IGRpZmZUb29scy5nZXROb3RBdmFpbGFibGVUb29scygpLmtleVNldCgpKSB7Ci0JCQlub3RBdmFpbGFibGVUb29sTmFtZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlx0XHQlc1xuIiwgbmFtZSkpOyAvLyROT04tTkxTLTEkCisJCWZvciAoU3RyaW5nIG5hbWUgOiBwcmVkZWZUb29scy5rZXlTZXQoKSkgeworCQkJaWYgKHByZWRlZlRvb2xzLmdldChuYW1lKS5pc0F2YWlsYWJsZSgpKSB7CisJCQkJYXZhaWxhYmxlVG9vbE5hbWVzLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdCgiXHRcdHswfVxuIiwgbmFtZSkpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCW5vdEF2YWlsYWJsZVRvb2xOYW1lcy5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlx0XHR7MH1cbiIsIG5hbWUpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQogCQl9CiAJCVN0cmluZ0J1aWxkZXIgdXNlclRvb2xOYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCU1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHVzZXJUb29scyA9IGRpZmZUb29scwogCQkJCS5nZXRVc2VyRGVmaW5lZFRvb2xzKCk7CiAJCWZvciAoU3RyaW5nIG5hbWUgOiB1c2VyVG9vbHMua2V5U2V0KCkpIHsKLQkJCXVzZXJUb29sTmFtZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlx0XHQlcy5jbWQgJXNcbiIsIC8vJE5PTi1OTFMtMSQKKwkJCXVzZXJUb29sTmFtZXMuYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJcdFx0ezB9LmNtZCB7MX1cbiIsIC8vJE5PTi1OTFMtMSQKIAkJCQkJbmFtZSwgdXNlclRvb2xzLmdldChuYW1lKS5nZXRDb21tYW5kKCkpKTsKIAkJfQogCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCkBAIC0yNTIsNCArMzI3LDU0IEBAIHByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGdldEZpbGVzKCkKIAkJcmV0dXJuIGZpbGVzOwogCX0KIAorCXByaXZhdGUgRmlsZUVsZW1lbnQgY3JlYXRlRmlsZUVsZW1lbnQoRmlsZUVsZW1lbnQuVHlwZSBlbGVtZW50VHlwZSwKKwkJCVBhaXIgcGFpciwgU2lkZSBzaWRlLCBEaWZmRW50cnkgZW50cnkpIHRocm93cyBOb1dvcmtUcmVlRXhjZXB0aW9uLAorCQkJQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFRvb2xFeGNlcHRpb24geworCQlTdHJpbmcgZW50cnlQYXRoID0gc2lkZSA9PSBTaWRlLk5FVyA/IGVudHJ5LmdldE5ld1BhdGgoKQorCQkJCTogZW50cnkuZ2V0T2xkUGF0aCgpOworCQlGaWxlRWxlbWVudCBmaWxlRWxlbWVudCA9IG5ldyBGaWxlRWxlbWVudChlbnRyeVBhdGgsIGVsZW1lbnRUeXBlLAorCQkJCWRiLmdldFdvcmtUcmVlKCkpOworCQlpZiAoIXBhaXIuaXNXb3JraW5nVHJlZVNvdXJjZShzaWRlKSAmJiAhZmlsZUVsZW1lbnQuaXNOdWxsUGF0aCgpKSB7CisJCQl0cnkgKFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKGRiKTsKKwkJCQkJVHJlZVdhbGsgdHJlZVdhbGsgPSBuZXcgVHJlZVdhbGsoZGIsCisJCQkJCQkJcmV2V2Fsay5nZXRPYmplY3RSZWFkZXIoKSkpIHsKKwkJCQl0cmVlV2Fsay5zZXRGaWx0ZXIoCisJCQkJCQlQYXRoRmlsdGVyR3JvdXAuY3JlYXRlRnJvbVN0cmluZ3MoZW50cnlQYXRoKSk7CisJCQkJaWYgKHNpZGUgPT0gU2lkZS5ORVcpIHsKKwkJCQkJbmV3VHJlZS5yZXNldCgpOworCQkJCQl0cmVlV2Fsay5hZGRUcmVlKG5ld1RyZWUpOworCQkJCX0gZWxzZSB7CisJCQkJCW9sZFRyZWUucmVzZXQoKTsKKwkJCQkJdHJlZVdhbGsuYWRkVHJlZShvbGRUcmVlKTsKKwkJCQl9CisJCQkJaWYgKHRyZWVXYWxrLm5leHQoKSkgeworCQkJCQlmaW5hbCBFb2xTdHJlYW1UeXBlIGVvbFN0cmVhbVR5cGUgPSB0cmVlV2FsaworCQkJCQkJCS5nZXRFb2xTdHJlYW1UeXBlKENIRUNLT1VUX09QKTsKKwkJCQkJZmluYWwgU3RyaW5nIGZpbHRlckNvbW1hbmQgPSB0cmVlV2Fsay5nZXRGaWx0ZXJDb21tYW5kKAorCQkJCQkJCUNvbnN0YW50cy5BVFRSX0ZJTFRFUl9UWVBFX1NNVURHRSk7CisJCQkJCVdvcmtpbmdUcmVlT3B0aW9ucyBvcHQgPSBkYi5nZXRDb25maWcoKQorCQkJCQkJCS5nZXQoV29ya2luZ1RyZWVPcHRpb25zLktFWSk7CisJCQkJCUNoZWNrb3V0TWV0YWRhdGEgY2hlY2tvdXRNZXRhZGF0YSA9IG5ldyBDaGVja291dE1ldGFkYXRhKAorCQkJCQkJCWVvbFN0cmVhbVR5cGUsIGZpbHRlckNvbW1hbmQpOworCQkJCQlEaXJDYWNoZUNoZWNrb3V0LmdldENvbnRlbnQoZGIsIGVudHJ5UGF0aCwKKwkJCQkJCQljaGVja291dE1ldGFkYXRhLCBwYWlyLm9wZW4oc2lkZSwgZW50cnkpLCBvcHQsCisJCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oCisJCQkJCQkJCQlmaWxlRWxlbWVudC5jcmVhdGVUZW1wRmlsZShudWxsKSkpOworCQkJCX0gZWxzZSB7CisJCQkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBwYXRoICciICsgZW50cnlQYXRoIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkrICInIGluIHN0YWdpbmcgYXJlYSEiLCAvLyROT04tTkxTLTEkCisJCQkJCQkJbnVsbCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmaWxlRWxlbWVudDsKKwl9CisKKwlwcml2YXRlIENvbnRlbnRTb3VyY2Ugc291cmNlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIGl0ZXJhdG9yKSB7CisJCWlmIChpdGVyYXRvciBpbnN0YW5jZW9mIFdvcmtpbmdUcmVlSXRlcmF0b3IpIHsKKwkJCXJldHVybiBDb250ZW50U291cmNlLmNyZWF0ZSgoV29ya2luZ1RyZWVJdGVyYXRvcikgaXRlcmF0b3IpOworCQl9CisJCXJldHVybiBDb250ZW50U291cmNlLmNyZWF0ZShkYi5uZXdPYmplY3RSZWFkZXIoKSk7CisJfQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZS5qYXZhCmluZGV4IGNhNDg3N2YuLjI3YTNkOTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZS5qYXZhCkBAIC0xMCw2ICsxMCw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTE0NCw4ICsxNDYsMTAgQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgewogCQkJY2FzZSBGQVNUX0ZPUldBUkQ6CiAJCQkJT2JqZWN0SWQgb2xkSGVhZElkID0gb2xkSGVhZC5nZXRPYmplY3RJZCgpOwogCQkJCWlmIChvbGRIZWFkSWQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkSWQgPSBvbGRIZWFkSWQuYWJicmV2aWF0ZSg3KS5uYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdJZCA9IHJlc3VsdC5nZXROZXdIZWFkKCkuYWJicmV2aWF0ZSg3KS5uYW1lKCk7CisJCQkJCVN0cmluZyBvbGRJZCA9IG9sZEhlYWRJZAorCQkJCQkJCS5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkubmFtZSgpOworCQkJCQlTdHJpbmcgbmV3SWQgPSByZXN1bHQuZ2V0TmV3SGVhZCgpCisJCQkJCQkJLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKS5uYW1lKCk7CiAJCQkJCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLnVwZGF0aW5nLAogCQkJCQkJCW9sZElkLCBuZXdJZCkpOwogCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZVRvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZVRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzgyZmFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlVG9vbC5qYXZhCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjIsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTksIFRpbSBOZXVtYW5uIDx0aW0ubmV1bWFubkBhZHZhbnRlc3QuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrLk9wZXJhdGlvblR5cGUuQ0hFQ0tPVVRfT1A7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuU3RhdHVzQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5Db250ZW50U291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUNoZWNrb3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVDaGVja291dC5DaGVja291dE1ldGFkYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9Xb3JrVHJlZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXZpc2lvblN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2wuRXh0ZXJuYWxNZXJnZVRvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sLkZpbGVFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbC5GaWxlRWxlbWVudC5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbC5NZXJnZVRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbC5Ub29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db3JlQ29uZmlnLkVvbFN0cmVhbVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuSW5kZXhEaWZmLlN0YWdlU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbC5Cb29sZWFuVHJpU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWwuQ0xJVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuV29ya2luZ1RyZWVPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlBhdGhGaWx0ZXJHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlMuRXhlY3V0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLnNwaS5SZXN0T2ZBcmd1bWVudHNIYW5kbGVyOworCitAQ29tbWFuZChuYW1lID0gIm1lcmdldG9vbCIsIGNvbW1vbiA9IHRydWUsIHVzYWdlID0gInVzYWdlX01lcmdlVG9vbCIpCitjbGFzcyBNZXJnZVRvb2wgZXh0ZW5kcyBUZXh0QnVpbHRpbiB7CisJcHJpdmF0ZSBNZXJnZVRvb2xzIG1lcmdlVG9vbHM7CisKKwlwcml2YXRlIE9wdGlvbmFsPFN0cmluZz4gdG9vbE5hbWUgPSBPcHRpb25hbC5lbXB0eSgpOworCisJQE9wdGlvbihuYW1lID0gIi0tdG9vbCIsIGFsaWFzZXMgPSB7CisJCQkiLXQiIH0sIG1ldGFWYXIgPSAibWV0YVZhcl90b29sIiwgdXNhZ2UgPSAidXNhZ2VfVG9vbEZvck1lcmdlIikKKwl2b2lkIHNldFRvb2xOYW1lKFN0cmluZyBuYW1lKSB7CisJCXRvb2xOYW1lID0gT3B0aW9uYWwub2YobmFtZSk7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuVHJpU3RhdGUgcHJvbXB0ID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCisJQE9wdGlvbihuYW1lID0gIi0tcHJvbXB0IiwgdXNhZ2UgPSAidXNhZ2VfcHJvbXB0IikKKwl2b2lkIHNldFByb21wdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgeworCQlwcm9tcHQgPSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwl9CisKKwlAT3B0aW9uKG5hbWUgPSAiLS1uby1wcm9tcHQiLCBhbGlhc2VzID0geyAiLXkiIH0sIHVzYWdlID0gInVzYWdlX25vUHJvbXB0IikKKwl2b2lkIG5vUHJvbXB0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CisJCXByb21wdCA9IEJvb2xlYW5UcmlTdGF0ZS5GQUxTRTsKKwl9CisKKwlAT3B0aW9uKG5hbWUgPSAiLS10b29sLWhlbHAiLCB1c2FnZSA9ICJ1c2FnZV90b29sSGVscCIpCisJcHJpdmF0ZSBib29sZWFuIHRvb2xIZWxwOworCisJcHJpdmF0ZSBib29sZWFuIGd1aSA9IGZhbHNlOworCisJQE9wdGlvbihuYW1lID0gIi0tZ3VpIiwgYWxpYXNlcyA9IHsgIi1nIiB9LCB1c2FnZSA9ICJ1c2FnZV9NZXJnZUd1aVRvb2wiKQorCXZvaWQgc2V0R3VpKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CisJCWd1aSA9IHRydWU7CisJfQorCisJQE9wdGlvbihuYW1lID0gIi0tbm8tZ3VpIiwgdXNhZ2UgPSAidXNhZ2Vfbm9HdWkiKQorCXZvaWQgbm9HdWkoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gb24pIHsKKwkJZ3VpID0gZmFsc2U7CisJfQorCisJQEFyZ3VtZW50KHJlcXVpcmVkID0gZmFsc2UsIGluZGV4ID0gMCwgbWV0YVZhciA9ICJtZXRhVmFyX3BhdGhzIikKKwlAT3B0aW9uKG5hbWUgPSAiLS0iLCBtZXRhVmFyID0gIm1ldGFWYXJfcGF0aHMiLCBoYW5kbGVyID0gUmVzdE9mQXJndW1lbnRzSGFuZGxlci5jbGFzcykKKwlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGZpbHRlclBhdGhzOworCisJcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBpbnB1dFJlYWRlcjsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgZ2l0RGlyKSB7CisJCXN1cGVyLmluaXQocmVwb3NpdG9yeSwgZ2l0RGlyKTsKKwkJbWVyZ2VUb29scyA9IG5ldyBNZXJnZVRvb2xzKHJlcG9zaXRvcnkpOworCQlpbnB1dFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5zLAorCQkJCQkJU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdENoYXJzZXQoKSkpOworCX0KKworCWVudW0gTWVyZ2VSZXN1bHQgeworCQlTVUNDRVNTRlVMLCBGQUlMRUQsIEFCT1JURUQKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBydW4oKSB7CisJCXRyeSB7CisJCQlpZiAodG9vbEhlbHApIHsKKwkJCQlzaG93VG9vbEhlbHAoKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gZ2V0IHRoZSBjaGFuZ2VkIGZpbGVzCisJCQkJTWFwPFN0cmluZywgU3RhZ2VTdGF0ZT4gZmlsZXMgPSBnZXRGaWxlcygpOworCQkJCWlmIChmaWxlcy5zaXplKCkgPiAwKSB7CisJCQkJCW1lcmdlKGZpbGVzKTsKKwkJCQl9IGVsc2UgeworCQkJCQlvdXR3LnByaW50bG4oQ0xJVGV4dC5nZXQoKS5tZXJnZVRvb2xOb0ZpbGVzKTsKKwkJCQl9CisJCQl9CisJCQlvdXR3LmZsdXNoKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBkaWUoZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGluZm9ybVVzZXJOb1Rvb2woTGlzdDxTdHJpbmc+IHRvb2xzKSB7CisJCXRyeSB7CisJCQlTdHJpbmdCdWlsZGVyIHRvb2xOYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlmb3IgKFN0cmluZyBuYW1lIDogdG9vbHMpIHsKKwkJCQl0b29sTmFtZXMuYXBwZW5kKG5hbWUgKyAiICIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KENMSVRleHQuZ2V0KCkubWVyZ2VUb29sUHJvbXB0VG9vbE5hbWUsIHRvb2xOYW1lcykpOworCQkJb3V0dy5mbHVzaCgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgb3V0cHV0IHRleHQiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIG1lcmdlKE1hcDxTdHJpbmcsIFN0YWdlU3RhdGU+IGZpbGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gc29ydCBmaWxlIG5hbWVzCisJCUxpc3Q8U3RyaW5nPiBtZXJnZWRGaWxlUGF0aHMgPSBuZXcgQXJyYXlMaXN0PD4oZmlsZXMua2V5U2V0KCkpOworCQlDb2xsZWN0aW9ucy5zb3J0KG1lcmdlZEZpbGVQYXRocyk7CisJCS8vIHNob3cgdGhlIGZpbGVzCisJCVN0cmluZ0J1aWxkZXIgbWVyZ2VkRmlsZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlmb3IgKFN0cmluZyBtZXJnZWRGaWxlUGF0aCA6IG1lcmdlZEZpbGVQYXRocykgeworCQkJbWVyZ2VkRmlsZXMuYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJ7MH1cbiIsIG1lcmdlZEZpbGVQYXRoKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5tZXJnZVRvb2xNZXJnaW5nLAorCQkJCW1lcmdlZEZpbGVzKSk7CisJCW91dHcuZmx1c2goKTsKKwkJYm9vbGVhbiBzaG93UHJvbXB0ID0gbWVyZ2VUb29scy5pc0ludGVyYWN0aXZlKCk7CisJCWlmIChwcm9tcHQgIT0gQm9vbGVhblRyaVN0YXRlLlVOU0VUKSB7CisJCQlzaG93UHJvbXB0ID0gcHJvbXB0ID09IEJvb2xlYW5UcmlTdGF0ZS5UUlVFOworCQl9CisJCS8vIG1lcmdlIHRoZSBmaWxlcworCQlNZXJnZVJlc3VsdCBtZXJnZVJlc3VsdCA9IE1lcmdlUmVzdWx0LlNVQ0NFU1NGVUw7CisJCWZvciAoU3RyaW5nIG1lcmdlZEZpbGVQYXRoIDogbWVyZ2VkRmlsZVBhdGhzKSB7CisJCQkvLyBpZiBsYXN0IG1lcmdlIGZhaWxlZC4uLgorCQkJaWYgKG1lcmdlUmVzdWx0ID09IE1lcmdlUmVzdWx0LkZBSUxFRCkgeworCQkJCS8vIGNoZWNrIGlmIHVzZXIgd2FudHMgdG8gY29udGludWUKKwkJCQlpZiAoc2hvd1Byb21wdCAmJiAhaXNDb250aW51ZVVucmVzb2x2ZWRQYXRocygpKSB7CisJCQkJCW1lcmdlUmVzdWx0ID0gTWVyZ2VSZXN1bHQuQUJPUlRFRDsKKwkJCQl9CisJCQl9CisJCQkvLyBhYm9ydGVkID8KKwkJCWlmIChtZXJnZVJlc3VsdCA9PSBNZXJnZVJlc3VsdC5BQk9SVEVEKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvLyBnZXQgZmlsZSBzdGFnZSBzdGF0ZSBhbmQgbWVyZ2UKKwkJCVN0YWdlU3RhdGUgZmlsZVN0YXRlID0gZmlsZXMuZ2V0KG1lcmdlZEZpbGVQYXRoKTsKKwkJCWlmIChmaWxlU3RhdGUgPT0gU3RhZ2VTdGF0ZS5CT1RIX01PRElGSUVEKSB7CisJCQkJbWVyZ2VSZXN1bHQgPSBtZXJnZU1vZGlmaWVkKG1lcmdlZEZpbGVQYXRoLCBzaG93UHJvbXB0KTsKKwkJCX0gZWxzZSBpZiAoKGZpbGVTdGF0ZSA9PSBTdGFnZVN0YXRlLkRFTEVURURfQllfVVMpCisJCQkJCXx8IChmaWxlU3RhdGUgPT0gU3RhZ2VTdGF0ZS5ERUxFVEVEX0JZX1RIRU0pKSB7CisJCQkJbWVyZ2VSZXN1bHQgPSBtZXJnZURlbGV0ZWQobWVyZ2VkRmlsZVBhdGgsCisJCQkJCQlmaWxlU3RhdGUgPT0gU3RhZ2VTdGF0ZS5ERUxFVEVEX0JZX1VTKTsKKwkJCX0gZWxzZSB7CisJCQkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJQ0xJVGV4dC5nZXQoKS5tZXJnZVRvb2xVbmtub3duQ29uZmxpY3QsCisJCQkJCQltZXJnZWRGaWxlUGF0aCkpOworCQkJCW1lcmdlUmVzdWx0ID0gTWVyZ2VSZXN1bHQuQUJPUlRFRDsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgTWVyZ2VSZXN1bHQgbWVyZ2VNb2RpZmllZChTdHJpbmcgbWVyZ2VkRmlsZVBhdGgsIGJvb2xlYW4gc2hvd1Byb21wdCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5tZXJnZVRvb2xOb3JtYWxDb25mbGljdCwKKwkJCQltZXJnZWRGaWxlUGF0aCkpOworCQlvdXR3LmZsdXNoKCk7CisJCWJvb2xlYW4gaXNNZXJnZVN1Y2Nlc3NmdWwgPSB0cnVlOworCQlDb250ZW50U291cmNlIGJhc2VTb3VyY2UgPSBDb250ZW50U291cmNlLmNyZWF0ZShkYi5uZXdPYmplY3RSZWFkZXIoKSk7CisJCUNvbnRlbnRTb3VyY2UgbG9jYWxTb3VyY2UgPSBDb250ZW50U291cmNlLmNyZWF0ZShkYi5uZXdPYmplY3RSZWFkZXIoKSk7CisJCUNvbnRlbnRTb3VyY2UgcmVtb3RlU291cmNlID0gQ29udGVudFNvdXJjZS5jcmVhdGUoZGIubmV3T2JqZWN0UmVhZGVyKCkpOworCQkvLyB0ZW1wb3JhcnkgZGlyZWN0b3J5IGlmIG1lcmdldG9vbC53cml0ZVRvVGVtcCA9PSB0cnVlCisJCUZpbGUgdGVtcERpciA9IG1lcmdlVG9vbHMuY3JlYXRlVGVtcERpcmVjdG9yeSgpOworCQkvLyB0aGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgdGVtcCBmaWxlcyAoY2FuIGJlIHNhbWUgYXMgdGVtcERpciBvciBqdXN0CisJCS8vIHRoZSB3b3JrdHJlZSBkaXIpCisJCUZpbGUgdGVtcEZpbGVzUGFyZW50ID0gdGVtcERpciAhPSBudWxsID8gdGVtcERpciA6IGRiLmdldFdvcmtUcmVlKCk7CisJCXRyeSB7CisJCQlGaWxlRWxlbWVudCBiYXNlID0gbnVsbDsKKwkJCUZpbGVFbGVtZW50IGxvY2FsID0gbnVsbDsKKwkJCUZpbGVFbGVtZW50IHJlbW90ZSA9IG51bGw7CisJCQlGaWxlRWxlbWVudCBtZXJnZWQgPSBuZXcgRmlsZUVsZW1lbnQobWVyZ2VkRmlsZVBhdGgsIFR5cGUuTUVSR0VELAorCQkJCQlkYi5nZXRXb3JrVHJlZSgpKTsKKwkJCURpckNhY2hlIGNhY2hlID0gZGIucmVhZERpckNhY2hlKCk7CisJCQl0cnkgKFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKGRiKTsKKwkJCQkJVHJlZVdhbGsgdHJlZVdhbGsgPSBuZXcgVHJlZVdhbGsoZGIsCisJCQkJCQkJcmV2V2Fsay5nZXRPYmplY3RSZWFkZXIoKSkpIHsKKwkJCQl0cmVlV2Fsay5zZXRGaWx0ZXIoCisJCQkJCQlQYXRoRmlsdGVyR3JvdXAuY3JlYXRlRnJvbVN0cmluZ3MobWVyZ2VkRmlsZVBhdGgpKTsKKwkJCQlEaXJDYWNoZUl0ZXJhdG9yIGNhY2hlSXRlciA9IG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGNhY2hlKTsKKwkJCQl0cmVlV2Fsay5hZGRUcmVlKGNhY2hlSXRlcik7CisJCQkJd2hpbGUgKHRyZWVXYWxrLm5leHQoKSkgeworCQkJCQlpZiAodHJlZVdhbGsuaXNTdWJ0cmVlKCkpIHsKKwkJCQkJCXRyZWVXYWxrLmVudGVyU3VidHJlZSgpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJZmluYWwgRW9sU3RyZWFtVHlwZSBlb2xTdHJlYW1UeXBlID0gdHJlZVdhbGsKKwkJCQkJCQkuZ2V0RW9sU3RyZWFtVHlwZShDSEVDS09VVF9PUCk7CisJCQkJCWZpbmFsIFN0cmluZyBmaWx0ZXJDb21tYW5kID0gdHJlZVdhbGsuZ2V0RmlsdGVyQ29tbWFuZCgKKwkJCQkJCQlDb25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0UpOworCQkJCQlXb3JraW5nVHJlZU9wdGlvbnMgb3B0ID0gZGIuZ2V0Q29uZmlnKCkKKwkJCQkJCQkuZ2V0KFdvcmtpbmdUcmVlT3B0aW9ucy5LRVkpOworCQkJCQlDaGVja291dE1ldGFkYXRhIGNoZWNrb3V0TWV0YWRhdGEgPSBuZXcgQ2hlY2tvdXRNZXRhZGF0YSgKKwkJCQkJCQllb2xTdHJlYW1UeXBlLCBmaWx0ZXJDb21tYW5kKTsKKwkJCQkJRGlyQ2FjaGVFbnRyeSBlbnRyeSA9IHRyZWVXYWxrCisJCQkJCQkJLmdldFRyZWUoRGlyQ2FjaGVJdGVyYXRvci5jbGFzcykuZ2V0RGlyQ2FjaGVFbnRyeSgpOworCQkJCQlpZiAoZW50cnkgPT0gbnVsbCkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJT2JqZWN0SWQgaWQgPSBlbnRyeS5nZXRPYmplY3RJZCgpOworCQkJCQlzd2l0Y2ggKGVudHJ5LmdldFN0YWdlKCkpIHsKKwkJCQkJY2FzZSBEaXJDYWNoZUVudHJ5LlNUQUdFXzE6CisJCQkJCQliYXNlID0gbmV3IEZpbGVFbGVtZW50KG1lcmdlZEZpbGVQYXRoLCBUeXBlLkJBU0UpOworCQkJCQkJRGlyQ2FjaGVDaGVja291dC5nZXRDb250ZW50KGRiLCBtZXJnZWRGaWxlUGF0aCwKKwkJCQkJCQkJY2hlY2tvdXRNZXRhZGF0YSwKKwkJCQkJCQkJYmFzZVNvdXJjZS5vcGVuKG1lcmdlZEZpbGVQYXRoLCBpZCksIG9wdCwKKwkJCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oCisJCQkJCQkJCQkJYmFzZS5jcmVhdGVUZW1wRmlsZSh0ZW1wRmlsZXNQYXJlbnQpKSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBEaXJDYWNoZUVudHJ5LlNUQUdFXzI6CisJCQkJCQlsb2NhbCA9IG5ldyBGaWxlRWxlbWVudChtZXJnZWRGaWxlUGF0aCwgVHlwZS5MT0NBTCk7CisJCQkJCQlEaXJDYWNoZUNoZWNrb3V0LmdldENvbnRlbnQoZGIsIG1lcmdlZEZpbGVQYXRoLAorCQkJCQkJCQljaGVja291dE1ldGFkYXRhLAorCQkJCQkJCQlsb2NhbFNvdXJjZS5vcGVuKG1lcmdlZEZpbGVQYXRoLCBpZCksIG9wdCwKKwkJCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oCisJCQkJCQkJCQkJbG9jYWwuY3JlYXRlVGVtcEZpbGUodGVtcEZpbGVzUGFyZW50KSkpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRGlyQ2FjaGVFbnRyeS5TVEFHRV8zOgorCQkJCQkJcmVtb3RlID0gbmV3IEZpbGVFbGVtZW50KG1lcmdlZEZpbGVQYXRoLCBUeXBlLlJFTU9URSk7CisJCQkJCQlEaXJDYWNoZUNoZWNrb3V0LmdldENvbnRlbnQoZGIsIG1lcmdlZEZpbGVQYXRoLAorCQkJCQkJCQljaGVja291dE1ldGFkYXRhLAorCQkJCQkJCQlyZW1vdGVTb3VyY2Uub3BlbihtZXJnZWRGaWxlUGF0aCwgaWQpLCBvcHQsCisJCQkJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKHJlbW90ZQorCQkJCQkJCQkJCS5jcmVhdGVUZW1wRmlsZSh0ZW1wRmlsZXNQYXJlbnQpKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICgobG9jYWwgPT0gbnVsbCkgfHwgKHJlbW90ZSA9PSBudWxsKSkgeworCQkJCXRocm93IGRpZShNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLm1lcmdlVG9vbERpZWQsCisJCQkJCQltZXJnZWRGaWxlUGF0aCkpOworCQkJfQorCQkJbG9uZyBtb2RpZmllZEJlZm9yZSA9IG1lcmdlZC5nZXRGaWxlKCkubGFzdE1vZGlmaWVkKCk7CisJCQl0cnkgeworCQkJCS8vIFRPRE86IGNoZWNrIGhvdyB0byByZXR1cm4gdGhlIGV4aXQtY29kZSBvZiB0aGUKKwkJCQkvLyB0b29sIHRvIGpnaXQgLyBqYXZhIHJ1bnRpbWUgPworCQkJCS8vIGludCByYyA9Li4uCisJCQkJT3B0aW9uYWw8RXhlY3V0aW9uUmVzdWx0PiBvcHRpb25hbFJlc3VsdCA9IG1lcmdlVG9vbHMubWVyZ2UoCisJCQkJCQlsb2NhbCwgcmVtb3RlLCBtZXJnZWQsIGJhc2UsIHRlbXBEaXIsIHRvb2xOYW1lLCBwcm9tcHQsCisJCQkJCQlndWksIHRoaXM6OnByb21wdEZvckxhdW5jaCwgdGhpczo6aW5mb3JtVXNlck5vVG9vbCk7CisJCQkJaWYgKG9wdGlvbmFsUmVzdWx0LmlzUHJlc2VudCgpKSB7CisJCQkJCUV4ZWN1dGlvblJlc3VsdCByZXN1bHQgPSBvcHRpb25hbFJlc3VsdC5nZXQoKTsKKwkJCQkJQ2hhcnNldCBkZWZhdWx0Q2hhcnNldCA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpCisJCQkJCQkJLmdldERlZmF1bHRDaGFyc2V0KCk7CisJCQkJCW91dHcucHJpbnRsbihuZXcgU3RyaW5nKHJlc3VsdC5nZXRTdGRvdXQoKS50b0J5dGVBcnJheSgpLAorCQkJCQkJCWRlZmF1bHRDaGFyc2V0KSk7CisJCQkJCW91dHcuZmx1c2goKTsKKwkJCQkJZXJydy5wcmludGxuKG5ldyBTdHJpbmcocmVzdWx0LmdldFN0ZGVycigpLnRvQnl0ZUFycmF5KCksCisJCQkJCQkJZGVmYXVsdENoYXJzZXQpKTsKKwkJCQkJZXJydy5mbHVzaCgpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiBNZXJnZVJlc3VsdC5BQk9SVEVEOworCQkJCX0KKwkJCX0gY2F0Y2ggKFRvb2xFeGNlcHRpb24gZSkgeworCQkJCWlzTWVyZ2VTdWNjZXNzZnVsID0gZmFsc2U7CisJCQkJb3V0dy5wcmludGxuKGUuZ2V0UmVzdWx0U3Rkb3V0KCkpOworCQkJCW91dHcuZmx1c2goKTsKKwkJCQllcnJ3LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworCQkJCWVycncucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCUNMSVRleHQuZ2V0KCkubWVyZ2VUb29sTWVyZ2VGYWlsZWQsIG1lcmdlZEZpbGVQYXRoKSk7CisJCQkJZXJydy5mbHVzaCgpOworCQkJCWlmIChlLmlzQ29tbWFuZEV4ZWN1dGlvbkVycm9yKCkpIHsKKwkJCQkJdGhyb3cgZGllKENMSVRleHQuZ2V0KCkubWVyZ2VUb29sRXhlY3V0aW9uRXJyb3IsIGUpOworCQkJCX0KKwkJCX0KKwkJCS8vIGlmIG1lcmdlIHdhcyBzdWNjZXNzZnVsIGNoZWNrIGZpbGUgbW9kaWZpZWQKKwkJCWlmIChpc01lcmdlU3VjY2Vzc2Z1bCkgeworCQkJCWxvbmcgbW9kaWZpZWRBZnRlciA9IG1lcmdlZC5nZXRGaWxlKCkubGFzdE1vZGlmaWVkKCk7CisJCQkJaWYgKG1vZGlmaWVkQmVmb3JlID09IG1vZGlmaWVkQWZ0ZXIpIHsKKwkJCQkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUNMSVRleHQuZ2V0KCkubWVyZ2VUb29sRmlsZVVuY2hhbmdlZCwKKwkJCQkJCQltZXJnZWRGaWxlUGF0aCkpOworCQkJCQlpc01lcmdlU3VjY2Vzc2Z1bCA9ICFzaG93UHJvbXB0IHx8IGlzTWVyZ2VTdWNjZXNzZnVsKCk7CisJCQkJfQorCQkJfQorCQkJLy8gaWYgYXV0b21hdGljYWxseSBvciBtYW51YWxseSBzdWNjZXNzZnVsCisJCQkvLyAtPiBhZGQgdGhlIGZpbGUgdG8gdGhlIGluZGV4CisJCQlpZiAoaXNNZXJnZVN1Y2Nlc3NmdWwpIHsKKwkJCQlhZGRGaWxlKG1lcmdlZEZpbGVQYXRoKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWJhc2VTb3VyY2UuY2xvc2UoKTsKKwkJCWxvY2FsU291cmNlLmNsb3NlKCk7CisJCQlyZW1vdGVTb3VyY2UuY2xvc2UoKTsKKwkJfQorCQlyZXR1cm4gaXNNZXJnZVN1Y2Nlc3NmdWwgPyBNZXJnZVJlc3VsdC5TVUNDRVNTRlVMIDogTWVyZ2VSZXN1bHQuRkFJTEVEOworCX0KKworCXByaXZhdGUgTWVyZ2VSZXN1bHQgbWVyZ2VEZWxldGVkKFN0cmluZyBtZXJnZWRGaWxlUGF0aCwgYm9vbGVhbiBkZWxldGVkQnlVcykKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5tZXJnZVRvb2xGaWxlVW5jaGFuZ2VkLAorCQkJCW1lcmdlZEZpbGVQYXRoKSk7CisJCWlmIChkZWxldGVkQnlVcykgeworCQkJb3V0dy5wcmludGxuKENMSVRleHQuZ2V0KCkubWVyZ2VUb29sRGVsZXRlZENvbmZsaWN0QnlVcyk7CisJCX0gZWxzZSB7CisJCQlvdXR3LnByaW50bG4oQ0xJVGV4dC5nZXQoKS5tZXJnZVRvb2xEZWxldGVkQ29uZmxpY3RCeVRoZW0pOworCQl9CisJCWludCBtZXJnZURlY2lzaW9uID0gZ2V0RGVsZXRlZE1lcmdlRGVjaXNpb24oKTsKKwkJaWYgKG1lcmdlRGVjaXNpb24gPT0gMSkgeworCQkJLy8gYWRkIG1vZGlmaWVkIGZpbGUKKwkJCWFkZEZpbGUobWVyZ2VkRmlsZVBhdGgpOworCQl9IGVsc2UgaWYgKG1lcmdlRGVjaXNpb24gPT0gLTEpIHsKKwkJCS8vIHJlbW92ZSBkZWxldGVkIGZpbGUKKwkJCXJtRmlsZShtZXJnZWRGaWxlUGF0aCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gTWVyZ2VSZXN1bHQuQUJPUlRFRDsKKwkJfQorCQlyZXR1cm4gTWVyZ2VSZXN1bHQuU1VDQ0VTU0ZVTDsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGZpbGVOYW1lKS5jYWxsKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcm1GaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlnaXQucm0oKS5hZGRGaWxlcGF0dGVybihmaWxlTmFtZSkuY2FsbCgpOworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGhhc1VzZXJBY2NlcHRlZChTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYm9vbGVhbiB5ZXMgPSB0cnVlOworCQlvdXR3LnByaW50KG1lc3NhZ2UgKyAiICIpOyAvLyROT04tTkxTLTEkCisJCW91dHcuZmx1c2goKTsKKwkJQnVmZmVyZWRSZWFkZXIgYnIgPSBpbnB1dFJlYWRlcjsKKwkJU3RyaW5nIGxpbmUgPSBudWxsOworCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQlpZiAobGluZS5lcXVhbHNJZ25vcmVDYXNlKCJ5IikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXllcyA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzSWdub3JlQ2FzZSgibiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl5ZXMgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW91dHcucHJpbnQobWVzc2FnZSk7CisJCQlvdXR3LmZsdXNoKCk7CisJCX0KKwkJcmV0dXJuIHllczsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNDb250aW51ZVVucmVzb2x2ZWRQYXRocygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBoYXNVc2VyQWNjZXB0ZWQoQ0xJVGV4dC5nZXQoKS5tZXJnZVRvb2xDb250aW51ZVVucmVzb2x2ZWRQYXRocyk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzTWVyZ2VTdWNjZXNzZnVsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGhhc1VzZXJBY2NlcHRlZChDTElUZXh0LmdldCgpLm1lcmdlVG9vbFdhc01lcmdlU3VjY2Vzc2Z1bGwpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRGb3JMYXVuY2goU3RyaW5nIHRvb2xOYW1lUHJvbXB0KSB7CisJCXRyeSB7CisJCQlib29sZWFuIGxhdW5jaCA9IHRydWU7CisJCQlvdXR3LnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkubWVyZ2VUb29sTGF1bmNoLAorCQkJCQl0b29sTmFtZVByb21wdCkgKyAiICIpOyAvLyROT04tTkxTLTEkCisJCQlvdXR3LmZsdXNoKCk7CisJCQlCdWZmZXJlZFJlYWRlciBiciA9IGlucHV0UmVhZGVyOworCQkJU3RyaW5nIGxpbmUgPSBudWxsOworCQkJaWYgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJCWlmICghbGluZS5lcXVhbHNJZ25vcmVDYXNlKCJ5IikgJiYgIWxpbmUuZXF1YWxzSWdub3JlQ2FzZSgiIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCWxhdW5jaCA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBsYXVuY2g7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBvdXRwdXQgdGV4dCIsIGUpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwcml2YXRlIGludCBnZXREZWxldGVkTWVyZ2VEZWNpc2lvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWludCByZXQgPSAwOyAvLyBhYm9ydAorCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IENMSVRleHQuZ2V0KCkubWVyZ2VUb29sRGVsZXRlZE1lcmdlRGVjaXNpb24KKwkJCQkrICIgIjsgLy8kTk9OLU5MUy0xJAorCQlvdXR3LnByaW50KG1lc3NhZ2UpOworCQlvdXR3LmZsdXNoKCk7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gaW5wdXRSZWFkZXI7CisJCVN0cmluZyBsaW5lID0gbnVsbDsKKwkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJaWYgKGxpbmUuZXF1YWxzSWdub3JlQ2FzZSgibSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXQgPSAxOyAvLyBtb2RpZmllZAorCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFsc0lnbm9yZUNhc2UoImQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcmV0ID0gLTE7IC8vIGRlbGV0ZWQKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHNJZ25vcmVDYXNlKCJhIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWJyZWFrOworCQkJfQorCQkJb3V0dy5wcmludChtZXNzYWdlKTsKKwkJCW91dHcuZmx1c2goKTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCXByaXZhdGUgdm9pZCBzaG93VG9vbEhlbHAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBFeHRlcm5hbE1lcmdlVG9vbD4gcHJlZGVmVG9vbHMgPSBtZXJnZVRvb2xzCisJCQkJLmdldFByZWRlZmluZWRUb29scyh0cnVlKTsKKwkJU3RyaW5nQnVpbGRlciBhdmFpbGFibGVUb29sTmFtZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlTdHJpbmdCdWlsZGVyIG5vdEF2YWlsYWJsZVRvb2xOYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZvciAoU3RyaW5nIG5hbWUgOiBwcmVkZWZUb29scy5rZXlTZXQoKSkgeworCQkJaWYgKHByZWRlZlRvb2xzLmdldChuYW1lKS5pc0F2YWlsYWJsZSgpKSB7CisJCQkJYXZhaWxhYmxlVG9vbE5hbWVzLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdCgiXHRcdHswfVxuIiwgbmFtZSkpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCW5vdEF2YWlsYWJsZVRvb2xOYW1lcy5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlx0XHR7MH1cbiIsIG5hbWUpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCVN0cmluZ0J1aWxkZXIgdXNlclRvb2xOYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCU1hcDxTdHJpbmcsIEV4dGVybmFsTWVyZ2VUb29sPiB1c2VyVG9vbHMgPSBtZXJnZVRvb2xzCisJCQkJLmdldFVzZXJEZWZpbmVkVG9vbHMoKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IHVzZXJUb29scy5rZXlTZXQoKSkgeworCQkJdXNlclRvb2xOYW1lcy5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlx0XHR7MH0uY21kIHsxfVxuIiwgLy8kTk9OLU5MUy0xJAorCQkJCQluYW1lLCB1c2VyVG9vbHMuZ2V0KG5hbWUpLmdldENvbW1hbmQoKSkpOworCQl9CisJCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQlDTElUZXh0LmdldCgpLm1lcmdlVG9vbEhlbHBTZXRUb0ZvbGxvd2luZywgYXZhaWxhYmxlVG9vbE5hbWVzLAorCQkJCXVzZXJUb29sTmFtZXMsIG5vdEF2YWlsYWJsZVRvb2xOYW1lcykpOworCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RhZ2VTdGF0ZT4gZ2V0RmlsZXMoKSB0aHJvd3MgUmV2aXNpb25TeW50YXhFeGNlcHRpb24sCisJCQlOb1dvcmtUcmVlRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdGFnZVN0YXRlPiBmaWxlcyA9IG5ldyBUcmVlTWFwPD4oKTsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCVN0YXR1c0NvbW1hbmQgc3RhdHVzQ29tbWFuZCA9IGdpdC5zdGF0dXMoKTsKKwkJCWlmIChmaWx0ZXJQYXRocyAhPSBudWxsICYmIGZpbHRlclBhdGhzLnNpemUoKSA+IDApIHsKKwkJCQlmb3IgKFN0cmluZyBwYXRoIDogZmlsdGVyUGF0aHMpIHsKKwkJCQkJc3RhdHVzQ29tbWFuZC5hZGRQYXRoKHBhdGgpOworCQkJCX0KKwkJCX0KKwkJCVN0YXR1cyBzdGF0dXMgPSBzdGF0dXNDb21tYW5kLmNhbGwoKTsKKwkJCWZpbGVzID0gc3RhdHVzLmdldENvbmZsaWN0aW5nU3RhZ2VTdGF0ZSgpOworCQl9CisJCXJldHVybiBmaWxlczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZWZsb2cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZWZsb2cuamF2YQppbmRleCAwMzAxMTllLi5jNjM1MzJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVmbG9nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlZmxvZy5qYXZhCkBAIC05LDYgKzksOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCkBAIC00NSw3ICs0Nyw4IEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHsKIAogCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKFJlZmxvZ0VudHJ5IGVudHJ5LCBpbnQgaSkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzLmFwcGVuZChlbnRyeS5nZXROZXdJZCgpLmFiYnJldmlhdGUoNykubmFtZSgpKTsKKwkJcy5hcHBlbmQoZW50cnkuZ2V0TmV3SWQoKS5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkKKwkJCQkubmFtZSgpKTsKIAkJcy5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAogCQlzLmFwcGVuZChyZWYgPT0gbnVsbCA/IENvbnN0YW50cy5IRUFEIDogUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZShyZWYpKTsKIAkJcy5hcHBlbmQoIkB7IiArIGkgKyAifToiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQuamF2YQppbmRleCA3ZmU1YjBmLi5lMDZmMTUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LmphdmEKQEAgLTEzOSw2ICsxMzksOCBAQCBwdWJsaWMgc3RhdGljIFN0cmluZyBmYXRhbEVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkaWZmVG9vbEhlbHBTZXRUb0ZvbGxvd2luZzsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRpZmZUb29sTGF1bmNoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGlmZlRvb2xEaWVkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGlmZlRvb2xQcm9tcHRUb29sTmFtZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRpZmZUb29sVW5rbm93blRvb2xOYW1lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZG9lc05vdEV4aXN0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZG9udE92ZXJ3cml0ZUxvY2FsQ2hhbmdlczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGV2ZXJ5dGhpbmdVcFRvRGF0ZTsKQEAgLTE2OSw2ICsxNzEsMjQgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmF0YWxFcnJvcihTdHJpbmcgbWVzc2FnZSkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9nTm9TaWduYXR1cmVWZXJpZmllcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1lcmdlQ2hlY2tvdXRDb25mbGljdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1lcmdlQ29uZmxpY3Q7CisJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZVRvb2xIZWxwU2V0VG9Gb2xsb3dpbmc7CisJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZVRvb2xMYXVuY2g7CisJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZVRvb2xEaWVkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVyZ2VUb29sTm9GaWxlczsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIG1lcmdlVG9vbE1lcmdpbmc7CisJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZVRvb2xVbmtub3duQ29uZmxpY3Q7CisJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZVRvb2xOb3JtYWxDb25mbGljdDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIG1lcmdlVG9vbE1lcmdlRmFpbGVkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVyZ2VUb29sRXhlY3V0aW9uRXJyb3I7CisJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZVRvb2xGaWxlVW5jaGFuZ2VkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVyZ2VUb29sRGVsZXRlZENvbmZsaWN0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVyZ2VUb29sRGVsZXRlZENvbmZsaWN0QnlVczsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIG1lcmdlVG9vbERlbGV0ZWRDb25mbGljdEJ5VGhlbTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIG1lcmdlVG9vbENvbnRpbnVlVW5yZXNvbHZlZFBhdGhzOworCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVyZ2VUb29sV2FzTWVyZ2VTdWNjZXNzZnVsbDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIG1lcmdlVG9vbERlbGV0ZWRNZXJnZURlY2lzaW9uOworCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVyZ2VUb29sUHJvbXB0VG9vbE5hbWU7CisJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZVRvb2xVbmtub3duVG9vbE5hbWU7CiAJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZUZhaWxlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1lcmdlQ2hlY2tvdXRGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZU1hZGVCeTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9CVUlMRCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9CVUlMRAppbmRleCAwYzhjZjgzLi5mMmU0ZDU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvQlVJTEQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L0JVSUxECkBAIC0xNyw2ICsxNyw2IEBACiAgICAgICAgICIvL2xpYjpzbGY0ai1hcGkiLAogICAgICAgICAiLy9saWI6c3NoZC1vc2dpIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdDpqZ2l0IiwKLSAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlOnNzaC1hcGFjaGUiCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZTpzc2gtYXBhY2hlIiwKICAgICBdLAogKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2MmEyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9SRUFETUUubWQKQEAgLTAsMCArMSw4MiBAQAorIyBKR2l0IFNTSCBhZ2VudCB0cmFuc3BvcnQgc3VwcG9ydCBmb3IgQXBhY2hlIE1JTkEgc3NoZAorCitUaGlzIGJ1bmRsZSBwcm92aWRlcyBvcHRpb25hbCBzdXBwb3J0IGZvciBjb21tdW5pY2F0aW5nIHdpdGggYW4gU1NIIGFnZW50Citmb3IgU1NIIG9yIFNGVFAgYXV0aGVudGljYXRpb24uIEl0IGlzIGFuIE9TR2kgZnJhZ21lbnQgZm9yIGJ1bmRsZQorW29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZV0oLi4vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL1JFQURNRS5tZCksCithbmQgaXQgcHJvdmlkZXMgdHJhbnNwb3J0cyBmb3IgbG9jYWwgY29tbXVuaWNhdGlvbiB3aXRoIFNTSCBhZ2VudHMuCisKKyMjIFN1cHBvcnRlZCBTU0ggYWdlbnQgdHJhbnNwb3J0cworCisjIyMgTGludXgsIE9TIFgsIEJTRAorCitPbiBMaW51eCwgT1MgWCwgYW5kIEJTRCwgdGhlIG9ubHkgdHJhbnNwb3J0IG1lY2hhbmlzbSBzdXBwb3J0ZWQgaXMgdGhlIHVzdWFsCitjb21tdW5pY2F0aW9uIHZpYSBhIFVuaXggZG9tYWluIHNvY2tldC4gVGhpcyBpcyB0aGUgb25seSBwcm90b2NvbCB0aGUgT3BlblNTSAorU1NIIGFnZW50IHN1cHBvcnRzLiBBIFVuaXggZG9tYWluIHNvY2tldCBhcHBlYXJzIGFzIGEgc3BlY2lhbCBmaWxlIGluIHRoZSBmaWxlCitzeXN0ZW07IHRoaXMgZmlsZSBuYW1lIGlzIHR5cGljYWxseSBhdmFpbGFibGUgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitgU1NIX0FVVEhfU09DS2AuCisKK1RoZSBTU0ggY29uZmlnIGBJZGVudGl0eUFnZW50YCBjYW4gYmUgc2V0IHRvIHRoaXMgc29ja2V0IGZpbGVuYW1lIHRvIHNwZWNpZnkKK2V4YWN0bHkgd2hpY2ggVW5peCBkb21haW4gc29ja2V0IHRvIHVzZSwgb3IgaXQgY2FuIGJlIHNldCB0byBgU1NIX0FVVEhfU09DS2AKK3RvIHVzZSB0aGUgdmFsdWUgZnJvbSB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlLiBJZiBgSWRlbnRpdHlBZ2VudGAgaXMgbm90IHNldAorYXQgYWxsLCBKR2l0IHVzZXMgYFNTSF9BVVRIX1NPQ0tgIGJ5IGRlZmF1bHQuIElmIHRoZSB2YXJpYWJsZSBpcyBub3Qgc2V0LCBubworU1NIIGFnZW50IHdpbGwgYmUgdXNlZC4gYElkZW50aXR5QWdlbnRgIGNhbiBhbHNvIGJlIHNldCB0byBgbm9uZWAgdG8gbm90IHVzZQorYW55IFNTSCBhZ2VudC4KKworIyMjIFdpbmRvd3MKKworT24gV2luZG93cywgdHdvIGRpZmZlcmVudCB0cmFuc3BvcnRzIGFyZSBzdXBwb3J0ZWQ6CisKKyogQSB0cmFuc3BvcnQgb3ZlciBhIFdpbmRvd3MgbmFtZWQgcGlwZS4gVGhpcyBpcyB1c2VkIGJ5IFdpbjMyLU9wZW5TU0gsIGFuZCBpcyBhdmFpbGFibGUgZm9yIFBhZ2VhbnQgc2luY2UgdmVyc2lvbiAwLjc1LgorKiBBIFBhZ2VhbnQtc3BlY2lmaWMgbGVnYWN5IHRyYW5zcG9ydCB2aWEgc2hhcmVkIG1lbW9yeTsgdXNlZnVsIGZvciBQYWdlYW50IGFuZCBHUEcncyBncGctYWdlbnQuCisKK1Bvc3NpYmxlIHNldHRpbmdzIG9mIGBJZGVudGl0eUFnZW50YCB0byBzZWxlY3QgYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydCBhcmUKKworKiBgLy8uL3BpcGUvb3BlbnNzaC1zc2gtYWdlbnRgOiB0aGUgV2luZG93cyBuYW1lZCBwaXBlIG9mIFdpbjMyLU9wZW5TU0guCisqIGAvLy4vcGFnZWFudGA6IHRoZSBzaGFyZWQtbWVtb3J5IG1lY2hhbmlzbSBvZiBQYWdlYW50LgorKiBgbm9uZWA6IGRvIG5vdCB1c2UgYW55IFNTSCBhZ2VudC4KKyogYC8vLi9waXBlLyZsdDthbnlfdmFsaWRfcGlwZV9uYW1lPmA6IHVzZSBhIHNwZWNpZmljIFdpbmRvd3MgbmFtZWQgcGlwZS4KKworVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG9uIFdpbmRvd3MgaWYgYElkZW50aXR5QWdlbnRgIGlzIG5vdCBzZXQgYXQgYWxsIGlzIHRoZQorUGFnZWFudCBzaGFyZWQtbWVtb3J5IHRyYW5zcG9ydC4gRW52aXJvbm1lbnQgdmFyaWFibGUgYFNTSF9BVVRIX1NPQ0tgIG5lZWRzCitub3QgYmUgc2V0IGZvciBQYWdlYW50LCBhbmQgX211c3Qgbm90XyBiZSBzZXQgZm9yIFdpbjMyLU9wZW5TU0guCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIGEgbmFtZWQgcGlwZSBhcyB0cmFuc3BvcnQgZm9yIFBhZ2VhbnQgKGFzIG9mCit2ZXJzaW9uIDAuNzUpLiBVbmZvcnR1bmF0ZWx5LCBQYWdlYW50IHVubmVjZXNzYXJpbHkgY3J5cHRvZ3JhcGhpY2FsbHkKK29iZnVzY2F0ZXMgdGhlIHBpcGUgbmFtZSwgc28gaXQgaXMgbm90IHBvc3NpYmxlIGZvciBKR2l0IHRvIGRldGVybWluZSBpdAorYXV0b21hdGljYWxseS4gVGhlIHBpcGUgbmFtZSBpcyBgcGFnZWFudC48dXNlciBuYW1lPi48c2hhMjU2PmAsIGZvciBpbnN0YW5jZQorYHBhZ2VhbnQubXlzZWxmLmM1Njg3NzM2YmE3NTVhNzBiMDAwOTU1Y2IxOTE2OThhZWQ3ZGIyMjFjMmIwNzEwMTk5ZWIxZjUyOTg5MjJhYjVgLgorQSB1c2VyIGNhbiBsb29rIHVwIHRoZSBuYW1lIGJ5IHN0YXJ0aW5nIFBhZ2VhbnQgYW5kIHRoZW4gcnVubmluZyB0aGUKK2NvbW1hbmQgYGRpciBcXC5ccGlwZVxcYCBpbiBhIGNvbW1hbmQgc2hlbGwuIE9uY2UgdGhlIG5hbWUgaXMga25vd24sIHNldHRpbmcKK2BJZGVudGl0eUFnZW50YCB0byB0aGUgcGlwZSBuYW1lIGFzCitgLy8uL3BpcGUvcGFnZWFudC5teXNlbGYuYzU2ODc3MzZiYTc1NWE3MGIwMDA5NTVjYjE5MTY5OGFlZDdkYjIyMWMyYjA3MTAxOTllYjFmNTI5ODkyMmFiNWAKK21ha2VzIEpHaXQgdXNlIHRoaXMgV2luZG93cyBuYW1lZCBwaXBlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggUGFnZWFudC4KKworKFlvdSBjYW4gdXNlIGZvcndhcmQgc2xhc2hlcyBpbiB0aGUgYH4vLnNzaC9jb25maWdgIGZpbGUuIFNTSCBjb25maWcgZmlsZQorcGFyc2luZyBoYXMgaXRzIG93biBydWxlcyBhYm91dCBiYWNrc2xhc2hlcyBpbiBjb25maWcgZmlsZXM7IHdoaWNoIGFyZQordHJlYXRlZCBhcyBlc2NhcGUgY2hhcmFjdGVycyBpbiBzb21lIGNvbnRleHRzLiBXaXRoIGJhY2tzbGFzaGVzIG9uZSB3b3VsZAoraGF2ZSB0byB3cml0ZSwgZS5nLiwgYFxcXFwuXHBpcGVcb3BlbnNzaC1zc2gtYWdlbnRgLikKKworV2l0aCB0aGVzZSB0d28gdHJhbnNwb3J0IG1lY2hhbmlzbXMsIFBhZ2VhbnQgYW5kIFdpbjMyLU9wZW5TU0ggYXJlIHN1cHBvcnRlZC4KK0FzIGZvciBHUEc6IHRoZSBncGctYWdlbnQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gZW11bGF0ZSBzc2gtYWdlbnQgKHByZXN1bWFibHkKK3ZpYSBhIFdpblNvY2tldHMyICJVbml4IGRvbWFpbiBzb2NrZXQiIG9uIFdpbmRvd3MpIG9yIHRvIGVtdWxhdGUgUGFnZWFudAorKHVzaW5nIHRoZSBzaGFyZWQgbWVtb3J5IG1lY2hhbmlzbSkuIFJ1bm5pbmcgZ3BnLWFnZW50IHdpdGggdGhlCitgZW5hYmxlLXNzaC1zdXBwb3J0YCBvcHRpb24gaXMKK1tyZXBvcnRlZCBub3QgdG8gd29yayBvbiBXaW5kb3dzXShodHRwczovL2Rldi5nbnVwZy5vcmcvVDM4ODMpLCB0aG91Z2guIEJ1dAordGhlIFB1VFRZIGVtdWxhdGlvbiBpbiBncGctYWdlbnQgKG9wdGlvbiBgZW5hYmxlLXB1dHR5LXN1cHBvcnRgKSBfc2hvdWxkXyB3b3JrLAorc28gaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBncGctYWdlbnQgaW5zdGVhZCBvZiBQYWdlYW50LgorCitOZWl0aGVyIFBhZ2VhbnQgKGFzIG9mIHZlcnNpb24gMC43Nikgbm9yIFdpbjMyLU9wZW5TU0ggKGFzIG9mIHZlcnNpb24gOC42KQorc3VwcG9ydCB0aGUgYGNvbmZpcm1gIG9yIGxpZmV0aW1lIGNvbnN0cmFpbnRzIGZvciBgQWRkS2V5c1RvQWdlbnRgLiBncGctYWdlbnQKK2FwcGFyZW50bHkgZG9lcywgZXZlbiB3aGVuIGNvbW11bmljYXRpbmcgb3ZlciB0aGUgUGFnZWFudCBzaGFyZWQgbWVtb3J5CittZWNoYW5pc20uCisKK1RoZSBzc2gtYWdlbnQgZnJvbSBnaXQgYmFzaCBvbiBXaW5kb3dzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLiBJdCB3b3VsZAorbmVlZCBhIGNvbm5lY3RvciBoYW5kbGluZyBDeWd3aW4gc29ja2V0IGZpbGVzIGFuZCB0aGUgQ3lnd2luIGhhbmRzaGFrZSBvdmVyCithIFRDUCBzdHJlYW0gc29ja2V0IGJvdW5kIHRvIHRoZSBsb29wYmFjayBpbnRlcmZhY2UuIFRoZSBDeWd3aW4gc29ja2V0IGZpbGUKK19pc18gZXhwb3NlZCBpbiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSBhdCAlVEVNUCVcc3NoLVhYWFhYWFhYWFhcYWdlbnQuJmx0O251bWJlcj4sCitidXQgaXQgZG9lcyBub3QgaGF2ZSBhIGZpeGVkIG5hbWUgKHRoZSBYJ3MgYW5kIHRoZSBudW1iZXIgYXJlIHZhcmlhYmxlIGFuZAorY2hhbmdlIGVhY2ggdGltZSBzc2gtYWdlbnQgaXMgc3RhcnRlZCkuCisKKyMjIEltcGxlbWVudGF0aW9uCisKK1RoZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgdHJhbnNwb3J0cyB1c2VzIEpOQS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9wb20ueG1sCmluZGV4IGQ0OGZkMDAuLjZiNGNhMzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9wb20ueG1sCkBAIC0xMzIsNyArMTMyLDYgQEAKICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CiAKLSAgICAgIDwhLS0gTmV3IGluIDYuMDsgdW5jb21tZW50IGluIDYuMQogICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLnNpb203OS5qYXBpY21wPC9ncm91cElkPgogICAgICAgICAgIDxhcnRpZmFjdElkPmphcGljbXAtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgpAQCAtMTU1LDYgKzE1NCw5IEBACiAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmVjbGlwc2UuamdpdC4qPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qLmludGVybmFsLio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgogICAgICAgICAgICAgICAgICAgPGFjY2Vzc01vZGlmaWVyPnB1YmxpYzwvYWNjZXNzTW9kaWZpZXI+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPgpAQCAtMTc0LDExICsxNzYsOSBAQAogICAgICAgICAgIDwvZXhlY3V0aW9uPgogICAgICAgICA8L2V4ZWN1dGlvbnM+CiAgICAgICA8L3BsdWdpbj4KLSAgICAgIC0tPgogICAgIDwvcGx1Z2lucz4KICAgPC9idWlsZD4KIAotICA8IS0tIE5ldyBpbiA2LjAsIHVuY29tbWVudCBpbiA2LjEKICAgPHJlcG9ydGluZz4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+CkBAIC0yMTAsNiArMjEwLDkgQEAKICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuZWNsaXBzZS5qZ2l0Lio8L2luY2x1ZGU+CiAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPiouaW50ZXJuYWwuKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICA8YWNjZXNzTW9kaWZpZXI+cHVibGljPC9hY2Nlc3NNb2RpZmllcj4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25Nb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25Nb2RpZmljYXRpb25zPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+CkBAIC0yMjMsNSArMjI2LDQgQEAKICAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KICAgPC9yZXBvcnRpbmc+Ci0gIC0tPgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5wcm9wZXJ0aWVzCmluZGV4IDZmY2UwODMuLmEzYjRlOTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLnByb3BlcnRpZXMKQEAgLTIsOSArMiwxMSBAQAogZXJyTGFzdEVycm9yPVN5c3RlbSBtZXNzYWdlIGZvciBlcnJvciB7MH0gY291bGQgbm90IGJlIHJldHJpZXZlZCwgZ290IHsxfQogZXJyUmVsZWFzZVNoYXJlZE1lbW9yeT1DYW5ub3QgcmVsZWFzZSBzaGFyZWQgbWVtb3J5OiB7MH0gLSB7MX0KIGVyclVua25vd249dW5rbm93biBlcnJvcgorZXJyVW5rbm93bklkZW50aXR5QWdlbnQ9SWRlbnRpdHlBZ2VudCAnJ3swfScnIHVua25vd24KIGxvZ0Vycm9yTG9hZExpYnJhcnk9Q2Fubm90IGxvYWQgc29ja2V0IGxpYnJhcnk7IFNTSCBhZ2VudCBzdXBwb3J0IGlzIHN3aXRjaGVkIG9mZgogbXNnQ2xvc2VGYWlsZWQ9Q2Fubm90IGNsb3NlIFNTSCBhZ2VudCBzb2NrZXQgezB9CiBtc2dDb25uZWN0RmFpbGVkPUNvdWxkIG5vdCBjb25uZWN0IHRvIFNTSCBhZ2VudCB2aWEgc29ja2V0ICcnezB9JycKK21zZ0Nvbm5lY3RQaXBlRmFpbGVkPUNvdWxkIG5vdCBjb25uZWN0IHRvIFNTSCBhZ2VudCB2aWEgcGlwZSAnJ3swfScnCiBtc2dOb01hcHBlZEZpbGU9Q291bGQgbm90IGNyZWF0ZSBmaWxlIG1hcHBpbmc6IHswfSAtIHsxfQogbXNnTm9TaGFyZWRNZW1vcnk9Q291bGQgbm90IGluaXRpYWxpemUgc2hhcmVkIG1lbW9yeTogezB9IC0gezF9CiBtc2dQYWdlYW50VW5hdmFpbGFibGU9Q291bGQgbm90IGNvbm5lY3QgdG8gUGFnZWFudApAQCAtMTUsMyArMTcsNCBAQAogbXNnU2hvcnRSZWFkPVNob3J0IHJlYWQgZnJvbSBTU0ggYWdlbnQsIGV4cGVjdGVkIHswfaBieXRlcywgZ290IHsxfSBieXRlczsgbGFzdCByZWFkKCkgcmV0dXJuZWQgezJ9CiBwYWdlYW50PVBhZ2VhbnQKIHVuaXhEZWZhdWx0QWdlbnQ9c3NoLWFnZW50Cit3aW5PcGVuU3NoPVdpbjMyIE9wZW5TU0gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9GYWN0b3J5LmphdmEKaW5kZXggZDc0MDliMC4uMWNlZTFiZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9GYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9GYWN0b3J5LmphdmEKQEAgLTExLDExICsxMSwxNSBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkNvbm5lY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkNvbm5lY3RvckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CiAKIC8qKgpAQCAtMjksNyArMzMsMjAgQEAgcHVibGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBDb25uZWN0b3JGYWN0b3J5IHsKIAlwdWJsaWMgQ29ubmVjdG9yIGNyZWF0ZShTdHJpbmcgaWRlbnRpdHlBZ2VudCwgRmlsZSBob21lRGlyKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmlzV2luZG93cygpKSB7Ci0JCQlyZXR1cm4gbmV3IFBhZ2VhbnRDb25uZWN0b3IoKTsKKwkJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKGlkZW50aXR5QWdlbnQpKSB7CisJCQkJLy8gRGVmYXVsdC4KKwkJCQlyZXR1cm4gbmV3IFBhZ2VhbnRDb25uZWN0b3IoKTsKKwkJCX0KKwkJCVN0cmluZyB3aW5QYXRoID0gaWRlbnRpdHlBZ2VudC5yZXBsYWNlKCcvJywgJ1xcJyk7CisJCQlpZiAoUGFnZWFudENvbm5lY3Rvci5ERVNDUklQVE9SLmdldElkZW50aXR5QWdlbnQoKQorCQkJCQkuZXF1YWxzSWdub3JlQ2FzZSh3aW5QYXRoKSkgeworCQkJCXJldHVybiBuZXcgUGFnZWFudENvbm5lY3RvcigpOworCQkJfQorCQkJaWYgKHdpblBhdGgudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpLnN0YXJ0c1dpdGgoIlxcXFwuXFxwaXBlXFwiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIG5ldyBXaW5QaXBlQ29ubmVjdG9yKHdpblBhdGgpOworCQkJfQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlUZXh0cy5nZXQoKS5lcnJVbmtub3duSWRlbnRpdHlBZ2VudCwgaWRlbnRpdHlBZ2VudCkpOwogCQl9CiAJCXJldHVybiBuZXcgVW5peERvbWFpblNvY2tldENvbm5lY3RvcihpZGVudGl0eUFnZW50KTsKIAl9CkBAIC01NSw3ICs3MiwxMSBAQCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAJICovCiAJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb248Q29ubmVjdG9yRGVzY3JpcHRvcj4gZ2V0U3VwcG9ydGVkQ29ubmVjdG9ycygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihnZXREZWZhdWx0Q29ubmVjdG9yKCkpOworCQlpZiAoU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuaXNXaW5kb3dzKCkpIHsKKwkJCXJldHVybiBMaXN0Lm9mKFBhZ2VhbnRDb25uZWN0b3IuREVTQ1JJUFRPUiwKKwkJCQkJV2luUGlwZUNvbm5lY3Rvci5ERVNDUklQVE9SKTsKKwkJfQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IuREVTQ1JJUFRPUik7CiAJfQogCiAJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL0xpYnJhcnlIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvTGlicmFyeUhvbGRlci5qYXZhCmluZGV4IGIwOWI1NWYuLjBhNTkyZDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvTGlicmFyeUhvbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvTGlicmFyeUhvbGRlci5qYXZhCkBAIC01Myw2ICs1MywxMCBAQCBwcml2YXRlIExpYnJhcnlIb2xkZXIoKSB7CiAJCWtlcm5lbCA9IEtlcm5lbDMyLklOU1RBTkNFOwogCX0KIAorCVN0cmluZyBzeXN0ZW1FcnJvcigpIHsKKwkJcmV0dXJuIHN5c3RlbUVycm9yKCJbezB9XSAtIHsxfSIpOyAvLyROT04tTkxTLTEkCisJfQorCiAJU3RyaW5nIHN5c3RlbUVycm9yKFN0cmluZyBwYXR0ZXJuKSB7CiAJCWludCBsYXN0RXJyb3IgPSBrZXJuZWwuR2V0TGFzdEVycm9yKCk7CiAJCVN0cmluZyBtc2c7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1BhZ2VhbnRDb25uZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvUGFnZWFudENvbm5lY3Rvci5qYXZhCmluZGV4IGIwZTNiY2UuLjE5Njg0ZWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvUGFnZWFudENvbm5lY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvUGFnZWFudENvbm5lY3Rvci5qYXZhCkBAIC0yNiw3ICsyNiwxMCBAQCBwdWJsaWMgY2xhc3MgUGFnZWFudENvbm5lY3RvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdG9yIHsKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIFN0cmluZyBnZXRJZGVudGl0eUFnZW50KCkgewotCQkJcmV0dXJuICJwYWdlYW50IjsgLy8kTk9OLU5MUy0xJAorCQkJLy8gVGhpcyBtdXN0IGJlIGFuIGFic29sdXRlIFdpbmRvd3MgcGF0aCBuYW1lIHRvIGF2b2lkIHRoYXQKKwkJCS8vIE9wZW5Tc2hDb25maWdGaWxlIHRyZWF0cyBpdCBhcyBhIHJlbGF0aXZlIHBhdGggbmFtZS4gVXNlIGFuIFVOQworCQkJLy8gbmFtZSBvbiBsb2NhbGhvc3QsIGxpa2UgZm9yIHBpcGVzLgorCQkJcmV0dXJuICJcXFxcLlxccGFnZWFudCI7IC8vJE5PTi1OTFMtMSQKIAkJfQogCiAJCUBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9Tb2NrZXRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1NvY2tldHMuamF2YQppbmRleCAzZDk1YmRiLi41MmNmNWYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1NvY2tldHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1NvY2tldHMuamF2YQpAQCAtMjQsMTEgKzI0LDYgQEAgcHJpdmF0ZSBTb2NrZXRzKCkgewogCX0KIAogCS8qKgotCSAqIERlZmF1bHQgU1NIIGFnZW50IHNvY2tldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVl9TU0hfQVVUSF9TT0NLID0gIlNTSF9BVVRIX1NPQ0siOyAvLyROT04tTkxTLTEkCi0KLQkvKioKIAkgKiBEb21haW4gZm9yIFVuaXggZG9tYWluIHNvY2tldHMuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUZfVU5JWCA9IDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLmphdmEKaW5kZXggZmI0NWIzMC4uZjM4N2M3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMuamF2YQpAQCAtMzEsOSArMzEsMTEgQEAgcHVibGljIHN0YXRpYyBUZXh0cyBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBlcnJMYXN0RXJyb3I7CiAJLyoqKi8gcHVibGljIFN0cmluZyBlcnJSZWxlYXNlU2hhcmVkTWVtb3J5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZXJyVW5rbm93bjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGVyclVua25vd25JZGVudGl0eUFnZW50OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9nRXJyb3JMb2FkTGlicmFyeTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1zZ0Nsb3NlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnQ29ubmVjdEZhaWxlZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIG1zZ0Nvbm5lY3RQaXBlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnTm9NYXBwZWRGaWxlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnTm9TaGFyZWRNZW1vcnk7CiAJLyoqKi8gcHVibGljIFN0cmluZyBtc2dQYWdlYW50VW5hdmFpbGFibGU7CkBAIC00NCw1ICs0Niw2IEBAIHB1YmxpYyBzdGF0aWMgVGV4dHMgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnU2hvcnRSZWFkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcGFnZWFudDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuaXhEZWZhdWx0QWdlbnQ7CisJLyoqKi8gcHVibGljIFN0cmluZyB3aW5PcGVuU3NoOwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1VuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVW5peERvbWFpblNvY2tldENvbm5lY3Rvci5qYXZhCmluZGV4IDNiNzVmM2EuLjk1YWMzNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVW5peERvbWFpblNvY2tldENvbm5lY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVW5peERvbWFpblNvY2tldENvbm5lY3Rvci5qYXZhCkBAIC0xMSwxMCArMTEsMTAgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3Rvci5Tb2NrZXRzLkFGX1VOSVg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yLlNvY2tldHMuREVGQVVMVF9QUk9UT0NPTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuU29ja2V0cy5FTlZfU1NIX0FVVEhfU09DSzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuU29ja2V0cy5TT0NLX1NUUkVBTTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuVW5peFNvY2tldHMuRkRfQ0xPRVhFQzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuVW5peFNvY2tldHMuRl9TRVRGRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoQ29uc3RhbnRzLkVOVl9TU0hfQVVUSF9TT0NLRVQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKQEAgLTQ2LDcgKzQ2LDcgQEAgcHVibGljIGNsYXNzIFVuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3RvciB7CiAKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpdHlBZ2VudCgpIHsKLQkJCXJldHVybiBFTlZfU1NIX0FVVEhfU09DSzsKKwkJCXJldHVybiBFTlZfU1NIX0FVVEhfU09DS0VUOwogCQl9CiAKIAkJQE92ZXJyaWRlCkBAIC05MSw4ICs5MSw5IEBAIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBVbml4U29ja2V0cyBnZXRMaWJyYXJ5KCkgewogCXB1YmxpYyBVbml4RG9tYWluU29ja2V0Q29ubmVjdG9yKFN0cmluZyBzb2NrZXRGaWxlKSB7CiAJCXN1cGVyKCk7CiAJCVN0cmluZyBmaWxlID0gc29ja2V0RmlsZTsKLQkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoZmlsZSkpIHsKLQkJCWZpbGUgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRlbnYoRU5WX1NTSF9BVVRIX1NPQ0spOworCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChmaWxlKQorCQkJCXx8IEVOVl9TU0hfQVVUSF9TT0NLRVQuZXF1YWxzKGZpbGUpKSB7CisJCQlmaWxlID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0ZW52KEVOVl9TU0hfQVVUSF9TT0NLRVQpOwogCQl9CiAJCXRoaXMuc29ja2V0RmlsZSA9IGZpbGU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9XaW5QaXBlQ29ubmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1dpblBpcGVDb25uZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWM2NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9XaW5QaXBlQ29ubmVjdG9yLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uU3NoRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQuQWJzdHJhY3RDb25uZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5Db25uZWN0b3JGYWN0b3J5LkNvbm5lY3RvckRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOworCitpbXBvcnQgY29tLnN1bi5qbmEuTGFzdEVycm9yRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4uam5hLnBsYXRmb3JtLndpbjMyLldpbkJhc2U7CitpbXBvcnQgY29tLnN1bi5qbmEucGxhdGZvcm0ud2luMzIuV2luRXJyb3I7CitpbXBvcnQgY29tLnN1bi5qbmEucGxhdGZvcm0ud2luMzIuV2luTlQ7CitpbXBvcnQgY29tLnN1bi5qbmEucGxhdGZvcm0ud2luMzIuV2luTlQuSEFORExFOworaW1wb3J0IGNvbS5zdW4uam5hLnB0ci5JbnRCeVJlZmVyZW5jZTsKKworLyoqCisgKiBBIGNvbm5lY3RvciBiYXNlZCBvbiBKTkEgdXNpbmcgV2luZG93cycgbmFtZWQgcGlwZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBhbgorICogc3NoIGFnZW50LiBUaGlzIGlzIHVzZWQgYnkgTWljcm9zb2Z0J3MgV2luMzItT3BlblNTSCBwb3J0LgorICovCitwdWJsaWMgY2xhc3MgV2luUGlwZUNvbm5lY3RvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdG9yIHsKKworCS8vIFBpcGUgbmFtZXMgYXJlLCBsaWtlIG90aGVyIGZpbGUgbmFtZXMsIGNhc2UtaW5zZW5zaXRpdmUgb24gV2luZG93cy4KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOT05JQ0FMX1BJUEVfTkFNRSA9ICJcXFxcLlxccGlwZVxcb3BlbnNzaC1zc2gtYWdlbnQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiB7QGxpbmsgQ29ubmVjdG9yRGVzY3JpcHRvcn0gZm9yIHRoZSB7QGxpbmsgUGFnZWFudENvbm5lY3Rvcn0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25uZWN0b3JEZXNjcmlwdG9yIERFU0NSSVBUT1IgPSBuZXcgQ29ubmVjdG9yRGVzY3JpcHRvcigpIHsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRJZGVudGl0eUFnZW50KCkgeworCQkJcmV0dXJuIENBTk9OSUNBTF9QSVBFX05BTUU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKwkJCXJldHVybiBUZXh0cy5nZXQoKS53aW5PcGVuU3NoOworCQl9CisJfTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFX1NIQVJFX05PTkUgPSAwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfQVRUUklCVVRFX05PTkUgPSAwOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGlwZU5hbWU7CisKKwlwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gY29ubmVjdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKKworCS8vIEl0J3MgYSBieXRlIHBpcGUsIHNvIHRoZSBub3JtYWwgV2luZG93cyBmaWxlIG1lY2hhbmlzbXMgY2FuIGJlIHVzZWQuCisJLy8gV291bGQgb25lIG9mIHRoZSBzdGFuZGFyZCBKYXZhIEZpbGUgSS9PIGFic3RyYWN0aW9ucyB3b3JrPworCXByaXZhdGUgdm9sYXRpbGUgSEFORExFIGZpbGVIYW5kbGU7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEge0BsaW5rIFdpblBpcGVDb25uZWN0b3J9IGZvciB0aGUgZ2l2ZW4gbmFtZWQgcGlwZS4KKwkgKgorCSAqIEBwYXJhbSBwaXBlTmFtZQorCSAqICAgICAgICAgICAgdG8gY29ubmVjdCB0bworCSAqLworCXB1YmxpYyBXaW5QaXBlQ29ubmVjdG9yKFN0cmluZyBwaXBlTmFtZSkgeworCQl0aGlzLnBpcGVOYW1lID0gcGlwZU5hbWUucmVwbGFjZSgnLycsICdcXCcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChwaXBlTmFtZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlIQU5ETEUgZmlsZSA9IGZpbGVIYW5kbGU7CisJCXN5bmNocm9uaXplZCAodGhpcykgeworCQkJaWYgKGNvbm5lY3RlZC5nZXQoKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJTGlicmFyeUhvbGRlciBsaWJzID0gTGlicmFyeUhvbGRlci5nZXRMaWJyYXJ5KCk7CisJCQlpZiAobGlicyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJZmlsZSA9IGxpYnMua2VybmVsLkNyZWF0ZUZpbGUocGlwZU5hbWUsCisJCQkJCVdpbk5ULkdFTkVSSUNfUkVBRCB8IFdpbk5ULkdFTkVSSUNfV1JJVEUsIEZJTEVfU0hBUkVfTk9ORSwKKwkJCQkJbnVsbCwgV2luTlQuT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9ORSwgbnVsbCk7CisJCQlpZiAoZmlsZSA9PSBudWxsIHx8IFdpbkJhc2UuSU5WQUxJRF9IQU5ETEVfVkFMVUUuZXF1YWxzKGZpbGUpKSB7CisJCQkJaW50IGVycm9yQ29kZSA9IGxpYnMua2VybmVsLkdldExhc3RFcnJvcigpOworCQkJCWlmIChlcnJvckNvZGUgPT0gV2luRXJyb3IuRVJST1JfRklMRV9OT1RfRk9VTkQKKwkJCQkJCSYmIENBTk9OSUNBTF9QSVBFX05BTUUuZXF1YWxzSWdub3JlQ2FzZShwaXBlTmFtZSkpIHsKKwkJCQkJLy8gT3BlblNTSCBhZ2VudCBub3QgcnVubmluZy4gRG9uJ3QgdGhyb3cuCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJTGFzdEVycm9yRXhjZXB0aW9uIGNhdXNlID0gbmV3IExhc3RFcnJvckV4Y2VwdGlvbigKKwkJCQkJCWxpYnMuc3lzdGVtRXJyb3IoKSk7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoVGV4dHMuZ2V0KCkubXNnQ29ubmVjdFBpcGVGYWlsZWQsIHBpcGVOYW1lKSwKKwkJCQkJCWNhdXNlKTsKKwkJCX0KKwkJCWNvbm5lY3RlZC5zZXQodHJ1ZSk7CisJCX0KKwkJZmlsZUhhbmRsZSA9IGZpbGU7CisJCXJldHVybiBjb25uZWN0ZWQuZ2V0KCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSEFORExFIGZpbGUgPSBmaWxlSGFuZGxlOworCQlpZiAoY29ubmVjdGVkLmdldEFuZFNldChmYWxzZSkgJiYgZmlsZUhhbmRsZSAhPSBudWxsKSB7CisJCQlmaWxlSGFuZGxlID0gbnVsbDsKKwkJCUxpYnJhcnlIb2xkZXIgbGlicyA9IExpYnJhcnlIb2xkZXIuZ2V0TGlicmFyeSgpOworCQkJYm9vbGVhbiBzdWNjZXNzID0gbGlicy5rZXJuZWwuQ2xvc2VIYW5kbGUoZmlsZSk7CisJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQlMYXN0RXJyb3JFeGNlcHRpb24gY2F1c2UgPSBuZXcgTGFzdEVycm9yRXhjZXB0aW9uKAorCQkJCQkJbGlicy5zeXN0ZW1FcnJvcigpKTsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJLmZvcm1hdChUZXh0cy5nZXQoKS5tc2dDbG9zZUZhaWxlZCwgcGlwZU5hbWUpLCBjYXVzZSk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYnl0ZVtdIHJwYyhieXRlIGNvbW1hbmQsIGJ5dGVbXSBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwcmVwYXJlTWVzc2FnZShjb21tYW5kLCBtZXNzYWdlKTsKKwkJSEFORExFIGZpbGUgPSBmaWxlSGFuZGxlOworCQlpZiAoIWNvbm5lY3RlZC5nZXQoKSB8fCBmaWxlID09IG51bGwpIHsKKwkJCS8vIE5vIHRyYW5zbGF0aW9uLCBpbnRlcm5hbCBlcnJvcgorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IGNvbm5lY3RlZCB0byBTU0ggYWdlbnQiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCUxpYnJhcnlIb2xkZXIgbGlicyA9IExpYnJhcnlIb2xkZXIuZ2V0TGlicmFyeSgpOworCQl3cml0ZUZ1bGx5KGxpYnMsIGZpbGUsIG1lc3NhZ2UpOworCQkvLyBOb3cgcmVjZWl2ZSB0aGUgcmVwbHkKKwkJYnl0ZVtdIGxlbmd0aEJ1ZiA9IG5ldyBieXRlWzRdOworCQlyZWFkRnVsbHkobGlicywgZmlsZSwgbGVuZ3RoQnVmKTsKKwkJaW50IGxlbmd0aCA9IHRvTGVuZ3RoKGNvbW1hbmQsIGxlbmd0aEJ1Zik7CisJCWJ5dGVbXSBwYXlsb2FkID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKwkJcmVhZEZ1bGx5KGxpYnMsIGZpbGUsIHBheWxvYWQpOworCQlyZXR1cm4gcGF5bG9hZDsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVGdWxseShMaWJyYXJ5SG9sZGVyIGxpYnMsIEhBTkRMRSBmaWxlLCBieXRlW10gbWVzc2FnZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWJ5dGVbXSBidWYgPSBtZXNzYWdlOworCQlpbnQgdG9Xcml0ZSA9IGJ1Zi5sZW5ndGg7CisJCXRyeSB7CisJCQl3aGlsZSAodG9Xcml0ZSA+IDApIHsKKwkJCQlJbnRCeVJlZmVyZW5jZSB3cml0dGVuID0gbmV3IEludEJ5UmVmZXJlbmNlKCk7CisJCQkJYm9vbGVhbiBzdWNjZXNzID0gbGlicy5rZXJuZWwuV3JpdGVGaWxlKGZpbGUsIGJ1ZiwgYnVmLmxlbmd0aCwKKwkJCQkJCXdyaXR0ZW4sIG51bGwpOworCQkJCWlmICghc3VjY2VzcykgeworCQkJCQl0aHJvdyBuZXcgTGFzdEVycm9yRXhjZXB0aW9uKGxpYnMuc3lzdGVtRXJyb3IoKSk7CisJCQkJfQorCQkJCWludCBhY3R1YWxseVdyaXR0ZW4gPSB3cml0dGVuLmdldFZhbHVlKCk7CisJCQkJdG9Xcml0ZSAtPSBhY3R1YWxseVdyaXR0ZW47CisJCQkJaWYgKGFjdHVhbGx5V3JpdHRlbiA+IDAgJiYgdG9Xcml0ZSA+IDApIHsKKwkJCQkJYnVmID0gQXJyYXlzLmNvcHlPZlJhbmdlKGJ1ZiwgYWN0dWFsbHlXcml0dGVuLCBidWYubGVuZ3RoKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKExhc3RFcnJvckV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCVRleHRzLmdldCgpLm1zZ1NlbmRGYWlsZWQsIEludGVnZXIudG9TdHJpbmcobWVzc2FnZS5sZW5ndGgpLAorCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHRvV3JpdGUpKSwgZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcmVhZEZ1bGx5KExpYnJhcnlIb2xkZXIgbGlicywgSEFORExFIGZpbGUsIGJ5dGVbXSBkYXRhKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW50IG4gPSAwOworCQlpbnQgb2Zmc2V0ID0gMDsKKwkJd2hpbGUgKG9mZnNldCA8IGRhdGEubGVuZ3RoICYmIChuID0gcmVhZChsaWJzLCBmaWxlLCBkYXRhLCBvZmZzZXQsCisJCQkJZGF0YS5sZW5ndGggLSBvZmZzZXQpKSA+IDApIHsKKwkJCW9mZnNldCArPSBuOworCQl9CisJCWlmIChvZmZzZXQgPCBkYXRhLmxlbmd0aCkgeworCQkJdGhyb3cgbmV3IFNzaEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJVGV4dHMuZ2V0KCkubXNnU2hvcnRSZWFkLCBJbnRlZ2VyLnRvU3RyaW5nKGRhdGEubGVuZ3RoKSwKKwkJCQkJSW50ZWdlci50b1N0cmluZyhvZmZzZXQpLCBJbnRlZ2VyLnRvU3RyaW5nKG4pKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGludCByZWFkKExpYnJhcnlIb2xkZXIgbGlicywgSEFORExFIGZpbGUsIGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsCisJCQlpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJaW50IHRvUmVhZCA9IGxlbmd0aDsKKwkJCUludEJ5UmVmZXJlbmNlIHJlYWQgPSBuZXcgSW50QnlSZWZlcmVuY2UoKTsKKwkJCWlmIChvZmZzZXQgPT0gMCkgeworCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGxpYnMua2VybmVsLlJlYWRGaWxlKGZpbGUsIGJ1ZmZlciwgdG9SZWFkLAorCQkJCQkJcmVhZCwgbnVsbCk7CisJCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJCXRocm93IG5ldyBMYXN0RXJyb3JFeGNlcHRpb24obGlicy5zeXN0ZW1FcnJvcigpKTsKKwkJCQl9CisJCQkJcmV0dXJuIHJlYWQuZ2V0VmFsdWUoKTsKKwkJCX0KKwkJCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKwkJCWJvb2xlYW4gc3VjY2VzcyA9IGxpYnMua2VybmVsLlJlYWRGaWxlKGZpbGUsIGJ1ZmZlciwgdG9SZWFkLCByZWFkLAorCQkJCQludWxsKTsKKwkJCWlmICghc3VjY2VzcykgeworCQkJCXRocm93IG5ldyBMYXN0RXJyb3JFeGNlcHRpb24obGlicy5zeXN0ZW1FcnJvcigpKTsKKwkJCX0KKwkJCWludCBhY3R1YWxseVJlYWQgPSByZWFkLmdldFZhbHVlKCk7CisJCQlpZiAoYWN0dWFsbHlSZWFkID4gMCkgeworCQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgYnVmZmVyLCBvZmZzZXQsIGFjdHVhbGx5UmVhZCk7CisJCQl9CisJCQlyZXR1cm4gYWN0dWFsbHlSZWFkOworCQl9IGNhdGNoIChMYXN0RXJyb3JFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlUZXh0cy5nZXQoKS5tc2dSZWFkRmFpbGVkLCBJbnRlZ2VyLnRvU3RyaW5nKGxlbmd0aCkpLCBlKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggOWU0YThmNy4uMGQwNDZjOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTcsMjAgKzcsMjAgQEAKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKLUltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0czt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uYXV0aDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaGVscGVyczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubmV0O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29yZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuZm9yd2FyZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uYXV0aDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaGVscGVyczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubmV0O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29yZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuZm9yd2FyZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCiAgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5wcm94eTt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IDQwNmM1YTcuLjM1ZDcxNDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L2J1aWxkLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvYnVpbGQucHJvcGVydGllcwpAQCAtMyw1ICszLDQgQEAKIGJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCiAgICAgICAgICAgICAgICAuLFwKICAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1hZGRpdGlvbmFsLmJ1bmRsZXMgPSBvcmcuYXBhY2hlLmxvZzRqLFwKLSAgICAgICAgICAgICAgICAgICAgIG9yZy5zbGY0ai5iaW5kaW5nLmxvZzRqMTIKK2FkZGl0aW9uYWwuYnVuZGxlcyA9IG9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvQXBhY2hlU3NoVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvQXBhY2hlU3NoVGVzdC5qYXZhCmluZGV4IGNjYWY5OGMuLmE4ZmNjYTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL0FwYWNoZVNzaFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9BcGFjaGVTc2hUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIwIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIDIwMjIgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwNyw2ICsxMDcsMzIgQEAgcHVibGljIHZvaWQgdGVzdEVkMjU1MTlIb3N0S2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJIklkZW50aXR5RmlsZSAiICsgcHJpdmF0ZUtleTEuZ2V0QWJzb2x1dGVQYXRoKCkpOwogCX0KIAorCS8qKgorCSAqIFRlc3QgZm9yIFNTSEQtMTIzMS4gSWYgYXV0aGVudGljYXRpb24gaXMgYXR0ZW1wdGVkIGZpcnN0IHdpdGggYW4gUlNBIGtleSwKKwkgKiB3aGljaCBpcyByZWplY3RlZCwgYW5kIHRoZW4gd2l0aCBzb21lIG90aGVyIGtleSB0eXBlIChoZXJlIGVkMjU1MTkpLAorCSAqIGF1dGhlbnRpY2F0aW9uIGZhaWxzIGluIGJ1ZyBTU0hELTEyMzEuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIG9uIGVycm9ycworCSAqIEBzZWUgPGEgaHJlZj0KKwkgKiAgICAgICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1NTSEQtMTIzMSI+U1NIRC0xMjMxPC9hPgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFdyb25nS2V5Rmlyc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZSB1c2VyS2V5ID0gbmV3IEZpbGUoZ2V0VGVtcG9yYXJ5RGlyZWN0b3J5KCksICJ1c2Vya2V5Iik7CisJCWNvcHlUZXN0UmVzb3VyY2UoImlkX2VkMjU1MTkiLCB1c2VyS2V5KTsKKwkJRmlsZSBwdWJsaWNLZXkgPSBuZXcgRmlsZShnZXRUZW1wb3JhcnlEaXJlY3RvcnkoKSwgInVzZXJrZXkucHViIik7CisJCWNvcHlUZXN0UmVzb3VyY2UoImlkX2VkMjU1MTkucHViIiwgcHVibGljS2V5KTsKKwkJc2VydmVyLnNldFRlc3RVc2VyUHVibGljS2V5KHB1YmxpY0tleS50b1BhdGgoKSk7CisJCWNsb25lV2l0aCgic3NoOi8vZ2l0L2RvZXNudG1hdHRlciIsIGRlZmF1bHRDbG9uZURpciwgbnVsbCwgLy8KKwkJCQkiSG9zdCBnaXQiLCAvLworCQkJCSJIb3N0TmFtZSBsb2NhbGhvc3QiLCAvLworCQkJCSJQb3J0ICIgKyB0ZXN0UG9ydCwgLy8KKwkJCQkiVXNlciAiICsgVEVTVF9VU0VSLCAvLworCQkJCSJJZGVudGl0eUZpbGUgIiArIHByaXZhdGVLZXkxLmdldEFic29sdXRlUGF0aCgpLCAvLyBSU0EKKwkJCQkiSWRlbnRpdHlGaWxlICIgKyB1c2VyS2V5LmdldEFic29sdXRlUGF0aCgpKTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RIYXNoZWRLbm93bkhvc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydFRydWUoIkZhaWxlZCB0byBkZWxldGUga25vd25faG9zdHMiLCBrbm93bkhvc3RzLmRlbGV0ZSgpKTsKQEAgLTc2Myw0ICs3ODksNzYgQEAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RPbmx5UnNhU2hhMSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJc2Vzc2lvbi5kaXNjb25uZWN0KCk7CiAJCX0KIAl9CisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5QXV0aExvZyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGZpcnN0KSB7CisJCWFzc2VydFRydWUobWVzc2FnZS5jb250YWlucyhTeXN0ZW0ubGluZVNlcGFyYXRvcigpKSk7CisJCVN0cmluZ1tdIGxpbmVzID0gbWVzc2FnZS5zcGxpdChTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKKwkJaW50IHB1YmtleUluZGV4ID0gLTE7CisJCWludCBwYXNzd29yZEluZGV4ID0gLTE7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBsaW5lID0gbGluZXNbaV07CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJYXNzZXJ0VHJ1ZShsaW5lLmNvbnRhaW5zKGZpcnN0KSk7CisJCQl9CisJCQlpZiAobGluZS5jb250YWlucygicHVibGlja2V5OiIpKSB7CisJCQkJaWYgKHB1YmtleUluZGV4IDwgMCkgeworCQkJCQlwdWJrZXlJbmRleCA9IGk7CisJCQkJCWFzc2VydFRydWUobGluZS5jb250YWlucygiL3VzZXJrZXkiKSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChsaW5lLmNvbnRhaW5zKCJwYXNzd29yZDoiKSkgeworCQkJCWlmIChwYXNzd29yZEluZGV4IDwgMCkgeworCQkJCQlwYXNzd29yZEluZGV4ID0gaTsKKwkJCQkJYXNzZXJ0VHJ1ZShsaW5lLmNvbnRhaW5zKCJhdHRlbXB0IDEiKSk7CisJCQkJfQorCQkJfQorCQl9CisJCWFzc2VydFRydWUocHVia2V5SW5kZXggPiAwICYmIHBhc3N3b3JkSW5kZXggPiAwKTsKKwkJYXNzZXJ0VHJ1ZShwdWJrZXlJbmRleCA8IHBhc3N3b3JkSW5kZXgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEF1dGhGYWlsdXJlTWVzc2FnZUNhbmNlbCgpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlIHVzZXJLZXkgPSBuZXcgRmlsZShnZXRUZW1wb3JhcnlEaXJlY3RvcnkoKSwgInVzZXJrZXkiKTsKKwkJY29weVRlc3RSZXNvdXJjZSgiaWRfZWQyNTUxOSIsIHVzZXJLZXkpOworCQlGaWxlIHB1YmxpY0tleSA9IG5ldyBGaWxlKGdldFRlbXBvcmFyeURpcmVjdG9yeSgpLCAidXNlcmtleS5wdWIiKTsKKwkJY29weVRlc3RSZXNvdXJjZSgiaWRfZWQyNTUxOS5wdWIiLCBwdWJsaWNLZXkpOworCQkvLyBEb24ndCBzZXQgdGhpcyBhcyB0aGUgdXNlcidzIGtleTsgd2UgZG8gd2FudCB0byB0cnkgd2l0aCBhIHdyb25nIGtleS4KKwkJc2VydmVyLmVuYWJsZVBhc3N3b3JkQXV0aGVudGljYXRpb24oKTsKKwkJVGVzdENyZWRlbnRpYWxzUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgVGVzdENyZWRlbnRpYWxzUHJvdmlkZXIoCisJCQkJIndyb25ncGFzcyIpOworCQlUcmFuc3BvcnRFeGNlcHRpb24gZSA9IGFzc2VydFRocm93cyhUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MsCisJCQkJKCkgLT4gY2xvbmVXaXRoKCJzc2g6Ly9naXQvZG9lc250bWF0dGVyIiwgZGVmYXVsdENsb25lRGlyLAorCQkJCQkJcHJvdmlkZXIsIC8vCisJCQkJCQkiSG9zdCBnaXQiLCAvLworCQkJCQkJIkhvc3ROYW1lIGxvY2FsaG9zdCIsIC8vCisJCQkJCQkiUG9ydCAiICsgdGVzdFBvcnQsIC8vCisJCQkJCQkiVXNlciAiICsgVEVTVF9VU0VSLCAvLworCQkJCQkJIklkZW50aXR5RmlsZSAiICsgdXNlcktleS5nZXRBYnNvbHV0ZVBhdGgoKSwgLy8KKwkJCQkJCSJQcmVmZXJyZWRBdXRoZW50aWNhdGlvbnMgcHVibGlja2V5LHBhc3N3b3JkIikpOworCQl2ZXJpZnlBdXRoTG9nKGUuZ2V0TWVzc2FnZSgpLCAiY2FuY2VsZWQiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBdXRoRmFpbHVyZU1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZSB1c2VyS2V5ID0gbmV3IEZpbGUoZ2V0VGVtcG9yYXJ5RGlyZWN0b3J5KCksICJ1c2Vya2V5Iik7CisJCWNvcHlUZXN0UmVzb3VyY2UoImlkX2VkMjU1MTkiLCB1c2VyS2V5KTsKKwkJRmlsZSBwdWJsaWNLZXkgPSBuZXcgRmlsZShnZXRUZW1wb3JhcnlEaXJlY3RvcnkoKSwgInVzZXJrZXkucHViIik7CisJCWNvcHlUZXN0UmVzb3VyY2UoImlkX2VkMjU1MTkucHViIiwgcHVibGljS2V5KTsKKwkJLy8gRG9uJ3Qgc2V0IHRoaXMgYXMgdGhlIHVzZXIncyBrZXk7IHdlIGRvIHdhbnQgdG8gdHJ5IHdpdGggYSB3cm9uZyBrZXkuCisJCXNlcnZlci5lbmFibGVQYXNzd29yZEF1dGhlbnRpY2F0aW9uKCk7CisJCS8vIEVub3VnaCBwYXNzd29yZHMgbm90IHRvIGNhbmNlbCBhdXRoZW50aWNhdGlvbgorCQlUZXN0Q3JlZGVudGlhbHNQcm92aWRlciBwcm92aWRlciA9IG5ldyBUZXN0Q3JlZGVudGlhbHNQcm92aWRlcigKKwkJCQkid3JvbmdwYXNzIiwgIndyb25ncGFzcyIsICJ3cm9uZ3Bhc3MiKTsKKwkJVHJhbnNwb3J0RXhjZXB0aW9uIGUgPSBhc3NlcnRUaHJvd3MoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IGNsb25lV2l0aCgic3NoOi8vZ2l0L2RvZXNudG1hdHRlciIsIGRlZmF1bHRDbG9uZURpciwKKwkJCQkJCXByb3ZpZGVyLCAvLworCQkJCQkJIkhvc3QgZ2l0IiwgLy8KKwkJCQkJCSJIb3N0TmFtZSBsb2NhbGhvc3QiLCAvLworCQkJCQkJIlBvcnQgIiArIHRlc3RQb3J0LCAvLworCQkJCQkJIlVzZXIgIiArIFRFU1RfVVNFUiwgLy8KKwkJCQkJCSJJZGVudGl0eUZpbGUgIiArIHVzZXJLZXkuZ2V0QWJzb2x1dGVQYXRoKCksIC8vCisJCQkJCQkiUHJlZmVycmVkQXV0aGVudGljYXRpb25zIHB1YmxpY2tleSxwYXNzd29yZCIpKTsKKwkJdmVyaWZ5QXV0aExvZyhlLmdldE1lc3NhZ2UoKSwgImxvZyBpbiIpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDNiZWM2NDcuLmYyNGZmODAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTM1LDU0ICszNSw1NyBAQAogICAgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5rZXl2ZXJpZmllciIsCiAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudDt2ZXJzaW9uPSI3LjAuMCIKIEltcG9ydC1QYWNrYWdlOiBuZXQuaTJwLmNyeXB0by5lZGRzYTt2ZXJzaW9uPSJbMC4zLjAsMC40LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuYWdlbnQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLmtleWJvYXJkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wYXNzd29yZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucHVia2V5O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY2hhbm5lbDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0czt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuZnV0dXJlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQua2V5dmVyaWZpZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5zZXNzaW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbi5mb3J3YXJkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5hdXRoO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY2hhbm5lbDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbXByZXNzaW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5sb2FkZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5sb2FkZXIub3BlbnNzaC5rZGY7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5kaWdlc3Q7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5mb3J3YXJkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZnV0dXJlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaGVscGVyczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmlvO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LmV4dGVuc2lvbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5leHRlbnNpb24ucGFyc2VyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5tYWM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5yYW5kb207dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbi5oZWxwZXJzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5jbG9zZWFibGU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5pby5mdW5jdG9yczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW8ucmVzb3VyY2U7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmxvZ2dpbmc7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLm5ldDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvcmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZnRwO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZnRwLmNsaWVudDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5jb21tb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmFnZW50O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5rZXlib2FyZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucGFzc3dvcmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnB1YmtleTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNoYW5uZWw7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcuaG9zdHM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcua2V5czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmZ1dHVyZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmtleXZlcmlmaWVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb24uZm9yd2FyZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uYXV0aDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNoYW5uZWw7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb21wcmVzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMubG9hZGVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMubG9hZGVyLm9wZW5zc2gua2RmO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMudTJmO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZGlnZXN0O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZm9yd2FyZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmZ1dHVyZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5pbzt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5leHRlbnNpb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguZXh0ZW5zaW9uLnBhcnNlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ubWFjO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ucmFuZG9tO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb24uaGVscGVyczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWw7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLmtleXM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmNsb3NlYWJsZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW87dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLmRlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW8uZnVuY3RvcnM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLnJlc291cmNlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5sb2dnaW5nO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5uZXQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnNlY3VyaXR5O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb3JlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2Z0cDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5jbGllbnQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNmdHAuY29tbW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCiAgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCiAgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9SRUFETUUubWQKaW5kZXggY2JhODdhYy4uZjA2YjJmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL1JFQURNRS5tZAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvUkVBRE1FLm1kCkBAIC00Myw2ICs0Myw1MyBAQAogICAuY2FsbCgpOwogYGBgCiAKKyMjIFN1cHBvcnQgZm9yIFNTSCBhZ2VudHMKKworVGhlcmUgZXhpc3QgdHdvIElFVEYgZHJhZnQgUkZDcyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIGFuIFNTSCBhZ2VudDoKKworKiBhbiBvbGRlciBbU1NIMSBwcm90b2NvbF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtc2Vjc2gtYWdlbnQtMDIpIHRoYXQgY2FuIGRlYWwgb25seSB3aXRoIERTQSBhbmQgUlNBIGtleXMsIGFuZAorKiBhIG5ld2VyIFtTU0gyIHByb3RvY29sXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtbWlsbGVyLXNzaC1hZ2VudC0wNCkgKGZyb20gT3BlblNTSCkuCisKK0pHaXQgb25seSBzdXBwb3J0cyB0aGUgbmV3ZXIgT3BlblNTSCBwcm90b2NvbC4KKworQ29tbXVuaWNhdGlvbiB3aXRoIGFuIFNTSCBhZ2VudCBjYW4gb2NjdXIgb3ZlciBhbnkgdHJhbnNwb3J0IHByb3RvY29sLCBhbmQgZGlmZmVyZW50CitTU0ggYWdlbnRzIG1heSB1c2UgZGlmZmVyZW50IHRyYW5zcG9ydHMgZm9yIGxvY2FsIGNvbW11bmljYXRpb24uIEpHaXQgcHJvdmlkZXMgc29tZQordHJhbnNwb3J0cyB2aWEgdGhlIFtvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnRdKC4uL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9SRUFETUUubWQpCitmcmFnbWVudCwgd2hpY2ggYXJlIGRpc2NvdmVyZWQgZnJvbSBgb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlYCBhbHNvIHZpYSB0aGUgYFNlcnZpY2VMb2FkZXJgIG1lY2hhbmlzbTsKK3RoZSBTUEkgKHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlKSBpcyBgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5Db25uZWN0b3JGYWN0b3J5YC4KKworSWYgc3VjaCBhIGBDb25uZWN0b3JGYWN0b3J5YCBpbXBsZW1lbnRhdGlvbiBpcyBmb3VuZCwgSkdpdCBtYXkgdXNlIGFuIFNTSCBhZ2VudC4gSWYgbm9uZQoraXMgYXZhaWxhYmxlLCBKR2l0IGNhbm5vdCBjb21tdW5pY2F0ZSB3aXRoIGFuIFNTSCBhZ2VudCwgYW5kIHdpbGwgbm90IGF0dGVtcHQgdG8gdXNlIG9uZS4KKworIyMjIFNTSCBjb25maWd1cmF0aW9ucyBmb3IgU1NIIGFnZW50cworCitUaGVyZSBhcmUgc2V2ZXJhbCBTU0ggcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBgfi8uc3NoL2NvbmZpZ2AgZmlsZSB0byBjb25maWd1cmUKK3RoZSB1c2Ugb2YgYW4gU1NIIGFnZW50LiBGb3IgdGhlIGRldGFpbHMsIHNlZSB0aGUgW09wZW5CU0Qgc3NoLWNvbmZpZyBkb2N1bWVudGF0aW9uXShodHRwczovL21hbi5vcGVuYnNkLm9yZy9zc2hfY29uZmlnLjUpLgorCisqICoqQWRkS2V5c1RvQWdlbnQqKiBjYW4gYmUgc2V0IHRvIGBub2AsIGB5ZXNgLCBvciBgYXNrYC4gSWYgc2V0IHRvIGB5ZXNgLCBrZXlzIHdpbGwgYmUgYWRkZWQKKyAgdG8gdGhlIGFnZW50IGlmIHRoZXkncmUgbm90IHlldCBpbiB0aGUgYWdlbnQuIElmIHNldCB0byBgYXNrYCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZAorICBiZWZvcmUgZG9pbmcgc28sIGFuZCBjYW4gb3B0IG91dCBvZiBhZGRpbmcgdGhlIGtleS4gSkdpdCBhbHNvIHN1cHBvcnRzIHRoZSBhZGRpdGlvbmFsCisgIHNldHRpbmdzIGBjb25maXJtYCBhbmQga2V5IGxpZmV0aW1lcy4KKyogKipJZGVudGl0eUFnZW50KiogY2FuIGJlIHNldCB0byBjaG9vc2Ugd2hpY2ggU1NIIGFnZW50IHRvIHVzZSwgaWYgdGhlcmUgYXJlIHNldmVyYWwgcnVubmluZy4KKyAgSXQgY2FuIGFsc28gYmUgc2V0IHRvIGBub25lYCB0byBleHBsaWNpdGx5IHN3aXRjaCBvZmYgdXNpbmcgYW4gU1NIIGFnZW50IGF0IGFsbC4KKyogKipJZGVudGl0aWVzT25seSoqIGlmIHNldCB0byBgeWVzYCBhbmQgYW4gU1NIIGFnZW50IGlzIHVzZWQsIG9ubHkga2V5cyBmcm9tIHRoZSBhZ2VudCB0aGF0IGFyZQorICBhbHNvIGxpc3RlZCBpbiBhbiBgSWRlbnRpdHlGaWxlYCBwcm9wZXJ0eSB3aWxsIGJlIGNvbnNpZGVyZWQuIChJdCdsbCBhbHNvIHN3aXRjaCBvZmYgdHJ5aW5nCisgIGRlZmF1bHQga2V5IG5hbWVzLCBzdWNoIGFzIGB+Ly5zc2gvaWRfcnNhYCBvciBgfi8uc3NoL2lkX2VkMjU1MTlgOyBvbmx5IGtleXMgbGlzdGVkIGV4cGxpY2l0bHkKKyAgd2lsbCBiZSB1c2VkLikKKworIyMjIExpbWl0YXRpb25zCisKK0FzIG1lbnRpb25lZCBhYm92ZSBKR2l0IG9ubHkgaW1wbGVtZW50cyB0aGUgbmV3ZXIgT3BlblNTSCBwcm90b2NvbC4gT3BlblNTSCBmdWxseSBpbXBsZW1lbnRzIHRoaXMsCitidXQgc29tZSBvdGhlciBTU0ggYWdlbnRzIG9ubHkgb2ZmZXIgcGFydGlhbCBpbXBsZW1lbnRhdGlvbnMuIEluIHBhcnRpY3VsYXIgb24gV2luZG93cywgbmVpdGhlcgorUGFnZWFudCBub3IgV2luMzItT3BlblNTSCBpbXBsZW1lbnQgdGhlIGBjb25maXJtYCBvciBsaWZldGltZSBjb25zdHJhaW50cyBmb3IgYEFkZEtleXNUb0FnZW50YC4gV2l0aAorc3VjaCBTU0ggYWdlbnRzLCB0aGVzZSBzZXR0aW5ncyBzaG91bGQgbm90IGJlIHVzZWQgaW4gYH4vLnNzaC9jb25maWdgLiBHUEcncyBncGctYWdlbnQgY2FuIGJlIHJ1bgord2l0aCBvcHRpb24gYGVuYWJsZV9wdXR0eV9zdXBwb3J0YCBhbmQgY2FuIHRoZW4gYmUgdXNlZCBhcyBhIFBhZ2VhbnQgcmVwbGFjZW1lbnQuIGdwZy1hZ2VudCBhcHBlYXJzCit0byBzdXBwb3J0IHRoZXNlIGtleSBjb25zdHJhaW50cy4KKworT3BlblNTSCBkb2VzIG5vdCBpbXBsZW1lbnQgZWQ0NDgga2V5cywgYW5kIG5laXRoZXIgZG9lcyBBcGFjaGUgTUlOQSBzc2hkLCBhbmQgaGVuY2Ugc3VjaCBrZXlzIGFyZQorbm90IHN1cHBvcnRlZCBpbiBKR2l0IGlmIGl0cyBidWlsdC1pbiBTU0ggaW1wbGVtZW50YXRpb24gaXMgdXNlZC4gZWQ0NDggb3Igb3RoZXIgdW5zdXBwb3J0ZWQga2V5cworcHJvdmlkZWQgYnkgYW4gU1NIIGFnZW50IGFyZSBpZ25vcmVkLgorCiAjIyBVc2luZyBhIGRpZmZlcmVudCBTU0ggaW1wbGVtZW50YXRpb24KIAogVG8gdXNlIGEgZGlmZmVyZW50IFNTSCBpbXBsZW1lbnRhdGlvbjoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3BvbS54bWwKaW5kZXggMDI0ZGFlOC4uM2VhOGI2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3BvbS54bWwKQEAgLTE1NCw2ICsxNTQsOSBAQAogICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5lY2xpcHNlLmpnaXQuKjwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Ki5pbnRlcm5hbC4qPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KICAgICAgICAgICAgICAgICAgIDxhY2Nlc3NNb2RpZmllcj5wdWJsaWM8L2FjY2Vzc01vZGlmaWVyPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz4KQEAgLTIwNyw2ICsyMTAsOSBAQAogICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5lY2xpcHNlLmpnaXQuKjwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Ki5pbnRlcm5hbC4qPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KICAgICAgICAgICAgICAgICAgIDxhY2Nlc3NNb2RpZmllcj5wdWJsaWM8L2FjY2Vzc01vZGlmaWVyPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbk1vZGlmaWNhdGlvbnM+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uQmluYXJ5SW5jb21wYXRpYmxlTW9kaWZpY2F0aW9ucz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LnByb3BlcnRpZXMKaW5kZXggMmJiYTczNi4uYzY3NjIyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LnByb3BlcnRpZXMKQEAgLTEsNSArMSwyMyBAQAogYXV0aGVudGljYXRpb25DYW5jZWxlZD1TU0ggYXV0aGVudGljYXRpb24gY2FuY2VsZWQ6IG5vIHBhc3N3b3JkIGdpdmVuCiBhdXRoZW50aWNhdGlvbk9uQ2xvc2VkU2Vzc2lvbj1BdXRoZW50aWNhdGlvbiBjYW5jZWxlZDogc2Vzc2lvbiBpcyBhbHJlYWR5IGNsb3Npbmcgb3IgY2xvc2VkCithdXRoR3NzQXBpQXR0ZW1wdD17MH06IHRyeWluZyBtZWNoYW5pc20gT0lEIHsxfQorYXV0aEdzc0FwaUV4aGF1c3RlZD17MH06IG5vIG1vcmUgbWVjaGFuaXNtcyB0byB0cnkKK2F1dGhHc3NBcGlGYWlsdXJlPXswfTogc2VydmVyIHJlZnVzZWQgYXV0aGVudGljYXRpb247IG1lY2hhbmlzbSB7MX0KK2F1dGhHc3NBcGlOb3RUcmllZD17MH06IG5vdCB0cmllZAorYXV0aEdzc0FwaVBhcnRpYWxTdWNjZXNzPXswfTogcGFydGlhbCBzdWNjZXNzIHdpdGggbWVjaGFuaXNtIE9JRCB7MX0sIGNvbnRpbnVlIHdpdGggYXV0aGVudGljYXRpb24gbWV0aG9kcyB7Mn0KK2F1dGhQYXNzd29yZEF0dGVtcHQ9ezB9OiBhdHRlbXB0IHsxfQorYXV0aFBhc3N3b3JkQ2hhbmdlQXR0ZW1wdD17MH06IGF0dGVtcHQgezF9IHdpdGggcGFzc3dvcmQgY2hhbmdlCithdXRoUGFzc3dvcmRFeGhhdXN0ZWQ9ezB9OiBubyBtb3JlIGF0dGVtcHRzCithdXRoUGFzc3dvcmRGYWlsdXJlPXswfTogc2VydmVyIHJlZnVzZWQgKHdyb25nIHBhc3N3b3JkKQorYXV0aFBhc3N3b3JkTm90VHJpZWQ9ezB9OiBub3QgdHJpZWQKK2F1dGhQYXNzd29yZFBhcnRpYWxTdWNjZXNzPXswfTogcGFydGlhbCBzdWNjZXNzLCBjb250aW51ZSB3aXRoIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgezF9CithdXRoUHVia2V5QXR0ZW1wdD17MH06IHRyeWluZyB7MX0ga2V5IHsyfSB3aXRoIHNpZ25hdHVyZSB0eXBlIHszfQorYXV0aFB1YmtleUF0dGVtcHRBZ2VudD17MH06IHRyeWluZyB7MX0ga2V5IHsyfSBmcm9tIFNTSCBhZ2VudCB3aXRoIHNpZ25hdHVyZSB0eXBlIHszfQorYXV0aFB1YmtleUV4aGF1c3RlZD17MH06IG5vIG1vcmUga2V5cyB0byB0cnkKK2F1dGhQdWJrZXlGYWlsdXJlPXswfTogc2VydmVyIHJlZnVzZWQgezF9IGtleSB7Mn0KK2F1dGhQdWJrZXlOb0tleXM9ezB9OiBubyBrZXlzIHRvIHRyeQorYXV0aFB1YmtleVBhcnRpYWxTdWNjZXNzPXswfTogcGFydGlhbCBzdWNjZXNzIGZvciB7MX0ga2V5IHsyfSwgY29udGludWUgd2l0aCBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHszfQorY2Fubm90UmVhZFB1YmxpY0tleT1DYW5ub3QgcmVhZCBwdWJsaWMga2V5IGZyb20gZmlsZSB7MH0KIGNsb3NlTGlzdGVuZXJGYWlsZWQ9U3NoIHNlc3Npb24gY2xvc2UgbGlzdGVuZXIgZmFpbGVkCiBjb25maWdJbnZhbGlkUGF0aD1JbnZhbGlkIHBhdGggaW4gc3NoIGNvbmZpZyBrZXkgezB9OiB7MX0KIGNvbmZpZ0ludmFsaWRQYXR0ZXJuPUludmFsaWQgcGF0dGVybiBpbiBzc2ggY29uZmlnIGtleSB7MH06IHsxfQpAQCAtNzcsNiArOTUsOCBAQAogcHJveHlTb2Nrc1VuZXhwZWN0ZWRNZXNzYWdlPVVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCBmcm9tIFNPQ0tTNSBwcm94eSB7MH07IGNsaWVudCBzdGF0ZSB7MX06IHsyfQogcHJveHlTb2Nrc1VuZXhwZWN0ZWRWZXJzaW9uPUV4cGVjdGVkIFNPQ0tTIHZlcnNpb24gNSwgZ290IHswfQogcHJveHlTb2Nrc1VzZXJuYW1lVG9vTG9uZz1Vc2VyIG5hbWUgZm9yIHByb3h5IHswfSBtdXN0IGJlIGF0IG1vc3QgMjU1IGJ5dGVzIGxvbmcsIGlzIHsxfSBieXRlczogezJ9CitwdWJrZXlBdXRoQWRkS2V5VG9BZ2VudEVycm9yPUNvdWxkIG5vdCBhZGQgezB9IGtleSB3aXRoIGZpbmdlcnByaW50IHsxfSB0byB0aGUgU1NIIGFnZW50CitwdWJrZXlBdXRoQWRkS2V5VG9BZ2VudFF1ZXN0aW9uPUFkZCB0aGUgezB9IGtleSB3aXRoIGZpbmdlcnByaW50IHsxfSB0byB0aGUgU1NIIGFnZW50PwogcHVia2V5QXV0aFdyb25nQ29tbWFuZD1QdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIHJlY2VpdmVkIHVua25vd24gU1NIIGNvbW1hbmQgezB9IGZyb20gezF9ICh7Mn0pCiBwdWJrZXlBdXRoV3JvbmdLZXk9UHVibGljIGtleSBhdXRoZW50aWNhdGlvbiByZWNlaXZlZCB3cm9uZyBrZXk7IHNlbnQgezB9LCBnb3QgYmFjayB7MX0gZnJvbSB7Mn0gKHszfSkKIHB1YmtleUF1dGhXcm9uZ1NpZ25hdHVyZUFsZ29yaXRobT1QdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RlZCBzaWduYXR1cmUgdHlwZSB7MH0gYnV0IGdvdCBiYWNrIHsxfSBmcm9tIHsyfSAoezN9KQpAQCAtODUsOSArMTA1LDEzIEBACiBzZXJ2ZXJJZFdpdGhOdWw9U2VydmVyIGlkZW50aWZpY2F0aW9uIGNvbnRhaW5zIGEgTlVMIGNoYXJhY3RlcjogezB9CiBzZXNzaW9uQ2xvc2VGYWlsZWQ9Q2xvc2luZyB0aGUgc2Vzc2lvbiBmYWlsZWQKIHNlc3Npb25XaXRob3V0VXNlcm5hbWU9U1NIIHNlc3Npb24gY3JlYXRlZCB3aXRob3V0IHVzZXIgbmFtZTsgY2Fubm90IGF1dGhlbnRpY2F0ZQorc3NoQWdlbnRFZERTQUZvcm1hdEVycm9yPUNhbm5vdCBhZGQgZWQyNTUxOSBrZXkgdG8gdGhlIFNTSCBhZ2VudCBiZWNhdXNlIGl0IGlzIGVuY29kZWQgYXMgezB9IGluc3RlYWQgb2YgUEtDUyM4Citzc2hBZ2VudFBheWxvYWRMZW5ndGhFcnJvcj1FeHBlY3RlZCB7MCxjaG9pY2UsMCNubyBieXRlc3wxI29uZSBieXRlfDE8ezB9IGJ5dGVzfSBidXQgZ290IHsxfQogc3NoQWdlbnRSZXBseUxlbmd0aEVycm9yPUludmFsaWQgU1NIIGFnZW50IHJlcGx5IG1lc3NhZ2UgbGVuZ3RoIHswfSBhZnRlciBjb21tYW5kIHsxfQogc3NoQWdlbnRSZXBseVVuZXhwZWN0ZWQ9VW5leHBlY3RlZCByZXBseSBmcm9tIHNzaC1hZ2VudDogezB9CiBzc2hBZ2VudFNob3J0UmVhZEJ1ZmZlcj1TaG9ydCByZWFkIGZyb20gU1NIIGFnZW50Citzc2hBZ2VudFVua25vd25LZXk9U1NIIGFnZW50IGRlbGl2ZXJlZCBhIGtleSB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkCitzc2hBZ2VudFdyb25nS2V5TGVuZ3RoPVNTSCBhZ2VudCBkZWxpdmVyZWQgaWxsb2dpY2FsIGtleSBsZW5ndGggezB9IGF0IG9mZnNldCB7MX0gaW4gYnVmZmVyIG9mIGxlbmd0aCB7Mn0KIHNzaEFnZW50V3JvbmdOdW1iZXJPZktleXM9SW52YWxpZCBudW1iZXIgb2YgU1NIIGFnZW50IGtleXM6IHswfQogc3NoQ2xvc2luZ0Rvd249QXBhY2hlIE1JTkEgc3NoZCBzZXNzaW9uIGZhY3RvcnkgaXMgY2xvc2luZyBkb3duOyBjYW5ub3QgY3JlYXRlIG5ldyBzc2ggc2Vzc2lvbnMgb24gdGhpcyBmYWN0b3J5CiBzc2hDb21tYW5kVGltZW91dD17MH0gdGltZWQgb3V0IGFmdGVyIHsxfSBzZWNvbmRzIHdoaWxlIG9wZW5pbmcgdGhlIGNoYW5uZWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9BdXRoZW50aWNhdGlvbkxvZ2dlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0F1dGhlbnRpY2F0aW9uTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkNzliMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9BdXRoZW50aWNhdGlvbkxvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuQ2FjaGluZ0tleVBhaXJQcm92aWRlci5nZXRLZXlJZDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wYXNzd29yZC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uUmVwb3J0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnBhc3N3b3JkLlVzZXJBdXRoUGFzc3dvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnB1YmtleS5QdWJsaWNLZXlBdXRoZW50aWNhdGlvblJlcG9ydGVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wdWJrZXkuVXNlckF1dGhQdWJsaWNLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5zZXNzaW9uLkNsaWVudFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5LZXlVdGlsczsKKworLyoqCisgKiBQcm92aWRlcyBhIGxvZyBvZiBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyBmb3IgYSB7QGxpbmsgQ2xpZW50U2Vzc2lvbn0uCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbkxvZ2dlciB7CisKKwlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJLy8gV2UncmUgaW50ZXJlc3RlZCBpbiB0aGlzIGxvZyBvbmx5IGluIHRoZSBmYWlsdXJlIGNhc2UsIHNvIHdlIGRvbid0IG5lZWQKKwkvLyB0byBsb2cgYXV0aGVudGljYXRpb24gc3VjY2Vzcy4KKworCXByaXZhdGUgZmluYWwgUHVibGljS2V5QXV0aGVudGljYXRpb25SZXBvcnRlciBwdWJrZXlMb2dnZXIgPSBuZXcgUHVibGljS2V5QXV0aGVudGljYXRpb25SZXBvcnRlcigpIHsKKworCQlwcml2YXRlIGJvb2xlYW4gaGFzQXR0ZW1wdHM7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNpZ25hbEF1dGhlbnRpY2F0aW9uQXR0ZW1wdChDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQkJU3RyaW5nIHNlcnZpY2UsIEtleVBhaXIgaWRlbnRpdHksIFN0cmluZyBzaWduYXR1cmUpCisJCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQloYXNBdHRlbXB0cyA9IHRydWU7CisJCQlTdHJpbmcgbWVzc2FnZTsKKwkJCWlmIChpZGVudGl0eS5nZXRQcml2YXRlKCkgPT0gbnVsbCkgeworCQkJCS8vIFNTSCBhZ2VudCBrZXkKKwkJCQltZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlTc2hkVGV4dC5nZXQoKS5hdXRoUHVia2V5QXR0ZW1wdEFnZW50LAorCQkJCQkJVXNlckF1dGhQdWJsaWNLZXkuTkFNRSwgS2V5VXRpbHMuZ2V0S2V5VHlwZShpZGVudGl0eSksCisJCQkJCQlnZXRLZXlJZChzZXNzaW9uLCBpZGVudGl0eSksIHNpZ25hdHVyZSk7CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCVNzaGRUZXh0LmdldCgpLmF1dGhQdWJrZXlBdHRlbXB0LAorCQkJCQkJVXNlckF1dGhQdWJsaWNLZXkuTkFNRSwgS2V5VXRpbHMuZ2V0S2V5VHlwZShpZGVudGl0eSksCisJCQkJCQlnZXRLZXlJZChzZXNzaW9uLCBpZGVudGl0eSksIHNpZ25hdHVyZSk7CisJCQl9CisJCQltZXNzYWdlcy5hZGQobWVzc2FnZSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc2lnbmFsQXV0aGVudGljYXRpb25FeGhhdXN0ZWQoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLAorCQkJCVN0cmluZyBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCVN0cmluZyBtZXNzYWdlOworCQkJaWYgKGhhc0F0dGVtcHRzKSB7CisJCQkJbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJU3NoZFRleHQuZ2V0KCkuYXV0aFB1YmtleUV4aGF1c3RlZCwKKwkJCQkJCVVzZXJBdXRoUHVibGljS2V5Lk5BTUUpOworCQkJfSBlbHNlIHsKKwkJCQltZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoU3NoZFRleHQuZ2V0KCkuYXV0aFB1YmtleU5vS2V5cywKKwkJCQkJCVVzZXJBdXRoUHVibGljS2V5Lk5BTUUpOworCQkJfQorCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOworCQkJaGFzQXR0ZW1wdHMgPSBmYWxzZTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzaWduYWxBdXRoZW50aWNhdGlvbkZhaWx1cmUoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLAorCQkJCVN0cmluZyBzZXJ2aWNlLCBLZXlQYWlyIGlkZW50aXR5LCBib29sZWFuIHBhcnRpYWwsCisJCQkJTGlzdDxTdHJpbmc+IHNlcnZlck1ldGhvZHMpIHRocm93cyBFeGNlcHRpb24geworCQkJU3RyaW5nIG1lc3NhZ2U7CisJCQlpZiAocGFydGlhbCkgeworCQkJCW1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCVNzaGRUZXh0LmdldCgpLmF1dGhQdWJrZXlQYXJ0aWFsU3VjY2VzcywKKwkJCQkJCVVzZXJBdXRoUHVibGljS2V5Lk5BTUUsIEtleVV0aWxzLmdldEtleVR5cGUoaWRlbnRpdHkpLAorCQkJCQkJZ2V0S2V5SWQoc2Vzc2lvbiwgaWRlbnRpdHkpLCBzZXJ2ZXJNZXRob2RzKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJU3NoZFRleHQuZ2V0KCkuYXV0aFB1YmtleUZhaWx1cmUsCisJCQkJCQlVc2VyQXV0aFB1YmxpY0tleS5OQU1FLCBLZXlVdGlscy5nZXRLZXlUeXBlKGlkZW50aXR5KSwKKwkJCQkJCWdldEtleUlkKHNlc3Npb24sIGlkZW50aXR5KSk7CisJCQl9CisJCQltZXNzYWdlcy5hZGQobWVzc2FnZSk7CisJCX0KKwl9OworCisJcHJpdmF0ZSBmaW5hbCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uUmVwb3J0ZXIgcGFzc3dvcmRMb2dnZXIgPSBuZXcgUGFzc3dvcmRBdXRoZW50aWNhdGlvblJlcG9ydGVyKCkgeworCisJCXByaXZhdGUgaW50IGF0dGVtcHRzOworCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzaWduYWxBdXRoZW50aWNhdGlvbkF0dGVtcHQoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLAorCQkJCVN0cmluZyBzZXJ2aWNlLCBTdHJpbmcgb2xkUGFzc3dvcmQsIGJvb2xlYW4gbW9kaWZpZWQsCisJCQkJU3RyaW5nIG5ld1Bhc3N3b3JkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCWF0dGVtcHRzKys7CisJCQlTdHJpbmcgbWVzc2FnZTsKKwkJCWlmIChtb2RpZmllZCkgeworCQkJCW1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCVNzaGRUZXh0LmdldCgpLmF1dGhQYXNzd29yZENoYW5nZUF0dGVtcHQsCisJCQkJCQlVc2VyQXV0aFBhc3N3b3JkLk5BTUUsIEludGVnZXIudmFsdWVPZihhdHRlbXB0cykpOworCQkJfSBlbHNlIHsKKwkJCQltZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlTc2hkVGV4dC5nZXQoKS5hdXRoUGFzc3dvcmRBdHRlbXB0LAorCQkJCQkJVXNlckF1dGhQYXNzd29yZC5OQU1FLCBJbnRlZ2VyLnZhbHVlT2YoYXR0ZW1wdHMpKTsKKwkJCX0KKwkJCW1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzaWduYWxBdXRoZW50aWNhdGlvbkV4aGF1c3RlZChDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQkJU3RyaW5nIHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24geworCQkJU3RyaW5nIG1lc3NhZ2U7CisJCQlpZiAoYXR0ZW1wdHMgPiAwKSB7CisJCQkJbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJU3NoZFRleHQuZ2V0KCkuYXV0aFBhc3N3b3JkRXhoYXVzdGVkLAorCQkJCQkJVXNlckF1dGhQYXNzd29yZC5OQU1FKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJU3NoZFRleHQuZ2V0KCkuYXV0aFBhc3N3b3JkTm90VHJpZWQsCisJCQkJCQlVc2VyQXV0aFBhc3N3b3JkLk5BTUUpOworCQkJfQorCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOworCQkJYXR0ZW1wdHMgPSAwOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNpZ25hbEF1dGhlbnRpY2F0aW9uRmFpbHVyZShDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQkJU3RyaW5nIHNlcnZpY2UsIFN0cmluZyBwYXNzd29yZCwgYm9vbGVhbiBwYXJ0aWFsLAorCQkJCUxpc3Q8U3RyaW5nPiBzZXJ2ZXJNZXRob2RzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCVN0cmluZyBtZXNzYWdlOworCQkJaWYgKHBhcnRpYWwpIHsKKwkJCQltZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlTc2hkVGV4dC5nZXQoKS5hdXRoUGFzc3dvcmRQYXJ0aWFsU3VjY2VzcywKKwkJCQkJCVVzZXJBdXRoUGFzc3dvcmQuTkFNRSwgc2VydmVyTWV0aG9kcyk7CisJCQl9IGVsc2UgeworCQkJCW1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCVNzaGRUZXh0LmdldCgpLmF1dGhQYXNzd29yZEZhaWx1cmUsCisJCQkJCQlVc2VyQXV0aFBhc3N3b3JkLk5BTUUpOworCQkJfQorCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOworCQl9CisJfTsKKworCXByaXZhdGUgZmluYWwgR3NzQXBpV2l0aE1pY0F1dGhlbnRpY2F0aW9uUmVwb3J0ZXIgZ3NzTG9nZ2VyID0gbmV3IEdzc0FwaVdpdGhNaWNBdXRoZW50aWNhdGlvblJlcG9ydGVyKCkgeworCisJCXByaXZhdGUgYm9vbGVhbiBoYXNBdHRlbXB0czsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc2lnbmFsQXV0aGVudGljYXRpb25BdHRlbXB0KENsaWVudFNlc3Npb24gc2Vzc2lvbiwKKwkJCQlTdHJpbmcgc2VydmljZSwgU3RyaW5nIG1lY2hhbmlzbSkgeworCQkJaGFzQXR0ZW1wdHMgPSB0cnVlOworCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJU3NoZFRleHQuZ2V0KCkuYXV0aEdzc0FwaUF0dGVtcHQsCisJCQkJCUdzc0FwaVdpdGhNaWNBdXRoRmFjdG9yeS5OQU1FLCBtZWNoYW5pc20pOworCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNpZ25hbEF1dGhlbnRpY2F0aW9uRXhoYXVzdGVkKENsaWVudFNlc3Npb24gc2Vzc2lvbiwKKwkJCQlTdHJpbmcgc2VydmljZSkgeworCQkJU3RyaW5nIG1lc3NhZ2U7CisJCQlpZiAoaGFzQXR0ZW1wdHMpIHsKKwkJCQltZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlTc2hkVGV4dC5nZXQoKS5hdXRoR3NzQXBpRXhoYXVzdGVkLAorCQkJCQkJR3NzQXBpV2l0aE1pY0F1dGhGYWN0b3J5Lk5BTUUpOworCQkJfSBlbHNlIHsKKwkJCQltZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlTc2hkVGV4dC5nZXQoKS5hdXRoR3NzQXBpTm90VHJpZWQsCisJCQkJCQlHc3NBcGlXaXRoTWljQXV0aEZhY3RvcnkuTkFNRSk7CisJCQl9CisJCQltZXNzYWdlcy5hZGQobWVzc2FnZSk7CisJCQloYXNBdHRlbXB0cyA9IGZhbHNlOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHNpZ25hbEF1dGhlbnRpY2F0aW9uRmFpbHVyZShDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQkJU3RyaW5nIHNlcnZpY2UsIFN0cmluZyBtZWNoYW5pc20sIGJvb2xlYW4gcGFydGlhbCwKKwkJCQlMaXN0PFN0cmluZz4gc2VydmVyTWV0aG9kcykgeworCQkJU3RyaW5nIG1lc3NhZ2U7CisJCQlpZiAocGFydGlhbCkgeworCQkJCW1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCVNzaGRUZXh0LmdldCgpLmF1dGhHc3NBcGlQYXJ0aWFsU3VjY2VzcywKKwkJCQkJCUdzc0FwaVdpdGhNaWNBdXRoRmFjdG9yeS5OQU1FLCBtZWNoYW5pc20sCisJCQkJCQlzZXJ2ZXJNZXRob2RzKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJU3NoZFRleHQuZ2V0KCkuYXV0aEdzc0FwaUZhaWx1cmUsCisJCQkJCQlHc3NBcGlXaXRoTWljQXV0aEZhY3RvcnkuTkFNRSwgbWVjaGFuaXNtKTsKKwkJCX0KKwkJCW1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKKwkJfQorCX07CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBBdXRoZW50aWNhdGlvbkxvZ2dlcn0gYW5kIGNvbmZpZ3VyZXMgdGhlCisJICoge0BsaW5rIENsaWVudFNlc3Npb259IHRvIHJlcG9ydCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB0aHJvdWdoIHRoaXMKKwkgKiBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSBzZXNzaW9uCisJICogICAgICAgICAgICB0byBjb25maWd1cmUKKwkgKi8KKwlwdWJsaWMgQXV0aGVudGljYXRpb25Mb2dnZXIoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uKSB7CisJCXNlc3Npb24uc2V0UHVibGljS2V5QXV0aGVudGljYXRpb25SZXBvcnRlcihwdWJrZXlMb2dnZXIpOworCQlzZXNzaW9uLnNldFBhc3N3b3JkQXV0aGVudGljYXRpb25SZXBvcnRlcihwYXNzd29yZExvZ2dlcik7CisJCXNlc3Npb24uc2V0QXR0cmlidXRlKAorCQkJCUdzc0FwaVdpdGhNaWNBdXRoZW50aWNhdGlvblJlcG9ydGVyLkdTU19BVVRIRU5USUNBVElPTl9SRVBPUlRFUiwKKwkJCQlnc3NMb2dnZXIpOworCQkvLyBUT0RPOiBrZXlib2FyZC1pbnRlcmFjdGl2ZT8gc3NoZCAyLjguMCBoYXMgbm8gY2FsbGJhY2sKKwkJLy8gaW50ZXJmYWNlIGZvciBpdC4KKwl9CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIGxvZyBtZXNzYWdlcyBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzLgorCSAqCisJICogQHJldHVybiB0aGUgbWVzc2FnZXMgYXMgYW4gdW5tb2RpZmlhYmxlIGxpc3QKKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldExvZygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobWVzc2FnZXMpOworCX0KKworCS8qKgorCSAqIERyb3BzIGFsbCBwcmV2aW91c2x5IHJlY29yZGVkIGxvZyBtZXNzYWdlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjbGVhcigpIHsKKwkJbWVzc2FnZXMuY2xlYXIoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvQ2FjaGluZ0tleVBhaXJQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0NhY2hpbmdLZXlQYWlyUHJvdmlkZXIuamF2YQppbmRleCA3OWIzNjM3Li5jYmQ2YTY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvQ2FjaGluZ0tleVBhaXJQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9DYWNoaW5nS2V5UGFpclByb3ZpZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE4LCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSw2ICsxMSw3IEBACiAKIGltcG9ydCBzdGF0aWMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0OwogCitpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwpAQCAtMTksMTggKzIwLDI0IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5EZXN0cm95RmFpbGVkRXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5BdHRyaWJ1dGVSZXBvc2l0b3J5LkF0dHJpYnV0ZUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb24uQ2xpZW50U2Vzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLk5hbWVkUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5GaWxlUGFzc3dvcmRQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLktleVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXIuRmlsZUtleVBhaXJQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb24uU2Vzc2lvbkNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLnJlc291cmNlLklvUmVzb3VyY2U7CkBAIC00Myw2ICs1MCwxNCBAQAogcHVibGljIGNsYXNzIENhY2hpbmdLZXlQYWlyUHJvdmlkZXIgZXh0ZW5kcyBGaWxlS2V5UGFpclByb3ZpZGVyCiAJCWltcGxlbWVudHMgSXRlcmFibGU8S2V5UGFpcj4gewogCisJLyoqCisJICogQW4gYXR0cmlidXRlIHNldCBvbiB0aGUge0BsaW5rIFNlc3Npb25Db250ZXh0fSByZWNvcmRpbmcgbG9hZGVkIGtleXMgYnkKKwkgKiBmaW5nZXJwcmludC4gVGhpcyBlbmFibGVzIHVzIHRvIHByb3ZpZGUgbmljZXIgb3V0cHV0IGJ5IHNob3dpbmcga2V5CisJICogcGF0aHMsIGlmIHBvc3NpYmxlLiBVc2VycyBjYW4gaWRlbnRpZnkga2V5IGlkZW50aXRpZXMgdXNlZCBlYXNpZXIgYnkKKwkgKiBmaWxlbmFtZSB0aGFuIGJ5IGZpbmdlcnByaW50LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlS2V5PE1hcDxTdHJpbmcsIFBhdGg+PiBLRVlfUEFUSFNfQllfRklOR0VSUFJJTlQgPSBuZXcgQXR0cmlidXRlS2V5PD4oKTsKKwogCXByaXZhdGUgZmluYWwgS2V5Q2FjaGUgY2FjaGU7CiAKIAkvKioKQEAgLTc4LDYgKzkzLDMzIEBAIHB1YmxpYyBJdGVyYWJsZTxLZXlQYWlyPiBsb2FkS2V5cyhTZXNzaW9uQ29udGV4dCBzZXNzaW9uKSB7CiAJCXJldHVybiAoKSAtPiBpdGVyYXRvcihzZXNzaW9uKTsKIAl9CiAKKwlzdGF0aWMgU3RyaW5nIGdldEtleUlkKENsaWVudFNlc3Npb24gc2Vzc2lvbiwgS2V5UGFpciBpZGVudGl0eSkgeworCQlTdHJpbmcgZmluZ2VycHJpbnQgPSBLZXlVdGlscy5nZXRGaW5nZXJQcmludChpZGVudGl0eS5nZXRQdWJsaWMoKSk7CisJCU1hcDxTdHJpbmcsIFBhdGg+IHJlZ2lzdGVyZWQgPSBzZXNzaW9uCisJCQkJLmdldEF0dHJpYnV0ZShLRVlfUEFUSFNfQllfRklOR0VSUFJJTlQpOworCQlpZiAocmVnaXN0ZXJlZCAhPSBudWxsKSB7CisJCQlQYXRoIHBhdGggPSByZWdpc3RlcmVkLmdldChmaW5nZXJwcmludCk7CisJCQlpZiAocGF0aCAhPSBudWxsKSB7CisJCQkJUGF0aCBob21lID0gc2Vzc2lvbgorCQkJCQkJLnJlc29sdmVBdHRyaWJ1dGUoSkdpdFNzaENsaWVudC5IT01FX0RJUkVDVE9SWSk7CisJCQkJaWYgKGhvbWUgIT0gbnVsbCAmJiBwYXRoLnN0YXJ0c1dpdGgoaG9tZSkpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCXBhdGggPSBob21lLnJlbGF0aXZpemUocGF0aCk7CisJCQkJCQlTdHJpbmcgcGF0aFN0cmluZyA9IHBhdGgudG9TdHJpbmcoKTsKKwkJCQkJCWlmICghcGF0aFN0cmluZy5pc0VtcHR5KCkpIHsKKwkJCQkJCQlyZXR1cm4gIn4iICsgRmlsZS5zZXBhcmF0b3IgKyBwYXRoU3RyaW5nOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBDYW5ub3QgYmUgcmVsYXRpdml6ZWQuIElnbm9yZSwgYW5kIHdvcmsgd2l0aCB0aGUKKwkJCQkJCS8vIG9yaWdpbmFsIHBhdGgKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gcGF0aC50b1N0cmluZygpOworCQkJfQorCQl9CisJCXJldHVybiBmaW5nZXJwcmludDsKKwl9CisKIAlwcml2YXRlIEtleVBhaXIgbG9hZEtleShTZXNzaW9uQ29udGV4dCBzZXNzaW9uLCBQYXRoIHBhdGgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiB7CiAJCWlmICghRmlsZXMuZXhpc3RzKHBhdGgpKSB7CkBAIC0xMjMsMTMgKzE2NSwyMyBAQCBwcml2YXRlIEtleVBhaXIgbG9hZEtleShTZXNzaW9uQ29udGV4dCBzZXNzaW9uLCBOYW1lZFJlc291cmNlIHJlc291cmNlLAogCQkJCQkJU3NoZFRleHQuZ2V0KCkuaWRlbnRpdHlGaWxlVW5zdXBwb3J0ZWRGb3JtYXQsIHBhdGgpKTsKIAkJCX0KIAkJCUtleVBhaXIgcmVzdWx0ID0ga2V5cy5uZXh0KCk7CisJCQlQdWJsaWNLZXkgcGsgPSByZXN1bHQuZ2V0UHVibGljKCk7CisJCQlpZiAocGsgIT0gbnVsbCkgeworCQkJCU1hcDxTdHJpbmcsIFBhdGg+IHJlZ2lzdGVyZWQgPSBzZXNzaW9uCisJCQkJCQkuZ2V0QXR0cmlidXRlKEtFWV9QQVRIU19CWV9GSU5HRVJQUklOVCk7CisJCQkJaWYgKHJlZ2lzdGVyZWQgPT0gbnVsbCkgeworCQkJCQlyZWdpc3RlcmVkID0gbmV3IEhhc2hNYXA8PigpOworCQkJCQlzZXNzaW9uLnNldEF0dHJpYnV0ZShLRVlfUEFUSFNfQllfRklOR0VSUFJJTlQsIHJlZ2lzdGVyZWQpOworCQkJCX0KKwkJCQlyZWdpc3RlcmVkLnB1dChLZXlVdGlscy5nZXRGaW5nZXJQcmludChwayksIHBhdGgpOworCQkJfQogCQkJaWYgKGtleXMuaGFzTmV4dCgpKSB7CiAJCQkJbG9nLndhcm4oZm9ybWF0KFNzaGRUZXh0LmdldCgpLmlkZW50aXR5RmlsZU11bHRpcGxlS2V5cywgcGF0aCkpOwogCQkJCWtleXMuZm9yRWFjaFJlbWFpbmluZyhrIC0+IHsKLQkJCQkJUHJpdmF0ZUtleSBwayA9IGsuZ2V0UHJpdmF0ZSgpOwotCQkJCQlpZiAocGsgIT0gbnVsbCkgeworCQkJCQlQcml2YXRlS2V5IHByaXYgPSBrLmdldFByaXZhdGUoKTsKKwkJCQkJaWYgKHByaXYgIT0gbnVsbCkgewogCQkJCQkJdHJ5IHsKLQkJCQkJCQlway5kZXN0cm95KCk7CisJCQkJCQkJcHJpdi5kZXN0cm95KCk7CiAJCQkJCQl9IGNhdGNoIChEZXN0cm95RmFpbGVkRXhjZXB0aW9uIGUpIHsKIAkJCQkJCQkvLyBJZ25vcmUKIAkJCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Hc3NBcGlXaXRoTWljQXV0aGVudGljYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Hc3NBcGlXaXRoTWljQXV0aGVudGljYXRpb24uamF2YQppbmRleCBjM2NhYzBjLi5kZjAxZGIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvR3NzQXBpV2l0aE1pY0F1dGhlbnRpY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0dzc0FwaVdpdGhNaWNBdXRoZW50aWNhdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMiBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5BYnN0cmFjdFVzZXJBdXRoOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbi5DbGllbnRTZXNzaW9uOwpAQCAtNzEsNyArNzIsMTAgQEAgcHJvdGVjdGVkIGJvb2xlYW4gc2VuZEF1dGhEYXRhUmVxdWVzdChDbGllbnRTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzZXJ2aWNlKQogCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CiAJCQljbG9zZShmYWxzZSk7CiAJCX0KKwkJR3NzQXBpV2l0aE1pY0F1dGhlbnRpY2F0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgKKwkJCQlHc3NBcGlXaXRoTWljQXV0aGVudGljYXRpb25SZXBvcnRlci5HU1NfQVVUSEVOVElDQVRJT05fUkVQT1JURVIpOwogCQlpZiAoIW5leHRNZWNoYW5pc20uaGFzTmV4dCgpKSB7CisJCQlyZXBvcnRlci5zaWduYWxBdXRoZW50aWNhdGlvbkV4aGF1c3RlZChzZXNzaW9uLCBzZXJ2aWNlKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlzdGF0ZSA9IFByb3RvY29sU3RhdGUuU1RBUlRFRDsKQEAgLTc5LDYgKzgzLDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gc2VuZEF1dGhEYXRhUmVxdWVzdChDbGllbnRTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzZXJ2aWNlKQogCQkvLyBSRkMgNDQ2MiBzdGF0ZXMgdGhhdCBTUE5FR08gbXVzdCBub3QgYmUgdXNlZCB3aXRoIHNzaAogCQl3aGlsZSAoR3NzQXBpTWVjaGFuaXNtcy5TUE5FR08uZXF1YWxzKGN1cnJlbnRNZWNoYW5pc20pKSB7CiAJCQlpZiAoIW5leHRNZWNoYW5pc20uaGFzTmV4dCgpKSB7CisJCQkJcmVwb3J0ZXIuc2lnbmFsQXV0aGVudGljYXRpb25FeGhhdXN0ZWQoc2Vzc2lvbiwgc2VydmljZSk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJY3VycmVudE1lY2hhbmlzbSA9IG5leHRNZWNoYW5pc20ubmV4dCgpOwpAQCAtMTAyLDYgKzEwNywxMCBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBzZW5kQXV0aERhdGFSZXF1ZXN0KENsaWVudFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHNlcnZpY2UpCiAJCQlzdGF0ZSA9IFByb3RvY29sU3RhdGUuRkFJTEVEOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CisJCWlmIChyZXBvcnRlciAhPSBudWxsKSB7CisJCQlyZXBvcnRlci5zaWduYWxBdXRoZW50aWNhdGlvbkF0dGVtcHQoc2Vzc2lvbiwgc2VydmljZSwKKwkJCQkJY3VycmVudE1lY2hhbmlzbS50b1N0cmluZygpKTsKKwkJfQogCQlCdWZmZXIgYnVmZmVyID0gc2Vzc2lvbgogCQkJCS5jcmVhdGVCdWZmZXIoU3NoQ29uc3RhbnRzLlNTSF9NU0dfVVNFUkFVVEhfUkVRVUVTVCk7CiAJCWJ1ZmZlci5wdXRTdHJpbmcoc2Vzc2lvbi5nZXRVc2VybmFtZSgpKTsKQEAgLTI0Niw0ICsyNTUsMjYgQEAgcHJpdmF0ZSBib29sZWFuIHVuZXhwZWN0ZWRNZXNzYWdlKGludCBjb21tYW5kKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzaWduYWxBdXRoTWV0aG9kU3VjY2VzcyhDbGllbnRTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzZXJ2aWNlLAorCQkJQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUdzc0FwaVdpdGhNaWNBdXRoZW50aWNhdGlvblJlcG9ydGVyIHJlcG9ydGVyID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoCisJCQkJR3NzQXBpV2l0aE1pY0F1dGhlbnRpY2F0aW9uUmVwb3J0ZXIuR1NTX0FVVEhFTlRJQ0FUSU9OX1JFUE9SVEVSKTsKKwkJaWYgKHJlcG9ydGVyICE9IG51bGwpIHsKKwkJCXJlcG9ydGVyLnNpZ25hbEF1dGhlbnRpY2F0aW9uU3VjY2VzcyhzZXNzaW9uLCBzZXJ2aWNlLAorCQkJCQljdXJyZW50TWVjaGFuaXNtLnRvU3RyaW5nKCkpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2lnbmFsQXV0aE1ldGhvZEZhaWx1cmUoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgc2VydmljZSwKKwkJCWJvb2xlYW4gcGFydGlhbCwgTGlzdDxTdHJpbmc+IHNlcnZlck1ldGhvZHMsIEJ1ZmZlciBidWZmZXIpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJR3NzQXBpV2l0aE1pY0F1dGhlbnRpY2F0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgKKwkJCQlHc3NBcGlXaXRoTWljQXV0aGVudGljYXRpb25SZXBvcnRlci5HU1NfQVVUSEVOVElDQVRJT05fUkVQT1JURVIpOworCQlpZiAocmVwb3J0ZXIgIT0gbnVsbCkgeworCQkJcmVwb3J0ZXIuc2lnbmFsQXV0aGVudGljYXRpb25GYWlsdXJlKHNlc3Npb24sIHNlcnZpY2UsCisJCQkJCWN1cnJlbnRNZWNoYW5pc20udG9TdHJpbmcoKSwgcGFydGlhbCwgc2VydmVyTWV0aG9kcyk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvR3NzQXBpV2l0aE1pY0F1dGhlbnRpY2F0aW9uUmVwb3J0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Hc3NBcGlXaXRoTWljQXV0aGVudGljYXRpb25SZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMWExMzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvR3NzQXBpV2l0aE1pY0F1dGhlbnRpY2F0aW9uUmVwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb24uQ2xpZW50U2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLkF0dHJpYnV0ZVJlcG9zaXRvcnkuQXR0cmlidXRlS2V5OworCisvKioKKyAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgcmVjb3JkaW5nIGF1dGhlbnRpY2F0aW9uIHN0YXRlIGluCisgKiB7QGxpbmsgR3NzQXBpV2l0aE1pY0F1dGhlbnRpY2F0aW9ufS4KKyAqLworcHVibGljIGludGVyZmFjZSBHc3NBcGlXaXRoTWljQXV0aGVudGljYXRpb25SZXBvcnRlciB7CisKKwkvKioKKwkgKiBBbiB7QGxpbmsgQXR0cmlidXRlS2V5fcKgZm9yIGEge0BsaW5rIENsaWVudFNlc3Npb259IGhvbGRpbmcgdGhlCisJICoge0BsaW5rIEdzc0FwaVdpdGhNaWNBdXRoZW50aWNhdGlvblJlcG9ydGVyfS4KKwkgKi8KKwlzdGF0aWMgZmluYWwgQXR0cmlidXRlS2V5PEdzc0FwaVdpdGhNaWNBdXRoZW50aWNhdGlvblJlcG9ydGVyPiBHU1NfQVVUSEVOVElDQVRJT05fUkVQT1JURVIgPSBuZXcgQXR0cmlidXRlS2V5PD4oKTsKKworCS8qKgorCSAqIENhbGxlZCB3aGVuIGEgbmV3IGF1dGhlbnRpY2F0aW9uIGF0dGVtcHQgaXMgbWFkZS4KKwkgKgorCSAqIEBwYXJhbSBzZXNzaW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIENsaWVudFNlc3Npb259CisJICogQHBhcmFtIHNlcnZpY2UKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0aW5nIFNTSCBzZXJ2aWNlIG5hbWUKKwkgKiBAcGFyYW0gbWVjaGFuaXNtCisJICogICAgICAgICAgICB0aGUgT0lEIG9mIHRoZSBtZWNoYW5pc20gdXNlZAorCSAqLworCWRlZmF1bHQgdm9pZCBzaWduYWxBdXRoZW50aWNhdGlvbkF0dGVtcHQoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLAorCQkJU3RyaW5nIHNlcnZpY2UsIFN0cmluZyBtZWNoYW5pc20pIHsKKwkJLy8gbm90aGluZworCX0KKworCS8qKgorCSAqIENhbGxlZCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIG1lY2hhbmlzbXMgdG8gdHJ5LgorCSAqCisJICogQHBhcmFtIHNlc3Npb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQ2xpZW50U2Vzc2lvbn0KKwkgKiBAcGFyYW0gc2VydmljZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RpbmcgU1NIIHNlcnZpY2UgbmFtZQorCSAqLworCWRlZmF1bHQgdm9pZCBzaWduYWxBdXRoZW50aWNhdGlvbkV4aGF1c3RlZChDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQlTdHJpbmcgc2VydmljZSkgeworCQkvLyBub3RoaW5nCisJfQorCisJLyoqCisJICogQ2FsbGVkIHdoZW4gYXV0aGVudGljYXRpb24gd2FzIHN1Y2NlZXNzZnVsLgorCSAqCisJICogQHBhcmFtIHNlc3Npb24KKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQ2xpZW50U2Vzc2lvbn0KKwkgKiBAcGFyYW0gc2VydmljZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RpbmcgU1NIIHNlcnZpY2UgbmFtZQorCSAqIEBwYXJhbSBtZWNoYW5pc20KKwkgKiAgICAgICAgICAgIHRoZSBPSUQgb2YgdGhlIG1lY2hhbmlzbSB1c2VkCisJICovCisJZGVmYXVsdCB2b2lkIHNpZ25hbEF1dGhlbnRpY2F0aW9uU3VjY2VzcyhDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQlTdHJpbmcgc2VydmljZSwgU3RyaW5nIG1lY2hhbmlzbSkgeworCQkvLyBub3RoaW5nCisJfQorCisJLyoqCisJICogQ2FsbGVkIHdoZW4gdGhlIGF1dGhlbnRpY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KKwkgKgorCSAqIEBwYXJhbSBzZXNzaW9uCisJICogICAgICAgICAgICB0aGUge0BsaW5rIENsaWVudFNlc3Npb259CisJICogQHBhcmFtIHNlcnZpY2UKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0aW5nIFNTSCBzZXJ2aWNlIG5hbWUKKwkgKiBAcGFyYW0gbWVjaGFuaXNtCisJICogICAgICAgICAgICB0aGUgT0lEIG9mIHRoZSBtZWNoYW5pc20gdXNlZAorCSAqIEBwYXJhbSBwYXJ0aWFsCisJICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgYXV0aGVudGljYXRpb24gd2FzIHBhcnRpYWxseSBzdWNjZXNzZnVsLAorCSAqICAgICAgICAgICAgbWVhbmluZyBvbmUgY29udGludWVzIHdpdGggYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBtZXRob2RzCisJICogICAgICAgICAgICBnaXZlbiBieSB7QGNvZGUgc2VydmVyTWV0aG9kc30KKwkgKiBAcGFyYW0gc2VydmVyTWV0aG9kcworCSAqICAgICAgICAgICAgdGhlIHtAbGluayBMaXN0fSBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHRoYXQgY2FuIGNvbnRpbnVlCisJICovCisJZGVmYXVsdCB2b2lkIHNpZ25hbEF1dGhlbnRpY2F0aW9uRmFpbHVyZShDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQlTdHJpbmcgc2VydmljZSwgU3RyaW5nIG1lY2hhbmlzbSwgYm9vbGVhbiBwYXJ0aWFsLAorCQkJTGlzdDxTdHJpbmc+IHNlcnZlck1ldGhvZHMpIHsKKwkJLy8gbm90aGluZworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0Q2xpZW50U2Vzc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRDbGllbnRTZXNzaW9uLmphdmEKaW5kZXggZTJkYmI0Yy4uNTEwMGJjOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRDbGllbnRTZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRDbGllbnRTZXNzaW9uLmphdmEKQEAgLTQyLDcgKzQyLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmlvLklvV3JpdGVGdXR1cmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguQnVpbHRpbkRIRmFjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LkRIRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5LZXhQcm9wb3NhbE9wdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5LZXlFeGNoYW5nZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguZXh0ZW5zaW9uLktleEV4dGVuc2lvbkhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguZXh0ZW5zaW9uLktleEV4dGVuc2lvbkhhbmRsZXIuQXZhaWxhYmlsaXR5UGhhc2U7CkBAIC0xOTksMjQgKzE5OCw2IEBAIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChSZWFkYWJsZSBidWZmZXIpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcDxLZXhQcm9wb3NhbE9wdGlvbiwgU3RyaW5nPiBzZXROZWdvdGlhdGlvblJlc3VsdCgKLQkJCU1hcDxLZXhQcm9wb3NhbE9wdGlvbiwgU3RyaW5nPiBndWVzcykgewotCQlNYXA8S2V4UHJvcG9zYWxPcHRpb24sIFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuc2V0TmVnb3RpYXRpb25SZXN1bHQoCi0JCQkJZ3Vlc3MpOwotCQkvLyBUaGlzIHNob3VsZCBiZSBkb2FibGUgd2l0aCBhIFNlc3Npb25MaXN0ZW5lciwgdG9vLCBidXQgSSBkb24ndCBzZWUKLQkJLy8gaG93IHRvIGFkZCBhIGxpc3RlbmVyIGluIHRpbWUgdG8gY2F0Y2ggdGhlIG5lZ290aWF0aW9uIGVuZCBmb3Igc3VyZQotCQkvLyBnaXZlbiB0aGF0IHRoZSBzdXBlci1jb25zdHJ1Y3RvciBhbHJlYWR5IHN0YXJ0cyBLRVguCi0JCS8vCi0JCS8vIFRPRE86IFRoaXMgb3ZlcnJpZGUgY2FuIGJlIHJlbW92ZWQgb25jZSB3ZSB1c2Ugc3NoZCAyLjguMC4KLQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQlyZXN1bHQuZm9yRWFjaCgob3B0aW9uLCB2YWx1ZSkgLT4gbG9nLmRlYnVnKAotCQkJCQkic2V0TmVnb3RpYXRpb25SZXN1bHQoe30pIEtleDoge30gPSB7fSIsIHRoaXMsIC8vJE5PTi1OTFMtMSQKLQkJCQkJb3B0aW9uLmdldERlc2NyaXB0aW9uKCksIHZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KIAlTZXQ8U3RyaW5nPiBnZXRBbGxBdmFpbGFibGVTaWduYXR1cmVBbGdvcml0aG1zKCkgewogCQlTZXQ8U3RyaW5nPiBhbGxBdmFpbGFibGUgPSBuZXcgSGFzaFNldDw+KCk7CiAJCUJ1aWx0aW5TaWduYXR1cmVzLlZBTFVFUy5mb3JFYWNoKHMgLT4gYWxsQXZhaWxhYmxlLmFkZChzLmdldE5hbWUoKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFBhc3N3b3JkQXV0aGVudGljYXRpb24uamF2YQppbmRleCBmZjhjYWFhLi4zM2MzYzYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFBhc3N3b3JkQXV0aGVudGljYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFBhc3N3b3JkQXV0aGVudGljYXRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTgsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIDIwMjIgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDEzICsxMSwxMSBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuc3NoZC5jb3JlLkNvcmVNb2R1bGVQcm9wZXJ0aWVzLlBBU1NXT1JEX1BST01QVFM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgua2V5Ym9hcmQuVXNlckludGVyYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wYXNzd29yZC5Vc2VyQXV0aFBhc3N3b3JkOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuc2Vzc2lvbi5DbGllbnRTZXNzaW9uOwogCiAvKioKLSAqIEEgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gaGFuZGxlciB0aGF0IHVzZXMgdGhlIHtAbGluayBKR2l0VXNlckludGVyYWN0aW9ufQotICogdG8gYXNrIHRoZSB1c2VyIGZvciB0aGUgcGFzc3dvcmQuIEl0IGFsc28gcmVzcGVjdHMgdGhlCisgKiBBIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGhhbmRsZXIgdGhhdCByZXNwZWN0cyB0aGUKICAqIHtAY29kZSBOdW1iZXJPZlBhc3N3b3JkUHJvbXB0c30gc3NoIGNvbmZpZy4KICAqLwogcHVibGljIGNsYXNzIEpHaXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGV4dGVuZHMgVXNlckF1dGhQYXNzd29yZCB7CkBAIC0zNSwzMCArMzMsMTEgQEAgcHVibGljIHZvaWQgaW5pdChDbGllbnRTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZW5kQXV0aERhdGFSZXF1ZXN0KENsaWVudFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHNlcnZpY2UpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVBdHRlbXB0ZWRQYXNzd29yZChDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQlTdHJpbmcgc2VydmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWlmICgrK2F0dGVtcHRzID4gbWF4QXR0ZW1wdHMpIHsKLQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiBudWxsOwogCQl9Ci0JCVVzZXJJbnRlcmFjdGlvbiBpbnRlcmFjdGlvbiA9IHNlc3Npb24uZ2V0VXNlckludGVyYWN0aW9uKCk7Ci0JCWlmICghaW50ZXJhY3Rpb24uaXNJbnRlcmFjdGlvbkFsbG93ZWQoc2Vzc2lvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgcGFzc3dvcmQgPSBnZXRQYXNzd29yZChzZXNzaW9uLCBpbnRlcmFjdGlvbik7Ci0JCWlmIChwYXNzd29yZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQXV0aGVudGljYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHNlbmRQYXNzd29yZCB0YWtlcyBhIGJ1ZmZlciBhcyBmaXJzdCBhcmd1bWVudCwgYnV0IGFjdHVhbGx5IGRvZXNuJ3QKLQkJLy8gdXNlIGl0IGFuZCBjcmVhdGVzIGl0cyBvd24gYnVmZmVyLi4uCi0JCXNlbmRQYXNzd29yZChudWxsLCBzZXNzaW9uLCBwYXNzd29yZCwgcGFzc3dvcmQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQYXNzd29yZChDbGllbnRTZXNzaW9uIHNlc3Npb24sCi0JCQlVc2VySW50ZXJhY3Rpb24gaW50ZXJhY3Rpb24pIHsKLQkJU3RyaW5nW10gcmVzdWx0cyA9IGludGVyYWN0aW9uLmludGVyYWN0aXZlKHNlc3Npb24sIG51bGwsIG51bGwsICIiLCAvLyROT04tTkxTLTEkCi0JCQkJbmV3IFN0cmluZ1tdIHsgU3NoZFRleHQuZ2V0KCkucGFzc3dvcmRQcm9tcHQgfSwKLQkJCQluZXcgYm9vbGVhbltdIHsgZmFsc2UgfSk7Ci0JCXJldHVybiAocmVzdWx0cyA9PSBudWxsIHx8IHJlc3VsdHMubGVuZ3RoID09IDApID8gbnVsbCA6IHJlc3VsdHNbMF07CisJCXJldHVybiBzdXBlci5yZXNvbHZlQXR0ZW1wdGVkUGFzc3dvcmQoc2Vzc2lvbiwgc2VydmljZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRQdWJsaWNLZXlBdXRoZW50aWNhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRQdWJsaWNLZXlBdXRoZW50aWNhdGlvbi5qYXZhCmluZGV4IGMwODJhOWEuLmUxMDM2YzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0UHVibGljS2V5QXV0aGVudGljYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFB1YmxpY0tleUF1dGhlbnRpY2F0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIxIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIDIwMjIgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDI1ICsxMiw2OCBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaENvbnN0YW50cy5QVUJLRVlfQUNDRVBURURfQUxHT1JJVEhNUzsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5JbnZhbGlkUGF0aEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnRLZXlDb25zdHJhaW50OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wdWJrZXkuS2V5QWdlbnRJZGVudGl0eTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucHVia2V5LlB1YmxpY0tleUlkZW50aXR5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wdWJrZXkuVXNlckF1dGhQdWJsaWNLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnB1YmtleS5Vc2VyQXV0aFB1YmxpY0tleUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmhvc3RzLkhvc3RDb25maWdFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb24uQ2xpZW50U2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLkZhY3RvcnlNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uTmFtZWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMuQXV0aG9yaXplZEtleUVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMuS2V5VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5cy5QdWJsaWNLZXlFbnRyeVJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMudTJmLlNlY3VyaXR5S2V5UHVibGljS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlLlNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZS5TaWduYXR1cmVGYWN0b3JpZXNNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaC5PcGVuU3NoQ29uZmlnRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5DcmVkZW50aWFsSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5DcmVkZW50aWFsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VUklpc2g7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIEN1c3RvbSB7QGxpbmsgVXNlckF1dGhQdWJsaWNLZXl9IGltcGxlbWVudGF0aW9uIGZvciBoYW5kbGluZyBTU0ggY29uZmlnCi0gKiBQdWJrZXlBY2NlcHRlZEFsZ29yaXRobXMuCisgKiBQdWJrZXlBY2NlcHRlZEFsZ29yaXRobXMgYW5kIGludGVyYWN0aW9uIHdpdGggdGhlIFNTSCBhZ2VudC4KICAqLwogcHVibGljIGNsYXNzIEpHaXRQdWJsaWNLZXlBdXRoZW50aWNhdGlvbiBleHRlbmRzIFVzZXJBdXRoUHVibGljS2V5IHsKIAorCXByaXZhdGUgU3NoQWdlbnQgYWdlbnQ7CisKKwlwcml2YXRlIEhvc3RDb25maWdFbnRyeSBob3N0Q29uZmlnOworCisJcHJpdmF0ZSBib29sZWFuIGFkZEtleXNUb0FnZW50OworCisJcHJpdmF0ZSBib29sZWFuIGFza0JlZm9yZUFkZGluZzsKKworCXByaXZhdGUgU3RyaW5nIHNrUHJvdmlkZXI7CisKKwlwcml2YXRlIFNzaEFnZW50S2V5Q29uc3RyYWludFtdIGNvbnN0cmFpbnRzOworCiAJSkdpdFB1YmxpY0tleUF1dGhlbnRpY2F0aW9uKExpc3Q8TmFtZWRGYWN0b3J5PFNpZ25hdHVyZT4+IGZhY3RvcmllcykgewogCQlzdXBlcihmYWN0b3JpZXMpOwogCX0KQEAgLTQzLDcgKzg2LDcgQEAgcHVibGljIHZvaWQgaW5pdChDbGllbnRTZXNzaW9uIHJhd1Nlc3Npb24sIFN0cmluZyBzZXJ2aWNlKQogCQkJCQkrIHJhd1Nlc3Npb24uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwogCQl9CiAJCUpHaXRDbGllbnRTZXNzaW9uIHNlc3Npb24gPSAoSkdpdENsaWVudFNlc3Npb24pIHJhd1Nlc3Npb247Ci0JCUhvc3RDb25maWdFbnRyeSBob3N0Q29uZmlnID0gc2Vzc2lvbi5nZXRIb3N0Q29uZmlnRW50cnkoKTsKKwkJaG9zdENvbmZpZyA9IHNlc3Npb24uZ2V0SG9zdENvbmZpZ0VudHJ5KCk7CiAJCS8vIFNldCBzaWduYXR1cmUgYWxnb3JpdGhtcyBmb3IgcHVibGljIGtleSBhdXRoZW50aWNhdGlvbgogCQlTdHJpbmcgcHVia2V5QWxnb3MgPSBob3N0Q29uZmlnLmdldFByb3BlcnR5KFBVQktFWV9BQ0NFUFRFRF9BTEdPUklUSE1TKTsKIAkJaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKHB1YmtleUFsZ29zKSkgewpAQCAtNTYsNTQgKzk5LDMwNCBAQCBwdWJsaWMgdm9pZCBpbml0KENsaWVudFNlc3Npb24gcmF3U2Vzc2lvbiwgU3RyaW5nIHNlcnZpY2UpCiAJCQkJCWxvZy5kZWJ1ZyhQVUJLRVlfQUNDRVBURURfQUxHT1JJVEhNUyArICcgJyArIHNpZ25hdHVyZXMpOwogCQkJCX0KIAkJCQlzZXRTaWduYXR1cmVGYWN0b3JpZXNOYW1lcyhzaWduYXR1cmVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9nLndhcm4oZm9ybWF0KFNzaGRUZXh0LmdldCgpLmNvbmZpZ05vS25vd25BbGdvcml0aG1zLAotCQkJCQkJUFVCS0VZX0FDQ0VQVEVEX0FMR09SSVRITVMsIHB1YmtleUFsZ29zKSk7CisJCQkJc3VwZXIuaW5pdChzZXNzaW9uLCBzZXJ2aWNlKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlsb2cud2Fybihmb3JtYXQoU3NoZFRleHQuZ2V0KCkuY29uZmlnTm9Lbm93bkFsZ29yaXRobXMsCisJCQkJCVBVQktFWV9BQ0NFUFRFRF9BTEdPUklUSE1TLCBwdWJrZXlBbGdvcykpOworCQl9CisJCS8vIFRPRE86IHJlbW92ZSB0aGlzIG9uY2Ugd2UncmUgb24gYW4gc3NoZCB2ZXJzaW9uIHRoYXQgaGFzIFNTSEQtMTI3MgorCQkvLyBmaXhlZAorCQlMaXN0PE5hbWVkRmFjdG9yeTxTaWduYXR1cmU+PiBsb2NhbEZhY3RvcmllcyA9IGdldFNpZ25hdHVyZUZhY3RvcmllcygpOworCQlpZiAobG9jYWxGYWN0b3JpZXMgPT0gbnVsbCB8fCBsb2NhbEZhY3Rvcmllcy5pc0VtcHR5KCkpIHsKKwkJCXNldFNpZ25hdHVyZUZhY3Rvcmllc05hbWVzKHNlc3Npb24uZ2V0U2lnbmF0dXJlRmFjdG9yaWVzTmFtZXMoKSk7CisJCX0KKwkJc3VwZXIuaW5pdChzZXNzaW9uLCBzZXJ2aWNlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8UHVibGljS2V5SWRlbnRpdHk+IGNyZWF0ZVB1YmxpY0tleUl0ZXJhdG9yKAorCQkJQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLCBTaWduYXR1cmVGYWN0b3JpZXNNYW5hZ2VyIG1hbmFnZXIpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWdlbnQgPSBnZXRBZ2VudChzZXNzaW9uKTsKKwkJaWYgKGFnZW50ICE9IG51bGwpIHsKKwkJCXBhcnNlQWRkS2V5cyhob3N0Q29uZmlnKTsKKwkJCWlmIChhZGRLZXlzVG9BZ2VudCkgeworCQkJCXNrUHJvdmlkZXIgPSBob3N0Q29uZmlnLmdldFByb3BlcnR5KFNzaENvbnN0YW50cy5TRUNVUklUWV9LRVlfUFJPVklERVIpOwogCQkJfQogCQl9Ci0JCS8vIElmIHdlIGRvbid0IHNldCBzaWduYXR1cmUgZmFjdG9yaWVzIGhlcmUsIHRoZSBkZWZhdWx0IG9uZXMgZnJvbSB0aGUKLQkJLy8gc2Vzc2lvbiB3aWxsIGJlIHVzZWQuCi0JCXN1cGVyLmluaXQoc2Vzc2lvbiwgc2VydmljZSk7Ci0JCS8vIEluIHNzaGQgMi43LjAsIHdlIGVuZCB1cCBub3cgd2l0aCBhIGtleSBpdGVyYXRvciB0aGF0IHVzZXMga2V5cwotCQkvLyBwcm92aWRlZCBieSBhbiBzc2gtYWdlbnQgZXZlbiBpZiBJZGVudGl0aWVzT25seSBpcyB0cnVlLiBTbyBpZgotCQkvLyBuZWVkZWQsIGZpbHRlciBvdXQgYW55IEtleUFnZW50SWRlbnRpdHkuCi0JCWlmIChob3N0Q29uZmlnLmlzSWRlbnRpdGllc09ubHkoKSkgewotCQkJSXRlcmF0b3I8UHVibGljS2V5SWRlbnRpdHk+IG9yaWdpbmFsID0ga2V5czsKLQkJCS8vIFRoZSBvcmlnaW5hbCBpdGVyYXRvciB3aWxsIGFscmVhZHkgaGF2ZSBnb3R0ZW4gdGhlIGlkZW50aXRpZXMKLQkJCS8vIGZyb20gdGhlIGFnZW50LiBVbmZvcnR1bmF0ZWx5IHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQKLQkJCS8vIHRoYXQ7IGl0J2xsIGhhdmUgdG8gYmUgZml4ZWQgdXBzdHJlYW0uIChBcyB3aWxsLCB1bHRpbWF0ZWx5LAotCQkJLy8gcmVzcGVjdGluZyBpc0lkZW50aXRpZXNPbmx5KCkuKSBBdCBsZWFzdCB3ZSBjYW4gc2ltcGx5IG5vdAotCQkJLy8gdXNlIHRoZSBrZXlzIHRoZSBhZ2VudCBwcm92aWRlZC4KLQkJCS8vCi0JCQkvLyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9TU0hELTEyMTgKLQkJCWtleXMgPSBuZXcgSXRlcmF0b3I8PigpIHsKKwkJcmV0dXJuIG5ldyBLZXlJdGVyYXRvcihzZXNzaW9uLCBtYW5hZ2VyKTsKKwl9CiAKLQkJCQlwcml2YXRlIFB1YmxpY0tleUlkZW50aXR5IHZhbHVlOworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQdWJsaWNLZXlJZGVudGl0eSByZXNvbHZlQXR0ZW1wdGVkUHVibGljS2V5SWRlbnRpdHkoCisJCQlDbGllbnRTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHVibGljS2V5SWRlbnRpdHkgcmVzdWx0ID0gZ2V0TmV4dEtleShzZXNzaW9uLCBzZXJ2aWNlKTsKKwkJLy8gVGhpcyBmaXhlcyBTU0hELTEyMzEuIENhbiBiZSByZW1vdmVkIG9uY2Ugd2UncmUgdXNpbmcgQXBhY2hlIE1JTkEKKwkJLy8gc3NoZCA+IDIuOC4wLgorCQkvLworCQkvLyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9TU0hELTEyMzEKKwkJY3VycmVudEFsZ29yaXRobXMuY2xlYXIoKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIFB1YmxpY0tleUlkZW50aXR5IGdldE5leHRLZXkoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgc2VydmljZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlQdWJsaWNLZXlJZGVudGl0eSBpZCA9IHN1cGVyLnJlc29sdmVBdHRlbXB0ZWRQdWJsaWNLZXlJZGVudGl0eShzZXNzaW9uLAorCQkJCXNlcnZpY2UpOworCQlpZiAoYWRkS2V5c1RvQWdlbnQgJiYgaWQgIT0gbnVsbCAmJiAhKGlkIGluc3RhbmNlb2YgS2V5QWdlbnRJZGVudGl0eSkpIHsKKwkJCUtleVBhaXIga2V5ID0gaWQuZ2V0S2V5SWRlbnRpdHkoKTsKKwkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkuZ2V0UHVibGljKCkgIT0gbnVsbAorCQkJCQkmJiBrZXkuZ2V0UHJpdmF0ZSgpICE9IG51bGwpIHsKKwkJCQkvLyBXZSd2ZSBqdXN0IHN1Y2Nlc3NmdWxseSBsb2FkZWQgYSBrZXkgdGhhdCB3YXNuJ3QgaW4gdGhlCisJCQkJLy8gYWdlbnQuIEFkZCBpdCB0byB0aGUgYWdlbnQuCisJCQkJLy8KKwkJCQkvLyBLZXlzIGFyZSBhZGRlZCBhZnRlciBsb2FkaW5nLCBhcyBpbiBPcGVuU1NILiBUaGUgYWx0ZXJuYXRpdmUKKwkJCQkvLyBtaWdodCBiZSB0byBhZGQgYSBrZXkgb25seSBhZnRlciAocGFydGlhbGx5KSBzdWNjZXNzZnVsCisJCQkJLy8gYXV0aGVudGljYXRpb24/CisJCQkJUHVibGljS2V5IHBrID0ga2V5LmdldFB1YmxpYygpOworCQkJCVN0cmluZyBmaW5nZXJwcmludCA9IEtleVV0aWxzLmdldEZpbmdlclByaW50KHBrKTsKKwkJCQlTdHJpbmcga2V5VHlwZSA9IEtleVV0aWxzLmdldEtleVR5cGUoa2V5KTsKKwkJCQl0cnkgeworCQkJCQkvLyBDaGVjayB0aGF0IHRoZSBrZXkgaXMgbm90IGluIHRoZSBhZ2VudCBhbHJlYWR5LgorCQkJCQlpZiAoYWdlbnRIYXNLZXkocGspKSB7CisJCQkJCQlyZXR1cm4gaWQ7CisJCQkJCX0KKwkJCQkJaWYgKGFza0JlZm9yZUFkZGluZworCQkJCQkJCSYmIChzZXNzaW9uIGluc3RhbmNlb2YgSkdpdENsaWVudFNlc3Npb24pKSB7CisJCQkJCQlDcmVkZW50aWFsc1Byb3ZpZGVyIHByb3ZpZGVyID0gKChKR2l0Q2xpZW50U2Vzc2lvbikgc2Vzc2lvbikKKwkJCQkJCQkJLmdldENyZWRlbnRpYWxzUHJvdmlkZXIoKTsKKwkJCQkJCUNyZWRlbnRpYWxJdGVtLlllc05vVHlwZSBxdWVzdGlvbiA9IG5ldyBDcmVkZW50aWFsSXRlbS5ZZXNOb1R5cGUoCisJCQkJCQkJCWZvcm1hdChTc2hkVGV4dAorCQkJCQkJCQkJCS5nZXQoKS5wdWJrZXlBdXRoQWRkS2V5VG9BZ2VudFF1ZXN0aW9uLAorCQkJCQkJCQkJCWtleVR5cGUsIGZpbmdlcnByaW50KSk7CisJCQkJCQlib29sZWFuIHJlc3VsdCA9IHByb3ZpZGVyICE9IG51bGwKKwkJCQkJCQkJJiYgcHJvdmlkZXIuc3VwcG9ydHMocXVlc3Rpb24pCisJCQkJCQkJCSYmIHByb3ZpZGVyLmdldChnZXRVcmkoKSwgcXVlc3Rpb24pOworCQkJCQkJaWYgKCFyZXN1bHQgfHwgIXF1ZXN0aW9uLmdldFZhbHVlKCkpIHsKKwkJCQkJCQkvLyBEb24ndCBhZGQgdGhlIGtleS4KKwkJCQkJCQlyZXR1cm4gaWQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJU3NoQWdlbnRLZXlDb25zdHJhaW50W10gcnVsZXMgPSBjb25zdHJhaW50czsKKwkJCQkJaWYgKHBrIGluc3RhbmNlb2YgU2VjdXJpdHlLZXlQdWJsaWNLZXkgJiYgIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoc2tQcm92aWRlcikpIHsKKwkJCQkJCXJ1bGVzID0gQXJyYXlzLmNvcHlPZihydWxlcywgcnVsZXMubGVuZ3RoICsgMSk7CisJCQkJCQlydWxlc1tydWxlcy5sZW5ndGggLSAxXSA9CisJCQkJCQkJCW5ldyBTc2hBZ2VudEtleUNvbnN0cmFpbnQuRmlkb1Byb3ZpZGVyRXh0ZW5zaW9uKHNrUHJvdmlkZXIpOworCQkJCQl9CisJCQkJCS8vIFVuZm9ydHVuYXRlbHkgYSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGlzIGxvc3QKKwkJCQkJLy8gYnkgQXBhY2hlIE1JTkEgc3NoZCwgYW5kIHRoZXJlIGlzIGFsc28gbm8gd2F5IHRvIGdldCB0aGUKKwkJCQkJLy8gb3JpZ2luYWwgZmlsZSBuYW1lIGZvciBrZXlzIGxvYWRlZCBmcm9tIGEgZmlsZS4gU28gYWRkIGl0CisJCQkJCS8vIHdpdGhvdXQgY29tbWVudC4KKwkJCQkJYWdlbnQuYWRkSWRlbnRpdHkoa2V5LCBudWxsLCBydWxlcyk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBEbyBub3QgcmUtdGhyb3c6IHdlIGRvbid0IHdhbnQgYXV0aGVudGljYXRpb24gdG8gZmFpbCBpZgorCQkJCQkvLyB3ZSBjYW5ub3QgYWRkIHRoZSBrZXkgdG8gdGhlIGFnZW50LgorCQkJCQlsb2cuZXJyb3IoCisJCQkJCQkJZm9ybWF0KFNzaGRUZXh0LmdldCgpLnB1YmtleUF1dGhBZGRLZXlUb0FnZW50RXJyb3IsCisJCQkJCQkJCQlrZXlUeXBlLCBmaW5nZXJwcmludCksCisJCQkJCQkJZSk7CisJCQkJCS8vIE5vdGUgdGhhdCBhcyBvZiBXaW4zMi1PcGVuU1NIIDguNiBhbmQgUGFnZWFudCAwLjc2LAorCQkJCQkvLyBuZWl0aGVyIGNhbiBoYW5kbGUga2V5IGNvbnN0cmFpbnRzLiBQYWdlYW50IGZhaWxzCisJCQkJCS8vIGdyYWNlZnVsbHksIG5vdCBhZGRpbmcgdGhlIGtleSBhbmQgcmV0dXJuaW5nCisJCQkJCS8vIFNTSF9BR0VOVF9GQUlMVVJFLiBXaW4zMi1PcGVuU1NIIGNsb3NlcyB0aGUgY29ubmVjdGlvbgorCQkJCQkvLyB3aXRob3V0IGV2ZW4gcmV0dXJuaW5nIGEgZmFpbHVyZSBtZXNzYWdlLCB3aGljaCB2aW9sYXRlcworCQkJCQkvLyB0aGUgU1NIIGFnZW50IHByb3RvY29sIGFuZCBtYWtlcyBhbGwgc3Vic2VxdWVudCByZXF1ZXN0cworCQkJCQkvLyB0byB0aGUgYWdlbnQgZmFpbC4KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGlkOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBhZ2VudEhhc0tleShQdWJsaWNLZXkgcGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUl0ZXJhYmxlPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBpZHMgPSBhZ2VudAorCQkJCS5nZXRJZGVudGl0aWVzKCk7CisJCWlmIChpZHMgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBpdGVyID0gaWRzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJaWYgKEtleVV0aWxzLmNvbXBhcmVLZXlzKGl0ZXIubmV4dCgpLmdldEtleSgpLCBwaykpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBVUklpc2ggZ2V0VXJpKCkgeworCQlTdHJpbmcgdXJpID0gU3NoQ29uc3RhbnRzLlNTSF9TQ0hFTUUgKyAiOi8vIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgdXNlck5hbWUgPSBob3N0Q29uZmlnLmdldFVzZXJuYW1lKCk7CisJCWlmICghU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbCh1c2VyTmFtZSkpIHsKKwkJCXVyaSArPSB1c2VyTmFtZSArICdAJzsKKwkJfQorCQl1cmkgKz0gaG9zdENvbmZpZy5nZXRIb3N0KCk7CisJCWludCBwb3J0ID0gaG9zdENvbmZpZy5nZXRQb3J0KCk7CisJCWlmIChwb3J0ID4gMCAmJiBwb3J0ICE9IFNzaENvbnN0YW50cy5TU0hfREVGQVVMVF9QT1JUKSB7CisJCQl1cmkgKz0gIjoiICsgcG9ydDsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IFVSSWlzaCh1cmkpOworCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsKKwkJfQorCQlyZXR1cm4gbmV3IFVSSWlzaCgpOworCX0KKworCXByaXZhdGUgU3NoQWdlbnQgZ2V0QWdlbnQoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmFjdG9yeU1hbmFnZXIgbWFuYWdlciA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoCisJCQkJc2Vzc2lvbi5nZXRGYWN0b3J5TWFuYWdlcigpLCAiTm8gc2Vzc2lvbiBmYWN0b3J5IG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAorCQlTc2hBZ2VudEZhY3RvcnkgZmFjdG9yeSA9IG1hbmFnZXIuZ2V0QWdlbnRGYWN0b3J5KCk7CisJCWlmIChmYWN0b3J5ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUNsaWVudChzZXNzaW9uLCBtYW5hZ2VyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcGFyc2VBZGRLZXlzKEhvc3RDb25maWdFbnRyeSBjb25maWcpIHsKKwkJU3RyaW5nIHZhbHVlID0gY29uZmlnLmdldFByb3BlcnR5KFNzaENvbnN0YW50cy5BRERfS0VZU19UT19BR0VOVCk7CisJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKHZhbHVlKSkgeworCQkJYWRkS2V5c1RvQWdlbnQgPSBmYWxzZTsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmdbXSB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCisJCUxpc3Q8U3NoQWdlbnRLZXlDb25zdHJhaW50PiBydWxlcyA9IG5ldyBBcnJheUxpc3Q8PigyKTsKKwkJc3dpdGNoICh2YWx1ZXNbMF0pIHsKKwkJY2FzZSAieWVzIjogLy8kTk9OLU5MUy0xJAorCQkJYWRkS2V5c1RvQWdlbnQgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgIm5vIjogLy8kTk9OLU5MUy0xJAorCQkJYWRkS2V5c1RvQWdlbnQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlICJhc2siOiAvLyROT04tTkxTLTEkCisJCQlhZGRLZXlzVG9BZ2VudCA9IHRydWU7CisJCQlhc2tCZWZvcmVBZGRpbmcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgImNvbmZpcm0iOiAvLyROT04tTkxTLTEkCisJCQlhZGRLZXlzVG9BZ2VudCA9IHRydWU7CisJCQlydWxlcy5hZGQoU3NoQWdlbnRLZXlDb25zdHJhaW50LkNPTkZJUk0pOworCQkJaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7CisJCQkJaW50IHNlY29uZHMgPSBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYyh2YWx1ZXNbMV0pOworCQkJCWlmIChzZWNvbmRzID4gMCkgeworCQkJCQlydWxlcy5hZGQobmV3IFNzaEFnZW50S2V5Q29uc3RyYWludC5MaWZlVGltZShzZWNvbmRzKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpbnQgc2Vjb25kcyA9IE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKHZhbHVlc1swXSk7CisJCQlpZiAoc2Vjb25kcyA+IDApIHsKKwkJCQlhZGRLZXlzVG9BZ2VudCA9IHRydWU7CisJCQkJcnVsZXMuYWRkKG5ldyBTc2hBZ2VudEtleUNvbnN0cmFpbnQuTGlmZVRpbWUoc2Vjb25kcykpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY29uc3RyYWludHMgPSBydWxlcy50b0FycmF5KG5ldyBTc2hBZ2VudEtleUNvbnN0cmFpbnRbMF0pOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VLZXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYWRkS2V5c1RvQWdlbnQgPSBmYWxzZTsKKwkJYXNrQmVmb3JlQWRkaW5nID0gZmFsc2U7CisJCXNrUHJvdmlkZXIgPSBudWxsOworCQljb25zdHJhaW50cyA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAoYWdlbnQgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWFnZW50LmNsb3NlKCk7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJYWdlbnQgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXN1cGVyLnJlbGVhc2VLZXlzKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIEtleUl0ZXJhdG9yIGV4dGVuZHMgVXNlckF1dGhQdWJsaWNLZXlJdGVyYXRvciB7CisKKwkJcHJpdmF0ZSBJdGVyYWJsZTw/IGV4dGVuZHMgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4gYWdlbnRLZXlzOworCisJCS8vIElmIG5vbi1udWxsLCBhbGwgdGhlIHB1YmxpYyBrZXlzIGZyb20gZXhwbGljaXRseSBnaXZlbiBrZXkgZmlsZXMuIEFueQorCQkvLyBhZ2VudCBrZXkgbm90IG1hdGNoaW5nIG9uZSBvZiB0aGVzZSBwdWJsaWMga2V5cyB3aWxsIGJlIGlnbm9yZWQgaW4KKwkJLy8gZ2V0SWRlbnRpdGllcygpLgorCQlwcml2YXRlIENvbGxlY3Rpb248UHVibGljS2V5PiBpZGVudGl0eUZpbGVzOworCisJCXB1YmxpYyBLZXlJdGVyYXRvcihDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQkJU2lnbmF0dXJlRmFjdG9yaWVzTWFuYWdlciBtYW5hZ2VyKQorCQkJCXRocm93cyBFeGNlcHRpb24geworCQkJc3VwZXIoc2Vzc2lvbiwgbWFuYWdlcik7CisJCX0KKworCQlwcml2YXRlIExpc3Q8UHVibGljS2V5PiBnZXRFeHBsaWNpdEtleXMoCisJCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGxpY2l0RmlsZXMpIHsKKwkJCWlmIChleHBsaWNpdEZpbGVzID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiBleHBsaWNpdEZpbGVzLnN0cmVhbSgpLm1hcChzIC0+IHsKKwkJCQl0cnkgeworCQkJCQlQYXRoIHAgPSBQYXRocy5nZXQocyArICIucHViIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKEZpbGVzLmlzUmVndWxhckZpbGUocCwgTGlua09wdGlvbi5OT0ZPTExPV19MSU5LUykpIHsKKwkJCQkJCXJldHVybiBBdXRob3JpemVkS2V5RW50cnkucmVhZEF1dGhvcml6ZWRLZXlzKHApLmdldCgwKQorCQkJCQkJCQkucmVzb2x2ZVB1YmxpY0tleShudWxsLAorCQkJCQkJCQkJCVB1YmxpY0tleUVudHJ5UmVzb2x2ZXIuSUdOT1JJTkcpOworCQkJCQl9CisJCQkJfSBjYXRjaCAoSW52YWxpZFBhdGhFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbgorCQkJCQkJfCBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZSkgeworCQkJCQlsb2cud2Fybihmb3JtYXQoU3NoZFRleHQuZ2V0KCkuY2Fubm90UmVhZFB1YmxpY0tleSwgcyksIGUpOworCQkJCX0KKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0pLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBJdGVyYWJsZTxLZXlBZ2VudElkZW50aXR5PiBpbml0aWFsaXplQWdlbnRJZGVudGl0aWVzKAorCQkJCUNsaWVudFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCWlmIChhZ2VudCA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlhZ2VudEtleXMgPSBhZ2VudC5nZXRJZGVudGl0aWVzKCk7CisJCQlpZiAoaG9zdENvbmZpZyAhPSBudWxsICYmIGhvc3RDb25maWcuaXNJZGVudGl0aWVzT25seSgpKSB7CisJCQkJaWRlbnRpdHlGaWxlcyA9IGdldEV4cGxpY2l0S2V5cyhob3N0Q29uZmlnLmdldElkZW50aXRpZXMoKSk7CisJCQl9CisJCQlyZXR1cm4gKCkgLT4gbmV3IEl0ZXJhdG9yPD4oKSB7CisKKwkJCQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBpdGVyID0gYWdlbnRLZXlzCisJCQkJCQkuaXRlcmF0b3IoKTsKKworCQkJCXByaXZhdGUgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPiBuZXh0OwogCiAJCQkJQE92ZXJyaWRlCiAJCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCVB1YmxpY0tleUlkZW50aXR5IG5leHQgPSBudWxsOwotCQkJCQl3aGlsZSAob3JpZ2luYWwuaGFzTmV4dCgpKSB7Ci0JCQkJCQluZXh0ID0gb3JpZ2luYWwubmV4dCgpOwotCQkJCQkJaWYgKCEobmV4dCBpbnN0YW5jZW9mIEtleUFnZW50SWRlbnRpdHkpKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXh0OworCQkJCQl3aGlsZSAobmV4dCA9PSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJCQlNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+IHZhbCA9IGl0ZXIubmV4dCgpOworCQkJCQkJUHVibGljS2V5IHBrID0gdmFsLmdldEtleSgpOworCQkJCQkJLy8gVGhpcyBjaGVja3MgYWdhaW5zdCBhbGwgZXhwbGljaXQga2V5cyBmb3IgYW55IGFnZW50CisJCQkJCQkvLyBrZXksIGJ1dCBzaW5jZSBpZGVudGl0eUZpbGVzLnNpemUoKSBpcyB0eXBpY2FsbHkgMSwKKwkJCQkJCS8vIGl0IHNob3VsZCBiZSBmaW5lLgorCQkJCQkJaWYgKGlkZW50aXR5RmlsZXMgPT0gbnVsbCB8fCBpZGVudGl0eUZpbGVzLnN0cmVhbSgpCisJCQkJCQkJCS5hbnlNYXRjaChrIC0+IEtleVV0aWxzLmNvbXBhcmVLZXlzKGssIHBrKSkpIHsKKwkJCQkJCQluZXh0ID0gdmFsOwogCQkJCQkJCXJldHVybiB0cnVlOwogCQkJCQkJfQorCQkJCQkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisJCQkJCQkJbG9nLnRyYWNlKAorCQkJCQkJCQkJIklnbm9yaW5nIFNTSCBhZ2VudCB7fSBrZXkgbm90IGluIGV4cGxpY2l0IElkZW50aXR5RmlsZSBpbiBTU0ggY29uZmlnOiB7fSIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCUtleVV0aWxzLmdldEtleVR5cGUocGspLAorCQkJCQkJCQkJS2V5VXRpbHMuZ2V0RmluZ2VyUHJpbnQocGspKTsKKwkJCQkJCX0KIAkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCXJldHVybiBuZXh0ICE9IG51bGw7CiAJCQkJfQogCiAJCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFB1YmxpY0tleUlkZW50aXR5IG5leHQoKSB7Ci0JCQkJCWlmIChoYXNOZXh0KCkpIHsKLQkJCQkJCVB1YmxpY0tleUlkZW50aXR5IHJlc3VsdCA9IHZhbHVlOwotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQlwdWJsaWMgS2V5QWdlbnRJZGVudGl0eSBuZXh0KCkgeworCQkJCQlpZiAoIWhhc05leHQoKSkgeworCQkJCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKIAkJCQkJfQotCQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQkJCQlLZXlBZ2VudElkZW50aXR5IHJlc3VsdCA9IG5ldyBLZXlBZ2VudElkZW50aXR5KGFnZW50LAorCQkJCQkJCW5leHQuZ2V0S2V5KCksIG5leHQuZ2V0VmFsdWUoKSk7CisJCQkJCW5leHQgPSBudWxsOworCQkJCQlyZXR1cm4gcmVzdWx0OwogCQkJCX0KIAkJCX07CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0U3NoQ2xpZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFNzaENsaWVudC5qYXZhCmluZGV4IDcxZThlNjEuLjcyZjBiZGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0U3NoQ2xpZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRTc2hDbGllbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTgsIDIwMjEgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMiBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtODcsNiArODcsMTEgQEAgcHVibGljIGNsYXNzIEpHaXRTc2hDbGllbnQgZXh0ZW5kcyBTc2hDbGllbnQgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlS2V5PFN0cmluZz4gUFJFRkVSUkVEX0FVVEhFTlRJQ0FUSU9OUyA9IG5ldyBBdHRyaWJ1dGVLZXk8PigpOwogCiAJLyoqCisJICogQW4gYXR0cmlidXRlIGtleSBmb3IgdGhlIGhvbWUgZGlyZWN0b3J5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQXR0cmlidXRlS2V5PFBhdGg+IEhPTUVfRElSRUNUT1JZID0gbmV3IEF0dHJpYnV0ZUtleTw+KCk7CisKKwkvKioKIAkgKiBBbiBhdHRyaWJ1dGUga2V5IGZvciBzdG9yaW5nIGFuIGFsdGVybmF0ZSBsb2NhbCBhZGRyZXNzIHRvIGNvbm5lY3QgdG8gaWYKIAkgKiBhIGxvY2FsIGZvcndhcmQgZnJvbSBhIFByb3h5SnVtcCBzc2ggY29uZmlnIGlzIHByZXNlbnQuIElmIHNldCwKIAkgKiB7QGxpbmsgI2Nvbm5lY3QoSG9zdENvbmZpZ0VudHJ5LCBBdHRyaWJ1dGVSZXBvc2l0b3J5LCBTb2NrZXRBZGRyZXNzKX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0VXNlckludGVyYWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFVzZXJJbnRlcmFjdGlvbi5qYXZhCmluZGV4IGM1MWE3NWIuLjJhNzI1ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0VXNlckludGVyYWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRVc2VySW50ZXJhY3Rpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTgsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIDIwMjIgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyMCwxNSArMTIwLDE2IEBAIHB1YmxpYyBib29sZWFuIGlzSW50ZXJhY3Rpb25BbGxvd2VkKENsaWVudFNlc3Npb24gc2Vzc2lvbikgewogCQkJCXJldHVybiBudWxsOwogCQkJfSkuZmlsdGVyKHMgLT4gcyAhPSBudWxsKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwogCQl9Ci0JCS8vIFRPRE8gV2hhdCB0byB0aHJvdyB0byBhYm9ydCB0aGUgY29ubmVjdGlvbi9hdXRoZW50aWNhdGlvbiBwcm9jZXNzPwotCQkvLyBJbiBVc2VyQXV0aEtleWJvYXJkSW50ZXJhY3RpdmUuZ2V0VXNlclJlc3BvbnNlcygpIGl0J3MgY2xlYXIgdGhhdAotCQkvLyByZXR1cm5pbmcgbnVsbCBpcyB2YWxpZCBhbmQgc2lnbmlmaWVzICJhbiBlcnJvciI7IHdlJ2xsIHRyeSB0aGUKLQkJLy8gbmV4dCBhdXRoZW50aWNhdGlvbiBtZXRob2QuIEJ1dCBpZiB0aGUgdXNlciBleHBsaWNpdGx5IGNhbmNlbGVkLAotCQkvLyB0aGVuIHdlIGRvbid0IHdhbnQgdG8gdHJ5IHRoZSBuZXh0IG1ldGhvZHMuLi4KLQkJLy8KLQkJLy8gUHJvYmFibHkgbm90IGEgc2VyaW91cyBpc3N1ZSB3aXRoIHRoZSB0eXBpY2FsIG9yZGVyIG9mIHB1YmxpYy1rZXksCi0JCS8vIGtleWJvYXJkLWludGVyYWN0aXZlLCBwYXNzd29yZC4KLQkJcmV0dXJuIG51bGw7CisJCXRocm93IG5ldyBBdXRoZW50aWNhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyByZXNvbHZlQXV0aFBhc3N3b3JkQXR0ZW1wdChDbGllbnRTZXNzaW9uIHNlc3Npb24pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gcmVzdWx0cyA9IGludGVyYWN0aXZlKHNlc3Npb24sIG51bGwsIG51bGwsICIiLCAvLyROT04tTkxTLTEkCisJCQkJbmV3IFN0cmluZ1tdIHsgU3NoZFRleHQuZ2V0KCkucGFzc3dvcmRQcm9tcHQgfSwKKwkJCQluZXcgYm9vbGVhbltdIHsgZmFsc2UgfSk7CisJCXJldHVybiAocmVzdWx0cyA9PSBudWxsIHx8IHJlc3VsdHMubGVuZ3RoID09IDApID8gbnVsbCA6IHJlc3VsdHNbMF07CiAJfQogCiAJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvU3NoZFRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5qYXZhCmluZGV4IDAwZWU2MmQuLjM5MzMyZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMSBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yOSw3ICsyOSwyNSBAQCBwdWJsaWMgc3RhdGljIFNzaGRUZXh0IGdldCgpIHsKIAkvLyBAZm9ybWF0dGVyOm9mZgogCS8qKiovIHB1YmxpYyBTdHJpbmcgYXV0aGVudGljYXRpb25DYW5jZWxlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGF1dGhlbnRpY2F0aW9uT25DbG9zZWRTZXNzaW9uOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYXV0aEdzc0FwaUF0dGVtcHQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBhdXRoR3NzQXBpRXhoYXVzdGVkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYXV0aEdzc0FwaUZhaWx1cmU7CisJLyoqKi8gcHVibGljIFN0cmluZyBhdXRoR3NzQXBpTm90VHJpZWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBhdXRoR3NzQXBpUGFydGlhbFN1Y2Nlc3M7CisJLyoqKi8gcHVibGljIFN0cmluZyBhdXRoUGFzc3dvcmRBdHRlbXB0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgYXV0aFBhc3N3b3JkQ2hhbmdlQXR0ZW1wdDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGF1dGhQYXNzd29yZEV4aGF1c3RlZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGF1dGhQYXNzd29yZEZhaWx1cmU7CisJLyoqKi8gcHVibGljIFN0cmluZyBhdXRoUGFzc3dvcmROb3RUcmllZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGF1dGhQYXNzd29yZFBhcnRpYWxTdWNjZXNzOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYXV0aFB1YmtleUF0dGVtcHQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBhdXRoUHVia2V5QXR0ZW1wdEFnZW50OworCS8qKiovIHB1YmxpYyBTdHJpbmcgYXV0aFB1YmtleUV4aGF1c3RlZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGF1dGhQdWJrZXlGYWlsdXJlOworCS8qKiovIHB1YmxpYyBTdHJpbmcgYXV0aFB1YmtleU5vS2V5czsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGF1dGhQdWJrZXlQYXJ0aWFsU3VjY2VzczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNsb3NlTGlzdGVuZXJGYWlsZWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBjYW5ub3RSZWFkUHVibGljS2V5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY29uZmlnSW52YWxpZFBhdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBjb25maWdJbnZhbGlkUGF0dGVybjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNvbmZpZ0ludmFsaWRQb3NpdGl2ZTsKQEAgLTk4LDYgKzExNiw4IEBAIHB1YmxpYyBzdGF0aWMgU3NoZFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHJveHlTb2Nrc1VuZXhwZWN0ZWRNZXNzYWdlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHJveHlTb2Nrc1VuZXhwZWN0ZWRWZXJzaW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHJveHlTb2Nrc1VzZXJuYW1lVG9vTG9uZzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHB1YmtleUF1dGhBZGRLZXlUb0FnZW50RXJyb3I7CisJLyoqKi8gcHVibGljIFN0cmluZyBwdWJrZXlBdXRoQWRkS2V5VG9BZ2VudFF1ZXN0aW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVia2V5QXV0aFdyb25nQ29tbWFuZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1YmtleUF1dGhXcm9uZ0tleTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1YmtleUF1dGhXcm9uZ1NpZ25hdHVyZUFsZ29yaXRobTsKQEAgLTEwNiw5ICsxMjYsMTMgQEAgcHVibGljIHN0YXRpYyBTc2hkVGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzZXJ2ZXJJZFdpdGhOdWw7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzZXNzaW9uQ2xvc2VGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzZXNzaW9uV2l0aG91dFVzZXJuYW1lOworCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRFZERTQUZvcm1hdEVycm9yOworCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRQYXlsb2FkTGVuZ3RoRXJyb3I7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudFJlcGx5TGVuZ3RoRXJyb3I7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudFJlcGx5VW5leHBlY3RlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50U2hvcnRSZWFkQnVmZmVyOworCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRVbmtub3duS2V5OworCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRXcm9uZ0tleUxlbmd0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50V3JvbmdOdW1iZXJPZktleXM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hDbG9zaW5nRG93bjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaENvbW1hbmRUaW1lb3V0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L0pHaXRTc2hBZ2VudEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9KR2l0U3NoQWdlbnRGYWN0b3J5LmphdmEKaW5kZXggMWVkMmFiOS4uYTBmZmQ1NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L0pHaXRTc2hBZ2VudEZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvSkdpdFNzaEFnZW50RmFjdG9yeS5qYXZhCkBAIC0xNywxMCArMTcsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50RmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcuaG9zdHMuSG9zdENvbmZpZ0VudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uRmFjdG9yeU1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jaGFubmVsLkNoYW5uZWxGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbi5Db25uZWN0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb24uU2Vzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5KR2l0Q2xpZW50U2Vzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Tc2hDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5Db25uZWN0b3JGYWN0b3J5OwogCiAvKioKQEAgLTQ5LDE4ICs1MywyNCBAQCBwdWJsaWMgSkdpdFNzaEFnZW50RmFjdG9yeShATm9uTnVsbCBDb25uZWN0b3JGYWN0b3J5IGZhY3RvcnksCiAJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8Q2hhbm5lbEZhY3Rvcnk+IGdldENoYW5uZWxGb3J3YXJkaW5nRmFjdG9yaWVzKAogCQkJRmFjdG9yeU1hbmFnZXIgbWFuYWdlcikgewotCQkvLyBObyBhZ2VudCBmb3J3YXJkaW5nIHN1cHBvcnRlZCB5ZXQuCisJCS8vIE5vIGFnZW50IGZvcndhcmRpbmcgc3VwcG9ydGVkLgogCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHVibGljIFNzaEFnZW50IGNyZWF0ZUNsaWVudChGYWN0b3J5TWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBzc2hkIDIuOC4wIHdpbGwgcGFzcyB1cyB0aGUgc2Vzc2lvbiBoZXJlLiBBdCB0aGF0IHBvaW50LCB3ZSBjYW4gZ2V0Ci0JCS8vIHRoZSBIb3N0Q29uZmlnRW50cnkgYW5kIGV4dHJhY3QgYW5kIGhhbmRsZSB0aGUgSWRlbnRpdHlBZ2VudCBzZXR0aW5nLgotCQkvLyBGb3Igbm93LCBwYXNzIG51bGwgdG8gbGV0IHRoZSBDb25uZWN0b3JGYWN0b3J5IGRvIGl0cyBkZWZhdWx0Ci0JCS8vIGJlaGF2aW9yIChQYWdlYW50IG9uIFdpbmRvd3MsIFNTSF9BVVRIX1NPQ0sgb24gVW5peGVzIHdpdGggdGhlCi0JCS8vIGpnaXQtYnVpbHRpbiBmYWN0b3J5KS4KLQkJcmV0dXJuIG5ldyBTc2hBZ2VudENsaWVudChmYWN0b3J5LmNyZWF0ZShudWxsLCBob21lRGlyKSk7CisJcHVibGljIFNzaEFnZW50IGNyZWF0ZUNsaWVudChTZXNzaW9uIHNlc3Npb24sIEZhY3RvcnlNYW5hZ2VyIG1hbmFnZXIpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgaWRlbnRpdHlBZ2VudCA9IG51bGw7CisJCWlmIChzZXNzaW9uIGluc3RhbmNlb2YgSkdpdENsaWVudFNlc3Npb24pIHsKKwkJCUhvc3RDb25maWdFbnRyeSBob3N0Q29uZmlnID0gKChKR2l0Q2xpZW50U2Vzc2lvbikgc2Vzc2lvbikKKwkJCQkJLmdldEhvc3RDb25maWdFbnRyeSgpOworCQkJaWRlbnRpdHlBZ2VudCA9IGhvc3RDb25maWcuZ2V0UHJvcGVydHkoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5ULAorCQkJCQludWxsKTsKKwkJfQorCQlpZiAoU3NoQ29uc3RhbnRzLk5PTkUuZXF1YWxzKGlkZW50aXR5QWdlbnQpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gbmV3IFNzaEFnZW50Q2xpZW50KGZhY3RvcnkuY3JlYXRlKGlkZW50aXR5QWdlbnQsIGhvbWVEaXIpKTsKIAl9CiAKIAlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9Tc2hBZ2VudENsaWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L1NzaEFnZW50Q2xpZW50LmphdmEKaW5kZXggMDg0ODNlNC4uY2JjYjRkMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L1NzaEFnZW50Q2xpZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L1NzaEFnZW50Q2xpZW50LmphdmEKQEAgLTExLDEwICsxMSwxMiBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0yMiwyMSArMjQsMjcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudDsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnRDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50S2V5Q29uc3RyYWludDsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLlNzaEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLktleVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXIuS2V5UGFpclByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbi5TZXNzaW9uQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLkJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLkJ1ZmZlckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLkJ1ZmZlclV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXIuQnl0ZUFycmF5QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXIua2V5cy5CdWZmZXJQdWJsaWNLZXlQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLmRlci5ERVJQYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5Tc2hkVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkNvbm5lY3RvcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiAvKioKLSAqIEEgY2xpZW50IGZvciBhbiBTU0gyIGFnZW50LiBUaGlzIGNsaWVudCBzdXBwb3J0cyBvbmx5IHF1ZXJ5aW5nIGlkZW50aXRpZXMgYW5kCi0gKiBzaWduYXR1cmUgcmVxdWVzdHMuCisgKiBBIGNsaWVudCBmb3IgYW4gU1NIMiBhZ2VudC4gVGhpcyBjbGllbnQgc3VwcG9ydHMgcXVlcnlpbmcgaWRlbnRpdGllcywKKyAqIHNpZ25hdHVyZSByZXF1ZXN0cywgYW5kIGFkZGluZyBrZXlzIHRvIGFuIGFnZW50ICh3aXRoIG9yIHdpdGhvdXQKKyAqIGNvbnN0cmFpbnRzKS4gUmVtb3Zpbmcga2V5cyBpcyBub3Qgc3VwcG9ydGVkLCBhbmQgdGhlIG9sZGVyIFNTSDEgcHJvdG9jb2wgaXMKKyAqIG5vdCBzdXBwb3J0ZWQuCiAgKgogICogQHNlZSA8YSBocmVmPSJodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtbWlsbGVyLXNzaC1hZ2VudC0wNCI+U1NICiAgKiAgICAgIEFnZW50IFByb3RvY29sLCBSRkMgZHJhZnQ8L2E+CkBAIC03MiwxMSArODAsMTggQEAgcHJpdmF0ZSBib29sZWFuIG9wZW4oYm9vbGVhbiBkZWJ1Z2dpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJYm9vbGVhbiBjb25uZWN0ZWQgPSBjb25uZWN0b3IgIT0gbnVsbCAmJiBjb25uZWN0b3IuY29ubmVjdCgpOwotCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJaWYgKGRlYnVnZ2luZykgewotCQkJCUxPRy5kZWJ1ZygiTm8gU1NIIGFnZW50IChTU0hfQVVUSF9TT0NLIG5vdCBzZXQpIik7IC8vJE5PTi1OTFMtMSQKKwkJYm9vbGVhbiBjb25uZWN0ZWQ7CisJCXRyeSB7CisJCQljb25uZWN0ZWQgPSBjb25uZWN0b3IgIT0gbnVsbCAmJiBjb25uZWN0b3IuY29ubmVjdCgpOworCQkJaWYgKCFjb25uZWN0ZWQgJiYgZGVidWdnaW5nKSB7CisJCQkJTE9HLmRlYnVnKCJObyBTU0ggYWdlbnQiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBBZ2VudCBub3QgcnVubmluZz8KKwkJCWlmIChkZWJ1Z2dpbmcpIHsKKwkJCQlMT0cuZGVidWcoIk5vIFNTSCBhZ2VudCIsIGUpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQl0aHJvdyBlOwogCQl9CiAJCXJldHVybiBjb25uZWN0ZWQ7CiAJfQpAQCAtMTI3LDE0ICsxNDIsMTcgQEAgcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBnZXRJZGVudGl0aWVzKCkKIAkJCUxpc3Q8TWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigKIAkJCQkJbnVtYmVyT2ZLZXlzKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZLZXlzOyBpKyspIHsKLQkJCQlQdWJsaWNLZXkga2V5ID0gcmVwbHkuZ2V0UHVibGljS2V5KCk7CisJCQkJUHVibGljS2V5IGtleSA9IHJlYWRLZXkocmVwbHkpOwogCQkJCVN0cmluZyBjb21tZW50ID0gcmVwbHkuZ2V0U3RyaW5nKCk7Ci0JCQkJaWYgKHRyYWNpbmcpIHsKLQkJCQkJTE9HLnRyYWNlKCJHb3QgU1NIIGFnZW50IHt9IGtleToge30ge30iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJS2V5VXRpbHMuZ2V0S2V5VHlwZShrZXkpLAotCQkJCQkJCUtleVV0aWxzLmdldEZpbmdlclByaW50KGtleSksIGNvbW1lbnQpOworCQkJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJCQlpZiAodHJhY2luZykgeworCQkJCQkJTE9HLnRyYWNlKCJHb3QgU1NIIGFnZW50IHt9IGtleToge30ge30iLCAvLyROT04tTkxTLTEkCisJCQkJCQkJCUtleVV0aWxzLmdldEtleVR5cGUoa2V5KSwKKwkJCQkJCQkJS2V5VXRpbHMuZ2V0RmluZ2VyUHJpbnQoa2V5KSwgY29tbWVudCk7CisJCQkJCX0KKwkJCQkJa2V5cy5hZGQobmV3IEFic3RyYWN0TWFwLlNpbXBsZUltbXV0YWJsZUVudHJ5PD4oa2V5LAorCQkJCQkJCWNvbW1lbnQpKTsKIAkJCQl9Ci0JCQkJa2V5cy5hZGQobmV3IEFic3RyYWN0TWFwLlNpbXBsZUltbXV0YWJsZUVudHJ5PD4oa2V5LCBjb21tZW50KSk7CiAJCQl9CiAJCQlyZXR1cm4ga2V5czsKIAkJfSBjYXRjaCAoQnVmZmVyRXhjZXB0aW9uIGUpIHsKQEAgLTIxNiw2ICsyMzQsMjIyIEBAIHB1YmxpYyBJdGVyYWJsZTw/IGV4dGVuZHMgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4gZ2V0SWRlbnRpdGllcygpCiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGRJZGVudGl0eShLZXlQYWlyIGtleSwgU3RyaW5nIGNvbW1lbnQsCisJCQlTc2hBZ2VudEtleUNvbnN0cmFpbnQuLi4gY29uc3RyYWludHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWJvb2xlYW4gZGVidWdnaW5nID0gTE9HLmlzRGVidWdFbmFibGVkKCk7CisJCWlmICghb3BlbihkZWJ1Z2dpbmcpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBOZWl0aGVyIFBhZ2VhbnQgMC43NiBub3IgV2luMzItT3BlblNTSCA4LjYgc3VwcG9ydCBjb21tYW5kCisJCS8vIFNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRC4gQWRkaW5nIGEga2V5IHdpdGggY29uc3RyYWludHMgd2lsbAorCQkvLyBmYWlsLiBUaGUgb25seSB3b3JrLWFyb3VuZCBmb3IgdXNlcnMgaXMgbm90IHRvIHVzZSAiY29uZmlybSIgb3IgInRpbWUKKwkJLy8gc3BlYyIgd2l0aCBBZGRLZXlzVG9BZ2VudCwgYW5kIG5vdCB0byB1c2Ugc2stKiBrZXlzLgorCQkvLworCQkvLyBXaXRoIGEgdHJ1ZSBPcGVuU1NIIFNTSCBhZ2VudCwga2V5IGNvbnN0cmFpbnRzIHdvcmsuCisJCWJ5dGUgY21kID0gKGNvbnN0cmFpbnRzICE9IG51bGwgJiYgY29uc3RyYWludHMubGVuZ3RoID4gMCkKKwkJCQk/IFNzaEFnZW50Q29uc3RhbnRzLlNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRAorCQkJCTogU3NoQWdlbnRDb25zdGFudHMuU1NIMl9BR0VOVENfQUREX0lERU5USVRZOworCQlieXRlW10gbWVzc2FnZSA9IG51bGw7CisJCUJ5dGVBcnJheUJ1ZmZlciBtc2cgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKCk7CisJCXRyeSB7CisJCQltc2cucHV0SW50KDApOworCQkJbXNnLnB1dEJ5dGUoY21kKTsKKwkJCVN0cmluZyBrZXlUeXBlID0gS2V5VXRpbHMuZ2V0S2V5VHlwZShrZXkpOworCQkJaWYgKEtleVBhaXJQcm92aWRlci5TU0hfRUQyNTUxOS5lcXVhbHMoa2V5VHlwZSkpIHsKKwkJCQkvLyBBcGFjaGUgTUlOQSBzc2hkIDIuOC4wIGxhY2tzIHN1cHBvcnQgZm9yIHdyaXRpbmcgZWQyNTUxOQorCQkJCS8vIHByaXZhdGUga2V5cyB0byBhIGJ1ZmZlci4KKwkJCQlwdXRFZDI1NTE5S2V5KG1zZywga2V5KTsKKwkJCX0gZWxzZSB7CisJCQkJbXNnLnB1dEtleVBhaXIoa2V5KTsKKwkJCX0KKwkJCW1zZy5wdXRTdHJpbmcoY29tbWVudCA9PSBudWxsID8gIiIgOiBjb21tZW50KTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGNvbnN0cmFpbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKFNzaEFnZW50S2V5Q29uc3RyYWludCBjb25zdHJhaW50IDogY29uc3RyYWludHMpIHsKKwkJCQkJY29uc3RyYWludC5wdXQobXNnKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZGVidWdnaW5nKSB7CisJCQkJTE9HLmRlYnVnKAorCQkJCQkJImFkZElkZW50aXR5OiBhZGRpbmcge30ga2V5IHt9IHRvIFNTSCBhZ2VudDsgY29tbWVudCB7fSIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCWtleVR5cGUsIEtleVV0aWxzLmdldEZpbmdlclByaW50KGtleS5nZXRQdWJsaWMoKSksCisJCQkJCQljb21tZW50KTsKKwkJCX0KKwkJCW1lc3NhZ2UgPSBtc2cuZ2V0Q29tcGFjdERhdGEoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIFRoZSBtZXNzYWdlIGNvbnRhaW5zIHRoZSBwcml2YXRlIGtleSBkYXRhLCBzbyBjbGVhciBpbnRlcm1lZGlhcnkKKwkJCS8vIGRhdGEgQVNBUC4KKwkJCW1zZy5jbGVhcigpOworCQl9CisJCUJ1ZmZlciByZXBseTsKKwkJdHJ5IHsKKwkJCXJlcGx5ID0gcnBjKGNtZCwgbWVzc2FnZSk7CisJCX0gZmluYWxseSB7CisJCQlBcnJheXMuZmlsbChtZXNzYWdlLCAoYnl0ZSkgMCk7CisJCX0KKwkJaW50IHJlcGx5TGVuZ3RoID0gcmVwbHkuYXZhaWxhYmxlKCk7CisJCWlmIChyZXBseUxlbmd0aCAhPSAxKSB7CisJCQl0aHJvdyBuZXcgU3NoRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudFJlcGx5VW5leHBlY3RlZCwKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJU3NoZFRleHQuZ2V0KCkuc3NoQWdlbnRQYXlsb2FkTGVuZ3RoRXJyb3IsCisJCQkJCQkJSW50ZWdlci52YWx1ZU9mKDEpLCBJbnRlZ2VyLnZhbHVlT2YocmVwbHlMZW5ndGgpKSkpOworCisJCX0KKwkJY21kID0gcmVwbHkuZ2V0Qnl0ZSgpOworCQlpZiAoY21kICE9IFNzaEFnZW50Q29uc3RhbnRzLlNTSF9BR0VOVF9TVUNDRVNTKSB7CisJCQl0aHJvdyBuZXcgU3NoRXhjZXB0aW9uKAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudFJlcGx5VW5leHBlY3RlZCwKKwkJCQkJCQlTc2hBZ2VudENvbnN0YW50cy5nZXRDb21tYW5kTWVzc2FnZU5hbWUoY21kKSkpOworCQl9CisJfQorCisJLyoqCisJICogV3JpdGVzIGFuIGVkMjU1MTkge0BsaW5rIEtleVBhaXJ9IHRvIGEge0BsaW5rIEJ1ZmZlcn0uIE9wZW5TU0ggc3BlY2lmaWVzCisJICogdGhhdCBpdCBleHBlY3RzIHRoZSAzMiBwdWJsaWMga2V5IGJ5dGVzLCBmb2xsb3dlZCBieSA2NCBieXRlcyBmb3JtZWQgYnkKKwkgKiBjb25jYXRlbmF0aW5nIHRoZSAzMiBwcml2YXRlIGtleSBieXRlcyB3aXRoIHRoZSAzMiBwdWJsaWMga2V5IGJ5dGVzLgorCSAqCisJICogQHBhcmFtIG1zZworCSAqICAgICAgICAgICAge0BsaW5rIEJ1ZmZlcn0gdG8gd3JpdGUgdG8KKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICB7QGxpbmsgS2V5UGFpcn0gdG8gd3JpdGUKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHByaXZhdGUga2V5IGNhbm5vdCBiZSB3cml0dGVuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRFZDI1NTE5S2V5KEJ1ZmZlciBtc2csIEtleVBhaXIga2V5KQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQnVmZmVyIHRtcCA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoMzYpOworCQl0bXAucHV0UmF3UHVibGljS2V5Qnl0ZXMoa2V5LmdldFB1YmxpYygpKTsKKwkJYnl0ZVtdIHB1YmxpY0J5dGVzID0gdG1wLmdldEJ5dGVzKCk7CisJCW1zZy5wdXRTdHJpbmcoS2V5UGFpclByb3ZpZGVyLlNTSF9FRDI1NTE5KTsKKwkJbXNnLnB1dEJ5dGVzKHB1YmxpY0J5dGVzKTsKKwkJLy8gTmV4dCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgMzIgYnl0ZSBwcml2YXRlIGtleSB2YWx1ZSB3aXRoIHRoZQorCQkvLyAzMiBieXRlcyBvZiB0aGUgcHVibGljIGtleS4KKwkJUHJpdmF0ZUtleSBwayA9IGtleS5nZXRQcml2YXRlKCk7CisJCVN0cmluZyBmb3JtYXQgPSBway5nZXRGb3JtYXQoKTsKKwkJaWYgKCEiUEtDUyM4Ii5lcXVhbHNJZ25vcmVDYXNlKGZvcm1hdCkpIHsgLy8kTk9OLU5MUy0xJAorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJLmZvcm1hdChTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudEVkRFNBRm9ybWF0RXJyb3IsIGZvcm1hdCkpOworCQl9CisJCWJ5dGVbXSBwcml2YXRlQnl0ZXMgPSBudWxsOworCQlieXRlW10gZW5jb2RlZCA9IHBrLmdldEVuY29kZWQoKTsKKwkJdHJ5IHsKKwkJCXByaXZhdGVCeXRlcyA9IGFzbjFQYXJzZShlbmNvZGVkLCAzMik7CisJCQlieXRlW10gY29tYmluZWQgPSBBcnJheXMuY29weU9mKHByaXZhdGVCeXRlcywgNjQpOworCQkJQXJyYXlzLmZpbGwocHJpdmF0ZUJ5dGVzLCAoYnl0ZSkgMCk7CisJCQlwcml2YXRlQnl0ZXMgPSBjb21iaW5lZDsKKwkJCVN5c3RlbS5hcnJheWNvcHkocHVibGljQnl0ZXMsIDAsIHByaXZhdGVCeXRlcywgMzIsIDMyKTsKKwkJCW1zZy5wdXRCeXRlcyhwcml2YXRlQnl0ZXMpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKHByaXZhdGVCeXRlcyAhPSBudWxsKSB7CisJCQkJQXJyYXlzLmZpbGwocHJpdmF0ZUJ5dGVzLCAoYnl0ZSkgMCk7CisJCQl9CisJCQlBcnJheXMuZmlsbChlbmNvZGVkLCAoYnl0ZSkgMCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBFeHRyYWN0cyB0aGUgcHJpdmF0ZSBrZXkgYnl0ZXMgZnJvbSBhbiBlbmNvZGVkIGVkMjU1MTkgcHJpdmF0ZSBrZXkgYnkKKwkgKiBwYXJzaW5nIHRoZSBieXRlcyBhcyBBU04uMSBhY2NvcmRpbmcgdG8gUkZDIDU5NTggKFBLQ1MgIzggZW5jb2RpbmcpOgorCSAqCisJICogPHByZT4KKwkgKiBPbmVBc3ltbWV0cmljS2V5IDo6PSBTRVFVRU5DRSB7CisJICogICB2ZXJzaW9uIFZlcnNpb24sCisJICogICBwcml2YXRlS2V5QWxnb3JpdGhtIFByaXZhdGVLZXlBbGdvcml0aG1JZGVudGlmaWVyLAorCSAqICAgcHJpdmF0ZUtleSBQcml2YXRlS2V5LAorCSAqICAgLi4uCisJICogfQorCSAqCisJICogVmVyc2lvbiA6Oj0gSU5URUdFUgorCSAqIFByaXZhdGVLZXlBbGdvcml0aG1JZGVudGlmaWVyIDo6PSBBbGdvcml0aG1JZGVudGlmaWVyCisJICogUHJpdmF0ZUtleSA6Oj0gT0NURVQgU1RSSU5HCisJICoKKwkgKiBBbGdvcml0aG1JZGVudGlmaWVyICA6Oj0gIFNFUVVFTkNFICB7CisJICogICBhbGdvcml0aG0gICBPQkpFQ1QgSURFTlRJRklFUiwKKwkgKiAgIHBhcmFtZXRlcnMgIEFOWSBERUZJTkVEIEJZIGFsZ29yaXRobSBPUFRJT05BTAorCSAqIH0KKwkgKiA8L3ByZT4KKwkgKiA8cD4KKwkgKiBhbmQgUkZDIDg0MTA6ICIuLi4gd2hlbiBlbmNvZGluZyBhIE9uZUFzeW1tZXRyaWNLZXkgb2JqZWN0LCB0aGUgcHJpdmF0ZQorCSAqIGtleSBpcyB3cmFwcGVkIGluIGEgQ3VydmVQcml2YXRlS2V5IG9iamVjdCBhbmQgd3JhcHBlZCBieSB0aGUgT0NURVQKKwkgKiBTVFJJTkcgb2YgdGhlICdwcml2YXRlS2V5JyBmaWVsZC4iCisJICogPC9wPgorCSAqCisJICogPHByZT4KKwkgKiBDdXJ2ZVByaXZhdGVLZXkgOjo9IE9DVEVUIFNUUklORworCSAqIDwvcHJlPgorCSAqCisJICogQHBhcmFtIGVuY29kZWQKKwkgKiAgICAgICAgICAgIGVuY29kZWQgcHJpdmF0ZSBrZXkgdG8gZXh0cmFjdCB0aGUgcHJpdmF0ZSBrZXkgYnl0ZXMgZnJvbQorCSAqIEBwYXJhbSBuCisJICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQKKwkgKiBAcmV0dXJuIHRoZSBleHRyYWN0ZWQgcHJpdmF0ZSBrZXkgYnl0ZXM7IG9mIGxlbmd0aCB7QGNvZGUgbn0KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHByaXZhdGUga2V5IGNhbm5vdCBiZSBleHRyYWN0ZWQKKwkgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1OTU4Ij5SRkMgNTk1ODwvYT4KKwkgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM4NDEwIj5SRkMgODQxMDwvYT4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBieXRlW10gYXNuMVBhcnNlKGJ5dGVbXSBlbmNvZGVkLCBpbnQgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYnl0ZVtdIHByaXZhdGVLZXkgPSBudWxsOworCQl0cnkgKERFUlBhcnNlciBieXRlUGFyc2VyID0gbmV3IERFUlBhcnNlcihlbmNvZGVkKTsKKwkJCQlERVJQYXJzZXIgb25lQXN5bW1ldHJpY0tleSA9IGJ5dGVQYXJzZXIucmVhZE9iamVjdCgpCisJCQkJCQkuY3JlYXRlUGFyc2VyKCkpIHsKKwkJCW9uZUFzeW1tZXRyaWNLZXkucmVhZE9iamVjdCgpOyAvLyBza2lwIHZlcnNpb24KKwkJCW9uZUFzeW1tZXRyaWNLZXkucmVhZE9iamVjdCgpOyAvLyBza2lwIGFsZ29yaXRobSBpZGVudGlmaWVyCisJCQlwcml2YXRlS2V5ID0gb25lQXN5bW1ldHJpY0tleS5yZWFkT2JqZWN0KCkuZ2V0VmFsdWUoKTsKKwkJCS8vIFRoZSBsYXN0IG4gYnl0ZXMgb2YgdGhpcyBtdXN0IGJlIHRoZSBwcml2YXRlIGtleSBieXRlcworCQkJcmV0dXJuIEFycmF5cy5jb3B5T2ZSYW5nZShwcml2YXRlS2V5LAorCQkJCQlwcml2YXRlS2V5Lmxlbmd0aCAtIG4sIHByaXZhdGVLZXkubGVuZ3RoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChwcml2YXRlS2V5ICE9IG51bGwpIHsKKwkJCQlBcnJheXMuZmlsbChwcml2YXRlS2V5LCAoYnl0ZSkgMCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBBIHNhZmUgdmVyc2lvbiBvZiB7QGxpbmsgQnVmZmVyI2dldFB1YmxpY0tleSgpfS4gVXBvbiByZXR1cm4gdGhlCisJICogYnVmZmVycydzIHJlYWQgcG9zaXRpb24gaXMgYWx3YXlzIGFmdGVyIHRoZSBrZXkgYmxvYjsgYW55IGV4Y2VwdGlvbnMKKwkgKiB0aHJvd24gYnkgdHJ5aW5nIHRvIHJlYWQgdGhlIGtleSBhcmUgbG9nZ2VkIGFuZCA8ZW0+bm90PC9lbT4gcHJvcGFnYXRlZC4KKwkgKiA8cD4KKwkgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGFuIFNTSCBhZ2VudCBtaWdodCBjb250YWluIGFuZCBkZWxpdmVyIGtleXMgdGhhdAorCSAqIHdlIGNhbm5vdCBoYW5kbGUgKGZvciBpbnN0YW5jZSBlZDQ0OCBrZXlzKS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gYnVmZmVyCisJICogICAgICAgICAgICB0byByZWFkIHRoZSBrZXkgZnJvbQorCSAqIEByZXR1cm4gdGhlIHtAbGluayBQdWJsaWNLZXl9LCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGtleSBjb3VsZCBub3QgYmUKKwkgKiAgICAgICAgIHJlYWQKKwkgKiBAdGhyb3dzIEJ1ZmZlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBsZW5ndGggb2YgdGhlIGtleSBibG9iIGNhbm5vdCBiZSByZWFkIG9yIGlzIGNvcnJ1cHRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFB1YmxpY0tleSByZWFkS2V5KEJ1ZmZlciBidWZmZXIpIHRocm93cyBCdWZmZXJFeGNlcHRpb24geworCQlpbnQgZW5kT2ZCdWZmZXIgPSBidWZmZXIud3BvcygpOworCQlpbnQga2V5TGVuZ3RoID0gYnVmZmVyLmdldEludCgpOworCQlpbnQgYWZ0ZXJLZXkgPSBidWZmZXIucnBvcygpICsga2V5TGVuZ3RoOworCQlpZiAoa2V5TGVuZ3RoIDw9IDAgfHwgYWZ0ZXJLZXkgPiBlbmRPZkJ1ZmZlcikgeworCQkJdGhyb3cgbmV3IEJ1ZmZlckV4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoU3NoZFRleHQuZ2V0KCkuc3NoQWdlbnRXcm9uZ0tleUxlbmd0aCwKKwkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGtleUxlbmd0aCksCisJCQkJCQkJSW50ZWdlci50b1N0cmluZyhidWZmZXIucnBvcygpKSwKKwkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGVuZE9mQnVmZmVyKSkpOworCQl9CisJCS8vIExpbWl0IHN1YnNlcXVlbnQgcmVhZHMgdG8gdGhlIHB1YmxpYyBrZXkgYmxvYgorCQlidWZmZXIud3BvcyhhZnRlcktleSk7CisJCXRyeSB7CisJCQlyZXR1cm4gYnVmZmVyLmdldFJhd1B1YmxpY0tleShCdWZmZXJQdWJsaWNLZXlQYXJzZXIuREVGQVVMVCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cud2FybihTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudFVua25vd25LZXksIGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0gZmluYWxseSB7CisJCQkvLyBSZXN0b3JlIHJlYWwgYnVmZmVyIGVuZAorCQkJYnVmZmVyLndwb3MoZW5kT2ZCdWZmZXIpOworCQkJLy8gU2V0IHRoZSByZWFkIHBvc2l0aW9uIHRvIGFmdGVyIHRoaXMga2V5LCBldmVuIGlmIGZhaWxlZAorCQkJYnVmZmVyLnJwb3MoYWZ0ZXJLZXkpOworCQl9CisJfQorCiAJcHJpdmF0ZSBCdWZmZXIgcnBjKGJ5dGUgY29tbWFuZCwgYnl0ZVtdIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgQnl0ZUFycmF5QnVmZmVyKGNvbm5lY3Rvci5ycGMoY29tbWFuZCwgbWVzc2FnZSkpOwogCX0KQEAgLTIzMCwxMSArNDY0LDYgQEAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewogCX0KIAogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZElkZW50aXR5KEtleVBhaXIga2V5LCBTdHJpbmcgY29tbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcmVtb3ZlSWRlbnRpdHkoUHVibGljS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL1NzaGRTZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvU3NoZFNlc3Npb24uamF2YQppbmRleCBjMjcwYjQ0Li5iOTRjY2M2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvU3NoZFNlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvU3NoZFNlc3Npb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTgsIDIwMjEgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMiBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtNTEsNiArNTEsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZnRwLmNvbW1vbi5TZnRwRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoLk9wZW5Tc2hDb25maWdGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuQXV0aGVudGljYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLkF1dGhlbnRpY2F0aW9uTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuSkdpdFNzaENsaWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLlNzaGRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkZ0cENoYW5uZWw7CkBAIC0xMTgsNiArMTIxLDcgQEAgcHJpdmF0ZSBDbGllbnRTZXNzaW9uIGNvbm5lY3QoVVJJaXNoIHRhcmdldCwgTGlzdDxVUklpc2g+IGp1bXBzLAogCQlDbGllbnRTZXNzaW9uIHJlc3VsdFNlc3Npb24gPSBudWxsOwogCQlDbGllbnRTZXNzaW9uIHByb3h5U2Vzc2lvbiA9IG51bGw7CiAJCVBvcnRGb3J3YXJkaW5nVHJhY2tlciBwb3J0Rm9yd2FyZCA9IG51bGw7CisJCUF1dGhlbnRpY2F0aW9uTG9nZ2VyIGF1dGhMb2cgPSBudWxsOwogCQl0cnkgewogCQkJaWYgKCFob3BzLmlzRW1wdHkoKSkgewogCQkJCVVSSWlzaCBob3AgPSBob3BzLnJlbW92ZSgwKTsKQEAgLTEzOCw3ICsxNDIsMTEgQEAgcHJpdmF0ZSBDbGllbnRTZXNzaW9uIGNvbm5lY3QoVVJJaXNoIHRhcmdldCwgTGlzdDxVUklpc2g+IGp1bXBzLAogCQkJCQkJSkdpdFNzaENsaWVudC5MT0NBTF9GT1JXQVJEX0FERFJFU1MsCiAJCQkJCQlwb3J0Rm9yd2FyZC5nZXRCb3VuZEFkZHJlc3MoKSk7CiAJCQl9Ci0JCQlyZXN1bHRTZXNzaW9uID0gY29ubmVjdChob3N0Q29uZmlnLCBjb250ZXh0LCB0aW1lb3V0KTsKKwkJCWludCB0aW1lb3V0SW5TZWMgPSBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygKKwkJCQkJaG9zdENvbmZpZy5nZXRQcm9wZXJ0eShTc2hDb25zdGFudHMuQ09OTkVDVF9USU1FT1VUKSk7CisJCQlyZXN1bHRTZXNzaW9uID0gY29ubmVjdChob3N0Q29uZmlnLCBjb250ZXh0LAorCQkJCQl0aW1lb3V0SW5TZWMgPiAwID8gRHVyYXRpb24ub2ZTZWNvbmRzKHRpbWVvdXRJblNlYykKKwkJCQkJCQk6IHRpbWVvdXQpOwogCQkJaWYgKHByb3h5U2Vzc2lvbiAhPSBudWxsKSB7CiAJCQkJZmluYWwgUG9ydEZvcndhcmRpbmdUcmFja2VyIHRyYWNrZXIgPSBwb3J0Rm9yd2FyZDsKIAkJCQlmaW5hbCBDbGllbnRTZXNzaW9uIHBTZXNzaW9uID0gcHJveHlTZXNzaW9uOwpAQCAtMTYwLDYgKzE2OCw3IEBAIHByaXZhdGUgQ2xpZW50U2Vzc2lvbiBjb25uZWN0KFVSSWlzaCB0YXJnZXQsIExpc3Q8VVJJaXNoPiBqdW1wcywKIAkJCQlyZXN1bHRTZXNzaW9uLmFkZENsb3NlRnV0dXJlTGlzdGVuZXIobGlzdGVuZXIpOwogCQkJfQogCQkJLy8gQXV0aGVudGljYXRpb24gdGltZW91dCBpcyBieSBkZWZhdWx0IDIgbWludXRlcy4KKwkJCWF1dGhMb2cgPSBuZXcgQXV0aGVudGljYXRpb25Mb2dnZXIocmVzdWx0U2Vzc2lvbik7CiAJCQlyZXN1bHRTZXNzaW9uLmF1dGgoKS52ZXJpZnkocmVzdWx0U2Vzc2lvbi5nZXRBdXRoVGltZW91dCgpKTsKIAkJCXJldHVybiByZXN1bHRTZXNzaW9uOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0xNjgsMTcgKzE3NywzNCBAQCBwcml2YXRlIENsaWVudFNlc3Npb24gY29ubmVjdChVUklpc2ggdGFyZ2V0LCBMaXN0PFVSSWlzaD4ganVtcHMsCiAJCQljbG9zZShyZXN1bHRTZXNzaW9uLCBlKTsKIAkJCWlmIChlIGluc3RhbmNlb2YgU3NoRXhjZXB0aW9uICYmICgoU3NoRXhjZXB0aW9uKSBlKQogCQkJCQkuZ2V0RGlzY29ubmVjdENvZGUoKSA9PSBTU0gyX0RJU0NPTk5FQ1RfTk9fTU9SRV9BVVRIX01FVEhPRFNfQVZBSUxBQkxFKSB7Ci0JCQkJLy8gRW5zdXJlIHRoZSB1c2VyIGdldHMgdG8ga25vdyBvbiB3aGljaCBVUkkgdGhlIGF1dGhlbnRpY2F0aW9uCi0JCQkJLy8gd2FzIGRlbmllZC4KKwkJCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdChTc2hkVGV4dC5nZXQoKS5sb2dpbkRlbmllZCwgaG9zdCwKKwkJCQkJCUludGVnZXIudG9TdHJpbmcocG9ydCkpOwogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odGFyZ2V0LAotCQkJCQkJZm9ybWF0KFNzaGRUZXh0LmdldCgpLmxvZ2luRGVuaWVkLCBob3N0LAotCQkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpKSwKLQkJCQkJCWUpOworCQkJCQkJd2l0aEF1dGhMb2cobWVzc2FnZSwgYXV0aExvZyksIGUpOworCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgU3NoRXhjZXB0aW9uICYmIGUKKwkJCQkJLmdldENhdXNlKCkgaW5zdGFuY2VvZiBBdXRoZW50aWNhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKSB7CisJCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpOworCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odGFyZ2V0LAorCQkJCQkJd2l0aEF1dGhMb2cobWVzc2FnZSwgYXV0aExvZyksIGUuZ2V0Q2F1c2UoKSk7CiAJCQl9CiAJCQl0aHJvdyBlOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGF1dGhMb2cgIT0gbnVsbCkgeworCQkJCWF1dGhMb2cuY2xlYXIoKTsKKwkJCX0KIAkJfQogCX0KIAorCXByaXZhdGUgU3RyaW5nIHdpdGhBdXRoTG9nKFN0cmluZyBtZXNzYWdlLCBBdXRoZW50aWNhdGlvbkxvZ2dlciBhdXRoTG9nKSB7CisJCWlmIChhdXRoTG9nICE9IG51bGwpIHsKKwkJCVN0cmluZyBsb2cgPSBTdHJpbmcuam9pbihTeXN0ZW0ubGluZVNlcGFyYXRvcigpLCBhdXRoTG9nLmdldExvZygpKTsKKwkJCWlmICghbG9nLmlzRW1wdHkoKSkgeworCQkJCXJldHVybiBtZXNzYWdlICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSArIGxvZzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbWVzc2FnZTsKKwl9CisKIAlwcml2YXRlIENsaWVudFNlc3Npb24gY29ubmVjdChIb3N0Q29uZmlnRW50cnkgY29uZmlnLAogCQkJQXR0cmlidXRlUmVwb3NpdG9yeSBjb250ZXh0LCBEdXJhdGlvbiB0aW1lb3V0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9Tc2hkU2Vzc2lvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9Tc2hkU2Vzc2lvbkZhY3RvcnkuamF2YQppbmRleCA1OGNmOGUxLi5jNzkyYzE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvU3NoZFNlc3Npb25GYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL1NzaGRTZXNzaW9uRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMSBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkludmFsaWRQYXRoRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CiBpbXBvcnQgamF2YS50aW1lLkR1cmF0aW9uOwpAQCAtMzQsNyArMzUsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5rZXlib2FyZC5Vc2VyQXV0aEtleWJvYXJkSW50ZXJhY3RpdmVGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmhvc3RzLkhvc3RDb25maWdFbnRyeVJlc29sdmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uTmFtZWRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uU3NoRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29tcHJlc3Npb24uQnVpbHRpbkNvbXByZXNzaW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLkZpbGVQYXNzd29yZFByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMubG9hZGVyLm9wZW5zc2gua2RmLkJDcnlwdEtkZk9wdGlvbnM7CkBAIC00NCw3ICs0NCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2guT3BlblNzaENvbmZpZ0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5BdXRoZW50aWNhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuQ2FjaGluZ0tleVBhaXJQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLkdzc0FwaVdpdGhNaWNBdXRoRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLkpHaXRQYXNzd29yZEF1dGhGYWN0b3J5OwpAQCAtMjQzLDYgKzI0MiwxMiBAQCBwdWJsaWMgU3NoZFNlc3Npb24gZ2V0U2Vzc2lvbihVUklpc2ggdXJpLAogCQkJCQkJCUpHaXRTc2hDbGllbnQuUFJFRkVSUkVEX0FVVEhFTlRJQ0FUSU9OUywKIAkJCQkJCQlkZWZhdWx0QXV0aHMpOwogCQkJCX0KKwkJCQl0cnkgeworCQkJCQlqZ2l0Q2xpZW50LnNldEF0dHJpYnV0ZShKR2l0U3NoQ2xpZW50LkhPTUVfRElSRUNUT1JZLAorCQkJCQkJCWhvbWUuZ2V0QWJzb2x1dGVGaWxlKCkudG9QYXRoKCkpOworCQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHwgSW52YWxpZFBhdGhFeGNlcHRpb24gZSkgeworCQkJCQkvLyBJZ25vcmUKKwkJCQl9CiAJCQkJLy8gT3RoZXIgdGhpbmdzPwogCQkJCXJldHVybiBjbGllbnQ7CiAJCQl9KTsKQEAgLTI1NSwxMyArMjYwLDcgQEAgcHVibGljIFNzaGRTZXNzaW9uIGdldFNlc3Npb24oVVJJaXNoIHVyaSwKIAkJCWlmIChlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uKSB7CiAJCQkJdGhyb3cgKFRyYW5zcG9ydEV4Y2VwdGlvbikgZTsKIAkJCX0KLQkJCVRocm93YWJsZSBjYXVzZSA9IGU7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFNzaEV4Y2VwdGlvbiAmJiBlCi0JCQkJCS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQXV0aGVudGljYXRpb25DYW5jZWxlZEV4Y2VwdGlvbikgewotCQkJCS8vIFJlc3VsdHMgaW4gYSBuaWNlciBlcnJvciBtZXNzYWdlCi0JCQkJY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHVyaSwgY2F1c2UuZ2V0TWVzc2FnZSgpLCBjYXVzZSk7CisJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHVyaSwgZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvQlVJTEQgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvQlVJTEQKaW5kZXggYzliNWQzNy4uNmY2Yzg4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L0JVSUxECisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9CVUlMRApAQCAtMTMsNiArMTMsNyBAQAogKSArIFtQS0cgKyBjIGZvciBjIGluIFsKICAgICAiYXBpL0Fic3RyYWN0UmVtb3RlQ29tbWFuZFRlc3QuamF2YSIsCiAgICAgImRpZmYvQWJzdHJhY3REaWZmVGVzdENhc2UuamF2YSIsCisgICAgImludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxUb29sVGVzdENhc2UuamF2YSIsCiAgICAgImludGVybmFsL3JldndhbGsvT2JqZWN0UmVhY2hhYmlsaXR5VGVzdENhc2UuamF2YSIsCiAgICAgImludGVybmFsL3JldndhbGsvUmVhY2hhYmlsaXR5Q2hlY2tlclRlc3RDYXNlLmphdmEiLAogICAgICJpbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NUZXN0Q2FzZS5qYXZhIiwKQEAgLTQyLDYgKzQzLDcgQEAKIEVYQ0xVREVEID0gWwogICAgIFBLRyArICJhcGkvU2VjdXJpdHlNYW5hZ2VyVGVzdC5qYXZhIiwKICAgICBQS0cgKyAiYXBpL1NlY3VyaXR5TWFuYWdlck1pc3NpbmdQZXJtaXNzaW9uc1Rlc3QuamF2YSIsCisgICAgUEtHICsgImxpYi9Db21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QuamF2YSIsCiBdCiAKIHRlc3RzKHRlc3RzID0gZ2xvYigKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAyOTUyZWZiLi44MzJhOTNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zMyw2ICszMyw3IEBACiAgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCiAgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCiAgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmY7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCiAgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sO3ZlcnNpb249Ils3LjAuMCw3LjEuMCkiLAogIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSJbNy4wLjAsNy4xLjApIiwKICBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnJldndhbGs7dmVyc2lvbj0iWzcuMC4wLDcuMS4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9idWlsZC5wcm9wZXJ0aWVzCmluZGV4IGI1MjdhNzQuLjIxMmM4YmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9idWlsZC5wcm9wZXJ0aWVzCkBAIC03LDUgKzcsNCBAQAogICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAogICAgICAgICAgICAgICAgYmluLXRzdC8sXAogICAgICAgICAgICAgICAgYmluLwotYWRkaXRpb25hbC5idW5kbGVzID0gb3JnLmFwYWNoZS5sb2c0aixcCi0gICAgICAgICAgICAgICAgICAgICBvcmcuc2xmNGouYmluZGluZy5sb2c0ajEyCithZGRpdGlvbmFsLmJ1bmRsZXMgPSBvcmcuc2xmNGouYmluZGluZy5zaW1wbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsCmluZGV4IDM0ZGYwN2QuLmUyMDFiZGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3Rlc3RzLmJ6bApAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICAgICAgXQogICAgICAgICBpZiBzcmMuZW5kc3dpdGgoIlNlY3VyaXR5TWFuYWdlck1pc3NpbmdQZXJtaXNzaW9uc1Rlc3QuamF2YSIpOgogICAgICAgICAgICAgYWRkaXRpb25hbF9kZXBzID0gWwotICAgICAgICAgICAgICAgICIvL2xpYjpsb2c0aiIsCisgICAgICAgICAgICAgICAgIi8vbGliOnNsZjRqLXNpbXBsZSIsCiAgICAgICAgICAgICBdCiAgICAgICAgIGlmIHNyYy5lbmRzd2l0aCgiSkRLSHR0cENvbm5lY3Rpb25UZXN0LmphdmEiKToKICAgICAgICAgICAgIGFkZGl0aW9uYWxfZGVwcyA9IFsKQEAgLTY4LDYgKzY4LDcgQEAKICAgICAgICAgICAgICAgICAiLy9saWI6amF2YWV3YWgiLAogICAgICAgICAgICAgICAgICIvL2xpYjpqdW5pdCIsCiAgICAgICAgICAgICAgICAgIi8vbGliOnNsZjRqLWFwaSIsCisgICAgICAgICAgICAgICAgIi8vbGliOnNsZjRqLXNpbXBsZSIsCiAgICAgICAgICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdDpqZ2l0IiwKICAgICAgICAgICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Omp1bml0IiwKICAgICAgICAgICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmxmczpqZ2l0LWxmcyIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvamdpdC1zMy1jb25maWcuZGlzYWJsZWQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9qZ2l0LXMzLWNvbmZpZy5kaXNhYmxlZC5wcm9wZXJ0aWVzCmluZGV4IGQ1NDA5NzcuLjNmMzYyODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9qZ2l0LXMzLWNvbmZpZy5kaXNhYmxlZC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9qZ2l0LXMzLWNvbmZpZy5kaXNhYmxlZC5wcm9wZXJ0aWVzCkBAIC00MCw2ICs0MCwxNSBAQAogIyAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L21hbmFnZS1saWZlY3ljbGUtdXNpbmctY29uc29sZS5odG1sCiAjCiAKKyMgQVdTIEFQSSBzaWduYXR1cmUgdmVyc2lvbiAoZGVmYXVsdHMgdG8gMikKKyMgYXdzLmFwaS5zaWduYXR1cmUudmVyc2lvbj00CisKKyMgQVdTIFMzIFJlZ2lvbiBEb21haW4gKGRlZmF1bHRzIHRvIHMzLmFtYXpvbmF3cy5jb20pCisjIGRvbWFpbjogczMtdXMtZWFzdC0yLmFtYXpvbmF3cy5jb20KKworIyBBV1MgUzMgUmVnaW9uIChyZXF1aXJlZCBpZiBhd3MuYXBpLnNpZ25hdHVyZS52ZXJzaW9uPTQsIG11c3QgbWF0Y2ggZG9tYWluKQorIyByZWdpb246IHVzLWVhc3QtMgorCiAjIFRlc3QgYnVja2V0IG5hbWUKIHRlc3QuYnVja2V0PWpnaXQuZWNsaXBzZS5vcmcKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL2xvZzRqLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2YTczMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQotIyBSb290IGxvZ2dlciBvcHRpb24KLWxvZzRqLnJvb3RMb2dnZXI9SU5GTywgc3Rkb3V0Ci0KLSMgRGlyZWN0IGxvZyBtZXNzYWdlcyB0byBzdGRvdXQKLWxvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuc3Rkb3V0LlRhcmdldD1TeXN0ZW0ub3V0Ci1sb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHt5eXl5LU1NLWRkIEhIOm1tOnNzfSAlLTVwICVjezF9OiVMIC0gJW0lbgotbG9nNGouYXBwZW5kZXIuZmlsZUxvZ2dlci5idWZmZXJlZElPID0gdHJ1ZQotbG9nNGouYXBwZW5kZXIuZmlsZUxvZ2dlci5idWZmZXJTaXplID0gNDA5NgotCi0jbG9nNGoubG9nZ2VyLm9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUyA9IERFQlVHCi0jbG9nNGoubG9nZ2VyLm9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLkZpbGVTbmFwc2hvdCA9IERFQlVHCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvc2ltcGxlbG9nZ2VyLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0LXJzcmMvc2ltcGxlbG9nZ2VyLnByb3BlcnRpZXMKaW5kZXggMDExYjJmOC4uMjM1ZmVhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC1yc3JjL3NpbXBsZWxvZ2dlci5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3QtcnNyYy9zaW1wbGVsb2dnZXIucHJvcGVydGllcwpAQCAtMSw5ICsxLDkgQEAKLW9yZy5zbGY0ai5zaW1wbGVMb2dnZXIubG9nRmlsZSA9IFN5c3RlbS5lcnIKLW9yZy5zbGY0ai5zaW1wbGVMb2dnZXIuY2FjaGVPdXRwdXRTdHJlYW0gPSB0cnVlCi1vcmcuc2xmNGouc2ltcGxlTG9nZ2VyLmRlZmF1bHRMb2dMZXZlbCA9IGluZm8KLW9yZy5zbGY0ai5zaW1wbGVMb2dnZXIuc2hvd0RhdGVUaW1lID0gdHJ1ZQotb3JnLnNsZjRqLnNpbXBsZUxvZ2dlci5kYXRlVGltZUZvcm1hdCA9IEhIOm1tOnNzLlNTU1hYWAotb3JnLnNsZjRqLnNpbXBsZUxvZ2dlci5zaG93VGhyZWFkTmFtZSA9IHRydWUKK29yZy5zbGY0ai5zaW1wbGVMb2dnZXIuZGVmYXVsdExvZ0xldmVsPWluZm8KK29yZy5zbGY0ai5zaW1wbGVMb2dnZXIubG9nRmlsZT1TeXN0ZW0uZXJyCitvcmcuc2xmNGouc2ltcGxlTG9nZ2VyLnNob3dEYXRlVGltZT10cnVlCitvcmcuc2xmNGouc2ltcGxlTG9nZ2VyLmRhdGVUaW1lRm9ybWF0PXl5eXktTU0tZGQgSEg6bW06c3MKK29yZy5zbGY0ai5zaW1wbGVMb2dnZXIuc2hvd1RocmVhZE5hbWU9dHJ1ZQorb3JnLnNsZjRqLnNpbXBsZUxvZ2dlci5zaG93TG9nTmFtZT10cnVlCiAKICNvcmcuc2xmNGouc2ltcGxlTG9nZ2VyLmxvZy5vcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlMgPSBkZWJ1ZwogI29yZy5zbGY0ai5zaW1wbGVMb2dnZXIubG9nLm9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLkZpbGVTbmFwc2hvdCA9IGRlYnVnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCmluZGV4IDg2NzMxMGIuLjU4NGQxNDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC00MDIsNyArNDAzLDkgQEAgcHVibGljIHZvaWQgdGVzdE1vZGlmeVcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0QWRkTTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQXBwbHlSZXN1bHQgcmVzdWx0ID0gaW5pdCgiTTEiLCBmYWxzZSwgdHJ1ZSk7CiAJCWFzc2VydEVxdWFscygxLCByZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApLmNhbkV4ZWN1dGUoKSk7CisJCWlmIChGUy5ERVRFQ1RFRC5zdXBwb3J0c0V4ZWN1dGUoKSkgeworCQkJYXNzZXJ0VHJ1ZShGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkpKTsKKwkJfQogCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgIk0xIiksCiAJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CiAJfQpAQCAtNDExLDcgKzQxNCw5IEBAIHB1YmxpYyB2b2lkIHRlc3RBZGRNMSgpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNMigpIHRocm93cyBFeGNlcHRpb24gewogCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJNMiIsIHRydWUsIHRydWUpOwogCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKS5jYW5FeGVjdXRlKCkpOworCQlpZiAoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpIHsKKwkJCWFzc2VydFRydWUoRlMuREVURUNURUQuY2FuRXhlY3V0ZShyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKSk7CisJCX0KIAkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJNMiIpLAogCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOwogCX0KQEAgLTQyMCw3ICs0MjUsMTAgQEAgcHVibGljIHZvaWQgdGVzdE1vZGlmeU0yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE1vZGlmeU0zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUFwcGx5UmVzdWx0IHJlc3VsdCA9IGluaXQoIk0zIiwgdHJ1ZSwgdHJ1ZSk7CiAJCWFzc2VydEVxdWFscygxLCByZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKS5jYW5FeGVjdXRlKCkpOworCQlpZiAoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpIHsKKwkJCWFzc2VydEZhbHNlKAorCQkJCQlGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkpKTsKKwkJfQogCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgIk0zIiksCiAJCQkJYi5nZXRTdHJpbmcoMCwgYi5zaXplKCksIGZhbHNlKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhCmluZGV4IGU3ZWQxMDIuLjg3YmU4MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEKQEAgLTcxLDYgKzcxLDcgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgR2l0IHNldFVwUmVwb1dpdGhSZW1vdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmVwb3NpdG9yeSByZW1vdGVSZXBvc2l0b3J5ID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UocmVtb3RlUmVwb3NpdG9yeSk7CiAJCXRyeSAoR2l0IHJlbW90ZUdpdCA9IG5ldyBHaXQocmVtb3RlUmVwb3NpdG9yeSkpIHsKIAkJCS8vIGNvbW1pdCBzb21ldGhpbmcKIAkJCXdyaXRlVHJhc2hGaWxlKCJUZXN0LnR4dCIsICJIZWxsbyB3b3JsZCIpOwpAQCAtODUsNiArODYsNyBAQCBwcml2YXRlIEdpdCBzZXRVcFJlcG9XaXRoUmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlydXAuZm9yY2VVcGRhdGUoKTsKIAogCQkJUmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnkgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQkJYWRkUmVwb1RvQ2xvc2UobG9jYWxSZXBvc2l0b3J5KTsKIAkJCUdpdCBsb2NhbEdpdCA9IG5ldyBHaXQobG9jYWxSZXBvc2l0b3J5KTsKIAkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBsb2NhbFJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CiAJCQlSZW1vdGVDb25maWcgcmMgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgIm9yaWdpbiIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVja291dENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZWNrb3V0Q29tbWFuZFRlc3QuamF2YQppbmRleCBlNTIwNzMyLi5hYjAxODRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZWNrb3V0Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZWNrb3V0Q29tbWFuZFRlc3QuamF2YQpAQCAtMjkyLDYgKzI5Miw3IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVja291dEFubm90YXRlZFRhZygpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0UmVtb3RlVHJhY2tpbmdXaXRoVXBzdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmVwb3NpdG9yeSBkYjIgPSBjcmVhdGVSZXBvc2l0b3J5V2l0aFJlbW90ZSgpOworCQlhZGRSZXBvVG9DbG9zZShkYjIpOwogCiAJCUdpdC53cmFwKGRiMikuY2hlY2tvdXQoKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuc2V0TmFtZSgidGVzdCIpCiAJCQkJLnNldFN0YXJ0UG9pbnQoIm9yaWdpbi90ZXN0IikKQEAgLTMxMSw2ICszMTIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRSZW1vdGVUcmFja2luZ1dpdGhVcHN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0UmVtb3RlVHJhY2tpbmdXaXRob3V0TG9jYWxCcmFuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmVwb3NpdG9yeSBkYjIgPSBjcmVhdGVSZXBvc2l0b3J5V2l0aFJlbW90ZSgpOworCQlhZGRSZXBvVG9DbG9zZShkYjIpOwogCiAJCS8vIGNoZWNrb3V0IHJlbW90ZSB0cmFja2luZyBicmFuY2ggaW4gc2Vjb25kIHJlcG9zaXRvcnkKIAkJLy8gKG5vIGxvY2FsIGJyYW5jaGVzIGV4aXN0IHlldCBpbiBzZWNvbmQgcmVwb3NpdG9yeSkKQEAgLTg2OCw3ICs4NzAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Tm9uRGVsZXRhYmxlRmlsZXNPbldpbmRvd3MoKQogCQkJY29Db21tYW5kLnNldE5hbWUoY3J1ZENvbW1pdC5nZXROYW1lKCkpLmNhbGwoKTsKIAkJCUNoZWNrb3V0UmVzdWx0IHJlc3VsdCA9IGNvQ29tbWFuZC5nZXRSZXN1bHQoKTsKIAkJCWFzc2VydEVxdWFscyhTdGF0dXMuTk9OREVMRVRFRCwgcmVzdWx0LmdldFN0YXR1cygpKTsKLQkJCWFzc2VydEVxdWFscygiW1Rlc3QudHh0LCB0b0JlRGVsZXRlZC50eHRdIiwKKwkJCWFzc2VydEVxdWFscygiW3RvQmVEZWxldGVkLnR4dF0iLAogCQkJCQlyZXN1bHQuZ2V0UmVtb3ZlZExpc3QoKS50b1N0cmluZygpKTsKIAkJCWFzc2VydEVxdWFscygiW3RvQmVDcmVhdGVkLnR4dCwgdG9CZU1vZGlmaWVkLnR4dF0iLAogCQkJCQlyZXN1bHQuZ2V0TW9kaWZpZWRMaXN0KCkudG9TdHJpbmcoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YQppbmRleCBmNGYwZWNkLi4wZDM4MTk3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmRUZXN0LmphdmEKQEAgLTE3NSw3ICsxNzUsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlcnJ5UGlja0NvbmZsaWN0UmVzb2x1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCiAJCQlhc3NlcnRFcXVhbHMoQ2hlcnJ5UGlja1N0YXR1cy5DT05GTElDVElORywgcmVzdWx0LmdldFN0YXR1cygpKTsKIAkJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5NRVJHRV9NU0cpLmV4aXN0cygpKTsKLQkJCWFzc2VydEVxdWFscygic2lkZVxuXG5Db25mbGljdHM6XG5cdGFcbiIsIGRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKKwkJCWFzc2VydEVxdWFscygic2lkZVxuXG4jIENvbmZsaWN0czpcbiNcdGFcbiIsCisJCQkJCWRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKIAkJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5DSEVSUllfUElDS19IRUFEKQogCQkJCQkuZXhpc3RzKCkpOwogCQkJYXNzZXJ0RXF1YWxzKHNpZGVDb21taXQuZ2V0SWQoKSwgZGIucmVhZENoZXJyeVBpY2tIZWFkKCkpOwpAQCAtMjA3LDcgKzIwOCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVycnlQaWNrQ29uZmxpY3RSZXNvbHV0aW9uTm9Db21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nIGV4cGVjdGVkID0gIjw8PDw8PDwgbWFzdGVyXG5hKG1hc3Rlcilcbj09PT09PT1cbmEoc2lkZSlcbj4+Pj4+Pj4gNTI3NDYwYSBzaWRlXG4iOwogCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlYWQoImEiKSk7CiAJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5NRVJHRV9NU0cpLmV4aXN0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaWRlXG5cbkNvbmZsaWN0czpcblx0YVxuIiwgZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOworCQlhc3NlcnRFcXVhbHMoInNpZGVcblxuIyBDb25mbGljdHM6XG4jXHRhXG4iLCBkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CiAJCWFzc2VydEZhbHNlKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuQ0hFUlJZX1BJQ0tfSEVBRCkKIAkJCQkuZXhpc3RzKCkpOwogCQlhc3NlcnRFcXVhbHMoUmVwb3NpdG9yeVN0YXRlLlNBRkUsIGRiLmdldFJlcG9zaXRvcnlTdGF0ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2xvbmVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggZGUyNTg3MC4uYzkyOGQyYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmRUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkxpc3RCcmFuY2hDb21tYW5kLkxpc3RNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CkBAIC0xMTUsNiArMTE2LDQ5IEBAIHB1YmxpYyB2b2lkIHRlc3RDbG9uZVJlcG9zaXRvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmVSZXBvc2l0b3J5X3JlZkxvZ0ZvckxvY2FsUmVmcygpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKKwkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0Q2xvbmVSZXBvc2l0b3J5Iik7CisJCUNsb25lQ29tbWFuZCBjb21tYW5kID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpOworCQljb21tYW5kLnNldERpcmVjdG9yeShkaXJlY3RvcnkpOworCQljb21tYW5kLnNldFVSSShmaWxlVXJpKCkpOworCQlHaXQgZ2l0MiA9IGNvbW1hbmQuY2FsbCgpOworCQlSZXBvc2l0b3J5IGNsb25lZFJlcG8gPSBnaXQyLmdldFJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoY2xvbmVkUmVwbyk7CisKKwkJTGlzdDxSZWY+IGNsb25lZFJlZnMgPSBjbG9uZWRSZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQlTdHJlYW08UmVmPiByZW1vdGVSZWZzID0gY2xvbmVkUmVmcy5zdHJlYW0oKQorCQkJCS5maWx0ZXIoQ2xvbmVDb21tYW5kVGVzdDo6aXNSZW1vdGUpOworCQlTdHJlYW08UmVmPiBsb2NhbEhlYWRzUmVmcyA9IGNsb25lZFJlZnMuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKENsb25lQ29tbWFuZFRlc3Q6OmlzTG9jYWxIZWFkKTsKKworCQlyZW1vdGVSZWZzLmZvckVhY2gocmVmIC0+IGFzc2VydEZhbHNlKAorCQkJCSJSZWYgIiArIHJlZi5nZXROYW1lKCkKKwkJCQkJCSsgIiBpcyByZW1vdGUgYW5kIHNob3VsZCBub3QgaGF2ZSBhIHJlZmxvZyIsCisJCQkJaGFzUmVmTG9nKGNsb25lZFJlcG8sIHJlZikpKTsKKwkJbG9jYWxIZWFkc1JlZnMuZm9yRWFjaChyZWYgLT4gYXNzZXJ0VHJ1ZSgKKwkJCQkiUmVmICIgKyByZWYuZ2V0TmFtZSgpCisJCQkJCQkrICIgaXMgbG9jYWwgaGVhZCBhbmQgc2hvdWxkIGhhdmUgYSByZWZsb2ciLAorCQkJCWhhc1JlZkxvZyhjbG9uZWRSZXBvLCByZWYpKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1JlbW90ZShSZWYgcmVmKSB7CisJCXJldHVybiByZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfUkVNT1RFUyk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsSGVhZChSZWYgcmVmKSB7CisJCXJldHVybiAhaXNSZW1vdGUocmVmKSAmJiByZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpOworCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzUmVmTG9nKFJlcG9zaXRvcnkgcmVwbywgUmVmIHJlZikgeworCQl0cnkgeworCQkJcmV0dXJuIHJlcG8uZ2V0UmVmbG9nUmVhZGVyKHJlZi5nZXROYW1lKCkpLmdldExhc3RFbnRyeSgpICE9IG51bGw7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihpb2UpOworCQl9CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmVSZXBvc2l0b3J5RXhwbGljaXRHaXREaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlKR2l0SW50ZXJuYWxFeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdENsb25lUmVwb3NpdG9yeSIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhCmluZGV4IDgwODQ1MDUuLjM1ZGU3M2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZsb2dFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRDb25maWcuQ2xlYW51cE1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5GaWxlQmFzZWRDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGUuU3VibW9kdWxlV2FsazsKQEAgLTUxNSw2ICs1MTYsNjIgQEAgcHVibGljIHZvaWQgY29tbWl0QW1lbmRXaXRoQXV0aG9yU2hvdWxkVXNlSXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAl9CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbW1pdE1lc3NhZ2VWZXJiYXRpbSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJd3JpdGVUcmFzaEZpbGUoImZpbGUxIiwgImZpbGUxIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUxIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdHRlZCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCIjaW5pdGlhbCBjb21taXQiKQorCQkJCQkuY2FsbCgpOworCisJCQlhc3NlcnRFcXVhbHMoIiNpbml0aWFsIGNvbW1pdCIsIGNvbW1pdHRlZC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY29tbWl0TWVzc2FnZVN0cmlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQl3cml0ZVRyYXNoRmlsZSgiZmlsZTEiLCAiZmlsZTEiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZTEiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0dGVkID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoCisJCQkJCSIjQ29tbWVudFxuaW5pdGlhbCBjb21taXRcdFxuXG4gY29tbWl0IGJvZHkgXG4gXHQjYW5vdGhlciBjb21tZW50IikKKwkJCQkJLnNldENsZWFudXBNb2RlKENsZWFudXBNb2RlLlNUUklQKS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscygiaW5pdGlhbCBjb21taXRcblxuIGNvbW1pdCBib2R5IiwKKwkJCQkJY29tbWl0dGVkLmdldEZ1bGxNZXNzYWdlKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb21taXRNZXNzYWdlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJd3JpdGVUcmFzaEZpbGUoImZpbGUxIiwgImZpbGUxIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUxIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdHRlZCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKAorCQkJCQkiI0NvbW1lbnRcbmluaXRpYWwgY29tbWl0XHRcblxuIGNvbW1pdCBib2R5IFxuXG5cbiBcdCNhbm90aGVyIGNvbW1lbnQgICIpCisJCQkJCS5zZXRDbGVhbnVwTW9kZShDbGVhbnVwTW9kZS5ERUZBVUxUKS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscygiaW5pdGlhbCBjb21taXRcblxuIGNvbW1pdCBib2R5IiwKKwkJCQkJY29tbWl0dGVkLmdldEZ1bGxNZXNzYWdlKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb21taXRNZXNzYWdlRGVmYXVsdFdoaXRlc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCXdyaXRlVHJhc2hGaWxlKCJmaWxlMSIsICJmaWxlMSIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlMSIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXR0ZWQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgKKwkJCQkJIiNDb21tZW50XG5pbml0aWFsIGNvbW1pdFx0XG5cbiBjb21taXQgYm9keSBcblxuXG4gXHQjYW5vdGhlciBjb21tZW50ICAiKQorCQkJCQkuc2V0Q2xlYW51cE1vZGUoQ2xlYW51cE1vZGUuREVGQVVMVCkuc2V0RGVmYXVsdENsZWFuKGZhbHNlKQorCQkJCQkuY2FsbCgpOworCisJCQlhc3NlcnRFcXVhbHMoCisJCQkJCSIjQ29tbWVudFxuaW5pdGlhbCBjb21taXRcblxuIGNvbW1pdCBib2R5XG5cbiBcdCNhbm90aGVyIGNvbW1lbnQiLAorCQkJCQljb21taXR0ZWQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGNvbW1pdEVtcHR5Q29tbWl0cygpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhCmluZGV4IGI0NjBlM2YuLmFiODdmYTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhCkBAIC0xMCw5ICsxMCwxMCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwpAQCAtMTAwLDYgKzEwMSwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMi1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYWxpY2UqIikpOwogCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYm9iKiIpKTsKIAkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgImEqIiwgImIqIiwgImMqIikpOworCisJCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgMCkpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NiIsIGRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgMSkpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NiIsIGRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgLTEwKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1NTkyNzkwNWYyMWUzYmM3YzAwYTNkODNhMzFiZjRlZDNhIiwKKwkJCQkJZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCA1MCkpOwogCQl9IGVsc2UgewogCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGMyKSk7CiAJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzMpKTsKQEAgLTEwOCw2ICsxMTUsMTggQEAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlhc3NlcnRFcXVhbHMoIjM3NDdkYjMiLCBkZXNjcmliZShjMiwgZmFsc2UsIHRydWUpKTsKIAkJCWFzc2VydEVxdWFscygiNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCBmYWxzZSwgdHJ1ZSkpOwogCQkJYXNzZXJ0RXF1YWxzKCIzZTU2M2M1IiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlKSk7CisKKwkJCWFzc2VydEVxdWFscygiMzc0N2RiMzI2NyIsIGRlc2NyaWJlKGMyLCBmYWxzZSwgdHJ1ZSwgMTApKTsKKwkJCWFzc2VydEVxdWFscygiNDQ1NzllYmU3ZiIsIGRlc2NyaWJlKGMzLCBmYWxzZSwgdHJ1ZSwgMTApKTsKKwkJCWFzc2VydEVxdWFscygiM2U1NjNjNTU5MiIsIGRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgMTApKTsKKworCQkJYXNzZXJ0RXF1YWxzKCIzZTU2IiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAtMTApKTsKKwkJCWFzc2VydEVxdWFscygiM2U1NiIsIGRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgMCkpOworCQkJYXNzZXJ0RXF1YWxzKCIzZTU2IiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAyKSk7CisJCQlhc3NlcnRFcXVhbHMoIjNlNTYzYzU1OTI3OTA1ZjIxZTNiYzdjMDBhM2Q4M2EzMWJmNGVkM2EiLAorCQkJCQlkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDQwKSk7CisJCQlhc3NlcnRFcXVhbHMoIjNlNTYzYzU1OTI3OTA1ZjIxZTNiYzdjMDBhM2Q4M2EzMWJmNGVkM2EiLAorCQkJCQlkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDQyKSk7CiAJCX0KIAogCQkvLyB0ZXN0IGRlZmF1bHQgdGFyZ2V0CkBAIC00NzQsMTAgKzQ5MywxNSBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHRvdWNoKEZpbGUgZiwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAorCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxLCBib29sZWFuIGxvbmdEZXNjLCBib29sZWFuIGFsd2F5cywKKwkJCWludCBhYmJyZXYpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0VGFncyhkZXNjcmliZVVzZUFsbFRhZ3MpCisJCQkJLnNldExvbmcobG9uZ0Rlc2MpLnNldEFsd2F5cyhhbHdheXMpLnNldEFiYnJldihhYmJyZXYpLmNhbGwoKTsKKwl9CisKIAlwcml2YXRlIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCBjMSwgYm9vbGVhbiBsb25nRGVzYywgYm9vbGVhbiBhbHdheXMpCiAJCQl0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnaXQuZGVzY3JpYmUoKS5zZXRUYXJnZXQoYzEpLnNldFRhZ3MoZGVzY3JpYmVVc2VBbGxUYWdzKQotCQkJCS5zZXRMb25nKGxvbmdEZXNjKS5zZXRBbHdheXMoYWx3YXlzKS5jYWxsKCk7CisJCXJldHVybiBkZXNjcmliZShjMSwgbG9uZ0Rlc2MsIGFsd2F5cywgT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKTsKIAl9CiAKIAlwcml2YXRlIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCBjMSkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xSZXBvc2l0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xSZXBvc2l0b3J5VGVzdC5qYXZhCmluZGV4IGQwZGZkMWEuLmI5MzdiMWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sUmVwb3NpdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFJlcG9zaXRvcnlUZXN0LmphdmEKQEAgLTEsNDAgKzEsMTEgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUsIEl2YW4gTW90c2NoIDxpdmFuLm1vdHNjaEBic2lhZy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIDIwMjIgSXZhbiBNb3RzY2ggPGl2YW4ubW90c2NoQGJzaWFnLmNvbT4gYW5kIG90aGVycwogICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCi0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgogICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgotICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCi0gKiBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQotICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKLSAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKQEAgLTE3MywxNSArMTQ0LDIyIEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjdHVhbEVudHJ5IHsKIAogCXByaXZhdGUgRGlyQ2FjaGUgZGlyQ2FjaGU7CiAKKwlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0Q3JMZigpIHsKKwkJU3RyaW5nIGVvbCA9IG1vY2tTeXN0ZW1SZWFkZXIuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisJCXJldHVybiAiXHJcbiIuZXF1YWxzKGVvbCk7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGZvciBFT0wgdG8gd29yaywgdGhlIHRleHQgYXR0cmlidXRlIG11c3QgYmUgc2V0CiAJCXNldHVwR2l0QW5kRG9IYXJkUmVzZXQobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIiogdGV4dD1hdXRvIik7CiAJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ0ZXh0PWF1dG8iLCBlbnRyeUNSTEYuYXR0cnMpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7CisJCS8vIGVvbD1uYXRpdmUgaXMgdGhlIGRlZmF1bHQhCisJCVN0cmluZyBleHBlY3RlZCA9IGlzRGVmYXVsdENyTGYoKSA/IENPTlRFTlRfQ1JMRiA6IENPTlRFTlRfTEY7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCBjaGVja0VudHJ5Q29udGVudChBY3R1YWxFbnRyeSBlbnRyeSwgU3RyaW5nIGZpbGVDb250ZW50LApAQCAtMTk5LDkgKzE3NywxMSBAQCBwdWJsaWMgdm9pZCB0ZXN0X0NvbmZpZ0F1dG9DUkxGX2ZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNldHVwR2l0QW5kRG9IYXJkUmVzZXQoQXV0b0NSTEYuRkFMU0UsIG51bGwsIG51bGwsIG51bGwsICIqIHRleHQ9YXV0byIpOwogCQljb2xsZWN0UmVwb3NpdG9yeVN0YXRlKCk7CiAJCWFzc2VydEVxdWFscygidGV4dD1hdXRvIiwgZW50cnlDUkxGLmF0dHJzKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOworCQkvLyBlb2w9bmF0aXZlIGlzIHRoZSBkZWZhdWx0IQorCQlTdHJpbmcgZXhwZWN0ZWQgPSBpc0RlZmF1bHRDckxmKCkgPyBDT05URU5UX0NSTEYgOiBDT05URU5UX0xGOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CiAJfQogCiAJQFRlc3QKQEAgLTI1MCwzNCArMjMwLDI0IEBAIHB1YmxpYyB2b2lkIHRlc3RfQ29uZmlnRU9MX2NybGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdF9Db25maWdFT0xfbmF0aXZlX3dpbmRvd3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG9yaWdMaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxyXG4iKTsKLQkJdHJ5IHsKLQkJCS8vIGZvciBFT0wgdG8gd29yaywgdGhlIHRleHQgYXR0cmlidXRlIG11c3QgYmUgc2V0Ci0JCQlzZXR1cEdpdEFuZERvSGFyZFJlc2V0KG51bGwsIEVPTC5OQVRJVkUsICIqLnR4dCB0ZXh0IiwgbnVsbCwgbnVsbCk7Ci0JCQljb2xsZWN0UmVwb3NpdG9yeVN0YXRlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoInRleHQiLCBlbnRyeUNSTEYuYXR0cnMpOwotCQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQl9IGZpbmFsbHkgewotCQkJU3lzdGVtLnNldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsIG9yaWdMaW5lU2VwYXJhdG9yKTsKLQkJfQorCQltb2NrU3lzdGVtUmVhZGVyLnNldFdpbmRvd3MoKTsKKwkJLy8gZm9yIEVPTCB0byB3b3JrLCB0aGUgdGV4dCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQKKwkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChudWxsLCBFT0wuTkFUSVZFLCAiKi50eHQgdGV4dCIsIG51bGwsIG51bGwpOworCQljb2xsZWN0UmVwb3NpdG9yeVN0YXRlKCk7CisJCWFzc2VydEVxdWFscygidGV4dCIsIGVudHJ5Q1JMRi5hdHRycyk7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9DUkxGLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgQ09OVEVOVF9DUkxGLCBDT05URU5UX0xGKTsKIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RfQ29uZmlnRU9MX25hdGl2ZV94bml4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBvcmlnTGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotCQl0cnkgewotCQkJLy8gZm9yIEVPTCB0byB3b3JrLCB0aGUgdGV4dCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQKLQkJCXNldHVwR2l0QW5kRG9IYXJkUmVzZXQobnVsbCwgRU9MLk5BVElWRSwgIioudHh0IHRleHQiLCBudWxsLCBudWxsKTsKLQkJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKLQkJCWFzc2VydEVxdWFscygidGV4dCIsIGVudHJ5Q1JMRi5hdHRycyk7Ci0JCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCX0gZmluYWxseSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgb3JpZ0xpbmVTZXBhcmF0b3IpOwotCQl9CisJCW1vY2tTeXN0ZW1SZWFkZXIuc2V0VW5peCgpOworCQkvLyBmb3IgRU9MIHRvIHdvcmssIHRoZSB0ZXh0IGF0dHJpYnV0ZSBtdXN0IGJlIHNldAorCQlzZXR1cEdpdEFuZERvSGFyZFJlc2V0KG51bGwsIEVPTC5OQVRJVkUsICIqLnR4dCB0ZXh0IiwgbnVsbCwgbnVsbCk7CisJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgZW50cnlDUkxGLmF0dHJzKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7CiAJfQogCiAJQFRlc3QKQEAgLTI5Nyw5ICsyNjcsMTAgQEAgcHVibGljIHZvaWQgdGVzdF9Db25maWdBdXRvQ1JMRl9mYWxzZV9Db25maWdFT0xfbmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNldHVwR2l0QW5kRG9IYXJkUmVzZXQoQXV0b0NSTEYuRkFMU0UsIEVPTC5OQVRJVkUsICIqLnR4dCB0ZXh0IiwgbnVsbCwgbnVsbCk7CiAJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgZW50cnlDUkxGLmF0dHJzKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSBpc0RlZmF1bHRDckxmKCkgPyBDT05URU5UX0NSTEYgOiBDT05URU5UX0xGOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CiAJfQogCiAJQFRlc3QKQEAgLTUyNCw5ICs0OTUsMTIgQEAgcHVibGljIHZvaWQgdGVzdF9HbG9iYWxFT0xfbGZfSW5mb0VPTF91bnNwZWNfUm9vdEVPTF9jcmxmKCkKIAkJLy8gaW5mbyBvdmVycmlkZXMgYWxsCiAJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgZW50cnlDUkxGLmF0dHJzKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOworCQkvLyAhZW9sIG1lYW5zIHVuc3BlY2lmaWVkLCBzbyB1c2UgdGhlIGRlZmF1bHQgb2YgY29yZS5lb2wsIHdoaWNoIGlzCisJCS8vIG5hdGl2ZS4KKwkJU3RyaW5nIGV4cGVjdGVkID0gaXNEZWZhdWx0Q3JMZigpID8gQ09OVEVOVF9DUkxGIDogQ09OVEVOVF9MRjsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOwogCX0KIAogCUBUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQW5kUHVsbENvbW1hbmRzUmVjdXJzZVN1Ym1vZHVsZXNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQW5kUHVsbENvbW1hbmRzUmVjdXJzZVN1Ym1vZHVsZXNUZXN0LmphdmEKaW5kZXggMzZiYTdjZS4uOWVhNjRlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaEFuZFB1bGxDb21tYW5kc1JlY3Vyc2VTdWJtb2R1bGVzVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hBbmRQdWxsQ29tbWFuZHNSZWN1cnNlU3VibW9kdWxlc1Rlc3QuamF2YQpAQCAtMjU5LDcgKzI1OSw4IEBAIHByaXZhdGUgUmV2Q29tbWl0IHVwZGF0ZVN1Ym1vZHVsZVJldmlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIHRoZSBjb21taXQgdGhhdCB3YXMgY3JlYXRlZAogCQl0cnkgKFN1Ym1vZHVsZVdhbGsgdyA9IFN1Ym1vZHVsZVdhbGsuZm9ySW5kZXgoZ2l0LmdldFJlcG9zaXRvcnkoKSkpIHsKIAkJCWFzc2VydFRydWUody5uZXh0KCkpOwotCQkJdHJ5IChHaXQgZyA9IG5ldyBHaXQody5nZXRSZXBvc2l0b3J5KCkpKSB7CisJCQl0cnkgKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IHcuZ2V0UmVwb3NpdG9yeSgpOworCQkJCQlHaXQgZyA9IG5ldyBHaXQocmVwb3NpdG9yeSkpIHsKIAkJCQlnLmZldGNoKCkuc2V0UmVtb3RlKFJFTU9URSkuc2V0UmVmU3BlY3MoUkVGU1BFQykuY2FsbCgpOwogCQkJCWcucmVzZXQoKS5zZXRNb2RlKFJlc2V0VHlwZS5IQVJEKS5zZXRSZWYoY29tbWl0MS5uYW1lKCkpLmNhbGwoKTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaENvbW1hbmRUZXN0LmphdmEKaW5kZXggNjQ3OWQxNS4uM2VjNDU0YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaENvbW1hbmRUZXN0LmphdmEKQEAgLTc3LDYgKzc3LDI2IEBAIHB1YmxpYyB2b2lkIHRlc3RGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoSGFzUmVmTG9nRm9yUmVtb3RlUmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGNyZWF0ZSBhbiBpbml0aWFsIGNvbW1pdCBTSEExIGZvciB0aGUgZGVmYXVsdCBicmFuY2gKKwkJT2JqZWN0SWQgZGVmYXVsdEJyYW5jaFNoYTEgPSByZW1vdGVHaXQuY29tbWl0KCkKKwkJCQkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCkuZ2V0SWQoKTsKKworCQlnaXQuZmV0Y2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCS5zZXRSZWZTcGVjcygicmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpLmNhbGwoKTsKKworCQlMaXN0PFJlZj4gYWxsRmV0Y2hlZFJlZnMgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkuZ2V0UmVmcygpOworCQlhc3NlcnRFcXVhbHMoYWxsRmV0Y2hlZFJlZnMuc2l6ZSgpLCAxKTsKKwkJUmVmIHJlbW90ZVJlZiA9IGFsbEZldGNoZWRSZWZzLmdldCgwKTsKKworCQlhc3NlcnRUcnVlKHJlbW90ZVJlZi5nZXROYW1lKCkuc3RhcnRzV2l0aChDb25zdGFudHMuUl9SRU1PVEVTKSk7CisJCWFzc2VydEVxdWFscyhkZWZhdWx0QnJhbmNoU2hhMSwgcmVtb3RlUmVmLmdldE9iamVjdElkKCkpOworCQlhc3NlcnROb3ROdWxsKGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0UmVmbG9nUmVhZGVyKHJlbW90ZVJlZi5nZXROYW1lKCkpCisJCQkJLmdldExhc3RFbnRyeSgpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RGb3JjZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCQlyZW1vdGVHaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiY29tbWl0IikuY2FsbCgpOwogCQlyZW1vdGVHaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiY29tbWl0MiIpLmNhbGwoKTsKQEAgLTk2LDYgKzExNiw1MyBAQCBwdWJsaWMgdm9pZCB0ZXN0Rm9yY2VkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAl9CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGZXRjaFNpbXBsZU5lZ2F0aXZlUmVmU3BlYygpIHRocm93cyBFeGNlcHRpb24geworCQlyZW1vdGVHaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiY29tbWl0IikuY2FsbCgpOworCisJCUZldGNoUmVzdWx0IHJlcyA9IGdpdC5mZXRjaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJLnNldFJlZlNwZWNzKCJyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL3Rlc3QiLAorCQkJCQkJIl46cmVmcy9oZWFkcy90ZXN0IikKKwkJCQkuY2FsbCgpOworCQlhc3NlcnROdWxsKHJlcy5nZXRUcmFja2luZ1JlZlVwZGF0ZSgicmVmcy9oZWFkcy90ZXN0IikpOworCisJCXJlcyA9IGdpdC5mZXRjaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJLnNldFJlZlNwZWNzKCJyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL3Rlc3QiLAorCQkJCQkJIl5yZWZzL2hlYWRzL21hc3RlciIpCisJCQkJLmNhbGwoKTsKKwkJYXNzZXJ0TnVsbChyZXMuZ2V0VHJhY2tpbmdSZWZVcGRhdGUoInJlZnMvaGVhZHMvdGVzdCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG5lZ2F0aXZlUmVmU3BlY0ZpbHRlckJ5U291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQiKS5jYWxsKCk7CisJCXJlbW90ZUdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKCJ0ZXN0IikuY2FsbCgpOworCQlyZW1vdGVHaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiY29tbWl0MSIpLmNhbGwoKTsKKwkJcmVtb3RlR2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoImRldiIpLmNhbGwoKTsKKworCQlGZXRjaFJlc3VsdCByZXMgPSBnaXQuZmV0Y2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCS5zZXRSZWZTcGVjcygicmVmcy8qOnJlZnMvb3JpZ2lucy8qIiwgIl5yZWZzLyovdGVzdCIpCisJCQkJLmNhbGwoKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXMuZ2V0VHJhY2tpbmdSZWZVcGRhdGUoInJlZnMvb3JpZ2lucy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydE51bGwocmVzLmdldFRyYWNraW5nUmVmVXBkYXRlKCJyZWZzL29yaWdpbnMvaGVhZHMvdGVzdCIpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXMuZ2V0VHJhY2tpbmdSZWZVcGRhdGUoInJlZnMvb3JpZ2lucy9oZWFkcy9kZXYiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBuZWdhdGl2ZVJlZlNwZWNGaWx0ZXJCeURlc3RpbmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQiKS5jYWxsKCk7CisJCXJlbW90ZUdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKCJtZXRhIikuY2FsbCgpOworCQlyZW1vdGVHaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiY29tbWl0MSIpLmNhbGwoKTsKKwkJcmVtb3RlR2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoImRhdGEiKS5jYWxsKCk7CisKKwkJRmV0Y2hSZXN1bHQgcmVzID0gZ2l0LmZldGNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkuc2V0UmVmU3BlY3MoInJlZnMvKjpyZWZzL3NlY3JldC8qIiwgIl46cmVmcy9zZWNyZXQvKi9tZXRhIikKKwkJCQkuY2FsbCgpOworCQlhc3NlcnROb3ROdWxsKHJlcy5nZXRUcmFja2luZ1JlZlVwZGF0ZSgicmVmcy9zZWNyZXQvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnROdWxsKHJlcy5nZXRUcmFja2luZ1JlZlVwZGF0ZSgicmVmcy9zZWNyZXQvaGVhZHMvbWV0YSIpKTsKKwkJYXNzZXJ0Tm90TnVsbChyZXMuZ2V0VHJhY2tpbmdSZWZVcGRhdGUoInJlZnMvc2VjcmV0L2hlYWRzL2RhdGEiKSk7CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCBmZXRjaEFkZHNCcmFuY2hlcygpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgYnJhbmNoMSA9ICJiMSI7CiAJCWZpbmFsIFN0cmluZyBicmFuY2gyID0gImIyIjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTHNSZW1vdGVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mc1JlbW90ZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggMTJlYzJhYS4uMDVhZjE3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mc1JlbW90ZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mc1JlbW90ZUNvbW1hbmRUZXN0LmphdmEKQEAgLTIxLDYgKzIxLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIExzUmVtb3RlQ29tbWFuZFRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewpAQCAtMTA3LDYgKzEwOSwyMCBAQCBwdWJsaWMgdm9pZCB0ZXN0THNSZW1vdGVXaXRob3V0TG9jYWxSZXBvc2l0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0THNSZW1vdGVXaXRob3V0TG9jYWxSZXBvc2l0b3J5VXJsSW5zdGVhZE9mKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdXJpID0gZmlsZVVyaSgpOworCQlTdG9yZWRDb25maWcgdXNlckNvbmZpZyA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldFVzZXJDb25maWcoKTsKKwkJdXNlckNvbmZpZy5sb2FkKCk7CisJCXVzZXJDb25maWcuc2V0U3RyaW5nKCJ1cmwiLCB1cmksICJpbnN0ZWFkT2YiLCAiZmlsZTovLy9mb28iKTsKKwkJdXNlckNvbmZpZy5zYXZlKCk7CisJCUNvbGxlY3Rpb248UmVmPiByZWZzID0gR2l0LmxzUmVtb3RlUmVwb3NpdG9yeSgpLnNldFJlbW90ZSgiZmlsZTovLy9mb28iKQorCQkJCS5zZXRIZWFkcyh0cnVlKS5jYWxsKCk7CisJCWFzc2VydE5vdE51bGwocmVmcyk7CisJCWFzc2VydEVxdWFscygyLCByZWZzLnNpemUoKSk7CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0THNSZW1vdGVXaXRoU3ltUmVmcygpIHRocm93cyBFeGNlcHRpb24gewogCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RSZXBvc2l0b3J5Iik7CiAJCUNsb25lQ29tbWFuZCBjb21tYW5kID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQppbmRleCBiYzRlOTQwLi45MTdiNmMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeVN0YXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlNldHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuQ29udGVudE1lcmdlU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5tZXJnZS5NZXJnZVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlci5NZXJnZUZhaWx1cmVSZWFzb247CkBAIC01NTQsNyArNTU1LDcgQEAgcHVibGljIHZvaWQgdGVzdE1lcmdlTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKQogCQkJCQkuc2V0U3RyYXRlZ3koTWVyZ2VTdHJhdGVneS5SRVNPTFZFKS5jYWxsKCk7CiAKLQkJCWFzc2VydEVxdWFscygiTWVyZ2UgYnJhbmNoICdzaWRlJ1xuXG5Db25mbGljdHM6XG5cdGFcbiIsCisJCQlhc3NlcnRFcXVhbHMoIk1lcmdlIGJyYW5jaCAnc2lkZSdcblxuIyBDb25mbGljdHM6XG4jXHRhXG4iLAogCQkJCQlkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CiAJCX0KIApAQCAtMTc4Nyw3ICsxNzg4LDcgQEAgcHVibGljIHZvaWQgdGVzdFNxdWFzaE1lcmdlQ29uZmxpY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJCQkrIGRhdGVGb3JtYXR0ZXIuZm9ybWF0RGF0ZSh0aGlyZAogCQkJCQkJCQkJLmdldEF1dGhvcklkZW50KCkpICsgIlxuXG5cdHRoaXJkIGNvbW1pdFxuIiwKIAkJCQkJZGIucmVhZFNxdWFzaENvbW1pdE1zZygpKTsKLQkJCWFzc2VydEVxdWFscygiXG5Db25mbGljdHM6XG5cdGZpbGUyXG4iLCBkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CisJCQlhc3NlcnRFcXVhbHMoIlxuIyBDb25mbGljdHM6XG4jXHRmaWxlMlxuIiwgZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCiAJCQlTdGF0dXMgc3RhdCA9IGdpdC5zdGF0dXMoKS5jYWxsKCk7CiAJCQlhc3NlcnRFcXVhbHMoU2V0cy5vZigiZmlsZTIiKSwgc3RhdC5nZXRDb25mbGljdGluZygpKTsKQEAgLTE4ODEsNiArMTg4Miw3IEBAIHB1YmxpYyB2b2lkIHRlc3RGYXN0Rm9yd2FyZE9ubHlOb3RQb3NzaWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZU1lcmdlV2l0aENvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gZGJfdCA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJQnJhbmNoQnVpbGRlciBtYXN0ZXIgPSBkYl90LmJyYW5jaCgibWFzdGVyIik7CiAJCQlSZXZDb21taXQgbTAgPSBtYXN0ZXIuY29tbWl0KCkKIAkJCQkJLmFkZCgiZiIsICIxXG4yXG4zXG40XG41XG42XG43XG44XG45XG4iKS5tZXNzYWdlKCJtMCIpCkBAIC0yMDEyLDcgKzIwMTQsNzQgQEAgcHVibGljIHZvaWQgdGVzdE1lcmdlQ29uZmxpY3RXaXRoTWVzc2FnZU9wdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKS5zZXRTdHJhdGVneShNZXJnZVN0cmF0ZWd5LlJFU09MVkUpCiAJCQkJCS5zZXRNZXNzYWdlKCJ1c2VyIG1lc3NhZ2UiKS5jYWxsKCk7CiAKLQkJCWFzc2VydEVxdWFscygidXNlciBtZXNzYWdlXG5cbkNvbmZsaWN0czpcblx0YVxuIiwKKwkJCWFzc2VydEVxdWFscygidXNlciBtZXNzYWdlXG5cbiMgQ29uZmxpY3RzOlxuI1x0YVxuIiwKKwkJCQkJZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDb25mbGljdFdpdGhNZXNzYWdlQW5kQ29tbWVudENoYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIjFcbmFcbjNcbiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGluaXRpYWxDb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCIpLmNhbGwoKTsKKworCQkJY3JlYXRlQnJhbmNoKGluaXRpYWxDb21taXQsICJyZWZzL2hlYWRzL3NpZGUiKTsKKwkJCWNoZWNrb3V0QnJhbmNoKCJyZWZzL2hlYWRzL3NpZGUiKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImEiLCAiMVxuYShzaWRlKVxuM1xuIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgic2lkZSIpLmNhbGwoKTsKKworCQkJY2hlY2tvdXRCcmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIik7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIjFcbmEobWFpbilcbjNcbiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm1haW4iKS5jYWxsKCk7CisKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImNvcmUiLCBudWxsLCAiY29tbWVudENoYXIiLCAiXiIpOworCisJCQlSZWYgc2lkZUJyYW5jaCA9IGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL3NpZGUiKTsKKworCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKS5zZXRTdHJhdGVneShNZXJnZVN0cmF0ZWd5LlJFU09MVkUpCisJCQkJCS5zZXRNZXNzYWdlKCJ1c2VyIG1lc3NhZ2UiKS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscygidXNlciBtZXNzYWdlXG5cbl4gQ29uZmxpY3RzOlxuXlx0YVxuIiwKKwkJCQkJZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDb25mbGljdFdpdGhNZXNzYWdlQW5kQ29tbWVudENoYXJBdXRvKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJd3JpdGVUcmFzaEZpbGUoImEiLCAiMVxuYVxuM1xuIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgaW5pdGlhbENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIikuY2FsbCgpOworCisJCQljcmVhdGVCcmFuY2goaW5pdGlhbENvbW1pdCwgInJlZnMvaGVhZHMvc2lkZSIpOworCQkJY2hlY2tvdXRCcmFuY2goInJlZnMvaGVhZHMvc2lkZSIpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiYSIsICIxXG5hKHNpZGUpXG4zXG4iKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYSIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJzaWRlIikuY2FsbCgpOworCisJCQljaGVja291dEJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImEiLCAiMVxuYShtYWluKVxuM1xuIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgibWFpbiIpLmNhbGwoKTsKKworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiY29yZSIsIG51bGwsICJjb21tZW50Q2hhciIsICJhdXRvIik7CisKKwkJCVJlZiBzaWRlQnJhbmNoID0gZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvc2lkZSIpOworCisJCQlnaXQubWVyZ2UoKS5pbmNsdWRlKHNpZGVCcmFuY2gpLnNldFN0cmF0ZWd5KE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSkKKwkJCQkJLnNldE1lc3NhZ2UoIiN1c2VyIG1lc3NhZ2UiKS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscygiI3VzZXIgbWVzc2FnZVxuXG47IENvbmZsaWN0czpcbjtcdGFcbiIsCiAJCQkJCWRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhCmluZGV4IDlhZjc3YWEuLjZhODRmMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YQpAQCAtNTY3LDYgKzU2Nyw3IEBAIHByaXZhdGUgdm9pZCBkb1Rlc3RQdWxsV2l0aFJlYmFzZShDYWxsYWJsZTxQdWxsUmVzdWx0PiBwdWxsU2V0dXAsCiAJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc2V0VXAoKTsKIAkJZGJUYXJnZXQgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShkYlRhcmdldCk7CiAJCXNvdXJjZSA9IG5ldyBHaXQoZGIpOwogCQl0YXJnZXQgPSBuZXcgR2l0KGRiVGFyZ2V0KTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kV2l0aFJlYmFzZVRlc3QuamF2YQppbmRleCBjY2UwNGY0Li5lMmQ3OTIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kV2l0aFJlYmFzZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kV2l0aFJlYmFzZVRlc3QuamF2YQpAQCAtMzIzLDYgKzMyMyw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWRiVGFyZ2V0ID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKIAkJc291cmNlID0gbmV3IEdpdChkYik7CiAJCXRhcmdldCA9IG5ldyBHaXQoZGJUYXJnZXQpOworCQlhZGRSZXBvVG9DbG9zZShkYlRhcmdldCk7CiAKIAkJLy8gcHV0IHNvbWUgZmlsZSBpbiB0aGUgc291cmNlIHJlcG8KIAkJc291cmNlRmlsZSA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJTb21lRmlsZS50eHQiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhCmluZGV4IGE3ODYwNjUuLjZmN2FhNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YQpAQCAtMTAsNyArMTAsOSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKQEAgLTE5LDEwICsyMSwxMyBAQAogaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5EZXRhY2hlZEhlYWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSW52YWxpZFJlZk5hbWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaG9va3MuUHJlUHVzaEhvb2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5KR2l0VGVzdFV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CkBAIC0zMiw2ICszNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnLlB1c2hEZWZhdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmTGVhc2VTcGVjOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZlNwZWM7CkBAIC01MCw2ICs1Niw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQdXNoKCkgdGhyb3dzIEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCiAKIAkJLy8gY3JlYXRlIG90aGVyIHJlcG9zaXRvcnkKIAkJUmVwb3NpdG9yeSBkYjIgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShkYjIpOwogCQlmaW5hbCBTdG9yZWRDb25maWcgY29uZmlnMiA9IGRiMi5nZXRDb25maWcoKTsKIAogCQkvLyB0aGlzIHRlc3RzIHRoYXQgdGhpcyBjb25maWcgY2FuIGJlIHBhcnNlZCBwcm9wZXJseQpAQCAtMjg5LDYgKzI5Niw3NzAgQEAgcHVibGljIHZvaWQgdGVzdFB1c2hXaXRob3V0UHVzaFJlZlNwZWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAl9CiAKIAkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2hpbmcgZnJvbSBhIGRldGFjaGVkIEhFQUQgd2l0aG91dCByZWZzcGVjIHRocm93cyBhCisJICogRGV0YWNoZWRIZWFkRXhjZXB0aW9uLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdERldGFjaGVkSGVhZCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCWZpbmFsIFN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoY29tbWl0LmdldE5hbWUoKSkuY2FsbCgpOworCQkJU3RyaW5nIGhlYWQgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldEZ1bGxCcmFuY2goKTsKKwkJCWFzc2VydFRydWUoT2JqZWN0SWQuaXNJZChoZWFkKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldE5hbWUoKSwgaGVhZCk7CisJCQlhc3NlcnRUaHJvd3MoRGV0YWNoZWRIZWFkRXhjZXB0aW9uLmNsYXNzLAorCQkJCQkoKSAtPiBnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD1ub3RoaW5nIHdpdGhvdXQgcmVmc3BlYyB0aHJvd3MgYW4KKwkgKiBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHROb3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJZmluYWwgU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuTk9USElORykuY2FsbCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PW1hdGNoaW5nIHdpdGhvdXQgcmVmc3BlYyBwdXNoZXMgYWxsIG1hdGNoaW5nCisJICogYnJhbmNoZXMuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0TWF0Y2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlmaW5hbCBTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQkvLyBwdXNoIG1hc3RlciBhbmQgYnJhbmNodG9wdXNoCisJCQlnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpLnNldFJlZlNwZWNzKAorCQkJCQluZXcgUmVmU3BlYygicmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy9tYXN0ZXIiKSwKKwkJCQkJbmV3IFJlZlNwZWMoCisJCQkJCQkJInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoOnJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpCisJCQkJCS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQkvLyBDcmVhdGUgdHdvIGRpZmZlcmVudCBjb21taXRzIG9uIHRoZXNlIHR3byBicmFuY2hlcworCQkJd3JpdGVUcmFzaEZpbGUoImIiLCAib24gYnJhbmNodG9wdXNoIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImIiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgYkNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJvbiBicmFuY2h0b3B1c2giKQorCQkJCQkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQkJd3JpdGVUcmFzaEZpbGUoIm0iLCAib24gbWFzdGVyIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIm0iKS5jYWxsKCk7CisJCQlSZXZDb21taXQgbUNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJvbiBtYXN0ZXIiKS5jYWxsKCk7CisJCQkvLyBOb3cgcHVzaCB3aXRoIG1vZGUgIm1hdGNoaW5nIjogc2hvdWxkIHB1c2ggYm90aCBicmFuY2hlcy4KKwkJCUl0ZXJhYmxlPFB1c2hSZXN1bHQ+IHJlc3VsdCA9IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkJLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0Lk1BVENISU5HKQorCQkJCQkuY2FsbCgpOworCQkJaW50IG4gPSAwOworCQkJZm9yIChQdXNoUmVzdWx0IHIgOiByZXN1bHQpIHsKKwkJCQluKys7CisJCQkJYXNzZXJ0RXF1YWxzKDEsIG4pOworCQkJCWFzc2VydEVxdWFscygyLCByLmdldFJlbW90ZVVwZGF0ZXMoKS5zaXplKCkpOworCQkJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHVwZGF0ZSA6IHIuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CisJCQkJCWFzc2VydEZhbHNlKHVwZGF0ZS5pc01hdGNoaW5nKCkpOworCQkJCQlhc3NlcnRUcnVlKHVwZGF0ZS5nZXRTcmNSZWYoKQorCQkJCQkJCS5lcXVhbHMoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikKKwkJCQkJCQl8fCB1cGRhdGUuZ2V0U3JjUmVmKCkuZXF1YWxzKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCQkJYXNzZXJ0RXF1YWxzKFJlbW90ZVJlZlVwZGF0ZS5TdGF0dXMuT0ssIHVwZGF0ZS5nZXRTdGF0dXMoKSk7CisJCQkJfQorCQkJfQorCQkJYXNzZXJ0RXF1YWxzKGJDb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG1Db21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoYkNvbW1pdC5nZXRJZCgpLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobUNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIikpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9dXBzdHJlYW0gd2l0aG91dCByZWZzcGVjIHB1c2hlcyBvbmx5IHRoZSBjdXJyZW50CisJICogYnJhbmNoIHRvIHRoZSBjb25maWd1cmVkIHVwc3RyZWFtLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdFVwc3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlVQU1RSRUFNKQorCQkJCQkuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi91cHN0cmVhbWJyYW5jaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL2JyYW5jaHRvcHVzaCIpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PXVwc3RyZWFtIHdpdGhvdXQgcmVmc3BlYyB0aHJvd3MgYW4KKwkgKiBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCBicmFuY2ggaGFzIG5vIHVwc3RyZWFtLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdFVwc3RyZWFtTm9UcmFja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0VGhyb3dzKEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzLAorCQkJCQkoKSAtPiBnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJCQkJLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlVQU1RSRUFNKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9dXBzdHJlYW0gd2l0aG91dCByZWZzcGVjIHRocm93cyBhbgorCSAqIEludmFsaWRSZWZOYW1lRXhjZXB0aW9uIGlmIHRoZSBwdXNoIHJlbW90ZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGZldGNoCisJICogcmVtb3RlLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdFVwc3RyZWFtVHJpYW5ndWxhcigpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJLy8gRG9uJ3QgY29uZmlndXJlIGEgcmVtb3RlOyBpdCdsbCBkZWZhdWx0IHRvICJvcmlnaW4iLgorCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJ1cHN0cmVhbWJyYW5jaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0VGhyb3dzKEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzLAorCQkJCQkoKSAtPiBnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJCQkJLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlVQU1RSRUFNKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9c2ltcGxlIHdpdGhvdXQgcmVmc3BlYyBwdXNoZXMgb25seSB0aGUgY3VycmVudAorCSAqIGJyYW5jaCB0byB0aGUgY29uZmlndXJlZCB1cHN0cmVhbSBuYW1lLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlNJTVBMRSkKKwkJCQkJLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL2JyYW5jaHRvcHVzaCIpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PXNpbXBsZSB3aXRob3V0IHJlZnNwZWMgcHVzaGVzIG9ubHkgdGhlIGN1cnJlbnQKKwkgKiBicmFuY2ggdG8gYSBicmFuY2ggd2l0aCB0aGUgc2FtZSBuYW1lIGluIGEgdHJpYW5ndWxhciB3b3JrZmxvdy4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRTaW1wbGVUcmlhbmd1bGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJLy8gRG9uJ3Qgc2V0IHJlbW90ZSwgaXQnbGwgZGVmYXVsdCB0byAib3JpZ2luIi4gQ29uZmlndXJlIGEKKwkJCS8vIGRpZmZlcmVudCBicmFuY2ggbmFtZTsgc2hvdWxkIGJlIGlnbm9yZWQuCisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0Iikuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuU0lNUExFKQorCQkJCQkuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD1zaW1wbGUgd2l0aG91dCByZWZzcGVjIHRocm93cyBhbgorCSAqIEludmFsaWRSZWZOYW1lRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBoYXMgbm8gdXBzdHJlYW0uCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0U2ltcGxlTm9UcmFja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0VGhyb3dzKEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzLAorCQkJCQkoKSAtPiBnaXQucHVzaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJCQkJLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlNJTVBMRSkuY2FsbCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PXNpbXBsZSB3aXRob3V0IHJlZnNwZWMgdGhyb3dzIGFuCisJICogSW52YWxpZFJlZk5hbWVFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGhhcyBhbiB1cHN0cmVhbSB3aXRoIGEKKwkgKiBkaWZmZXJlbnQgbmFtZS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRTaW1wbGVEaWZmZXJlbnRUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuU0lNUExFKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBpZiBubyBQdXNoRGVmYXVsdCBpcyBzZXQsIHRoZSB2YWx1ZSBpcyByZWFkIGZyb20gdGhlIGdpdAorCSAqIGNvbmZpZy4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRGcm9tQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoInB1c2giLCBudWxsLCAiZGVmYXVsdCIsICJ1cHN0cmVhbSIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCVB1c2hDb21tYW5kIGNtZCA9IGdpdC5wdXNoKCk7CisJCQljbWQuc2V0UmVtb3RlKCJ0ZXN0Iikuc2V0UHVzaERlZmF1bHQobnVsbCkuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKFB1c2hEZWZhdWx0LlVQU1RSRUFNLCBjbWQuZ2V0UHVzaERlZmF1bHQoKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBpZiBubyBQdXNoRGVmYXVsdCBpcyBzZXQgYW5kIG5vbmUgaXMgc2V0IGluIHRoZSBnaXQgY29uZmlnLCBpdAorCSAqIGRlZmF1bHRzIHRvICJzaW1wbGUiLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdEZyb21Db25maWdEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCVB1c2hDb21tYW5kIGNtZCA9IGdpdC5wdXNoKCk7CisJCQljbWQuc2V0UmVtb3RlKCJ0ZXN0Iikuc2V0UHVzaERlZmF1bHQobnVsbCkuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKFB1c2hEZWZhdWx0LlNJTVBMRSwgY21kLmdldFB1c2hEZWZhdWx0KCkpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBicmFuY2guPG5hbWU+LnB1c2hSZW1vdGUgb3ZlcnJpZGVzIGFueXRoaW5nIGVsc2UuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJyYW5jaFB1c2hSZW1vdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNldFN0cmluZygicmVtb3RlIiwgbnVsbCwgInB1c2hEZWZhdWx0IiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInB1c2hyZW1vdGUiLCAib3JpZ2luIik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsICgpIC0+IGdpdC5wdXNoKCkKKwkJCQkJLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlVQU1RSRUFNKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCByZW1vdGUucHVzaERlZmF1bHQgb3ZlcnJpZGVzIGJyYW5jaC48bmFtZT4ucmVtb3RlCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlbW90ZVB1c2hEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoInJlbW90ZSIsIG51bGwsICJwdXNoRGVmYXVsdCIsICJvcmlnaW4iKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsICgpIC0+IGdpdC5wdXNoKCkKKwkJCQkJLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlVQU1RSRUFNKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCB1bHRpbWF0ZWx5IHdlIGZhbGwgYmFjayB0byAib3JpZ2luIi4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFJlbW90ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJUHVzaENvbW1hbmQgY21kID0gZ2l0LnB1c2goKS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5VUFNUUkVBTSk7CisJCQlUcmFuc3BvcnRFeGNlcHRpb24gZSA9IGFzc2VydFRocm93cyhUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGNtZC5jYWxsKCkpOworCQkJYXNzZXJ0RXF1YWxzKE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJZS5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJvcmlnaW4iLCBjbWQuZ2V0UmVtb3RlKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBhIHB1c2ggd2l0aG91dCBzcGVjaWZ5aW5nIGEgcmVtb3RlIG9yIG1vZGUgb3IgYW55dGhpbmcgY2FuCisJICogc3VjY2VlZCBpZiB0aGUgZ2l0IGNvbmZpZyBpcyBjb3JyZWN0LgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UHVzaCgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQkvLyBTaG91bGQgdXNlIHJlbW90ZSAidGVzdCIsIHB1c2guZGVmYXVsdD1jdXJyZW50CisJCQlQdXNoQ29tbWFuZCBjbWQgPSBnaXQucHVzaCgpOworCQkJY21kLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscygidGVzdCIsIGNtZC5nZXRSZW1vdGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuQ1VSUkVOVCwgY21kLmdldFB1c2hEZWZhdWx0KCkpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQl9CisJfQorCisJLyoqCiAJICogQ2hlY2sgdGhhdCBtaXNzaW5nIHJlZnMgZG9uJ3QgY2F1c2UgZXJyb3JzIGR1cmluZyBwdXNoCiAJICoKIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgpAQCAtMjk3LDYgKzEwNjgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaFdpdGhvdXRQdXNoUmVmU3BlYygpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RQdXNoQWZ0ZXJHQygpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBjcmVhdGUgb3RoZXIgcmVwb3NpdG9yeQogCQlSZXBvc2l0b3J5IGRiMiA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKGRiMik7CiAKIAkJLy8gc2V0dXAgdGhlIGZpcnN0IHJlcG9zaXRvcnkKIAkJZmluYWwgU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOwpAQCAtMzYwLDYgKzExMzIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaFdpdGhMZWFzZSgpIHRocm93cyBKR2l0SW50ZXJuYWxFeGNlcHRpb24sIElPRXhjZXB0aW9uLAogCiAJCS8vIGNyZWF0ZSBvdGhlciByZXBvc2l0b3J5CiAJCVJlcG9zaXRvcnkgZGIyID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGIyKTsKIAogCQkvLyBzZXR1cCB0aGUgZmlyc3QgcmVwb3NpdG9yeQogCQlmaW5hbCBTdG9yZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggODYyMzkwMi4uZDU3NGU0NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuTWVyZ2VSZXN1bHQuTWVyZ2VTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuUmViYXNlQ29tbWFuZC5JbnRlcmFjdGl2ZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuUmViYXNlQ29tbWFuZC5JbnRlcmFjdGl2ZUhhbmRsZXIyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlJlYmFzZUNvbW1hbmQuT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlJlYmFzZVJlc3VsdC5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkludmFsaWRSZWJhc2VTdGVwRXhjZXB0aW9uOwpAQCAtNDYsNiArNDcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzLkxpc3RlbmVySGFuZGxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFiYnJldmlhdGVkT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0Q29uZmlnLkNsZWFudXBNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CkBAIC01Niw2ICs1OCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZmxvZ0VudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnlTdGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5tZXJnZS5NZXJnZVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlNvcnQ7CkBAIC0yOTI3LDggKzI5MzAsOCBAQCBwdWJsaWMgU3RyaW5nIG1vZGlmeUNvbW1pdE1lc3NhZ2UoU3RyaW5nIGNvbW1pdCkgewogCQl9CiAJfQogCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmViYXNlSW50ZXJhY3RpdmVGaXh1cFdpdGhCbGFua0xpbmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHNpbXBsZUZpeHVwKFN0cmluZyBmaXJzdE1lc3NhZ2UsIFN0cmluZyBzZWNvbmRNZXNzYWdlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSBmaWxlMSBvbiBtYXN0ZXIKIAkJd3JpdGVUcmFzaEZpbGUoRklMRTEsIEZJTEUxKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKEZJTEUxKS5jYWxsKCk7CkBAIC0yOTM4LDEzICsyOTQxLDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gY3JlYXRlIGZpbGUyIG9uIG1hc3RlcgogCQl3cml0ZVRyYXNoRmlsZSgiZmlsZTIiLCAiZmlsZTIiKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlMiIpLmNhbGwoKTsKLQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkFkZCBmaWxlMiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoZmlyc3RNZXNzYWdlKS5jYWxsKCk7CiAJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZpbGUyIikuZXhpc3RzKCkpOwogCiAJCS8vIHVwZGF0ZSBGSUxFMSBvbiBtYXN0ZXIKIAkJd3JpdGVUcmFzaEZpbGUoRklMRTEsICJibGFoIik7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihGSUxFMSkuY2FsbCgpOwotCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgidXBkYXRlZCBmaWxlMSBvbiBtYXN0ZXJcblxuc29tZSB0ZXh0IikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShzZWNvbmRNZXNzYWdlKS5jYWxsKCk7CiAKIAkJZ2l0LnJlYmFzZSgpLnNldFVwc3RyZWFtKCJIRUFEfjIiKQogCQkJCS5ydW5JbnRlcmFjdGl2ZWx5KG5ldyBJbnRlcmFjdGl2ZUhhbmRsZXIoKSB7CkBAIC0yOTY4LDkgKzI5NzEsMzEgQEAgcHVibGljIFN0cmluZyBtb2RpZnlDb21taXRNZXNzYWdlKFN0cmluZyBjb21taXQpIHsKIAkJdHJ5IChSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhkYikpIHsKIAkJCU9iamVjdElkIGhlYWRJZCA9IGRiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwogCQkJUmV2Q29tbWl0IGhlYWRDb21taXQgPSB3YWxrLnBhcnNlQ29tbWl0KGhlYWRJZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkFkZCBmaWxlMiIsCi0JCQkJCWhlYWRDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCQlhc3NlcnRFcXVhbHMoZmlyc3RNZXNzYWdlLCBoZWFkQ29tbWl0LmdldEZ1bGxNZXNzYWdlKCkpOwogCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2ltcGxlRml4dXAoIkFkZCBmaWxlMiIsICJ1cGRhdGVkIGZpbGUxIG9uIG1hc3RlclxuXG5zb21lIHRleHQiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNpbXBsZUZpeHVwKCJBZGQgZmlsZTJcblxuQm9keVxuIiwKKwkJCQkidXBkYXRlZCBmaWxlMSBvbiBtYXN0ZXJcblxuc29tZSB0ZXh0Iik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmViYXNlSW50ZXJhY3RpdmVGaXh1cFdpdGhIYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNpbXBsZUZpeHVwKCIjQWRkIGZpbGUyIiwgInVwZGF0ZWQgZmlsZTEgb24gbWFzdGVyIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmViYXNlSW50ZXJhY3RpdmVGaXh1cFdpdGhIYXNoMigpIHRocm93cyBFeGNlcHRpb24geworCQlzaW1wbGVGaXh1cCgiI0FkZCBmaWxlMlxuXG5IZWFkZXIgaGFzIGhhc2hcbiIsCisJCQkJIiN1cGRhdGVkIGZpbGUxIG9uIG1hc3RlciIpOwogCX0KIAogCUBUZXN0KGV4cGVjdGVkID0gSW52YWxpZFJlYmFzZVN0ZXBFeGNlcHRpb24uY2xhc3MpCkBAIC0zMzg4LDYgKzM0MTMsOTkgQEAgcHVibGljIFN0cmluZyBtb2RpZnlDb21taXRNZXNzYWdlKFN0cmluZyBjb21taXQpIHsKIAogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludGVyYWN0aXZlUmViYXNlU3F1YXNoRml4dXBTZXF1ZW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBjcmVhdGUgZmlsZTEsIGFkZCBhbmQgY29tbWl0CisJCXdyaXRlVHJhc2hGaWxlKEZJTEUxLCAiZmlsZTEiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKEZJTEUxKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQxIikuY2FsbCgpOworCisJCS8vIG1vZGlmeSBmaWxlMSwgYWRkIGFuZCBjb21taXQKKwkJd3JpdGVUcmFzaEZpbGUoRklMRTEsICJtb2RpZmllZCBmaWxlMSIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oRklMRTEpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImNvbW1pdDIiKS5jYWxsKCk7CisKKwkJLy8gbW9kaWZ5IGZpbGUxLCBhZGQgYW5kIGNvbW1pdAorCQl3cml0ZVRyYXNoRmlsZShGSUxFMSwgIm1vZGlmaWVkIGZpbGUxIGEgc2Vjb25kIHRpbWUiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKEZJTEUxKS5jYWxsKCk7CisJCS8vIE1ha2UgaXQgZGlmZmljdWx0OyB1c2UgZ2l0IHN0YW5kYXJkIGNvbW1lbnQgY2hhcmFjdGVycyBpbiB0aGUgY29tbWl0CisJCS8vIG1lc3NhZ2VzCisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCIjY29tbWl0MyIpLmNhbGwoKTsKKworCQkvLyBtb2RpZnkgZmlsZTEsIGFkZCBhbmQgY29tbWl0CisJCXdyaXRlVHJhc2hGaWxlKEZJTEUxLCAibW9kaWZpZWQgZmlsZTEgYSB0aGlyZCB0aW1lIik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihGSUxFMSkuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiQGNvbW1pdDQiKS5jYWxsKCk7CisKKwkJLy8gbW9kaWZ5IGZpbGUxLCBhZGQgYW5kIGNvbW1pdAorCQl3cml0ZVRyYXNoRmlsZShGSUxFMSwgIm1vZGlmaWVkIGZpbGUxIGEgZm91cnRoIHRpbWUiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKEZJTEUxKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCI7Y29tbWl0NSIpLmNhbGwoKTsKKworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiY29yZSIsIG51bGwsICJjb21tZW50Q2hhciIsICJhdXRvIik7CisJCS8vIFdpdGggImF1dG8iLCB3ZSBzaG91bGQgZW5kIHVwIHdpdGggJ0AnIGJlaW5nIHVzZWQgYXMgY29tbWVudAorCQkvLyBjaGFyYWN0ZXIgKGNvbW1pdDQgaXMgc2tpcHBlZCwgc28gaXQgc2hvdWxkIG5vdCBhZHZhbmNlIHRoZQorCQkvLyBjaGFyYWN0ZXIpLgorCQlSZWJhc2VSZXN1bHQgcmVzdWx0ID0gZ2l0LnJlYmFzZSgpLnNldFVwc3RyZWFtKCJIRUFEfjQiKQorCQkJCS5ydW5JbnRlcmFjdGl2ZWx5KG5ldyBJbnRlcmFjdGl2ZUhhbmRsZXIyKCkgeworCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgdm9pZCBwcmVwYXJlU3RlcHMoTGlzdDxSZWJhc2VUb2RvTGluZT4gc3RlcHMpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJc3RlcHMuZ2V0KDApLnNldEFjdGlvbihBY3Rpb24uUElDSyk7CisJCQkJCQkJc3RlcHMuZ2V0KDEpLnNldEFjdGlvbihBY3Rpb24uU1FVQVNIKTsKKwkJCQkJCQlzdGVwcy5nZXQoMikuc2V0QWN0aW9uKEFjdGlvbi5GSVhVUCk7CisJCQkJCQkJc3RlcHMuZ2V0KDMpLnNldEFjdGlvbihBY3Rpb24uU1FVQVNIKTsKKwkJCQkJCX0gY2F0Y2ggKElsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbiBlKSB7CisJCQkJCQkJZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgU3RyaW5nIG1vZGlmeUNvbW1pdE1lc3NhZ2UoU3RyaW5nIGNvbW1pdCkgeworCQkJCQkJZmFpbCgic2hvdWxkIG5vdCBiZSBjYWxsZWQiKTsKKwkJCQkJCXJldHVybiBjb21taXQ7CisJCQkJCX0KKworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIE1vZGlmeVJlc3VsdCBlZGl0Q29tbWl0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSwKKwkJCQkJCQlDbGVhbnVwTW9kZSBtb2RlLCBjaGFyIGNvbW1lbnRDaGFyKSB7CisJCQkJCQlhc3NlcnRFcXVhbHMoJ0AnLCBjb21tZW50Q2hhcik7CisJCQkJCQlhc3NlcnRFcXVhbHMoIkAgVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIDQgY29tbWl0cy5cbiIKKwkJCQkJCQkJKyAiQCBUaGUgZmlyc3QgY29tbWl0J3MgbWVzc2FnZSBpczpcbiIKKwkJCQkJCQkJKyAiY29tbWl0MlxuIgorCQkJCQkJCQkrICJAIFRoaXMgaXMgdGhlIDJuZCBjb21taXQgbWVzc2FnZTpcbiIKKwkJCQkJCQkJKyAiI2NvbW1pdDNcbiIKKwkJCQkJCQkJKyAiQCBUaGUgM3JkIGNvbW1pdCBtZXNzYWdlIHdpbGwgYmUgc2tpcHBlZDpcbiIKKwkJCQkJCQkJKyAiQCBAY29tbWl0NFxuIgorCQkJCQkJCQkrICJAIFRoaXMgaXMgdGhlIDR0aCBjb21taXQgbWVzc2FnZTpcbiIKKwkJCQkJCQkJKyAiO2NvbW1pdDUiLCBtZXNzYWdlKTsKKwkJCQkJCXJldHVybiBuZXcgTW9kaWZ5UmVzdWx0KCkgeworCisJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworCQkJCQkJCQlyZXR1cm4gbWVzc2FnZTsKKwkJCQkJCQl9CisKKwkJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCQlwdWJsaWMgQ2xlYW51cE1vZGUgZ2V0Q2xlYW51cE1vZGUoKSB7CisJCQkJCQkJCXJldHVybiBtb2RlOworCQkJCQkJCX0KKworCQkJCQkJCUBPdmVycmlkZQorCQkJCQkJCXB1YmxpYyBib29sZWFuIHNob3VsZEFkZENoYW5nZUlkKCkgeworCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJfQorCQkJCQkJfTsKKwkJCQkJfQorCQkJCX0pLmNhbGwoKTsKKwkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSywgcmVzdWx0LmdldFN0YXR1cygpKTsKKwkJSXRlcmF0b3I8UmV2Q29tbWl0PiBsb2dJdGVyYXRvciA9IGdpdC5sb2coKS5hbGwoKS5jYWxsKCkuaXRlcmF0b3IoKTsKKwkJU3RyaW5nIGFjdHVhbENvbW1pdE1zZyA9IGxvZ0l0ZXJhdG9yLm5leHQoKS5nZXRGdWxsTWVzc2FnZSgpOworCQlhc3NlcnRFcXVhbHMoImNvbW1pdDJcbiNjb21taXQzXG47Y29tbWl0NSIsIGFjdHVhbENvbW1pdE1zZyk7CisJfQorCiAJcHJpdmF0ZSBGaWxlIGdldFRvZG9GaWxlKCkgewogCQlGaWxlIHRvZG9GaWxlID0gbmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIEdJVF9SRUJBU0VfVE9ETyk7CiAJCXJldHVybiB0b2RvRmlsZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YQppbmRleCBjZmE4NDg2Li4xYzdiOGQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhCkBAIC05LDYgKzksNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC0xNjYsNyArMTY3LDkgQEAgcHVibGljIHZvaWQgdGVzdFJldmVydE11bHRpcGxlV2l0aEZhaWwoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAKIAkJCWNoZWNrRmlsZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiYSIpLCAiZmlyc3RcbiIKIAkJCQkJKyAiPDw8PDw8PCBtYXN0ZXJcbiIgKyAic2Vjb25kXG4iICsgInRoaXJkXG4iICsgIj09PT09PT1cbiIKLQkJCQkJKyAiPj4+Pj4+PiAiICsgc2Vjb25kQ29tbWl0LmdldElkKCkuYWJicmV2aWF0ZSg3KS5uYW1lKCkKKwkJCQkJKyAiPj4+Pj4+PiAiCisJCQkJCSsgc2Vjb25kQ29tbWl0LmdldElkKCkKKwkJCQkJCQkuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpLm5hbWUoKQogCQkJCQkrICIgYWRkIHNlY29uZFxuIik7CiAJCQlJdGVyYXRvcjxSZXZDb21taXQ+IGhpc3RvcnkgPSBnaXQubG9nKCkuY2FsbCgpLml0ZXJhdG9yKCk7CiAJCQlSZXZDb21taXQgcmV2ZXJ0Q29tbWl0ID0gaGlzdG9yeS5uZXh0KCk7CkBAIC0yMzIsNyArMjM1LDcgQEAgcHVibGljIHZvaWQgdGVzdFJldmVydENvbmZsaWN0UmVzb2x1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0VHJ1ZShuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLk1FUkdFX01TRykuZXhpc3RzKCkpOwogCQkJYXNzZXJ0RXF1YWxzKCJSZXZlcnQgXCIiICsgc2lkZUNvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKQogCQkJCQkrICJcIlxuXG5UaGlzIHJldmVydHMgY29tbWl0ICIgKyBzaWRlQ29tbWl0LmdldElkKCkuZ2V0TmFtZSgpCi0JCQkJCSsgIi5cblxuQ29uZmxpY3RzOlxuXHRhXG4iLAorCQkJCQkrICIuXG5cbiMgQ29uZmxpY3RzOlxuI1x0YVxuIiwKIAkJCQkJZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCQkJYXNzZXJ0VHJ1ZShuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLlJFVkVSVF9IRUFEKQogCQkJCQkuZXhpc3RzKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TZWN1cml0eU1hbmFnZXJNaXNzaW5nUGVybWlzc2lvbnNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1NlY3VyaXR5TWFuYWdlck1pc3NpbmdQZXJtaXNzaW9uc1Rlc3QuamF2YQppbmRleCBhMDdmMzcwLi5kMGZiZGJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1NlY3VyaXR5TWFuYWdlck1pc3NpbmdQZXJtaXNzaW9uc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1NlY3VyaXR5TWFuYWdlck1pc3NpbmdQZXJtaXNzaW9uc1Rlc3QuamF2YQpAQCAtMTMsMTcgKzEzLDE1IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qb2xpY3k7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouV3JpdGVyQXBwZW5kZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CkBAIC0zOCwyNSArMzYsMjEgQEAgcHVibGljIGNsYXNzIFNlY3VyaXR5TWFuYWdlck1pc3NpbmdQZXJtaXNzaW9uc1Rlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCS8qKgogCSAqIENvbGxlY3RzIGFsbCBsb2dnaW5nIHNlbnQgdG8gdGhlIGxvZ2dpbmcgc3lzdGVtLgogCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nV3JpdGVyIGVycm9yT3V0cHV0V3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0JLyoqCi0JICogQXBwZW5kZXIgdG8gaW50ZXJjZXB0IGFsbCBsb2dnaW5nIHNlbnQgdG8gdGhlIGxvZ2dpbmcgc3lzdGVtLgotCSAqLwotCXByaXZhdGUgV3JpdGVyQXBwZW5kZXIgYXBwZW5kZXI7CisJcHJpdmF0ZSBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXJyb3JPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAKIAlwcml2YXRlIFNlY3VyaXR5TWFuYWdlciBvcmlnaW5hbFNlY3VyaXR5TWFuYWdlcjsKIAorCXByaXZhdGUgUHJpbnRTdHJlYW0gZGVmYXVsdEVycm9yT3V0cHV0OworCiAJQE92ZXJyaWRlCiAJQEJlZm9yZQogCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCW9yaWdpbmFsU2VjdXJpdHlNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwogCi0JCWFwcGVuZGVyID0gbmV3IFdyaXRlckFwcGVuZGVyKAotCQkJCW5ldyBQYXR0ZXJuTGF5b3V0KFBhdHRlcm5MYXlvdXQuVFRDQ19DT05WRVJTSU9OX1BBVFRFUk4pLAotCQkJCWVycm9yT3V0cHV0V3JpdGVyKTsKLQotCQlMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLmFkZEFwcGVuZGVyKGFwcGVuZGVyKTsKKwkJLy8gc2xmNGotc2ltcGxlIGxvZ3MgdG8gU3lzdGVtLmVyciwgcmVkaXJlY3QgaXQgdG8gZW5hYmxlIGFzc2VydGluZworCQkvLyBsb2dnZWQgZXJyb3JzCisJCWRlZmF1bHRFcnJvck91dHB1dCA9IFN5c3RlbS5lcnI7CisJCVN5c3RlbS5zZXRFcnIobmV3IFByaW50U3RyZWFtKGVycm9yT3V0cHV0KSk7CiAKIAkJcmVmcmVzaFBvbGljeUFsbFBlcm1pc3Npb24oUG9saWN5LmdldFBvbGljeSgpKTsKIAkJU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgU2VjdXJpdHlNYW5hZ2VyKCkpOwpAQCAtODUsMTQgKzc5LDE0IEBAIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVOZXdSZXBvc19NaXNzaW5nUGVybWlzc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlhZGRSZXBvVG9DbG9zZShnaXQuZ2V0UmVwb3NpdG9yeSgpKTsKIAotCQlhc3NlcnRFcXVhbHMoIiIsIGVycm9yT3V0cHV0V3JpdGVyLnRvU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoIiIsIGVycm9yT3V0cHV0LnRvU3RyaW5nKCkpOwogCX0KIAogCUBPdmVycmlkZQogCUBBZnRlcgogCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIob3JpZ2luYWxTZWN1cml0eU1hbmFnZXIpOwotCQlMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLnJlbW92ZUFwcGVuZGVyKGFwcGVuZGVyKTsKKwkJU3lzdGVtLnNldEVycihkZWZhdWx0RXJyb3JPdXRwdXQpOwogCQlzdXBlci50ZWFyRG93bigpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGF0dXNDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGF0dXNDb21tYW5kVGVzdC5qYXZhCmluZGV4IDUzMTFlZGIuLjE5MjgxZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3RhdHVzQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXR1c0NvbW1hbmRUZXN0LmphdmEKQEAgLTIxLDggKzIxLDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLk5vRmlsZXBhdHRlcm5FeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9Xb3JrVHJlZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlNldHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVSZXBvc2l0b3J5QnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKQEAgLTE4MSw0ICsxODMsMzEgQEAgcHVibGljIHZvaWQgdGVzdEZvbGRlclByZWZpeCgpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ29tbWl0dGVkR2l0UmVwb0FuZFBhdGhGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29tbWl0RmlsZSgiZmlsZS50eHQiLCAiZmlsZSIsICJtYXN0ZXIiKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGlubmVyID0gbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCisJCQkJLnNldFdvcmtUcmVlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJzdWJnaXQiKSkuYnVpbGQoKSkgeworCQkJaW5uZXIuY3JlYXRlKCk7CisJCQl3cml0ZVRyYXNoRmlsZSgic3ViZ2l0L3N1Yi50eHQiLCAic3ViIik7CisJCQl0cnkgKEdpdCBvdXRlckdpdCA9IG5ldyBHaXQoZGIpOyBHaXQgaW5uZXJHaXQgPSBuZXcgR2l0KGlubmVyKSkgeworCQkJCWlubmVyR2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJzdWIudHh0IikuY2FsbCgpOworCQkJCWlubmVyR2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIklubmVyIGNvbW1pdCIpLmNhbGwoKTsKKwkJCQlvdXRlckdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigic3ViZ2l0IikuY2FsbCgpOworCQkJCW91dGVyR2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIk91dGVyIGNvbW1pdCIpLmNhbGwoKTsKKwkJCQlhc3NlcnRUcnVlKGlubmVyR2l0LnN0YXR1cygpLmNhbGwoKS5pc0NsZWFuKCkpOworCQkJCWFzc2VydFRydWUob3V0ZXJHaXQuc3RhdHVzKCkuY2FsbCgpLmlzQ2xlYW4oKSk7CisJCQkJd3JpdGVUcmFzaEZpbGUoInN1YmdpdC9zdWIudHh0IiwgInN1YjIiKTsKKwkJCQlhc3NlcnRGYWxzZShpbm5lckdpdC5zdGF0dXMoKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRGYWxzZShvdXRlckdpdC5zdGF0dXMoKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRUcnVlKAorCQkJCQkJb3V0ZXJHaXQuc3RhdHVzKCkuYWRkUGF0aCgiZmlsZS50eHQiKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRUcnVlKG91dGVyR2l0LnN0YXR1cygpLmFkZFBhdGgoImRvZXNudGV4aXN0IikuY2FsbCgpCisJCQkJCQkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRGYWxzZSgKKwkJCQkJCW91dGVyR2l0LnN0YXR1cygpLmFkZFBhdGgoInN1YmdpdCIpLmNhbGwoKS5pc0NsZWFuKCkpOworCQkJfQorCQl9CisJfQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9BYnN0cmFjdFJlbmFtZURldGVjdGlvblRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9BYnN0cmFjdFJlbmFtZURldGVjdGlvblRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5NjdmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0Fic3RyYWN0UmVuYW1lRGV0ZWN0aW9uVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5LkNoYW5nZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BYmJyZXZpYXRlZE9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuYW1lRGV0ZWN0aW9uVGVzdENhc2UKKwkJZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9BID0gInNyYy9BIjsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfQiA9ICJzcmMvQiI7CisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0ggPSAic3JjL0giOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9RID0gInNyYy9RIjsKKworCXByb3RlY3RlZCBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiB0ZXN0RGI7CisKKwlAT3ZlcnJpZGUKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJdGVzdERiID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oZGIpOworCX0KKworCXByb3RlY3RlZCBPYmplY3RJZCBibG9iKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRlc3REYi5ibG9iKGNvbnRlbnQpLmNvcHkoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYXNzZXJ0UmVuYW1lKERpZmZFbnRyeSBvLCBEaWZmRW50cnkgbiwgaW50IHNjb3JlLAorCQkJRGlmZkVudHJ5IHJlbmFtZSkgeworCQlhc3NlcnRFcXVhbHMoQ2hhbmdlVHlwZS5SRU5BTUUsIHJlbmFtZS5nZXRDaGFuZ2VUeXBlKCkpOworCisJCWFzc2VydEVxdWFscyhvLmdldE9sZFBhdGgoKSwgcmVuYW1lLmdldE9sZFBhdGgoKSk7CisJCWFzc2VydEVxdWFscyhuLmdldE5ld1BhdGgoKSwgcmVuYW1lLmdldE5ld1BhdGgoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKG8uZ2V0T2xkTW9kZSgpLCByZW5hbWUuZ2V0T2xkTW9kZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKG4uZ2V0TmV3TW9kZSgpLCByZW5hbWUuZ2V0TmV3TW9kZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoby5nZXRPbGRJZCgpLCByZW5hbWUuZ2V0T2xkSWQoKSk7CisJCWFzc2VydEVxdWFscyhuLmdldE5ld0lkKCksIHJlbmFtZS5nZXROZXdJZCgpKTsKKworCQlhc3NlcnRFcXVhbHMoc2NvcmUsIHJlbmFtZS5nZXRTY29yZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYXNzZXJ0Q29weShEaWZmRW50cnkgbywgRGlmZkVudHJ5IG4sIGludCBzY29yZSwKKwkJCURpZmZFbnRyeSBjb3B5KSB7CisJCWFzc2VydEVxdWFscyhDaGFuZ2VUeXBlLkNPUFksIGNvcHkuZ2V0Q2hhbmdlVHlwZSgpKTsKKworCQlhc3NlcnRFcXVhbHMoby5nZXRPbGRQYXRoKCksIGNvcHkuZ2V0T2xkUGF0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKG4uZ2V0TmV3UGF0aCgpLCBjb3B5LmdldE5ld1BhdGgoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKG8uZ2V0T2xkTW9kZSgpLCBjb3B5LmdldE9sZE1vZGUoKSk7CisJCWFzc2VydEVxdWFscyhuLmdldE5ld01vZGUoKSwgY29weS5nZXROZXdNb2RlKCkpOworCisJCWFzc2VydEVxdWFscyhvLmdldE9sZElkKCksIGNvcHkuZ2V0T2xkSWQoKSk7CisJCWFzc2VydEVxdWFscyhuLmdldE5ld0lkKCksIGNvcHkuZ2V0TmV3SWQoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKHNjb3JlLCBjb3B5LmdldFNjb3JlKCkpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhc3NlcnRBZGQoU3RyaW5nIG5ld05hbWUsIE9iamVjdElkIG5ld0lkLAorCQkJRmlsZU1vZGUgbmV3TW9kZSwgRGlmZkVudHJ5IGFkZCkgeworCQlhc3NlcnRFcXVhbHMoRGlmZkVudHJ5LkRFVl9OVUxMLCBhZGQub2xkUGF0aCk7CisJCWFzc2VydEVxdWFscyhEaWZmRW50cnkuQV9aRVJPLCBhZGQub2xkSWQpOworCQlhc3NlcnRFcXVhbHMoRmlsZU1vZGUuTUlTU0lORywgYWRkLm9sZE1vZGUpOworCQlhc3NlcnRFcXVhbHMoQ2hhbmdlVHlwZS5BREQsIGFkZC5jaGFuZ2VUeXBlKTsKKwkJYXNzZXJ0RXF1YWxzKG5ld05hbWUsIGFkZC5uZXdQYXRoKTsKKwkJYXNzZXJ0RXF1YWxzKEFiYnJldmlhdGVkT2JqZWN0SWQuZnJvbU9iamVjdElkKG5ld0lkKSwgYWRkLm5ld0lkKTsKKwkJYXNzZXJ0RXF1YWxzKG5ld01vZGUsIGFkZC5uZXdNb2RlKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYXNzZXJ0RGVsZXRlKFN0cmluZyBvbGROYW1lLCBPYmplY3RJZCBvbGRJZCwKKwkJCUZpbGVNb2RlIG9sZE1vZGUsIERpZmZFbnRyeSBkZWxldGUpIHsKKwkJYXNzZXJ0RXF1YWxzKERpZmZFbnRyeS5ERVZfTlVMTCwgZGVsZXRlLm5ld1BhdGgpOworCQlhc3NlcnRFcXVhbHMoRGlmZkVudHJ5LkFfWkVSTywgZGVsZXRlLm5ld0lkKTsKKwkJYXNzZXJ0RXF1YWxzKEZpbGVNb2RlLk1JU1NJTkcsIGRlbGV0ZS5uZXdNb2RlKTsKKwkJYXNzZXJ0RXF1YWxzKENoYW5nZVR5cGUuREVMRVRFLCBkZWxldGUuY2hhbmdlVHlwZSk7CisJCWFzc2VydEVxdWFscyhvbGROYW1lLCBkZWxldGUub2xkUGF0aCk7CisJCWFzc2VydEVxdWFscyhBYmJyZXZpYXRlZE9iamVjdElkLmZyb21PYmplY3RJZChvbGRJZCksIGRlbGV0ZS5vbGRJZCk7CisJCWFzc2VydEVxdWFscyhvbGRNb2RlLCBkZWxldGUub2xkTW9kZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRmlsdGVyZWRSZW5hbWVEZXRlY3RvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0ZpbHRlcmVkUmVuYW1lRGV0ZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkYTM2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0ZpbHRlcmVkUmVuYW1lRGV0ZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFNpbWVvbiBBbmRyZWV2IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5kaWZmOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZi5GaWx0ZXJlZFJlbmFtZURldGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlBhdGhGaWx0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIEZpbHRlcmVkUmVuYW1lRGV0ZWN0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZW5hbWVEZXRlY3Rpb25UZXN0Q2FzZSB7CisKKwlwcml2YXRlIEZpbHRlcmVkUmVuYW1lRGV0ZWN0b3IgZnJkOworCisJQE92ZXJyaWRlCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCWZyZCA9IG5ldyBGaWx0ZXJlZFJlbmFtZURldGVjdG9yKGRiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RFeGFjdFJlbmFtZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPYmplY3RJZCBmb28gPSBibG9iKCJmb28iKTsKKwkJT2JqZWN0SWQgYmFyID0gYmxvYigiYmFyIik7CisKKwkJRGlmZkVudHJ5IGEgPSBEaWZmRW50cnkuYWRkKFBBVEhfQSwgZm9vKTsKKwkJRGlmZkVudHJ5IGIgPSBEaWZmRW50cnkuZGVsZXRlKFBBVEhfUSwgZm9vKTsKKworCQlEaWZmRW50cnkgYyA9IERpZmZFbnRyeS5hZGQoUEFUSF9ILCBiYXIpOworCQlEaWZmRW50cnkgZCA9IERpZmZFbnRyeS5kZWxldGUoUEFUSF9CLCBiYXIpOworCisJCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gQXJyYXlzLmFzTGlzdChhLCBiLCBjLCBkKTsKKwkJUGF0aEZpbHRlciBmaWx0ZXIgPSBQYXRoRmlsdGVyLmNyZWF0ZShQQVRIX0EpOworCQlMaXN0PERpZmZFbnRyeT4gZW50cmllcyA9IGZyZC5jb21wdXRlKGNoYW5nZXMsIGZpbHRlcik7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlbnRyaWVzIGluOiAiICsgZW50cmllcywgMSwgZW50cmllcy5zaXplKCkpOworCQlhc3NlcnRSZW5hbWUoYiwgYSwgMTAwLCBlbnRyaWVzLmdldCgwKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXhhY3RSZW5hbWVfbXVsdGlwbGVGaWx0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9iamVjdElkIGZvbyA9IGJsb2IoImZvbyIpOworCQlPYmplY3RJZCBiYXIgPSBibG9iKCJiYXIiKTsKKworCQlEaWZmRW50cnkgYSA9IERpZmZFbnRyeS5hZGQoUEFUSF9BLCBmb28pOworCQlEaWZmRW50cnkgYiA9IERpZmZFbnRyeS5kZWxldGUoUEFUSF9RLCBmb28pOworCisJCURpZmZFbnRyeSBjID0gRGlmZkVudHJ5LmFkZChQQVRIX0gsIGJhcik7CisJCURpZmZFbnRyeSBkID0gRGlmZkVudHJ5LmRlbGV0ZShQQVRIX0IsIGJhcik7CisKKwkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBBcnJheXMuYXNMaXN0KGEsIGIsIGMsIGQpOworCQlMaXN0PFBhdGhGaWx0ZXI+IGZpbHRlcnMgPSBBcnJheXMuYXNMaXN0KFBhdGhGaWx0ZXIuY3JlYXRlKFBBVEhfQSksCisJCQkJUGF0aEZpbHRlci5jcmVhdGUoUEFUSF9IKSk7CisJCUxpc3Q8RGlmZkVudHJ5PiBlbnRyaWVzID0gZnJkLmNvbXB1dGUoY2hhbmdlcywgZmlsdGVycyk7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlbnRyaWVzIGluOiAiICsgZW50cmllcywgMiwgZW50cmllcy5zaXplKCkpOworCQlhc3NlcnRSZW5hbWUoYiwgYSwgMTAwLCBlbnRyaWVzLmdldCgwKSk7CisJCWFzc2VydFJlbmFtZShkLCBjLCAxMDAsIGVudHJpZXMuZ2V0KDEpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbmV4YWN0UmVuYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9iamVjdElkIGFJZCA9IGJsb2IoImZvb1xuYmFyXG5iYXpcbmJsYXJnXG4iKTsKKwkJT2JqZWN0SWQgYklkID0gYmxvYigiZm9vXG5iYXJcbmJhelxuYmxhaFxuIik7CisJCURpZmZFbnRyeSBhID0gRGlmZkVudHJ5LmFkZChQQVRIX0EsIGFJZCk7CisJCURpZmZFbnRyeSBiID0gRGlmZkVudHJ5LmRlbGV0ZShQQVRIX1EsIGJJZCk7CisKKwkJT2JqZWN0SWQgY0lkID0gYmxvYigic29tZVxuc29ydFxub2ZcbnRleHRcbiIpOworCQlPYmplY3RJZCBkSWQgPSBibG9iKCJjb21wbGV0ZWx5XG51bnJlbGF0ZWRcbnRleHRcbiIpOworCQlEaWZmRW50cnkgYyA9IERpZmZFbnRyeS5hZGQoUEFUSF9CLCBjSWQpOworCQlEaWZmRW50cnkgZCA9IERpZmZFbnRyeS5kZWxldGUoUEFUSF9ILCBkSWQpOworCisJCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gQXJyYXlzLmFzTGlzdChhLCBiLCBjLCBkKTsKKwkJUGF0aEZpbHRlciBmaWx0ZXIgPSBQYXRoRmlsdGVyLmNyZWF0ZShQQVRIX0EpOworCQlMaXN0PERpZmZFbnRyeT4gZW50cmllcyA9IGZyZC5jb21wdXRlKGNoYW5nZXMsIGZpbHRlcik7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlbnRyaWVzOiAiICsgZW50cmllcywgMSwgZW50cmllcy5zaXplKCkpOworCQlhc3NlcnRSZW5hbWUoYiwgYSwgNjYsIGVudHJpZXMuZ2V0KDApKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbmV4YWN0UmVuYW1lX211bHRpcGxlRmlsdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlPYmplY3RJZCBhSWQgPSBibG9iKCJmb29cbmJhclxuYmF6XG5ibGFyZ1xuIik7CisJCU9iamVjdElkIGJJZCA9IGJsb2IoImZvb1xuYmFyXG5iYXpcbmJsYWhcbiIpOworCQlEaWZmRW50cnkgYSA9IERpZmZFbnRyeS5hZGQoUEFUSF9BLCBhSWQpOworCQlEaWZmRW50cnkgYiA9IERpZmZFbnRyeS5kZWxldGUoUEFUSF9RLCBiSWQpOworCisJCU9iamVjdElkIGNJZCA9IGJsb2IoInNvbWVcbnNvcnRcbm9mXG50ZXh0XG4iKTsKKwkJT2JqZWN0SWQgZElkID0gYmxvYigiY29tcGxldGVseVxudW5yZWxhdGVkXG50ZXh0XG4iKTsKKwkJRGlmZkVudHJ5IGMgPSBEaWZmRW50cnkuYWRkKFBBVEhfQiwgY0lkKTsKKwkJRGlmZkVudHJ5IGQgPSBEaWZmRW50cnkuZGVsZXRlKFBBVEhfSCwgZElkKTsKKworCQlMaXN0PERpZmZFbnRyeT4gY2hhbmdlcyA9IEFycmF5cy5hc0xpc3QoYSwgYiwgYywgZCk7CisJCUxpc3Q8UGF0aEZpbHRlcj4gZmlsdGVycyA9IEFycmF5cy5hc0xpc3QoUGF0aEZpbHRlci5jcmVhdGUoUEFUSF9BKSwKKwkJCQlQYXRoRmlsdGVyLmNyZWF0ZShQQVRIX0gpKTsKKwkJTGlzdDxEaWZmRW50cnk+IGVudHJpZXMgPSBmcmQuY29tcHV0ZShjaGFuZ2VzLCBmaWx0ZXJzKTsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGVudHJpZXM6ICIgKyBlbnRyaWVzLCAyLCBlbnRyaWVzLnNpemUoKSk7CisJCWFzc2VydFJlbmFtZShiLCBhLCA2NiwgZW50cmllcy5nZXQoMCkpOworCQlhc3NlcnRTYW1lKGQsIGVudHJpZXMuZ2V0KDEpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROb1JlbmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT2JqZWN0SWQgYUlkID0gYmxvYigiIik7CisJCU9iamVjdElkIGJJZCA9IGJsb2IoImJsYWgxIik7CisJCU9iamVjdElkIGNJZCA9IGJsb2IoIiIpOworCQlPYmplY3RJZCBkSWQgPSBibG9iKCJibGFoMiIpOworCisJCURpZmZFbnRyeSBhID0gRGlmZkVudHJ5LmFkZChQQVRIX0EsIGFJZCk7CisJCURpZmZFbnRyeSBiID0gRGlmZkVudHJ5LmRlbGV0ZShQQVRIX1EsIGJJZCk7CisKKwkJRGlmZkVudHJ5IGMgPSBEaWZmRW50cnkuYWRkKFBBVEhfSCwgY0lkKTsKKwkJRGlmZkVudHJ5IGQgPSBEaWZmRW50cnkuZGVsZXRlKFBBVEhfQiwgZElkKTsKKworCQlMaXN0PERpZmZFbnRyeT4gY2hhbmdlcyA9IEFycmF5cy5hc0xpc3QoYSwgYiwgYywgZCk7CisJCVBhdGhGaWx0ZXIgZmlsdGVyID0gUGF0aEZpbHRlci5jcmVhdGUoUEFUSF9BKTsKKwkJTGlzdDxEaWZmRW50cnk+IGVudHJpZXMgPSBmcmQuY29tcHV0ZShjaGFuZ2VzLCBmaWx0ZXIpOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZW50cmllcyBpbjogIiArIGVudHJpZXMsIDEsIGVudHJpZXMuc2l6ZSgpKTsKKwkJYXNzZXJ0U2FtZShhLCBlbnRyaWVzLmdldCgwKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Tm9SZW5hbWVzX211bHRpcGxlRmlsdGVycygpIHRocm93cyBFeGNlcHRpb24geworCQlPYmplY3RJZCBhSWQgPSBibG9iKCIiKTsKKwkJT2JqZWN0SWQgYklkID0gYmxvYigiYmxhaDEiKTsKKwkJT2JqZWN0SWQgY0lkID0gYmxvYigiIik7CisJCU9iamVjdElkIGRJZCA9IGJsb2IoImJsYWgyIik7CisKKwkJRGlmZkVudHJ5IGEgPSBEaWZmRW50cnkuYWRkKFBBVEhfQSwgYUlkKTsKKwkJRGlmZkVudHJ5IGIgPSBEaWZmRW50cnkuZGVsZXRlKFBBVEhfUSwgYklkKTsKKworCQlEaWZmRW50cnkgYyA9IERpZmZFbnRyeS5hZGQoUEFUSF9ILCBjSWQpOworCQlEaWZmRW50cnkgZCA9IERpZmZFbnRyeS5kZWxldGUoUEFUSF9CLCBkSWQpOworCisJCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gQXJyYXlzLmFzTGlzdChhLCBiLCBjLCBkKTsKKwkJTGlzdDxQYXRoRmlsdGVyPiBmaWx0ZXJzID0gQXJyYXlzLmFzTGlzdChQYXRoRmlsdGVyLmNyZWF0ZShQQVRIX0EpLAorCQkJCVBhdGhGaWx0ZXIuY3JlYXRlKFBBVEhfSCkpOworCQlMaXN0PERpZmZFbnRyeT4gZW50cmllcyA9IGZyZC5jb21wdXRlKGNoYW5nZXMsIGZpbHRlcnMpOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZW50cmllcyBpbjogIiArIGVudHJpZXMsIDIsIGVudHJpZXMuc2l6ZSgpKTsKKwkJYXNzZXJ0U2FtZShhLCBlbnRyaWVzLmdldCgwKSk7CisJCWFzc2VydFNhbWUoYywgZW50cmllcy5nZXQoMSkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1JlbmFtZURldGVjdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmVuYW1lRGV0ZWN0b3JUZXN0LmphdmEKaW5kZXggNWVkYjYwYy4uYWQ1NjBlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmVuYW1lRGV0ZWN0b3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmVuYW1lRGV0ZWN0b3JUZXN0LmphdmEKQEAgLTE4LDMxICsxOCwyMCBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5LkNoYW5nZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BYmJyZXZpYXRlZE9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotcHVibGljIGNsYXNzIFJlbmFtZURldGVjdG9yVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfQSA9ICJzcmMvQSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfQiA9ICJzcmMvQiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfSCA9ICJzcmMvSCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfUSA9ICJzcmMvUSI7CitwdWJsaWMgY2xhc3MgUmVuYW1lRGV0ZWN0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZW5hbWVEZXRlY3Rpb25UZXN0Q2FzZSB7CiAKIAlwcml2YXRlIFJlbmFtZURldGVjdG9yIHJkOwogCi0JcHJpdmF0ZSBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiB0ZXN0RGI7Ci0KIAlAT3ZlcnJpZGUKIAlAQmVmb3JlCiAJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc2V0VXAoKTsKLQkJdGVzdERiID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oZGIpOwogCQlyZCA9IG5ldyBSZW5hbWVEZXRlY3RvcihkYik7CiAJfQogCkBAIC02NzUsNjIgKzY2NCw0IEBAIHB1YmxpYyB2b2lkIHRlc3RSZW5hbWVMaW1pdCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRTYW1lKGMsIGVudHJpZXMuZ2V0KDIpKTsKIAkJYXNzZXJ0U2FtZShkLCBlbnRyaWVzLmdldCgzKSk7CiAJfQotCi0JcHJpdmF0ZSBPYmplY3RJZCBibG9iKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRlc3REYi5ibG9iKGNvbnRlbnQpLmNvcHkoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFJlbmFtZShEaWZmRW50cnkgbywgRGlmZkVudHJ5IG4sIGludCBzY29yZSwKLQkJCURpZmZFbnRyeSByZW5hbWUpIHsKLQkJYXNzZXJ0RXF1YWxzKENoYW5nZVR5cGUuUkVOQU1FLCByZW5hbWUuZ2V0Q2hhbmdlVHlwZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoby5nZXRPbGRQYXRoKCksIHJlbmFtZS5nZXRPbGRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMobi5nZXROZXdQYXRoKCksIHJlbmFtZS5nZXROZXdQYXRoKCkpOwotCi0JCWFzc2VydEVxdWFscyhvLmdldE9sZE1vZGUoKSwgcmVuYW1lLmdldE9sZE1vZGUoKSk7Ci0JCWFzc2VydEVxdWFscyhuLmdldE5ld01vZGUoKSwgcmVuYW1lLmdldE5ld01vZGUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG8uZ2V0T2xkSWQoKSwgcmVuYW1lLmdldE9sZElkKCkpOwotCQlhc3NlcnRFcXVhbHMobi5nZXROZXdJZCgpLCByZW5hbWUuZ2V0TmV3SWQoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHNjb3JlLCByZW5hbWUuZ2V0U2NvcmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRDb3B5KERpZmZFbnRyeSBvLCBEaWZmRW50cnkgbiwgaW50IHNjb3JlLAotCQkJRGlmZkVudHJ5IGNvcHkpIHsKLQkJYXNzZXJ0RXF1YWxzKENoYW5nZVR5cGUuQ09QWSwgY29weS5nZXRDaGFuZ2VUeXBlKCkpOwotCi0JCWFzc2VydEVxdWFscyhvLmdldE9sZFBhdGgoKSwgY29weS5nZXRPbGRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHMobi5nZXROZXdQYXRoKCksIGNvcHkuZ2V0TmV3UGF0aCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoby5nZXRPbGRNb2RlKCksIGNvcHkuZ2V0T2xkTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG4uZ2V0TmV3TW9kZSgpLCBjb3B5LmdldE5ld01vZGUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG8uZ2V0T2xkSWQoKSwgY29weS5nZXRPbGRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG4uZ2V0TmV3SWQoKSwgY29weS5nZXROZXdJZCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoc2NvcmUsIGNvcHkuZ2V0U2NvcmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRBZGQoU3RyaW5nIG5ld05hbWUsIE9iamVjdElkIG5ld0lkLAotCQkJRmlsZU1vZGUgbmV3TW9kZSwgRGlmZkVudHJ5IGFkZCkgewotCQlhc3NlcnRFcXVhbHMoRGlmZkVudHJ5LkRFVl9OVUxMLCBhZGQub2xkUGF0aCk7Ci0JCWFzc2VydEVxdWFscyhEaWZmRW50cnkuQV9aRVJPLCBhZGQub2xkSWQpOwotCQlhc3NlcnRFcXVhbHMoRmlsZU1vZGUuTUlTU0lORywgYWRkLm9sZE1vZGUpOwotCQlhc3NlcnRFcXVhbHMoQ2hhbmdlVHlwZS5BREQsIGFkZC5jaGFuZ2VUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld05hbWUsIGFkZC5uZXdQYXRoKTsKLQkJYXNzZXJ0RXF1YWxzKEFiYnJldmlhdGVkT2JqZWN0SWQuZnJvbU9iamVjdElkKG5ld0lkKSwgYWRkLm5ld0lkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld01vZGUsIGFkZC5uZXdNb2RlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERlbGV0ZShTdHJpbmcgb2xkTmFtZSwgT2JqZWN0SWQgb2xkSWQsCi0JCQlGaWxlTW9kZSBvbGRNb2RlLCBEaWZmRW50cnkgZGVsZXRlKSB7Ci0JCWFzc2VydEVxdWFscyhEaWZmRW50cnkuREVWX05VTEwsIGRlbGV0ZS5uZXdQYXRoKTsKLQkJYXNzZXJ0RXF1YWxzKERpZmZFbnRyeS5BX1pFUk8sIGRlbGV0ZS5uZXdJZCk7Ci0JCWFzc2VydEVxdWFscyhGaWxlTW9kZS5NSVNTSU5HLCBkZWxldGUubmV3TW9kZSk7Ci0JCWFzc2VydEVxdWFscyhDaGFuZ2VUeXBlLkRFTEVURSwgZGVsZXRlLmNoYW5nZVR5cGUpOwotCQlhc3NlcnRFcXVhbHMob2xkTmFtZSwgZGVsZXRlLm9sZFBhdGgpOwotCQlhc3NlcnRFcXVhbHMoQWJicmV2aWF0ZWRPYmplY3RJZC5mcm9tT2JqZWN0SWQob2xkSWQpLCBkZWxldGUub2xkSWQpOwotCQlhc3NlcnRFcXVhbHMob2xkTW9kZSwgZGVsZXRlLm9sZE1vZGUpOwotCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9CYXJlU3VwZXJwcm9qZWN0V3JpdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjkzODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9CYXJlU3VwZXJwcm9qZWN0V3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCBHb29nbGUgSW5jLiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zSW5BbnlPcmRlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLkJhcmVTdXBlcnByb2plY3RXcml0ZXIuQmFyZVdyaXRlckNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb0NvbW1hbmQuUmVtb3RlUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBMV9BID0gImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiOworCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHdyaXRlX3NldEdpdE1vZHVsZXNDb250ZW50cygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKFJlcG9zaXRvcnkgYmFyZVJlcG8gPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSB7CisJCQlSZXBvUHJvamVjdCByZXBvUHJvamVjdCA9IG5ldyBSZXBvUHJvamVjdCgic3VicHJvamVjdFgiLCAicGF0aC90byIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaC14IiwgInJlbW90ZSIsICIiKTsKKwkJCXJlcG9Qcm9qZWN0LnNldFVybCgiaHR0cDovL2V4YW1wbGUuY29tL2EiKTsKKworCQkJUmVtb3RlUmVhZGVyIG1vY2tSZW1vdGVSZWFkZXIgPSBtb2NrKFJlbW90ZVJlYWRlci5jbGFzcyk7CisJCQl3aGVuKG1vY2tSZW1vdGVSZWFkZXIuc2hhMSgiaHR0cDovL2V4YW1wbGUuY29tL2EiLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2gteCIpKQorCQkJCQkJCS50aGVuUmV0dXJuKE9iamVjdElkLmZyb21TdHJpbmcoU0hBMV9BKSk7CisKKwkJCUJhcmVTdXBlcnByb2plY3RXcml0ZXIgdyA9IG5ldyBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyKGJhcmVSZXBvLAorCQkJCQludWxsLCAicmVmcy9oZWFkcy9tYXN0ZXIiLCBhdXRob3IsIG1vY2tSZW1vdGVSZWFkZXIsCisJCQkJCUJhcmVXcml0ZXJDb25maWcuZ2V0RGVmYXVsdCgpLCBMaXN0Lm9mKCkpOworCisJCQlSZXZDb21taXQgY29tbWl0ID0gdy53cml0ZShBcnJheXMuYXNMaXN0KHJlcG9Qcm9qZWN0KSk7CisKKwkJCVN0cmluZyBjb250ZW50cyA9IHJlYWRDb250ZW50cyhiYXJlUmVwbywgY29tbWl0LCAiLmdpdG1vZHVsZXMiKTsKKwkJCUxpc3Q8U3RyaW5nPiBjb250ZW50TGluZXMgPSBBcnJheXMKKwkJCQkJLmFzTGlzdChjb250ZW50cy5zcGxpdCgiXG4iKSk7CisJCQlhc3NlcnRUaGF0KGNvbnRlbnRMaW5lcy5nZXQoMCksCisJCQkJCWlzKCJbc3VibW9kdWxlIFwic3VicHJvamVjdFhcIl0iKSk7CisJCQlhc3NlcnRUaGF0KGNvbnRlbnRMaW5lcy5zdWJMaXN0KDEsIGNvbnRlbnRMaW5lcy5zaXplKCkpLAorCQkJCQljb250YWluc0luQW55T3JkZXIoaXMoIlx0YnJhbmNoID0gcmVmcy9oZWFkcy9icmFuY2gteCIpLAorCQkJCQkJCWlzKCJcdHBhdGggPSBwYXRoL3RvIiksCisJCQkJCQkJaXMoIlx0dXJsID0gaHR0cDovL2V4YW1wbGUuY29tL2EiKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB3cml0ZV9zZXRFeHRyYUNvbnRlbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoUmVwb3NpdG9yeSBiYXJlUmVwbyA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpIHsKKwkJCVJlcG9Qcm9qZWN0IHJlcG9Qcm9qZWN0ID0gbmV3IFJlcG9Qcm9qZWN0KCJzdWJwcm9qZWN0WCIsICJwYXRoL3RvIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNoLXgiLCAicmVtb3RlIiwgIiIpOworCQkJcmVwb1Byb2plY3Quc2V0VXJsKCJodHRwOi8vZXhhbXBsZS5jb20vYSIpOworCisJCQlSZW1vdGVSZWFkZXIgbW9ja1JlbW90ZVJlYWRlciA9IG1vY2soUmVtb3RlUmVhZGVyLmNsYXNzKTsKKwkJCXdoZW4obW9ja1JlbW90ZVJlYWRlci5zaGExKCJodHRwOi8vZXhhbXBsZS5jb20vYSIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaC14IikpCisJCQkJCQkJLnRoZW5SZXR1cm4oT2JqZWN0SWQuZnJvbVN0cmluZyhTSEExX0EpKTsKKworCQkJQmFyZVN1cGVycHJvamVjdFdyaXRlciB3ID0gbmV3IEJhcmVTdXBlcnByb2plY3RXcml0ZXIoYmFyZVJlcG8sCisJCQkJCW51bGwsICJyZWZzL2hlYWRzL21hc3RlciIsIGF1dGhvciwgbW9ja1JlbW90ZVJlYWRlciwKKwkJCQkJQmFyZVdyaXRlckNvbmZpZy5nZXREZWZhdWx0KCksCisJCQkJCUxpc3Qub2YobmV3IEJhcmVTdXBlcnByb2plY3RXcml0ZXIuRXh0cmFDb250ZW50KCJ4IiwKKwkJCQkJCQkiZXh0cmEtY29udGVudCIpKSk7CisKKwkJCVJldkNvbW1pdCBjb21taXQgPSB3LndyaXRlKEFycmF5cy5hc0xpc3QocmVwb1Byb2plY3QpKTsKKworCQkJU3RyaW5nIGNvbnRlbnRzID0gcmVhZENvbnRlbnRzKGJhcmVSZXBvLCBjb21taXQsICJ4Iik7CisJCQlhc3NlcnRUaGF0KGNvbnRlbnRzLCBpcygiZXh0cmEtY29udGVudCIpKTsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIHJlYWRDb250ZW50cyhSZXBvc2l0b3J5IHJlcG8sIFJldkNvbW1pdCBjb21taXQsCisJCQlTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArIHBhdGg7CisJCU9iamVjdElkIG1vZElkID0gcmVwby5yZXNvbHZlKGlkU3RyKTsKKwkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gcmVwby5uZXdPYmplY3RSZWFkZXIoKSkgeworCQkJcmV0dXJuIG5ldyBTdHJpbmcoCisJCQkJCXJlYWRlci5vcGVuKG1vZElkKS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSksCisJCQkJCVN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhCmluZGV4IDUwOWFkYzIuLjNlNmQxM2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKQEAgLTU0NiwyNCArNTQ3LDI5IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBvTWFuaWZlc3RDb3B5RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgZXhpc3QKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKIAkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQlhc3NlcnRGYWxzZSgiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIG5vdCBiZSBleGVjdXRhYmxlIiwKLQkJCQloZWxsby5jYW5FeGVjdXRlKCkpOworCQlpZiAoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpIHsKKwkJCWFzc2VydEZhbHNlKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgbm90IGJlIGV4ZWN1dGFibGUiLAorCQkJCQlGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKGhlbGxvKSk7CisJCX0KIAkJYXNzZXJ0Q29udGVudHMoaGVsbG8udG9QYXRoKCksICJtYXN0ZXIgd29ybGQiKTsKIAkJLy8gVGhlIGRlc3QgZmlsZSBzaG91bGQgYWxzbyBleGlzdAogCQloZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7CiAJCWFzc2VydFRydWUoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBub3QgYmUgZXhlY3V0YWJsZSIsCi0JCQkJaGVsbG8uY2FuRXhlY3V0ZSgpKTsKKwkJaWYgKEZTLkRFVEVDVEVELnN1cHBvcnRzRXhlY3V0ZSgpKSB7CisJCQlhc3NlcnRGYWxzZSgiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIG5vdCBiZSBleGVjdXRhYmxlIiwKKwkJCQkJRlMuREVURUNURUQuY2FuRXhlY3V0ZShoZWxsbykpOworCQl9CiAJCWFzc2VydENvbnRlbnRzKGhlbGxvLnRvUGF0aCgpLCAibWFzdGVyIHdvcmxkIik7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVwb01hbmlmZXN0Q29weUZpbGVfZXhlY3V0YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3N1bWVUcnVlKEZTLkRFVEVDVEVELnN1cHBvcnRzRXhlY3V0ZSgpKTsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkZWZhdWx0RGIpKSB7CiAJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CiAJCQlGaWxlIGYgPSBKR2l0VGVzdFV0aWwud3JpdGVUcmFzaEZpbGUoZGVmYXVsdERiLCAiaGVsbG8uc2giLAogCQkJCQkiY29udGVudCBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIik7Ci0JCQlmLnNldEV4ZWN1dGFibGUodHJ1ZSk7CisJCQlGUy5ERVRFQ1RFRC5zZXRFeGVjdXRlKGYsIHRydWUpOwogCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJoZWxsby5zaCIpLmNhbGwoKTsKIAkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJBZGQgYmluYXJ5IGZpbGUiKS5jYWxsKCk7CiAJCX0KQEAgLTU4OCw3ICs1OTQsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVwb01hbmlmZXN0Q29weUZpbGVfZXhlY3V0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgZXhpc3QgYW5kIGJlIGFuIGV4ZWN1dGFibGUKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby5zaCIpOwogCQlhc3NlcnRUcnVlKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBvcmlnaW5hbCBmaWxlIG11c3QgYmUgZXhlY3V0YWJsZSIsIGhlbGxvLmNhbkV4ZWN1dGUoKSk7CisJCWFzc2VydFRydWUoIlRoZSBvcmlnaW5hbCBmaWxlIG11c3QgYmUgZXhlY3V0YWJsZSIsCisJCQkJRlMuREVURUNURUQuY2FuRXhlY3V0ZShoZWxsbykpOwogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKGhlbGxvLnRvUGF0aCgpLAogCQkJCVVURl84KSkgewogCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKQEAgLTYwMCw3ICs2MDcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVwb01hbmlmZXN0Q29weUZpbGVfZXhlY3V0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQloZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImNvcHktaGVsbG8uc2giKTsKIAkJYXNzZXJ0VHJ1ZSgiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwogCQlhc3NlcnRUcnVlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUiLAotCQkJCWhlbGxvLmNhbkV4ZWN1dGUoKSk7CisJCQkJRlMuREVURUNURUQuY2FuRXhlY3V0ZShoZWxsbykpOwogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKGhlbGxvLnRvUGF0aCgpLAogCQkJCVVURl84KSkgewogCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2xUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbERpZmZUb29sVGVzdC5qYXZhCmluZGV4IGIxNDFhODYuLmY2OWExNzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2xUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbFRlc3QuamF2YQpAQCAtMTAsNDIgKzEwLDE1NiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19ESUZGVE9PTF9TRUNUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0RJRkZfU0VDVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQ01EOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9HVUlUT09MOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9QQVRIOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9QUk9NUFQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1RPT0w7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbC5Cb29sZWFuVHJpU3RhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUy5FeGVjdXRpb25SZXN1bHQ7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIC8qKgogICogVGVzdGluZyBleHRlcm5hbCBkaWZmIHRvb2xzLgogICovCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxEaWZmVG9vbFRlc3QgZXh0ZW5kcyBFeHRlcm5hbFRvb2xUZXN0IHsKK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERpZmZUb29sVGVzdCBleHRlbmRzIEV4dGVybmFsVG9vbFRlc3RDYXNlIHsKKworCUBUZXN0KGV4cGVjdGVkID0gVG9vbEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0VXNlclRvb2xXaXRoRXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvb2xOYW1lID0gImN1c3RvbVRvb2wiOworCisJCWludCBlcnJvclJldHVybkNvZGUgPSAxOworCQlTdHJpbmcgY29tbWFuZCA9ICJleGl0ICIgKyBlcnJvclJldHVybkNvZGU7CisKKwkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCB0b29sTmFtZSwgQ09ORklHX0tFWV9DTUQsCisJCQkJY29tbWFuZCk7CisKKwkJaW52b2tlQ29tcGFyZSh0b29sTmFtZSk7CisKKwkJZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIHRvIGJlIHRocm93biBkdWUgdG8gZXh0ZXJuYWwgdG9vbCBleGl0aW5nIHdpdGggZXJyb3IgY29kZTogIgorCQkJCSsgZXJyb3JSZXR1cm5Db2RlKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IFRvb2xFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdFVzZXJUb29sV2l0aENvbW1hbmROb3RGb3VuZEVycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b29sTmFtZSA9ICJjdXN0b21Ub29sIjsKKworCQlpbnQgZXJyb3JSZXR1cm5Db2RlID0gMTI3OyAvLyBjb21tYW5kIG5vdCBmb3VuZAorCQlTdHJpbmcgY29tbWFuZCA9ICJleGl0ICIgKyBlcnJvclJldHVybkNvZGU7CisKKwkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCB0b29sTmFtZSwgQ09ORklHX0tFWV9DTUQsCisJCQkJY29tbWFuZCk7CisKKwkJaW52b2tlQ29tcGFyZSh0b29sTmFtZSk7CisJCWZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gZHVlIHRvIGV4dGVybmFsIHRvb2wgZXhpdGluZyB3aXRoIGVycm9yIGNvZGU6ICIKKwkJCQkrIGVycm9yUmV0dXJuQ29kZSk7CisJfQogCiAJQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0VG9vbE5hbWVzKCkgeworCXB1YmxpYyB2b2lkIHRlc3RVc2VyRGVmaW5lZFRvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNvbW1hbmQgPSBnZXRFY2hvQ29tbWFuZCgpOworCisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJU3RyaW5nIGN1c3RvbVRvb2xOYW1lID0gImN1c3RvbVRvb2wiOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sTmFtZSwKKwkJCQlDT05GSUdfS0VZX0NNRCwgY29tbWFuZCk7CisKIAkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKLQkJU2V0PFN0cmluZz4gYWN0dWFsVG9vbE5hbWVzID0gbWFuYWdlci5nZXRUb29sTmFtZXMoKTsKLQkJU2V0PFN0cmluZz4gZXhwZWN0ZWRUb29sTmFtZXMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXQgb2YgZXh0ZXJuYWwgZGlmZiB0b29sIG5hbWVzIiwKLQkJCQlleHBlY3RlZFRvb2xOYW1lcywgYWN0dWFsVG9vbE5hbWVzKTsKKworCQlNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiB0b29scyA9IG1hbmFnZXIuZ2V0VXNlckRlZmluZWRUb29scygpOworCQlFeHRlcm5hbERpZmZUb29sIGV4dGVybmFsVG9vbCA9IHRvb2xzLmdldChjdXN0b21Ub29sTmFtZSk7CisJCWJvb2xlYW4gdHJ1c3RFeGl0Q29kZSA9IHRydWU7CisJCW1hbmFnZXIuY29tcGFyZShsb2NhbCwgcmVtb3RlLCBleHRlcm5hbFRvb2wsIHRydXN0RXhpdENvZGUpOworCisJCWFzc2VydEVjaG9Db21tYW5kSGFzQ29ycmVjdE91dHB1dCgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFVzZXJEZWZpbmVkVG9vbFdpdGhQcm9tcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNvbW1hbmQgPSBnZXRFY2hvQ29tbWFuZCgpOworCisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJU3RyaW5nIGN1c3RvbVRvb2xOYW1lID0gImN1c3RvbVRvb2wiOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sTmFtZSwKKwkJCQlDT05GSUdfS0VZX0NNRCwgY29tbWFuZCk7CisKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKworCQlQcm9tcHRIYW5kbGVyIHByb21wdEhhbmRsZXIgPSBQcm9tcHRIYW5kbGVyLmFjY2VwdFByb21wdCgpOworCQlNaXNzaW5nVG9vbEhhbmRsZXIgbm9Ub29sSGFuZGxlciA9IG5ldyBNaXNzaW5nVG9vbEhhbmRsZXIoKTsKKworCQltYW5hZ2VyLmNvbXBhcmUobG9jYWwsIHJlbW90ZSwgT3B0aW9uYWwub2YoY3VzdG9tVG9vbE5hbWUpLAorCQkJCUJvb2xlYW5UcmlTdGF0ZS5UUlVFLCBmYWxzZSwgQm9vbGVhblRyaVN0YXRlLlRSVUUsCisJCQkJcHJvbXB0SGFuZGxlciwgbm9Ub29sSGFuZGxlcik7CisKKwkJYXNzZXJ0RWNob0NvbW1hbmRIYXNDb3JyZWN0T3V0cHV0KCk7CisKKwkJTGlzdDxTdHJpbmc+IGFjdHVhbFRvb2xQcm9tcHRzID0gcHJvbXB0SGFuZGxlci50b29sUHJvbXB0czsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkVG9vbFByb21wdHMgPSBBcnJheXMuYXNMaXN0KCJjdXN0b21Ub29sIik7CisJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgYSB1c2VyIHByb21wdCBmb3IgY3VzdG9tIHRvb2wgY2FsbCIsCisJCQkJZXhwZWN0ZWRUb29sUHJvbXB0cywgYWN0dWFsVG9vbFByb21wdHMpOworCisJCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgdG8gbm8gaW5mb3JtaW5nIGFib3V0IG1pc3NpbmcgdG9vbHMiLAorCQkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG5vVG9vbEhhbmRsZXIubWlzc2luZ1Rvb2xzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVc2VyRGVmaW5lZFRvb2xXaXRoQ2FuY2VsbGVkUHJvbXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBjb21tYW5kID0gZ2V0RWNob0NvbW1hbmQoKTsKKworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBjdXN0b21Ub29sTmFtZSA9ICJjdXN0b21Ub29sIjsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbE5hbWUsCisJCQkJQ09ORklHX0tFWV9DTUQsIGNvbW1hbmQpOworCisJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisKKwkJUHJvbXB0SGFuZGxlciBwcm9tcHRIYW5kbGVyID0gUHJvbXB0SGFuZGxlci5jYW5jZWxQcm9tcHQoKTsKKwkJTWlzc2luZ1Rvb2xIYW5kbGVyIG5vVG9vbEhhbmRsZXIgPSBuZXcgTWlzc2luZ1Rvb2xIYW5kbGVyKCk7CisKKwkJT3B0aW9uYWw8RXhlY3V0aW9uUmVzdWx0PiByZXN1bHQgPSBtYW5hZ2VyLmNvbXBhcmUobG9jYWwsIHJlbW90ZSwKKwkJCQlPcHRpb25hbC5vZihjdXN0b21Ub29sTmFtZSksIEJvb2xlYW5UcmlTdGF0ZS5UUlVFLCBmYWxzZSwKKwkJCQlCb29sZWFuVHJpU3RhdGUuVFJVRSwgcHJvbXB0SGFuZGxlciwgbm9Ub29sSGFuZGxlcik7CisJCWFzc2VydEZhbHNlKCJFeHBlY3RlZCBubyByZXN1bHQgaWYgdXNlciBjYW5jZWxzIHRoZSBvcGVyYXRpb24iLAorCQkJCXJlc3VsdC5pc1ByZXNlbnQoKSk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0QWxsVG9vbHMoKSB7CisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJU3RyaW5nIGN1c3RvbVRvb2xOYW1lID0gImN1c3RvbVRvb2wiOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sTmFtZSwKKwkJCQlDT05GSUdfS0VZX0NNRCwgImVjaG8iKTsKKwogCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOwotCQlTZXQ8U3RyaW5nPiBhY3R1YWxUb29sTmFtZXMgPSBtYW5hZ2VyLmdldEF2YWlsYWJsZVRvb2xzKCkua2V5U2V0KCk7CisJCVNldDxTdHJpbmc+IGFjdHVhbFRvb2xOYW1lcyA9IG1hbmFnZXIuZ2V0QWxsVG9vbE5hbWVzKCk7CiAJCVNldDxTdHJpbmc+IGV4cGVjdGVkVG9vbE5hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworCQlleHBlY3RlZFRvb2xOYW1lcy5hZGQoY3VzdG9tVG9vbE5hbWUpOwogCQlDb21tYW5kTGluZURpZmZUb29sW10gZGVmYXVsdFRvb2xzID0gQ29tbWFuZExpbmVEaWZmVG9vbC52YWx1ZXMoKTsKIAkJZm9yIChDb21tYW5kTGluZURpZmZUb29sIGRlZmF1bHRUb29sIDogZGVmYXVsdFRvb2xzKSB7CiAJCQlTdHJpbmcgdG9vbE5hbWUgPSBkZWZhdWx0VG9vbC5uYW1lKCk7CkBAIC04NiwxMSArMjAwLDExIEBAIHB1YmxpYyB2b2lkIHRlc3RVc2VyRGVmaW5lZFRvb2xzKCkgewogCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sbmFtZSwKIAkJCQlDT05GSUdfS0VZX1BBVEgsICIvdXNyL2Jpbi9lY2hvIik7CiAJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIGN1c3RvbVRvb2xuYW1lLAotCQkJCUNPTkZJR19LRVlfUFJPTVBULCAiLS1uby1wcm9tcHQiKTsKKwkJCQlDT05GSUdfS0VZX1BST01QVCwgU3RyaW5nLnZhbHVlT2YoZmFsc2UpKTsKIAkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbG5hbWUsCi0JCQkJQ09ORklHX0tFWV9HVUlUT09MLCAiLS1uby1ndWkiKTsKKwkJCQlDT05GSUdfS0VZX0dVSVRPT0wsIFN0cmluZy52YWx1ZU9mKGZhbHNlKSk7CiAJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIGN1c3RvbVRvb2xuYW1lLAotCQkJCUNPTkZJR19LRVlfVFJVU1RfRVhJVF9DT0RFLCAiLS1uby10cnVzdC1leGl0LWNvZGUiKTsKKwkJCQlDT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERSwgU3RyaW5nLnZhbHVlT2YoZmFsc2UpKTsKIAkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKIAkJU2V0PFN0cmluZz4gYWN0dWFsVG9vbE5hbWVzID0gbWFuYWdlci5nZXRVc2VyRGVmaW5lZFRvb2xzKCkua2V5U2V0KCk7CiAJCVNldDxTdHJpbmc+IGV4cGVjdGVkVG9vbE5hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwpAQCAtMTAwLDU5ICsyMTQsMjQwIEBAIHB1YmxpYyB2b2lkIHRlc3RVc2VyRGVmaW5lZFRvb2xzKCkgewogCX0KIAogCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vdEF2YWlsYWJsZVRvb2xzKCkgewotCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOwotCQlTZXQ8U3RyaW5nPiBhY3R1YWxUb29sTmFtZXMgPSBtYW5hZ2VyLmdldE5vdEF2YWlsYWJsZVRvb2xzKCkua2V5U2V0KCk7Ci0JCVNldDxTdHJpbmc+IGV4cGVjdGVkVG9vbE5hbWVzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2V0IG9mIG5vdCBhdmFpbGFibGUgZXh0ZXJuYWwgZGlmZiB0b29scyIsCi0JCQkJZXhwZWN0ZWRUb29sTmFtZXMsIGFjdHVhbFRvb2xOYW1lcyk7Ci0JfQorCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlKCkgdGhyb3dzIFRvb2xFeGNlcHRpb24geworCQlTdHJpbmcgdG9vbE5hbWUgPSAiY3VzdG9tVG9vbCI7CiAKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlKCkgewotCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCS8vIHRoZSBkZWZhdWx0IGRpZmYgdG9vbCBpcyBjb25maWd1cmVkIHdpdGhvdXQgYSBzdWJzZWN0aW9uCisJCVN0cmluZyBzdWJzZWN0aW9uID0gbnVsbDsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRl9TRUNUSU9OLCBzdWJzZWN0aW9uLCBDT05GSUdfS0VZX1RPT0wsCisJCQkJdG9vbE5hbWUpOwogCi0JCVN0cmluZyBuZXdQYXRoID0gIiI7Ci0JCVN0cmluZyBvbGRQYXRoID0gIiI7Ci0JCVN0cmluZyBuZXdJZCA9ICIiOwotCQlTdHJpbmcgb2xkSWQgPSAiIjsKLQkJU3RyaW5nIHRvb2xOYW1lID0gIiI7Ci0JCUJvb2xlYW5UcmlTdGF0ZSBwcm9tcHQgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7Ci0JCUJvb2xlYW5UcmlTdGF0ZSBndWkgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7Ci0JCUJvb2xlYW5UcmlTdGF0ZSB0cnVzdEV4aXRDb2RlID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCQlTdHJpbmcgY29tbWFuZCA9IGdldEVjaG9Db21tYW5kKCk7CiAKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgdG9vbE5hbWUsIENPTkZJR19LRVlfQ01ELAorCQkJCWNvbW1hbmQpOworCQlPcHRpb25hbDxFeGVjdXRpb25SZXN1bHQ+IHJlc3VsdCA9IGludm9rZUNvbXBhcmUodG9vbE5hbWUpOworCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleHRlcm5hbCBkaWZmIHRvb2wgcmVzdWx0IHRvIGJlIGF2YWlsYWJsZSIsCisJCQkJcmVzdWx0LmlzUHJlc2VudCgpKTsKIAkJaW50IGV4cGVjdGVkQ29tcGFyZVJlc3VsdCA9IDA7Ci0JCWludCBjb21wYXJlUmVzdWx0ID0gbWFuYWdlci5jb21wYXJlKG5ld1BhdGgsIG9sZFBhdGgsIG5ld0lkLCBvbGRJZCwKLQkJCQl0b29sTmFtZSwgcHJvbXB0LCBndWksIHRydXN0RXhpdENvZGUpOwogCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBjb21wYXJlIHJlc3VsdCBmb3IgZXh0ZXJuYWwgZGlmZiB0b29sIiwKLQkJCQlleHBlY3RlZENvbXBhcmVSZXN1bHQsIGNvbXBhcmVSZXN1bHQpOworCQkJCWV4cGVjdGVkQ29tcGFyZVJlc3VsdCwgcmVzdWx0LmdldCgpLmdldFJjKCkpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdERlZmF1bHRUb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b29sTmFtZSA9ICJjdXN0b21Ub29sIjsKKwkJU3RyaW5nIGd1aVRvb2xOYW1lID0gImN1c3RvbUd1aVRvb2wiOworCisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJLy8gdGhlIGRlZmF1bHQgZGlmZiB0b29sIGlzIGNvbmZpZ3VyZWQgd2l0aG91dCBhIHN1YnNlY3Rpb24KKwkJU3RyaW5nIHN1YnNlY3Rpb24gPSBudWxsOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGX1NFQ1RJT04sIHN1YnNlY3Rpb24sIENPTkZJR19LRVlfVE9PTCwKKwkJCQl0b29sTmFtZSk7CisKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJYm9vbGVhbiBndWkgPSBmYWxzZTsKKwkJU3RyaW5nIGRlZmF1bHRUb29sTmFtZSA9IG1hbmFnZXIuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7CisJCWFzc2VydEVxdWFscygKKwkJCQkiRXhwZWN0ZWQgY29uZmlndXJlZCBkaWZmdG9vbCB0byBiZSB0aGUgZGVmYXVsdCBleHRlcm5hbCBkaWZmIHRvb2wiLAorCQkJCXRvb2xOYW1lLCBkZWZhdWx0VG9vbE5hbWUpOworCisJCWd1aSA9IHRydWU7CisJCVN0cmluZyBkZWZhdWx0R3VpVG9vbE5hbWUgPSBtYW5hZ2VyLmdldERlZmF1bHRUb29sTmFtZShndWkpOworCQlhc3NlcnRFcXVhbHMoCisJCQkJIkV4cGVjdGVkIGRlZmF1bHQgZ3VpIGRpZmZ0b29sIHRvIGJlIHRoZSBkZWZhdWx0IHRvb2wgaWYgbm8gZ3VpIHRvb2wgaXMgc2V0IiwKKwkJCQl0b29sTmFtZSwgZGVmYXVsdEd1aVRvb2xOYW1lKTsKKworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGX1NFQ1RJT04sIHN1YnNlY3Rpb24sIENPTkZJR19LRVlfR1VJVE9PTCwKKwkJCQlndWlUb29sTmFtZSk7CisJCW1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJZGVmYXVsdEd1aVRvb2xOYW1lID0gbWFuYWdlci5nZXREZWZhdWx0VG9vbE5hbWUoZ3VpKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJFeHBlY3RlZCBjb25maWd1cmVkIGRpZmZ0b29sIHRvIGJlIHRoZSBkZWZhdWx0IGV4dGVybmFsIGRpZmYgZ3VpdG9vbCIsCisJCQkJZ3VpVG9vbE5hbWUsIGRlZmF1bHRHdWlUb29sTmFtZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVQcmVEZWZpbmVkVG9vbFBhdGgoKSB7CisJCVN0cmluZyBuZXdUb29sUGF0aCA9ICIvdG1wL3BhdGgvIjsKKworCQlDb21tYW5kTGluZURpZmZUb29sW10gZGVmYXVsdFRvb2xzID0gQ29tbWFuZExpbmVEaWZmVG9vbC52YWx1ZXMoKTsKKwkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgdG8gZmluZCBwcmUtZGVmaW5lZCBleHRlcm5hbCBkaWZmIHRvb2xzIiwKKwkJCQlkZWZhdWx0VG9vbHMubGVuZ3RoID4gMCk7CisKKwkJQ29tbWFuZExpbmVEaWZmVG9vbCBvdmVycmlkZW5Ub29sID0gZGVmYXVsdFRvb2xzWzBdOworCQlTdHJpbmcgb3ZlcnJpZGVuVG9vbE5hbWUgPSBvdmVycmlkZW5Ub29sLm5hbWUoKTsKKwkJU3RyaW5nIG92ZXJyaWRlblRvb2xQYXRoID0gbmV3VG9vbFBhdGggKyBvdmVycmlkZW5Ub29sTmFtZTsKKwkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBvdmVycmlkZW5Ub29sTmFtZSwKKwkJCQlDT05GSUdfS0VZX1BBVEgsIG92ZXJyaWRlblRvb2xQYXRoKTsKKworCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCQlNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBhdmFpbGFibGVUb29scyA9IG1hbmFnZXIKKwkJCQkuZ2V0UHJlZGVmaW5lZFRvb2xzKHRydWUpOworCQlFeHRlcm5hbERpZmZUb29sIGV4dGVybmFsRGlmZlRvb2wgPSBhdmFpbGFibGVUb29scworCQkJCS5nZXQob3ZlcnJpZGVuVG9vbE5hbWUpOworCQlTdHJpbmcgYWN0dWFsRGlmZlRvb2xQYXRoID0gZXh0ZXJuYWxEaWZmVG9vbC5nZXRQYXRoKCk7CisJCWFzc2VydEVxdWFscygKKwkJCQkiRXhwZWN0ZWQgcHJlLWRlZmluZWQgZXh0ZXJuYWwgZGlmZiB0b29sIHRvIGhhdmUgb3ZlcnJpZGVuIHBhdGgiLAorCQkJCW92ZXJyaWRlblRvb2xQYXRoLCBhY3R1YWxEaWZmVG9vbFBhdGgpOworCQlTdHJpbmcgZXhwZWN0ZWREaWZmVG9vbENvbW1hbmQgPSBvdmVycmlkZW5Ub29sUGF0aCArICIgIgorCQkJCSsgb3ZlcnJpZGVuVG9vbC5nZXRQYXJhbWV0ZXJzKCk7CisJCVN0cmluZyBhY3R1YWxEaWZmVG9vbENvbW1hbmQgPSBleHRlcm5hbERpZmZUb29sLmdldENvbW1hbmQoKTsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJFeHBlY3RlZCBwcmUtZGVmaW5lZCBleHRlcm5hbCBkaWZmIHRvb2wgdG8gaGF2ZSBvdmVycmlkZW4gY29tbWFuZCIsCisJCQkJZXhwZWN0ZWREaWZmVG9vbENvbW1hbmQsIGFjdHVhbERpZmZUb29sQ29tbWFuZCk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBUb29sRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RVbmRlZmluZWRUb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b29sTmFtZSA9ICJ1bmRlZmluZWQiOworCQlpbnZva2VDb21wYXJlKHRvb2xOYW1lKTsKKwkJZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIHRvIGJlIHRocm93biBkdWUgdG8gbm90IGRlZmluZWQgZXh0ZXJuYWwgZGlmZiB0b29sIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRvb2xFeGVjdXRpb25XaXRoUHJvbXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKIAkJLy8gdGhlIGRlZmF1bHQgZGlmZiB0b29sIGlzIGNvbmZpZ3VyZWQgd2l0aG91dCBhIHN1YnNlY3Rpb24KIAkJU3RyaW5nIHN1YnNlY3Rpb24gPSBudWxsOwogCQljb25maWcuc2V0U3RyaW5nKCJkaWZmIiwgc3Vic2VjdGlvbiwgInRvb2wiLCAiY3VzdG9tVG9vbCIpOwogCisJCVN0cmluZyBjb21tYW5kID0gZ2V0RWNob0NvbW1hbmQoKTsKKworCQljb25maWcuc2V0U3RyaW5nKCJkaWZmdG9vbCIsICJjdXN0b21Ub29sIiwgImNtZCIsIGNvbW1hbmQpOworCiAJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7Ci0JCUJvb2xlYW5UcmlTdGF0ZSBndWkgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7CisKKwkJUHJvbXB0SGFuZGxlciBwcm9tcHRIYW5kbGVyID0gUHJvbXB0SGFuZGxlci5hY2NlcHRQcm9tcHQoKTsKKwkJTWlzc2luZ1Rvb2xIYW5kbGVyIG5vVG9vbEhhbmRsZXIgPSBuZXcgTWlzc2luZ1Rvb2xIYW5kbGVyKCk7CisKKwkJbWFuYWdlci5jb21wYXJlKGxvY2FsLCByZW1vdGUsIE9wdGlvbmFsLmVtcHR5KCksIEJvb2xlYW5UcmlTdGF0ZS5UUlVFLAorCQkJCWZhbHNlLCBCb29sZWFuVHJpU3RhdGUuVFJVRSwgcHJvbXB0SGFuZGxlciwgbm9Ub29sSGFuZGxlcik7CisKKwkJYXNzZXJ0RWNob0NvbW1hbmRIYXNDb3JyZWN0T3V0cHV0KCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Tm9EZWZhdWx0VG9vbE5hbWUoKSB7CisJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisJCWJvb2xlYW4gZ3VpID0gZmFsc2U7CiAJCVN0cmluZyBkZWZhdWx0VG9vbE5hbWUgPSBtYW5hZ2VyLmdldERlZmF1bHRUb29sTmFtZShndWkpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkJIkV4cGVjdGVkIGNvbmZpZ3VyZWQgZGlmZnRvb2wgdG8gYmUgdGhlIGRlZmF1bHQgZXh0ZXJuYWwgZGlmZiB0b29sIiwKLQkJCQkibXlfZGVmYXVsdF90b29sbmFtZSIsIGRlZmF1bHRUb29sTmFtZSk7CisJCWFzc2VydE51bGwoIkV4cGVjdGVkIG5vIGRlZmF1bHQgdG9vbCB3aGVuIG5vbmUgaXMgY29uZmlndXJlZCIsCisJCQkJZGVmYXVsdFRvb2xOYW1lKTsKIAotCQlndWkgPSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKLQkJU3RyaW5nIGRlZmF1bHRHdWlUb29sTmFtZSA9IG1hbmFnZXIuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7Ci0JCWFzc2VydEVxdWFscygKLQkJCQkiRXhwZWN0ZWQgY29uZmlndXJlZCBkaWZmdG9vbCB0byBiZSB0aGUgZGVmYXVsdCBleHRlcm5hbCBkaWZmIHRvb2wiLAotCQkJCSJteV9ndWlfdG9vbCIsIGRlZmF1bHRHdWlUb29sTmFtZSk7CisJCWd1aSA9IHRydWU7CisJCWRlZmF1bHRUb29sTmFtZSA9IG1hbmFnZXIuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7CisJCWFzc2VydE51bGwoIkV4cGVjdGVkIG5vIGRlZmF1bHQgdG9vbCB3aGVuIG5vbmUgaXMgY29uZmlndXJlZCIsCisJCQkJZGVmYXVsdFRvb2xOYW1lKTsKKwl9CiAKLQkJY29uZmlnLnNldFN0cmluZygiZGlmZiIsIHN1YnNlY3Rpb24sICJndWl0b29sIiwgImN1c3RvbUd1aVRvb2wiKTsKLQkJbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOwotCQlkZWZhdWx0R3VpVG9vbE5hbWUgPSBtYW5hZ2VyLmdldERlZmF1bHRUb29sTmFtZShndWkpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkJIkV4cGVjdGVkIGNvbmZpZ3VyZWQgZGlmZnRvb2wgdG8gYmUgdGhlIGRlZmF1bHQgZXh0ZXJuYWwgZGlmZiBndWl0b29sIiwKLQkJCQkibXlfZ3VpX3Rvb2wiLCBkZWZhdWx0R3VpVG9vbE5hbWUpOworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEV4dGVybmFsVG9vbEluR2l0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY29udGVudCA9ICJhdHRyaWJ1dGVzOlxuKi50eHQgCQlkaWZmdG9vbD1jdXN0b21Ub29sIjsKKwkJRmlsZSBnaXRhdHRyaWJ1dGVzID0gd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgY29udGVudCk7CisJCWdpdGF0dHJpYnV0ZXMuZGVsZXRlT25FeGl0KCk7CisJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gdGVzdFJlcG9zaXRvcnkgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PigKKwkJCQlkYikpIHsKKwkJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImRpZmZ0b29sIiwgImN1c3RvbVRvb2wiLCAiY21kIiwgImVjaG8iKTsKKwkJCXRlc3RSZXBvc2l0b3J5LmdpdCgpLmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGxvY2FsRmlsZS5nZXROYW1lKCkpCisJCQkJCS5jYWxsKCk7CisKKwkJCXRlc3RSZXBvc2l0b3J5LmdpdCgpLmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuZ2l0YXR0cmlidXRlcyIpLmNhbGwoKTsKKworCQkJdGVzdFJlcG9zaXRvcnkuYnJhbmNoKCJtYXN0ZXIiKS5jb21taXQoKS5tZXNzYWdlKCJmaXJzdCBjb21taXQiKQorCQkJCQkuY3JlYXRlKCk7CisKKwkJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisJCQlPcHRpb25hbDxTdHJpbmc+IHRvb2wgPSBtYW5hZ2VyCisJCQkJCS5nZXRFeHRlcm5hbFRvb2xGcm9tQXR0cmlidXRlcyhsb2NhbEZpbGUuZ2V0TmFtZSgpKTsKKwkJCWFzc2VydFRydWUoIkZhaWxlZCB0byBmaW5kIHVzZXIgZGVmaW5lZCB0b29sIiwgdG9vbC5pc1ByZXNlbnQoKSk7CisJCQlhc3NlcnRFcXVhbHMoIkZhaWxlZCB0byBmaW5kIHVzZXIgZGVmaW5lZCB0b29sIiwgImN1c3RvbVRvb2wiLAorCQkJCQl0b29sLmdldCgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCUZpbGVzLmRlbGV0ZShnaXRhdHRyaWJ1dGVzLnRvUGF0aCgpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5vdEV4dGVybmFsVG9vbEluR2l0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY29udGVudCA9ICIiOworCQlGaWxlIGdpdGF0dHJpYnV0ZXMgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCBjb250ZW50KTsKKwkJZ2l0YXR0cmlidXRlcy5kZWxldGVPbkV4aXQoKTsKKwkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiB0ZXN0UmVwb3NpdG9yeSA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KAorCQkJCWRiKSkgeworCQkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiZGlmZnRvb2wiLCAiY3VzdG9tVG9vbCIsICJjbWQiLCAiZWNobyIpOworCQkJdGVzdFJlcG9zaXRvcnkuZ2l0KCkuYWRkKCkuYWRkRmlsZXBhdHRlcm4obG9jYWxGaWxlLmdldE5hbWUoKSkKKwkJCQkJLmNhbGwoKTsKKworCQkJdGVzdFJlcG9zaXRvcnkuZ2l0KCkuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi5naXRhdHRyaWJ1dGVzIikuY2FsbCgpOworCisJCQl0ZXN0UmVwb3NpdG9yeS5icmFuY2goIm1hc3RlciIpLmNvbW1pdCgpLm1lc3NhZ2UoImZpcnN0IGNvbW1pdCIpCisJCQkJCS5jcmVhdGUoKTsKKworCQkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJCU9wdGlvbmFsPFN0cmluZz4gdG9vbCA9IG1hbmFnZXIKKwkJCQkJLmdldEV4dGVybmFsVG9vbEZyb21BdHRyaWJ1dGVzKGxvY2FsRmlsZS5nZXROYW1lKCkpOworCQkJYXNzZXJ0RmFsc2UoCisJCQkJCSJFeHBlY3RlZCBubyBleHRlcm5hbCB0b29sIGlmIG5vIGRlZmF1bHQgdG9vbCBpcyBzcGVjaWZpZWQgaW4gLmdpdGF0dHJpYnV0ZXMiLAorCQkJCQl0b29sLmlzUHJlc2VudCgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCUZpbGVzLmRlbGV0ZShnaXRhdHRyaWJ1dGVzLnRvUGF0aCgpKTsKKwkJfQorCX0KKworCUBUZXN0KGV4cGVjdGVkID0gVG9vbEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0TnVsbFRvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKworCQlib29sZWFuIHRydXN0RXhpdENvZGUgPSB0cnVlOworCQlFeHRlcm5hbERpZmZUb29sIHRvb2wgPSBudWxsOworCQltYW5hZ2VyLmNvbXBhcmUobG9jYWwsIHJlbW90ZSwgdG9vbCwgdHJ1c3RFeGl0Q29kZSk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBUb29sRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3ROdWxsVG9vbFdpdGhQcm9tcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKworCQlQcm9tcHRIYW5kbGVyIHByb21wdEhhbmRsZXIgPSBQcm9tcHRIYW5kbGVyLmNhbmNlbFByb21wdCgpOworCQlNaXNzaW5nVG9vbEhhbmRsZXIgbm9Ub29sSGFuZGxlciA9IG5ldyBNaXNzaW5nVG9vbEhhbmRsZXIoKTsKKworCQlPcHRpb25hbDxTdHJpbmc+IHRvb2wgPSBudWxsOworCQltYW5hZ2VyLmNvbXBhcmUobG9jYWwsIHJlbW90ZSwgdG9vbCwgQm9vbGVhblRyaVN0YXRlLlRSVUUsIGZhbHNlLAorCQkJCUJvb2xlYW5UcmlTdGF0ZS5UUlVFLCBwcm9tcHRIYW5kbGVyLCBub1Rvb2xIYW5kbGVyKTsKKwl9CisKKwlwcml2YXRlIE9wdGlvbmFsPEV4ZWN1dGlvblJlc3VsdD4gaW52b2tlQ29tcGFyZShTdHJpbmcgdG9vbE5hbWUpCisJCQl0aHJvd3MgVG9vbEV4Y2VwdGlvbiB7CisJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisKKwkJQm9vbGVhblRyaVN0YXRlIHByb21wdCA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKwkJYm9vbGVhbiBndWkgPSBmYWxzZTsKKwkJQm9vbGVhblRyaVN0YXRlIHRydXN0RXhpdENvZGUgPSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwkJUHJvbXB0SGFuZGxlciBwcm9tcHRIYW5kbGVyID0gUHJvbXB0SGFuZGxlci5hY2NlcHRQcm9tcHQoKTsKKwkJTWlzc2luZ1Rvb2xIYW5kbGVyIG5vVG9vbEhhbmRsZXIgPSBuZXcgTWlzc2luZ1Rvb2xIYW5kbGVyKCk7CisKKwkJT3B0aW9uYWw8RXhlY3V0aW9uUmVzdWx0PiByZXN1bHQgPSBtYW5hZ2VyLmNvbXBhcmUobG9jYWwsIHJlbW90ZSwKKwkJCQlPcHRpb25hbC5vZih0b29sTmFtZSksIHByb21wdCwgZ3VpLCB0cnVzdEV4aXRDb2RlLAorCQkJCXByb21wdEhhbmRsZXIsIG5vVG9vbEhhbmRsZXIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldEVjaG9Db21tYW5kKCkgeworCQlyZXR1cm4gIihlY2hvIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIpID4gIgorCQkJCSsgY29tbWFuZFJlc3VsdC5nZXRBYnNvbHV0ZVBhdGgoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYXNzZXJ0RWNob0NvbW1hbmRIYXNDb3JyZWN0T3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTGlzdDxTdHJpbmc+IGFjdHVhbExpbmVzID0gRmlsZXMucmVhZEFsbExpbmVzKGNvbW1hbmRSZXN1bHQudG9QYXRoKCkpOworCQlTdHJpbmcgYWN0dWFsQ29udGVudCA9IFN0cmluZy5qb2luKFN5c3RlbS5saW5lU2VwYXJhdG9yKCksIGFjdHVhbExpbmVzKTsKKwkJYWN0dWFsTGluZXMgPSBBcnJheXMuYXNMaXN0KGFjdHVhbENvbnRlbnQuc3BsaXQoIiAiKSk7CisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZExpbmVzID0gQXJyYXlzLmFzTGlzdChsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisJCQkJcmVtb3RlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCWFzc2VydEVxdWFscygiRHVtbXkgdGVzdCB0b29sIGNhbGxlZCB3aXRoIHVuZXhwZWN0ZWQgYXJndW1lbnRzIiwKKwkJCQlleHBlY3RlZExpbmVzLCBhY3R1YWxMaW5lcyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxNZXJnZVRvb2xUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbE1lcmdlVG9vbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGI2N2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxNZXJnZVRvb2xUZXN0LmphdmEKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMiwgU2ltZW9uIEFuZHJlZXYgPHNpbWVvbi5kYW5haWxvdi5hbmRyZWV2QGdtYWlsLmNvbT4gYW5kIG90aGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DTUQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0dVSVRPT0w7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1BBVEg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1BST01QVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVE9PTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVFJVU1RfRVhJVF9DT0RFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX01FUkdFX1NFQ1RJT047CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWwuQm9vbGVhblRyaVN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlMuRXhlY3V0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RpbmcgZXh0ZXJuYWwgbWVyZ2UgdG9vbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbE1lcmdlVG9vbFRlc3QgZXh0ZW5kcyBFeHRlcm5hbFRvb2xUZXN0Q2FzZSB7CisKKwlAVGVzdChleHBlY3RlZCA9IFRvb2xFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdFVzZXJUb29sV2l0aEVycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b29sTmFtZSA9ICJjdXN0b21Ub29sIjsKKworCQlpbnQgZXJyb3JSZXR1cm5Db2RlID0gMTsKKwkJU3RyaW5nIGNvbW1hbmQgPSAiZXhpdCAiICsgZXJyb3JSZXR1cm5Db2RlOworCisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VUT09MX1NFQ1RJT04sIHRvb2xOYW1lLCBDT05GSUdfS0VZX0NNRCwKKwkJCQljb21tYW5kKTsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VUT09MX1NFQ1RJT04sIHRvb2xOYW1lLAorCQkJCUNPTkZJR19LRVlfVFJVU1RfRVhJVF9DT0RFLCBTdHJpbmcudmFsdWVPZihCb29sZWFuLlRSVUUpKTsKKworCQlpbnZva2VNZXJnZSh0b29sTmFtZSk7CisKKwkJZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIHRvIGJlIHRocm93biBkdWUgdG8gZXh0ZXJuYWwgdG9vbCBleGl0aW5nIHdpdGggZXJyb3IgY29kZTogIgorCQkJCSsgZXJyb3JSZXR1cm5Db2RlKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IFRvb2xFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdFVzZXJUb29sV2l0aENvbW1hbmROb3RGb3VuZEVycm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b29sTmFtZSA9ICJjdXN0b21Ub29sIjsKKworCQlpbnQgZXJyb3JSZXR1cm5Db2RlID0gMTI3OyAvLyBjb21tYW5kIG5vdCBmb3VuZAorCQlTdHJpbmcgY29tbWFuZCA9ICJleGl0ICIgKyBlcnJvclJldHVybkNvZGU7CisKKwkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiwgdG9vbE5hbWUsIENPTkZJR19LRVlfQ01ELAorCQkJCWNvbW1hbmQpOworCisJCWludm9rZU1lcmdlKHRvb2xOYW1lKTsKKworCQlmYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gdG8gYmUgdGhyb3duIGR1ZSB0byBleHRlcm5hbCB0b29sIGV4aXRpbmcgd2l0aCBlcnJvciBjb2RlOiAiCisJCQkJKyBlcnJvclJldHVybkNvZGUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEtkaWZmMygpIHRocm93cyBFeGNlcHRpb24geworCQlhc3N1bWVQb3NpeFBsYXRmb3JtKCk7CisKKwkJQ29tbWFuZExpbmVNZXJnZVRvb2wgYXV0b01lcmdpbmdUb29sID0gQ29tbWFuZExpbmVNZXJnZVRvb2wua2RpZmYzOworCQlhc3N1bWVNZXJnZVRvb2xJc0F2YWlsYWJsZShhdXRvTWVyZ2luZ1Rvb2wpOworCisJCUNvbW1hbmRMaW5lTWVyZ2VUb29sIHRvb2wgPSBhdXRvTWVyZ2luZ1Rvb2w7CisJCVByZURlZmluZWRNZXJnZVRvb2wgZXh0ZXJuYWxUb29sID0gbmV3IFByZURlZmluZWRNZXJnZVRvb2wodG9vbC5uYW1lKCksCisJCQkJdG9vbC5nZXRQYXRoKCksIHRvb2wuZ2V0UGFyYW1ldGVycyh0cnVlKSwKKwkJCQl0b29sLmdldFBhcmFtZXRlcnMoZmFsc2UpLAorCQkJCXRvb2wuaXNFeGl0Q29kZVRydXN0YWJsZSgpID8gQm9vbGVhblRyaVN0YXRlLlRSVUUKKwkJCQkJCTogQm9vbGVhblRyaVN0YXRlLkZBTFNFKTsKKworCQlNZXJnZVRvb2xzIG1hbmFnZXIgPSBuZXcgTWVyZ2VUb29scyhkYik7CisJCUV4ZWN1dGlvblJlc3VsdCByZXN1bHQgPSBtYW5hZ2VyLm1lcmdlKGxvY2FsLCByZW1vdGUsIG1lcmdlZCwgbnVsbCwKKwkJCQludWxsLCBleHRlcm5hbFRvb2wpOworCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG1lcmdlIHRvb2wgdG8gc3VjY2VlZCIsIDAsIHJlc3VsdC5nZXRSYygpKTsKKworCQlMaXN0PFN0cmluZz4gYWN0dWFsTGluZXMgPSBGaWxlcy5yZWFkQWxsTGluZXMobWVyZ2VkRmlsZS50b1BhdGgoKSk7CisJCVN0cmluZyBhY3R1YWxNZXJnZVJlc3VsdCA9IFN0cmluZy5qb2luKFN5c3RlbS5saW5lU2VwYXJhdG9yKCksCisJCQkJYWN0dWFsTGluZXMpOworCQlTdHJpbmcgZXhwZWN0ZWRNZXJnZVJlc3VsdCA9IERFRkFVTFRfQ09OVEVOVDsKKwkJYXNzZXJ0RXF1YWxzKAorCQkJCSJGYWlsZWQgdG8gbWVyZ2UgZXF1YWwgbG9jYWwgYW5kIHJlbW90ZSB2ZXJzaW9ucyB3aXRoIHByZS1kZWZpbmVkIHRvb2w6ICIKKwkJCQkJCSsgdG9vbC5nZXRQYXRoKCksCisJCQkJZXhwZWN0ZWRNZXJnZVJlc3VsdCwgYWN0dWFsTWVyZ2VSZXN1bHQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFVzZXJEZWZpbmVkVG9vbCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY3VzdG9tVG9vbE5hbWUgPSAiY3VzdG9tVG9vbCI7CisJCVN0cmluZyBjb21tYW5kID0gZ2V0RWNob0NvbW1hbmQoKTsKKworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sTmFtZSwKKwkJCQlDT05GSUdfS0VZX0NNRCwgY29tbWFuZCk7CisKKwkJTWVyZ2VUb29scyBtYW5hZ2VyID0gbmV3IE1lcmdlVG9vbHMoZGIpOworCQlNYXA8U3RyaW5nLCBFeHRlcm5hbE1lcmdlVG9vbD4gdG9vbHMgPSBtYW5hZ2VyLmdldFVzZXJEZWZpbmVkVG9vbHMoKTsKKwkJRXh0ZXJuYWxNZXJnZVRvb2wgZXh0ZXJuYWxUb29sID0gdG9vbHMuZ2V0KGN1c3RvbVRvb2xOYW1lKTsKKwkJbWFuYWdlci5tZXJnZShsb2NhbCwgcmVtb3RlLCBtZXJnZWQsIGJhc2UsIG51bGwsIGV4dGVybmFsVG9vbCk7CisKKwkJYXNzZXJ0RWNob0NvbW1hbmRIYXNDb3JyZWN0T3V0cHV0KCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VXNlckRlZmluZWRUb29sV2l0aFByb21wdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgY3VzdG9tVG9vbE5hbWUgPSAiY3VzdG9tVG9vbCI7CisJCVN0cmluZyBjb21tYW5kID0gZ2V0RWNob0NvbW1hbmQoKTsKKworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sTmFtZSwKKwkJCQlDT05GSUdfS0VZX0NNRCwgY29tbWFuZCk7CisKKwkJTWVyZ2VUb29scyBtYW5hZ2VyID0gbmV3IE1lcmdlVG9vbHMoZGIpOworCisJCVByb21wdEhhbmRsZXIgcHJvbXB0SGFuZGxlciA9IFByb21wdEhhbmRsZXIuYWNjZXB0UHJvbXB0KCk7CisJCU1pc3NpbmdUb29sSGFuZGxlciBub1Rvb2xIYW5kbGVyID0gbmV3IE1pc3NpbmdUb29sSGFuZGxlcigpOworCisJCW1hbmFnZXIubWVyZ2UobG9jYWwsIHJlbW90ZSwgbWVyZ2VkLCBiYXNlLCBudWxsLAorCQkJCU9wdGlvbmFsLm9mKGN1c3RvbVRvb2xOYW1lKSwgQm9vbGVhblRyaVN0YXRlLlRSVUUsIGZhbHNlLAorCQkJCXByb21wdEhhbmRsZXIsIG5vVG9vbEhhbmRsZXIpOworCisJCWFzc2VydEVjaG9Db21tYW5kSGFzQ29ycmVjdE91dHB1dCgpOworCisJCUxpc3Q8U3RyaW5nPiBhY3R1YWxUb29sUHJvbXB0cyA9IHByb21wdEhhbmRsZXIudG9vbFByb21wdHM7CisJCUxpc3Q8U3RyaW5nPiBleHBlY3RlZFRvb2xQcm9tcHRzID0gQXJyYXlzLmFzTGlzdCgiY3VzdG9tVG9vbCIpOworCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGEgdXNlciBwcm9tcHQgZm9yIGN1c3RvbSB0b29sIGNhbGwiLAorCQkJCWV4cGVjdGVkVG9vbFByb21wdHMsIGFjdHVhbFRvb2xQcm9tcHRzKTsKKworCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHRvIG5vIGluZm9ybWluZyBhYm91dCBtaXNzaW5nIHRvb2xzIiwKKwkJCQlDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBub1Rvb2xIYW5kbGVyLm1pc3NpbmdUb29scyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VXNlckRlZmluZWRUb29sV2l0aENhbmNlbGxlZFByb21wdCgpIHRocm93cyBFeGNlcHRpb24geworCQlNZXJnZVRvb2xzIG1hbmFnZXIgPSBuZXcgTWVyZ2VUb29scyhkYik7CisKKwkJUHJvbXB0SGFuZGxlciBwcm9tcHRIYW5kbGVyID0gUHJvbXB0SGFuZGxlci5jYW5jZWxQcm9tcHQoKTsKKwkJTWlzc2luZ1Rvb2xIYW5kbGVyIG5vVG9vbEhhbmRsZXIgPSBuZXcgTWlzc2luZ1Rvb2xIYW5kbGVyKCk7CisKKwkJT3B0aW9uYWw8RXhlY3V0aW9uUmVzdWx0PiByZXN1bHQgPSBtYW5hZ2VyLm1lcmdlKGxvY2FsLCByZW1vdGUsIG1lcmdlZCwKKwkJCQliYXNlLCBudWxsLCBPcHRpb25hbC5lbXB0eSgpLCBCb29sZWFuVHJpU3RhdGUuVFJVRSwgZmFsc2UsCisJCQkJcHJvbXB0SGFuZGxlciwgbm9Ub29sSGFuZGxlcik7CisJCWFzc2VydEZhbHNlKCJFeHBlY3RlZCBubyByZXN1bHQgaWYgdXNlciBjYW5jZWxzIHRoZSBvcGVyYXRpb24iLAorCQkJCXJlc3VsdC5pc1ByZXNlbnQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWxsVG9vbHMoKSB7CisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJU3RyaW5nIGN1c3RvbVRvb2xOYW1lID0gImN1c3RvbVRvb2wiOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbE5hbWUsCisJCQkJQ09ORklHX0tFWV9DTUQsICJlY2hvIik7CisKKwkJTWVyZ2VUb29scyBtYW5hZ2VyID0gbmV3IE1lcmdlVG9vbHMoZGIpOworCQlTZXQ8U3RyaW5nPiBhY3R1YWxUb29sTmFtZXMgPSBtYW5hZ2VyLmdldEFsbFRvb2xOYW1lcygpOworCQlTZXQ8U3RyaW5nPiBleHBlY3RlZFRvb2xOYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKwkJZXhwZWN0ZWRUb29sTmFtZXMuYWRkKGN1c3RvbVRvb2xOYW1lKTsKKwkJQ29tbWFuZExpbmVNZXJnZVRvb2xbXSBkZWZhdWx0VG9vbHMgPSBDb21tYW5kTGluZU1lcmdlVG9vbC52YWx1ZXMoKTsKKwkJZm9yIChDb21tYW5kTGluZU1lcmdlVG9vbCBkZWZhdWx0VG9vbCA6IGRlZmF1bHRUb29scykgeworCQkJU3RyaW5nIHRvb2xOYW1lID0gZGVmYXVsdFRvb2wubmFtZSgpOworCQkJZXhwZWN0ZWRUb29sTmFtZXMuYWRkKHRvb2xOYW1lKTsKKwkJfQorCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXQgb2YgZXh0ZXJuYWwgbWVyZ2UgdG9vbHMiLCBleHBlY3RlZFRvb2xOYW1lcywKKwkJCQlhY3R1YWxUb29sTmFtZXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlUHJlZGVmaW5lZFRvb2xQYXRoKCkgeworCQlTdHJpbmcgdG9vbE5hbWUgPSBDb21tYW5kTGluZU1lcmdlVG9vbC5ndWlmZnkubmFtZSgpOworCQlTdHJpbmcgY3VzdG9tVG9vbFBhdGggPSAiL3Vzci9iaW4vZWNobyI7CisKKwkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiwgdG9vbE5hbWUsIENPTkZJR19LRVlfQ01ELAorCQkJCSJlY2hvIik7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OLCB0b29sTmFtZSwgQ09ORklHX0tFWV9QQVRILAorCQkJCWN1c3RvbVRvb2xQYXRoKTsKKworCQlNZXJnZVRvb2xzIG1hbmFnZXIgPSBuZXcgTWVyZ2VUb29scyhkYik7CisJCU1hcDxTdHJpbmcsIEV4dGVybmFsTWVyZ2VUb29sPiB0b29scyA9IG1hbmFnZXIuZ2V0VXNlckRlZmluZWRUb29scygpOworCQlFeHRlcm5hbE1lcmdlVG9vbCBtZXJnZVRvb2wgPSB0b29scy5nZXQodG9vbE5hbWUpOworCQlhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCB0b29sIFwiIiArIHRvb2xOYW1lICsgIlwiIHRvIGJlIHVzZXIgZGVmaW5lZCIsCisJCQkJbWVyZ2VUb29sKTsKKworCQlTdHJpbmcgdG9vbFBhdGggPSBtZXJnZVRvb2wuZ2V0UGF0aCgpOworCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGV4dGVybmFsIG1lcmdlIHRvb2wgdG8gaGF2ZSBhbiBvdmVycmlkZW4gcGF0aCIsCisJCQkJY3VzdG9tVG9vbFBhdGgsIHRvb2xQYXRoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVc2VyRGVmaW5lZFRvb2xzKCkgeworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBjdXN0b21Ub29sbmFtZSA9ICJjdXN0b21Ub29sIjsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VUT09MX1NFQ1RJT04sIGN1c3RvbVRvb2xuYW1lLAorCQkJCUNPTkZJR19LRVlfQ01ELCAiZWNobyIpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbG5hbWUsCisJCQkJQ09ORklHX0tFWV9QQVRILCAiL3Vzci9iaW4vZWNobyIpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbG5hbWUsCisJCQkJQ09ORklHX0tFWV9QUk9NUFQsIFN0cmluZy52YWx1ZU9mKGZhbHNlKSk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sbmFtZSwKKwkJCQlDT05GSUdfS0VZX0dVSVRPT0wsIFN0cmluZy52YWx1ZU9mKGZhbHNlKSk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sbmFtZSwKKwkJCQlDT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERSwgU3RyaW5nLnZhbHVlT2YoZmFsc2UpKTsKKwkJTWVyZ2VUb29scyBtYW5hZ2VyID0gbmV3IE1lcmdlVG9vbHMoZGIpOworCQlTZXQ8U3RyaW5nPiBhY3R1YWxUb29sTmFtZXMgPSBtYW5hZ2VyLmdldFVzZXJEZWZpbmVkVG9vbHMoKS5rZXlTZXQoKTsKKwkJU2V0PFN0cmluZz4gZXhwZWN0ZWRUb29sTmFtZXMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisJCWV4cGVjdGVkVG9vbE5hbWVzLmFkZChjdXN0b21Ub29sbmFtZSk7CisJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IHNldCBvZiBleHRlcm5hbCBtZXJnZSB0b29scyIsIGV4cGVjdGVkVG9vbE5hbWVzLAorCQkJCWFjdHVhbFRvb2xOYW1lcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpIHRocm93cyBUb29sRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvb2xOYW1lID0gImN1c3RvbVRvb2wiOworCisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJLy8gdGhlIGRlZmF1bHQgbWVyZ2UgdG9vbCBpcyBjb25maWd1cmVkIHdpdGhvdXQgYSBzdWJzZWN0aW9uCisJCVN0cmluZyBzdWJzZWN0aW9uID0gbnVsbDsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VfU0VDVElPTiwgc3Vic2VjdGlvbiwgQ09ORklHX0tFWV9UT09MLAorCQkJCXRvb2xOYW1lKTsKKworCQlTdHJpbmcgY29tbWFuZCA9IGdldEVjaG9Db21tYW5kKCk7CisKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VUT09MX1NFQ1RJT04sIHRvb2xOYW1lLCBDT05GSUdfS0VZX0NNRCwKKwkJCQljb21tYW5kKTsKKworCQlPcHRpb25hbDxFeGVjdXRpb25SZXN1bHQ+IHJlc3VsdCA9IGludm9rZU1lcmdlKHRvb2xOYW1lKTsKKwkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXh0ZXJuYWwgbWVyZ2UgdG9vbCByZXN1bHQgdG8gYmUgYXZhaWxhYmxlIiwKKwkJCQlyZXN1bHQuaXNQcmVzZW50KCkpOworCQlpbnQgZXhwZWN0ZWRDb21wYXJlUmVzdWx0ID0gMDsKKwkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgY29tcGFyZSByZXN1bHQgZm9yIGV4dGVybmFsIG1lcmdlIHRvb2wiLAorCQkJCWV4cGVjdGVkQ29tcGFyZVJlc3VsdCwgcmVzdWx0LmdldCgpLmdldFJjKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRUb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b29sTmFtZSA9ICJjdXN0b21Ub29sIjsKKwkJU3RyaW5nIGd1aVRvb2xOYW1lID0gImN1c3RvbUd1aVRvb2wiOworCisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJLy8gdGhlIGRlZmF1bHQgbWVyZ2UgdG9vbCBpcyBjb25maWd1cmVkIHdpdGhvdXQgYSBzdWJzZWN0aW9uCisJCVN0cmluZyBzdWJzZWN0aW9uID0gbnVsbDsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VfU0VDVElPTiwgc3Vic2VjdGlvbiwgQ09ORklHX0tFWV9UT09MLAorCQkJCXRvb2xOYW1lKTsKKworCQlNZXJnZVRvb2xzIG1hbmFnZXIgPSBuZXcgTWVyZ2VUb29scyhkYik7CisJCWJvb2xlYW4gZ3VpID0gZmFsc2U7CisJCVN0cmluZyBkZWZhdWx0VG9vbE5hbWUgPSBtYW5hZ2VyLmdldERlZmF1bHRUb29sTmFtZShndWkpOworCQlhc3NlcnRFcXVhbHMoCisJCQkJIkV4cGVjdGVkIGNvbmZpZ3VyZWQgbWVyZ2V0b29sIHRvIGJlIHRoZSBkZWZhdWx0IGV4dGVybmFsIG1lcmdlIHRvb2wiLAorCQkJCXRvb2xOYW1lLCBkZWZhdWx0VG9vbE5hbWUpOworCisJCWd1aSA9IHRydWU7CisJCVN0cmluZyBkZWZhdWx0R3VpVG9vbE5hbWUgPSBtYW5hZ2VyLmdldERlZmF1bHRUb29sTmFtZShndWkpOworCQlhc3NlcnROdWxsKCJFeHBlY3RlZCBkZWZhdWx0IG1lcmdldG9vbCB0byBub3QgYmUgc2V0IiwKKwkJCQlkZWZhdWx0R3VpVG9vbE5hbWUpOworCisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX01FUkdFX1NFQ1RJT04sIHN1YnNlY3Rpb24sIENPTkZJR19LRVlfR1VJVE9PTCwKKwkJCQlndWlUb29sTmFtZSk7CisJCW1hbmFnZXIgPSBuZXcgTWVyZ2VUb29scyhkYik7CisJCWRlZmF1bHRHdWlUb29sTmFtZSA9IG1hbmFnZXIuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7CisJCWFzc2VydEVxdWFscygKKwkJCQkiRXhwZWN0ZWQgY29uZmlndXJlZCBtZXJnZXRvb2wgdG8gYmUgdGhlIGRlZmF1bHQgZXh0ZXJuYWwgbWVyZ2UgZ3VpdG9vbCIsCisJCQkJZ3VpVG9vbE5hbWUsIGRlZmF1bHRHdWlUb29sTmFtZSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVQcmVEZWZpbmVkVG9vbFBhdGgoKSB7CisJCVN0cmluZyBuZXdUb29sUGF0aCA9ICIvdG1wL3BhdGgvIjsKKworCQlDb21tYW5kTGluZU1lcmdlVG9vbFtdIGRlZmF1bHRUb29scyA9IENvbW1hbmRMaW5lTWVyZ2VUb29sLnZhbHVlcygpOworCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCB0byBmaW5kIHByZS1kZWZpbmVkIGV4dGVybmFsIG1lcmdlIHRvb2xzIiwKKwkJCQlkZWZhdWx0VG9vbHMubGVuZ3RoID4gMCk7CisKKwkJQ29tbWFuZExpbmVNZXJnZVRvb2wgb3ZlcnJpZGVuVG9vbCA9IGRlZmF1bHRUb29sc1swXTsKKwkJU3RyaW5nIG92ZXJyaWRlblRvb2xOYW1lID0gb3ZlcnJpZGVuVG9vbC5uYW1lKCk7CisJCVN0cmluZyBvdmVycmlkZW5Ub29sUGF0aCA9IG5ld1Rvb2xQYXRoICsgb3ZlcnJpZGVuVG9vbE5hbWU7CisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfTUVSR0VUT09MX1NFQ1RJT04sIG92ZXJyaWRlblRvb2xOYW1lLAorCQkJCUNPTkZJR19LRVlfUEFUSCwgb3ZlcnJpZGVuVG9vbFBhdGgpOworCisJCU1lcmdlVG9vbHMgbWFuYWdlciA9IG5ldyBNZXJnZVRvb2xzKGRiKTsKKwkJTWFwPFN0cmluZywgRXh0ZXJuYWxNZXJnZVRvb2w+IGF2YWlsYWJsZVRvb2xzID0gbWFuYWdlcgorCQkJCS5nZXRQcmVkZWZpbmVkVG9vbHModHJ1ZSk7CisJCUV4dGVybmFsTWVyZ2VUb29sIGV4dGVybmFsTWVyZ2VUb29sID0gYXZhaWxhYmxlVG9vbHMKKwkJCQkuZ2V0KG92ZXJyaWRlblRvb2xOYW1lKTsKKwkJU3RyaW5nIGFjdHVhbE1lcmdlVG9vbFBhdGggPSBleHRlcm5hbE1lcmdlVG9vbC5nZXRQYXRoKCk7CisJCWFzc2VydEVxdWFscygKKwkJCQkiRXhwZWN0ZWQgcHJlLWRlZmluZWQgZXh0ZXJuYWwgbWVyZ2UgdG9vbCB0byBoYXZlIG92ZXJyaWRlbiBwYXRoIiwKKwkJCQlvdmVycmlkZW5Ub29sUGF0aCwgYWN0dWFsTWVyZ2VUb29sUGF0aCk7CisJCWJvb2xlYW4gd2l0aEJhc2UgPSB0cnVlOworCQlTdHJpbmcgZXhwZWN0ZWRNZXJnZVRvb2xDb21tYW5kID0gb3ZlcnJpZGVuVG9vbFBhdGggKyAiICIKKwkJCQkrIG92ZXJyaWRlblRvb2wuZ2V0UGFyYW1ldGVycyh3aXRoQmFzZSk7CisJCVN0cmluZyBhY3R1YWxNZXJnZVRvb2xDb21tYW5kID0gZXh0ZXJuYWxNZXJnZVRvb2wuZ2V0Q29tbWFuZCgpOworCQlhc3NlcnRFcXVhbHMoCisJCQkJIkV4cGVjdGVkIHByZS1kZWZpbmVkIGV4dGVybmFsIG1lcmdlIHRvb2wgdG8gaGF2ZSBvdmVycmlkZW4gY29tbWFuZCIsCisJCQkJZXhwZWN0ZWRNZXJnZVRvb2xDb21tYW5kLCBhY3R1YWxNZXJnZVRvb2xDb21tYW5kKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IFRvb2xFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdFVuZGVmaW5lZFRvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvb2xOYW1lID0gInVuZGVmaW5lZCI7CisJCWludm9rZU1lcmdlKHRvb2xOYW1lKTsKKwkJZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIHRvIGJlIHRocm93biBkdWUgdG8gbm90IGRlZmluZWQgZXh0ZXJuYWwgbWVyZ2UgdG9vbCIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRUb29sRXhlY3V0aW9uV2l0aFByb21wdCgpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCS8vIHRoZSBkZWZhdWx0IGRpZmYgdG9vbCBpcyBjb25maWd1cmVkIHdpdGhvdXQgYSBzdWJzZWN0aW9uCisJCVN0cmluZyBzdWJzZWN0aW9uID0gbnVsbDsKKwkJY29uZmlnLnNldFN0cmluZygibWVyZ2UiLCBzdWJzZWN0aW9uLCAidG9vbCIsICJjdXN0b21Ub29sIik7CisKKwkJU3RyaW5nIGNvbW1hbmQgPSBnZXRFY2hvQ29tbWFuZCgpOworCisJCWNvbmZpZy5zZXRTdHJpbmcoIm1lcmdldG9vbCIsICJjdXN0b21Ub29sIiwgImNtZCIsIGNvbW1hbmQpOworCisJCU1lcmdlVG9vbHMgbWFuYWdlciA9IG5ldyBNZXJnZVRvb2xzKGRiKTsKKworCQlQcm9tcHRIYW5kbGVyIHByb21wdEhhbmRsZXIgPSBQcm9tcHRIYW5kbGVyLmFjY2VwdFByb21wdCgpOworCQlNaXNzaW5nVG9vbEhhbmRsZXIgbm9Ub29sSGFuZGxlciA9IG5ldyBNaXNzaW5nVG9vbEhhbmRsZXIoKTsKKworCQltYW5hZ2VyLm1lcmdlKGxvY2FsLCByZW1vdGUsIG1lcmdlZCwgYmFzZSwgbnVsbCwgT3B0aW9uYWwuZW1wdHkoKSwKKwkJCQlCb29sZWFuVHJpU3RhdGUuVFJVRSwgZmFsc2UsIHByb21wdEhhbmRsZXIsIG5vVG9vbEhhbmRsZXIpOworCisJCWFzc2VydEVjaG9Db21tYW5kSGFzQ29ycmVjdE91dHB1dCgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5vRGVmYXVsdFRvb2xOYW1lKCkgeworCQlNZXJnZVRvb2xzIG1hbmFnZXIgPSBuZXcgTWVyZ2VUb29scyhkYik7CisJCWJvb2xlYW4gZ3VpID0gZmFsc2U7CisJCVN0cmluZyBkZWZhdWx0VG9vbE5hbWUgPSBtYW5hZ2VyLmdldERlZmF1bHRUb29sTmFtZShndWkpOworCQlhc3NlcnROdWxsKCJFeHBlY3RlZCBubyBkZWZhdWx0IHRvb2wgd2hlbiBub25lIGlzIGNvbmZpZ3VyZWQiLAorCQkJCWRlZmF1bHRUb29sTmFtZSk7CisKKwkJZ3VpID0gdHJ1ZTsKKwkJZGVmYXVsdFRvb2xOYW1lID0gbWFuYWdlci5nZXREZWZhdWx0VG9vbE5hbWUoZ3VpKTsKKwkJYXNzZXJ0TnVsbCgiRXhwZWN0ZWQgbm8gZGVmYXVsdCB0b29sIHdoZW4gbm9uZSBpcyBjb25maWd1cmVkIiwKKwkJCQlkZWZhdWx0VG9vbE5hbWUpOworCX0KKworCUBUZXN0KGV4cGVjdGVkID0gVG9vbEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0TnVsbFRvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTWVyZ2VUb29scyBtYW5hZ2VyID0gbmV3IE1lcmdlVG9vbHMoZGIpOworCisJCVByb21wdEhhbmRsZXIgcHJvbXB0SGFuZGxlciA9IG51bGw7CisJCU1pc3NpbmdUb29sSGFuZGxlciBub1Rvb2xIYW5kbGVyID0gbnVsbDsKKworCQlPcHRpb25hbDxTdHJpbmc+IHRvb2wgPSBudWxsOworCisJCW1hbmFnZXIubWVyZ2UobG9jYWwsIHJlbW90ZSwgbWVyZ2VkLCBiYXNlLCBudWxsLCB0b29sLAorCQkJCUJvb2xlYW5UcmlTdGF0ZS5UUlVFLCBmYWxzZSwgcHJvbXB0SGFuZGxlciwgbm9Ub29sSGFuZGxlcik7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBUb29sRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3ROdWxsVG9vbFdpdGhQcm9tcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJTWVyZ2VUb29scyBtYW5hZ2VyID0gbmV3IE1lcmdlVG9vbHMoZGIpOworCisJCVByb21wdEhhbmRsZXIgcHJvbXB0SGFuZGxlciA9IFByb21wdEhhbmRsZXIuY2FuY2VsUHJvbXB0KCk7CisJCU1pc3NpbmdUb29sSGFuZGxlciBub1Rvb2xIYW5kbGVyID0gbmV3IE1pc3NpbmdUb29sSGFuZGxlcigpOworCisJCU9wdGlvbmFsPFN0cmluZz4gdG9vbCA9IG51bGw7CisKKwkJbWFuYWdlci5tZXJnZShsb2NhbCwgcmVtb3RlLCBtZXJnZWQsIGJhc2UsIG51bGwsIHRvb2wsCisJCQkJQm9vbGVhblRyaVN0YXRlLlRSVUUsIGZhbHNlLCBwcm9tcHRIYW5kbGVyLCBub1Rvb2xIYW5kbGVyKTsKKwl9CisKKwlwcml2YXRlIE9wdGlvbmFsPEV4ZWN1dGlvblJlc3VsdD4gaW52b2tlTWVyZ2UoU3RyaW5nIHRvb2xOYW1lKQorCQkJdGhyb3dzIFRvb2xFeGNlcHRpb24geworCQlCb29sZWFuVHJpU3RhdGUgcHJvbXB0ID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCQlib29sZWFuIGd1aSA9IGZhbHNlOworCisJCU1lcmdlVG9vbHMgbWFuYWdlciA9IG5ldyBNZXJnZVRvb2xzKGRiKTsKKworCQlQcm9tcHRIYW5kbGVyIHByb21wdEhhbmRsZXIgPSBQcm9tcHRIYW5kbGVyLmFjY2VwdFByb21wdCgpOworCQlNaXNzaW5nVG9vbEhhbmRsZXIgbm9Ub29sSGFuZGxlciA9IG5ldyBNaXNzaW5nVG9vbEhhbmRsZXIoKTsKKworCQlPcHRpb25hbDxFeGVjdXRpb25SZXN1bHQ+IHJlc3VsdCA9IG1hbmFnZXIubWVyZ2UobG9jYWwsIHJlbW90ZSwgbWVyZ2VkLAorCQkJCWJhc2UsIG51bGwsIE9wdGlvbmFsLm9mKHRvb2xOYW1lKSwgcHJvbXB0LCBndWksIHByb21wdEhhbmRsZXIsCisJCQkJbm9Ub29sSGFuZGxlcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFzc3VtZU1lcmdlVG9vbElzQXZhaWxhYmxlKAorCQkJQ29tbWFuZExpbmVNZXJnZVRvb2wgYXV0b01lcmdpbmdUb29sKSB7CisJCWJvb2xlYW4gaXNBdmFpbGFibGUgPSBFeHRlcm5hbFRvb2xVdGlscy5pc1Rvb2xBdmFpbGFibGUoZGIuZ2V0RlMoKSwKKwkJCQlkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0V29ya1RyZWUoKSwgYXV0b01lcmdpbmdUb29sLmdldFBhdGgoKSk7CisJCWFzc3VtZVRydWUoIkFzc3VtaW5nIGV4dGVybmFsIHRvb2wgaXMgYXZhaWxhYmxlOiAiCisJCQkJKyBhdXRvTWVyZ2luZ1Rvb2wubmFtZSgpLCBpc0F2YWlsYWJsZSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0RWNob0NvbW1hbmQoKSB7CisJCXJldHVybiAiKGVjaG8gJExPQ0FMICRSRU1PVEUgJE1FUkdFRCAkQkFTRSkgPiAiCisJCQkJKyBjb21tYW5kUmVzdWx0LmdldEFic29sdXRlUGF0aCgpOworCX0KKworCXByaXZhdGUgdm9pZCBhc3NlcnRFY2hvQ29tbWFuZEhhc0NvcnJlY3RPdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlMaXN0PFN0cmluZz4gYWN0dWFsTGluZXMgPSBGaWxlcy5yZWFkQWxsTGluZXMoY29tbWFuZFJlc3VsdC50b1BhdGgoKSk7CisJCVN0cmluZyBhY3R1YWxDb250ZW50ID0gU3RyaW5nLmpvaW4oU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSwgYWN0dWFsTGluZXMpOworCQlhY3R1YWxMaW5lcyA9IEFycmF5cy5hc0xpc3QoYWN0dWFsQ29udGVudC5zcGxpdCgiICIpKTsKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkTGluZXMgPSBBcnJheXMuYXNMaXN0KGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKwkJCQlyZW1vdGVGaWxlLmdldEFic29sdXRlUGF0aCgpLCBtZXJnZWRGaWxlLmdldEFic29sdXRlUGF0aCgpLAorCQkJCWJhc2VGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJEdW1teSB0ZXN0IHRvb2wgY2FsbGVkIHdpdGggdW5leHBlY3RlZCBhcmd1bWVudHMiLAorCQkJCWV4cGVjdGVkTGluZXMsIGFjdHVhbExpbmVzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YzhlY2EuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxUb29sVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMC0yMDIxLCBTaW1lb24gQW5kcmVldiA8c2ltZW9uLmRhbmFpbG92LmFuZHJlZXZAZ21haWwuY29tPiBhbmQgb3RoZXJzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTX1BPU0lYOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci0KLS8qKgotICogQmFzZSB0ZXN0IGNhc2UgZm9yIGV4dGVybmFsIG1lcmdlIGFuZCBkaWZmIHRvb2wgdGVzdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlcm5hbFRvb2xUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEVOVCA9ICJsaW5lMSI7Ci0KLQlwcm90ZWN0ZWQgRmlsZSBsb2NhbEZpbGU7Ci0KLQlwcm90ZWN0ZWQgRmlsZSByZW1vdGVGaWxlOwotCi0JcHJvdGVjdGVkIEZpbGUgbWVyZ2VkRmlsZTsKLQotCXByb3RlY3RlZCBGaWxlIGJhc2VGaWxlOwotCi0JcHJvdGVjdGVkIEZpbGUgY29tbWFuZFJlc3VsdDsKLQotCUBCZWZvcmUKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCWxvY2FsRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJsb2NhbEZpbGUudHh0IiwgREVGQVVMVF9DT05URU5UICsgIlxuIik7Ci0JCWxvY2FsRmlsZS5kZWxldGVPbkV4aXQoKTsKLQkJcmVtb3RlRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJyZW1vdGVGaWxlLnR4dCIsIERFRkFVTFRfQ09OVEVOVCArICJcbiIpOwotCQlyZW1vdGVGaWxlLmRlbGV0ZU9uRXhpdCgpOwotCQltZXJnZWRGaWxlID0gd3JpdGVUcmFzaEZpbGUoIm1lcmdlZEZpbGUudHh0IiwgIiIpOwotCQltZXJnZWRGaWxlLmRlbGV0ZU9uRXhpdCgpOwotCQliYXNlRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJiYXNlRmlsZS50eHQiLCAiIik7Ci0JCWJhc2VGaWxlLmRlbGV0ZU9uRXhpdCgpOwotCQljb21tYW5kUmVzdWx0ID0gd3JpdGVUcmFzaEZpbGUoImNvbW1hbmRSZXN1bHQudHh0IiwgIiIpOwotCQljb21tYW5kUmVzdWx0LmRlbGV0ZU9uRXhpdCgpOwotCX0KLQotCUBBZnRlcgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGVzLmRlbGV0ZShsb2NhbEZpbGUudG9QYXRoKCkpOwotCQlGaWxlcy5kZWxldGUocmVtb3RlRmlsZS50b1BhdGgoKSk7Ci0JCUZpbGVzLmRlbGV0ZShtZXJnZWRGaWxlLnRvUGF0aCgpKTsKLQkJRmlsZXMuZGVsZXRlKGJhc2VGaWxlLnRvUGF0aCgpKTsKLQkJRmlsZXMuZGVsZXRlKGNvbW1hbmRSZXN1bHQudG9QYXRoKCkpOwotCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYXNzdW1lUG9zaXhQbGF0Zm9ybSgpIHsKLQkJQXNzdW1lLmFzc3VtZVRydWUoCi0JCQkJIlRoaXMgdGVzdCBjYW4gcnVuIG9ubHkgaW4gTGludXggdGVzdHMiLAotCQkJCUZTLkRFVEVDVEVEIGluc3RhbmNlb2YgRlNfUE9TSVgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsVG9vbFRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmZmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjEsIFNpbWVvbiBBbmRyZWV2IDxzaW1lb24uZGFuYWlsb3YuYW5kcmVldkBnbWFpbC5jb20+IGFuZCBvdGhlcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GU19QT1NJWDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCisvKioKKyAqIEJhc2UgdGVzdCBjYXNlIGZvciBleHRlcm5hbCBtZXJnZSBhbmQgZGlmZiB0b29sIHRlc3RzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZXJuYWxUb29sVGVzdENhc2UgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URU5UID0gImxpbmUxIjsKKworCXByb3RlY3RlZCBGaWxlIGxvY2FsRmlsZTsKKworCXByb3RlY3RlZCBGaWxlIHJlbW90ZUZpbGU7CisKKwlwcm90ZWN0ZWQgRmlsZSBtZXJnZWRGaWxlOworCisJcHJvdGVjdGVkIEZpbGUgYmFzZUZpbGU7CisKKwlwcm90ZWN0ZWQgRmlsZSBjb21tYW5kUmVzdWx0OworCisJcHJvdGVjdGVkIEZpbGVFbGVtZW50IGxvY2FsOworCisJcHJvdGVjdGVkIEZpbGVFbGVtZW50IHJlbW90ZTsKKworCXByb3RlY3RlZCBGaWxlRWxlbWVudCBtZXJnZWQ7CisKKwlwcm90ZWN0ZWQgRmlsZUVsZW1lbnQgYmFzZTsKKworCUBCZWZvcmUKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCisJCWxvY2FsRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJsb2NhbEZpbGUudHh0IiwgREVGQVVMVF9DT05URU5UICsgIlxuIik7CisJCWxvY2FsRmlsZS5kZWxldGVPbkV4aXQoKTsKKwkJcmVtb3RlRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJyZW1vdGVGaWxlLnR4dCIsIERFRkFVTFRfQ09OVEVOVCArICJcbiIpOworCQlyZW1vdGVGaWxlLmRlbGV0ZU9uRXhpdCgpOworCQltZXJnZWRGaWxlID0gd3JpdGVUcmFzaEZpbGUoIm1lcmdlZEZpbGUudHh0IiwgIiIpOworCQltZXJnZWRGaWxlLmRlbGV0ZU9uRXhpdCgpOworCQliYXNlRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJiYXNlRmlsZS50eHQiLCAiIik7CisJCWJhc2VGaWxlLmRlbGV0ZU9uRXhpdCgpOworCQljb21tYW5kUmVzdWx0ID0gd3JpdGVUcmFzaEZpbGUoImNvbW1hbmRSZXN1bHQudHh0IiwgIiIpOworCQljb21tYW5kUmVzdWx0LmRlbGV0ZU9uRXhpdCgpOworCisJCWxvY2FsID0gbmV3IEZpbGVFbGVtZW50KGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKwkJCQlGaWxlRWxlbWVudC5UeXBlLkxPQ0FMKTsKKwkJcmVtb3RlID0gbmV3IEZpbGVFbGVtZW50KHJlbW90ZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisJCQkJRmlsZUVsZW1lbnQuVHlwZS5SRU1PVEUpOworCQltZXJnZWQgPSBuZXcgRmlsZUVsZW1lbnQobWVyZ2VkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKwkJCQlGaWxlRWxlbWVudC5UeXBlLk1FUkdFRCk7CisJCWJhc2UgPSBuZXcgRmlsZUVsZW1lbnQoYmFzZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCisJCQkJRmlsZUVsZW1lbnQuVHlwZS5CQVNFKTsKKwl9CisKKwlAQWZ0ZXIKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlcy5kZWxldGUobG9jYWxGaWxlLnRvUGF0aCgpKTsKKwkJRmlsZXMuZGVsZXRlKHJlbW90ZUZpbGUudG9QYXRoKCkpOworCQlGaWxlcy5kZWxldGUobWVyZ2VkRmlsZS50b1BhdGgoKSk7CisJCUZpbGVzLmRlbGV0ZShiYXNlRmlsZS50b1BhdGgoKSk7CisJCUZpbGVzLmRlbGV0ZShjb21tYW5kUmVzdWx0LnRvUGF0aCgpKTsKKworCQlzdXBlci50ZWFyRG93bigpOworCX0KKworCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFzc3VtZVBvc2l4UGxhdGZvcm0oKSB7CisJCUFzc3VtZS5hc3N1bWVUcnVlKAorCQkJCSJUaGlzIHRlc3QgY2FuIHJ1biBvbmx5IGluIExpbnV4IHRlc3RzIiwKKwkJCQlGUy5ERVRFQ1RFRCBpbnN0YW5jZW9mIEZTX1BPU0lYKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFByb21wdEhhbmRsZXIgaW1wbGVtZW50cyBQcm9tcHRDb250aW51ZUhhbmRsZXIgeworCisJCXByaXZhdGUgZmluYWwgYm9vbGVhbiBwcm9tcHRSZXN1bHQ7CisKKwkJZmluYWwgTGlzdDxTdHJpbmc+IHRvb2xQcm9tcHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJcHJpdmF0ZSBQcm9tcHRIYW5kbGVyKGJvb2xlYW4gcHJvbXB0UmVzdWx0KSB7CisJCQl0aGlzLnByb21wdFJlc3VsdCA9IHByb21wdFJlc3VsdDsKKwkJfQorCisJCXN0YXRpYyBQcm9tcHRIYW5kbGVyIGFjY2VwdFByb21wdCgpIHsKKwkJCXJldHVybiBuZXcgUHJvbXB0SGFuZGxlcih0cnVlKTsKKwkJfQorCisJCXN0YXRpYyBQcm9tcHRIYW5kbGVyIGNhbmNlbFByb21wdCgpIHsKKwkJCXJldHVybiBuZXcgUHJvbXB0SGFuZGxlcihmYWxzZSk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gcHJvbXB0KFN0cmluZyB0b29sTmFtZSkgeworCQkJdG9vbFByb21wdHMuYWRkKHRvb2xOYW1lKTsKKwkJCXJldHVybiBwcm9tcHRSZXN1bHQ7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1pc3NpbmdUb29sSGFuZGxlciBpbXBsZW1lbnRzIEluZm9ybU5vVG9vbEhhbmRsZXIgeworCisJCWZpbmFsIExpc3Q8U3RyaW5nPiBtaXNzaW5nVG9vbHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgaW5mb3JtKExpc3Q8U3RyaW5nPiB0b29sTmFtZXMpIHsKKwkJCW1pc3NpbmdUb29scy5hZGRBbGwodG9vbE5hbWVzKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVUZXN0LmphdmEKaW5kZXggMDcwZDY2Ni4uYWI1ODhjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVUZXN0LmphdmEKQEAgLTE1LDE2ICsxNSwxOSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCitpbXBvcnQgamF2YS50aW1lLkR1cmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Mb25nU3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkRmc0Jsb2NrQ2FjaGVDb25maWcuSW5kZXhFdmVudENvbnN1bWVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrLlBhY2tFeHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSbmc7CkBAIC0xNTQsNiArMTU3LDExOSBAQCBwdWJsaWMgdm9pZCBoYXNDYWNoZUhvdE1hcCgpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKIAlAVGVzdAorCXB1YmxpYyB2b2lkIGhhc0luZGV4RXZlbnRDb25zdW1lck9ubHlMb2FkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQXRvbWljSW50ZWdlciBsb2FkZWQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCQlJbmRleEV2ZW50Q29uc3VtZXIgaW5kZXhFdmVudENvbnN1bWVyID0gbmV3IEluZGV4RXZlbnRDb25zdW1lcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYWNjZXB0UmVxdWVzdGVkRXZlbnQoaW50IHBhY2tFeHRQb3MsIGJvb2xlYW4gY2FjaGVIaXQsCisJCQkJCWxvbmcgbG9hZE1pY3JvcywgbG9uZyBieXRlcywKKwkJCQkJRHVyYXRpb24gbGFzdEV2aWN0aW9uRHVyYXRpb24pIHsKKwkJCQlhc3NlcnRFcXVhbHMoUGFja0V4dC5JTkRFWC5nZXRQb3NpdGlvbigpLCBwYWNrRXh0UG9zKTsKKwkJCQlhc3NlcnRUcnVlKGNhY2hlSGl0KTsKKwkJCQlhc3NlcnRUcnVlKGxhc3RFdmljdGlvbkR1cmF0aW9uLmlzWmVybygpKTsKKwkJCQlsb2FkZWQuaW5jcmVtZW50QW5kR2V0KCk7CisJCQl9CisJCX07CisKKwkJRGZzQmxvY2tDYWNoZS5yZWNvbmZpZ3VyZShuZXcgRGZzQmxvY2tDYWNoZUNvbmZpZygpLnNldEJsb2NrU2l6ZSg1MTIpCisJCQkJLnNldEJsb2NrTGltaXQoNTEyICogNCkKKwkJCQkuc2V0SW5kZXhFdmVudENvbnN1bWVyKGluZGV4RXZlbnRDb25zdW1lcikpOworCQljYWNoZSA9IERmc0Jsb2NrQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKKworCQlEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24gcmVwbyA9IG5ldyBEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24oInRlc3QiKTsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHIxID0gbmV3IEluTWVtb3J5UmVwb3NpdG9yeShyZXBvKTsKKwkJYnl0ZVtdIGNvbnRlbnQgPSBybmcubmV4dEJ5dGVzKDQyNDI0Mik7CisJCU9iamVjdElkIGlkOworCQl0cnkgKE9iamVjdEluc2VydGVyIGlucyA9IHIxLm5ld09iamVjdEluc2VydGVyKCkpIHsKKwkJCWlkID0gaW5zLmluc2VydChPQkpfQkxPQiwgY29udGVudCk7CisJCQlpbnMuZmx1c2goKTsKKwkJfQorCisJCXRyeSAoT2JqZWN0UmVhZGVyIHJkciA9IHIxLm5ld09iamVjdFJlYWRlcigpKSB7CisJCQlieXRlW10gYWN0dWFsID0gcmRyLm9wZW4oaWQsIE9CSl9CTE9CKS5nZXRCeXRlcygpOworCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGNvbnRlbnQsIGFjdHVhbCkpOworCQl9CisJCS8vIEFsbCBjYWNoZSBlbnRyaWVzIGFyZSBob3QgYW5kIGNhY2hlIGlzIGF0IGNhcGFjaXR5LgorCQlhc3NlcnRUcnVlKExvbmdTdHJlYW0ub2YoY2FjaGUuZ2V0SGl0Q291bnQoKSkuc3VtKCkgPiAwKTsKKwkJYXNzZXJ0RXF1YWxzKDk5LCBjYWNoZS5nZXRGaWxsUGVyY2VudGFnZSgpKTsKKworCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjIgPSBuZXcgSW5NZW1vcnlSZXBvc2l0b3J5KHJlcG8pOworCQljb250ZW50ID0gcm5nLm5leHRCeXRlcyg0MjQyNDIpOworCQl0cnkgKE9iamVjdEluc2VydGVyIGlucyA9IHIyLm5ld09iamVjdEluc2VydGVyKCkpIHsKKwkJCWlucy5pbnNlcnQoT0JKX0JMT0IsIGNvbnRlbnQpOworCQkJaW5zLmZsdXNoKCk7CisJCX0KKwkJYXNzZXJ0VHJ1ZShjYWNoZS5nZXRFdmljdGlvbnMoKVtQYWNrRXh0LlBBQ0suZ2V0UG9zaXRpb24oKV0gPiAwKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGNhY2hlLmdldEV2aWN0aW9ucygpW1BhY2tFeHQuSU5ERVguZ2V0UG9zaXRpb24oKV0pOworCQlhc3NlcnRFcXVhbHMoMSwgbG9hZGVkLmdldCgpKTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorCUBUZXN0CisJcHVibGljIHZvaWQgaGFzSW5kZXhFdmVudENvbnN1bWVyTG9hZGVkQW5kRXZpY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlBdG9taWNJbnRlZ2VyIGxvYWRlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisJCUF0b21pY0ludGVnZXIgZXZpY3RlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisJCUluZGV4RXZlbnRDb25zdW1lciBpbmRleEV2ZW50Q29uc3VtZXIgPSBuZXcgSW5kZXhFdmVudENvbnN1bWVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhY2NlcHRSZXF1ZXN0ZWRFdmVudChpbnQgcGFja0V4dFBvcywgYm9vbGVhbiBjYWNoZUhpdCwKKwkJCQkJbG9uZyBsb2FkTWljcm9zLCBsb25nIGJ5dGVzLAorCQkJCQlEdXJhdGlvbiBsYXN0RXZpY3Rpb25EdXJhdGlvbikgeworCQkJCWFzc2VydEVxdWFscyhQYWNrRXh0LklOREVYLmdldFBvc2l0aW9uKCksIHBhY2tFeHRQb3MpOworCQkJCWFzc2VydFRydWUoY2FjaGVIaXQpOworCQkJCWFzc2VydFRydWUobGFzdEV2aWN0aW9uRHVyYXRpb24uaXNaZXJvKCkpOworCQkJCWxvYWRlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhY2NlcHRFdmljdGVkRXZlbnQoaW50IHBhY2tFeHRQb3MsIGxvbmcgYnl0ZXMsCisJCQkJCWludCB0b3RhbENhY2hlSGl0Q291bnQsIER1cmF0aW9uIGxhc3RFdmljdGlvbkR1cmF0aW9uKSB7CisJCQkJYXNzZXJ0RXF1YWxzKFBhY2tFeHQuSU5ERVguZ2V0UG9zaXRpb24oKSwgcGFja0V4dFBvcyk7CisJCQkJYXNzZXJ0VHJ1ZSh0b3RhbENhY2hlSGl0Q291bnQgPiAwKTsKKwkJCQlhc3NlcnRUcnVlKGxhc3RFdmljdGlvbkR1cmF0aW9uLmlzWmVybygpKTsKKwkJCQlldmljdGVkLmluY3JlbWVudEFuZEdldCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIHNob3VsZFJlcG9ydEV2aWN0ZWRFdmVudCgpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfTsKKworCQlEZnNCbG9ja0NhY2hlLnJlY29uZmlndXJlKG5ldyBEZnNCbG9ja0NhY2hlQ29uZmlnKCkuc2V0QmxvY2tTaXplKDUxMikKKwkJCQkuc2V0QmxvY2tMaW1pdCg1MTIgKiA0KQorCQkJCS5zZXRJbmRleEV2ZW50Q29uc3VtZXIoaW5kZXhFdmVudENvbnN1bWVyKSk7CisJCWNhY2hlID0gRGZzQmxvY2tDYWNoZS5nZXRJbnN0YW5jZSgpOworCisJCURmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbiByZXBvID0gbmV3IERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbigidGVzdCIpOworCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjEgPSBuZXcgSW5NZW1vcnlSZXBvc2l0b3J5KHJlcG8pOworCQlieXRlW10gY29udGVudCA9IHJuZy5uZXh0Qnl0ZXMoNDI0MjQyKTsKKwkJT2JqZWN0SWQgaWQ7CisJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgaW5zID0gcjEubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgeworCQkJaWQgPSBpbnMuaW5zZXJ0KE9CSl9CTE9CLCBjb250ZW50KTsKKwkJCWlucy5mbHVzaCgpOworCQl9CisKKwkJdHJ5IChPYmplY3RSZWFkZXIgcmRyID0gcjEubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCWJ5dGVbXSBhY3R1YWwgPSByZHIub3BlbihpZCwgT0JKX0JMT0IpLmdldEJ5dGVzKCk7CisJCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoY29udGVudCwgYWN0dWFsKSk7CisJCX0KKwkJLy8gQWxsIGNhY2hlIGVudHJpZXMgYXJlIGhvdCBhbmQgY2FjaGUgaXMgYXQgY2FwYWNpdHkuCisJCWFzc2VydFRydWUoTG9uZ1N0cmVhbS5vZihjYWNoZS5nZXRIaXRDb3VudCgpKS5zdW0oKSA+IDApOworCQlhc3NlcnRFcXVhbHMoOTksIGNhY2hlLmdldEZpbGxQZXJjZW50YWdlKCkpOworCisJCUluTWVtb3J5UmVwb3NpdG9yeSByMiA9IG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkocmVwbyk7CisJCWNvbnRlbnQgPSBybmcubmV4dEJ5dGVzKDQyNDI0Mik7CisJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgaW5zID0gcjIubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgeworCQkJaW5zLmluc2VydChPQkpfQkxPQiwgY29udGVudCk7CisJCQlpbnMuZmx1c2goKTsKKwkJfQorCQlhc3NlcnRUcnVlKGNhY2hlLmdldEV2aWN0aW9ucygpW1BhY2tFeHQuUEFDSy5nZXRQb3NpdGlvbigpXSA+IDApOworCQlhc3NlcnRFcXVhbHMoMSwgY2FjaGUuZ2V0RXZpY3Rpb25zKClbUGFja0V4dC5JTkRFWC5nZXRQb3NpdGlvbigpXSk7CisJCWFzc2VydEVxdWFscygxLCBsb2FkZWQuZ2V0KCkpOworCQlhc3NlcnRFcXVhbHMoMSwgZXZpY3RlZC5nZXQoKSk7CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCBub0NvbmN1cnJlbmN5U2VyaWFsaXplZFJlYWRzX29uZVJlcG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSW5NZW1vcnlSZXBvc2l0b3J5IHIxID0gY3JlYXRlUmVwb1dpdGhCaXRtYXAoInRlc3QiKTsKIAkJLy8gUmVzZXQgY2FjaGUgd2l0aCBjb25jdXJyZW5jeSBMZXZlbCBhdCAxIGkuZS4gbm8gY29uY3VycmVuY3kuCkBAIC0yNjcsNyArMzgzLDYgQEAgcHVibGljIHZvaWQgbG93Q29uY3VycmVuY3lQYXJhbGxlbFJlYWRzX3R3b1JlcG9zQW5kSW5kZXgoKQogCQlhc3NlcnRFcXVhbHMoMiwgY2FjaGUuZ2V0TWlzc0NvdW50KClbMF0pOwogCX0KIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBoaWdoQ29uY3VycmVuY3lQYXJhbGxlbFJlYWRzX29uZVJlcG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSW5NZW1vcnlSZXBvc2l0b3J5IHIxID0gY3JlYXRlUmVwb1dpdGhCaXRtYXAoInRlc3QiKTsKQEAgLTI5MCw3ICs0MDUsNiBAQCBwdWJsaWMgdm9pZCBoaWdoQ29uY3VycmVuY3lQYXJhbGxlbFJlYWRzX29uZVJlcG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKDEsIGNhY2hlLmdldE1pc3NDb3VudCgpWzBdKTsKIAl9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCUBUZXN0CiAJcHVibGljIHZvaWQgaGlnaENvbmN1cnJlbmN5UGFyYWxsZWxSZWFkc19vbmVSZXBvUGFyYWxsZWxSZXZlcnNlSW5kZXgoKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JhdGNoUmVmVXBkYXRlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CYXRjaFJlZlVwZGF0ZVRlc3QuamF2YQppbmRleCA2MzU3YTBiLi5kYWY0MzgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JhdGNoUmVmVXBkYXRlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQmF0Y2hSZWZVcGRhdGVUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ldmVudHMuTGlzdGVuZXJIYW5kbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ldmVudHMuUmVmc0NoYW5nZWRMaXN0ZW5lcjsKQEAgLTEyNyw2ICsxMjksNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAKIAkJZGlza1JlcG8gPSBmaWxlUmVwbzsKKwkJYWRkUmVwb1RvQ2xvc2UoZGlza1JlcG8pOwogCQlzZXRMb2dBbGxSZWZVcGRhdGVzKHRydWUpOwogCiAJCWlmICghdXNlUmVmdGFibGUpIHsKQEAgLTExOTAsNyArMTE5Myw4IEBAIHByaXZhdGUgdm9pZCBhc3NlcnRSZWZzKE9iamVjdC4uLiBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGlza1JlcG8uZ2V0UmVmRGF0YWJhc2UoKQotCQkJCS5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCk7CisJCQkJLmdldFJlZnNCeVByZWZpeChSZWZEYXRhYmFzZS5BTEwpLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChSZWY6OmdldE5hbWUsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKIAkJUmVmIGFjdHVhbEhlYWQgPSByZWZzLnJlbW92ZShDb25zdGFudHMuSEVBRCk7CiAJCWlmIChhY3R1YWxIZWFkICE9IG51bGwpIHsKIAkJCVN0cmluZyBhY3R1YWxMZWFmTmFtZSA9IGFjdHVhbEhlYWQuZ2V0TGVhZigpLmdldE5hbWUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrVGVzdC5qYXZhCmluZGV4IDZjNzRmMDAuLjZjNzk5MjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFja1Rlc3QuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKQEAgLTMyLDEwICszMywxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKKwogcHVibGljIGNsYXNzIEZpbGVSZWZ0YWJsZVN0YWNrVGVzdCB7CiAKIAlwcml2YXRlIHN0YXRpYyBSZWYgbmV3UmVmKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCkgewpAQCAtMTE1LDkgKzExOCwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdGlvbjEwMjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGVzdENvbXBhY3Rpb24oMTAyNCk7CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiLCAidW51c2VkIiB9KQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBtaXNzaW5nUmVmdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ2FuJ3QgZGVsZXRlIGluLXVzZSBmaWxlcyBvbiBXaW5kb3dzLgorCQlhc3N1bWVGYWxzZShTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc1dpbmRvd3MoKSk7CisKIAkJdHJ5IChGaWxlUmVmdGFibGVTdGFjayBzdGFjayA9IG5ldyBGaWxlUmVmdGFibGVTdGFjaygKIAkJCQluZXcgRmlsZShyZWZ0YWJsZURpciwgInJlZnMiKSwgcmVmdGFibGVEaXIsIG51bGwsCiAJCQkJKCkgLT4gbmV3IENvbmZpZygpKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY1Rlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djVGVzdENhc2UuamF2YQppbmRleCBiZmIyMzNmLi40OGY2ZTA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djVGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djVGVzdENhc2UuamF2YQpAQCAtNDIsNiArNDIsNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCUBPdmVycmlkZQogCUBBZnRlcgogCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyLmNsb3NlKCk7CiAJCXN1cGVyLnRlYXJEb3duKCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZVRlc3QuamF2YQppbmRleCA1MDk5MzVkLi43ZWFiMWRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGVUZXN0LmphdmEKQEAgLTIwMCw0ICsyMDAsMTYgQEAgcHVibGljIHZvaWQgdGVzdExvY2tGb3JBcHBlbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RmFsc2UobG9jay5pc0xvY2tlZCgpKTsKIAkJY2hlY2tGaWxlKGYsICJjb250ZW50b3RoZXIiKTsKIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVbmxvY2tOb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUZpbGUgZiA9IHdyaXRlVHJhc2hGaWxlKCJzb21lZmlsZSIsICJjb250ZW50Iik7CisJCXRyeSB7CisJCQlMb2NrRmlsZSBsb2NrID0gbmV3IExvY2tGaWxlKGYpOworCQkJbG9jay51bmxvY2soKTsKKwkJCWxvY2sudW5sb2NrKCk7CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQlmYWlsKCJ1bmxvY2sgc2hvdWxkIGJlIG5vb3AgaWYgbm90IGxvY2tlZCBhdCBhbGwuIik7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEKaW5kZXggMWZmMjI2NC4uM2ZlOGY1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YQpAQCAtNzIyLDYgKzcyMiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsUGFja0ZpbGVzU2NhbldoZW5Eb2luZ1NlYXJjaEZvclJldXNlVGltZW91dENoZWNrKCkKIAkgKi8KIAlwcml2YXRlIEZpbGVSZXBvc2l0b3J5IHNldFVwUmVwb1dpdGhNdWx0aXBsZVBhY2tmaWxlcygpIHRocm93cyBFeGNlcHRpb24gewogCQlGaWxlUmVwb3NpdG9yeSBmaWxlUmVwb3NpdG9yeSA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKGZpbGVSZXBvc2l0b3J5KTsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChmaWxlUmVwb3NpdG9yeSkpIHsKIAkJCS8vIENyZWF0ZXMgMiBvYmplY3RzIChDMSA9IGNvbW1pdCwgVDEgPSB0cmVlKQogCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkZpcnN0IGNvbW1pdCIpLmNhbGwoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2lvL0NhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvaW8vQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhN2MwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2lvL0NhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBUZW5jZW50LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvLkNhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtLkJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0s7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5OdWxsT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW1UZXN0IHsKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBDYW5jZWxsZWRUZXN0TW9uaXRvciBpbXBsZW1lbnRzIFByb2dyZXNzTW9uaXRvciB7CisKKwkJcHJpdmF0ZSBib29sZWFuIGNhbmNlbGxlZCA9IGZhbHNlOworCisJCXB1YmxpYyB2b2lkIHNldENhbmNlbGxlZChib29sZWFuIGNhbmNlbGxlZCkgeworCQkJdGhpcy5jYW5jZWxsZWQgPSBjYW5jZWxsZWQ7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgc3RhcnQoaW50IHRvdGFsVGFza3MpIHsKKwkJCS8vIG5vdCBpbXBsZW1lbnRlZAorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgdGl0bGUsIGludCB0b3RhbFdvcmspIHsKKwkJCS8vIG5vdCBpbXBsZW1lbnRlZAorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHVwZGF0ZShpbnQgY29tcGxldGVkKSB7CisJCQkvLyBub3QgaW1wbGVtZW50ZWQKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBlbmRUYXNrKCkgeworCQkJLy8gbm90IGltcGxlbWVudGVkCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7CisJCQlyZXR1cm4gY2FuY2VsbGVkOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsSW5Qcm9jZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNhbmNlbGxlZFRlc3RNb25pdG9yIG0gPSBuZXcgQ2FuY2VsbGVkVGVzdE1vbml0b3IoKTsKKwkJdHJ5IChDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0oCisJCQkJbSwgTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSkpIHsKKwkJCWJ5dGVbXSBLQiA9IG5ldyBieXRlWzEwMjRdOworCQkJaW50IHRyaWdnZXJDYW5jZWxXcml0ZUNudCA9IEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0sKKwkJCQkJLyBLQi5sZW5ndGg7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRyaWdnZXJDYW5jZWxXcml0ZUNudCArIDE7IGkrKykgeworCQkJCW91dC53cml0ZShLQik7CisJCQl9CisJCQlhc3NlcnRUcnVlKG91dC5sZW5ndGgoKSA+IEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0spOworCQkJbS5zZXRDYW5jZWxsZWQodHJ1ZSk7CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJpZ2dlckNhbmNlbFdyaXRlQ250IC0gMTsgaSsrKSB7CisJCQkJb3V0LndyaXRlKEtCKTsKKwkJCX0KKworCQkJbG9uZyBsYXN0TGVuZ3RoID0gb3V0Lmxlbmd0aCgpOworCQkJYXNzZXJ0VGhyb3dzKEludGVycnVwdGVkSU9FeGNlcHRpb24uY2xhc3MsICgpIC0+IHsKKwkJCQlvdXQud3JpdGUoMSk7CisJCQl9KTsKKwkJCWFzc2VydEVxdWFscyhsYXN0TGVuZ3RoLCBvdXQubGVuZ3RoKCkpOworCisJCQlhc3NlcnRUaHJvd3MoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbi5jbGFzcywgKCkgLT4geworCQkJCW91dC53cml0ZShuZXcgYnl0ZVsxXSk7CisJCQl9KTsKKwkJCWFzc2VydEVxdWFscyhsYXN0TGVuZ3RoLCBvdXQubGVuZ3RoKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlckNoZWNrQWZ0ZXJTaW5nbGVCeXRlcygpIHRocm93cyBFeGNlcHRpb24geworCQlDYW5jZWxsZWRUZXN0TW9uaXRvciBtID0gbmV3IENhbmNlbGxlZFRlc3RNb25pdG9yKCk7CisJCXRyeSAoQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtKAorCQkJCW0sIE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKSB7CisKKwkJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW0JZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0sgKyAxXTsKKwkJCW0uc2V0Q2FuY2VsbGVkKHRydWUpOworCisJCQlhc3NlcnRUaHJvd3MoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbi5jbGFzcywgKCkgLT4geworCQkJCW91dC53cml0ZShieXRlcyk7CisJCQl9KTsKKwkJCWFzc2VydEVxdWFscyhCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLLCBvdXQubGVuZ3RoKCkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2gvT3BlblNzaENvbmZpZ0ZpbGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZVRlc3QuamF2YQppbmRleCAxMTc0MWI0Li5kMDY1MjgwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZVRlc3QuamF2YQpAQCAtMzY5LDIwICszNjksMjEgQEAgcHVibGljIHZvaWQgdGVzdEhvc3RDYXNlSW5zZW5zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdExpc3RWYWx1ZVNpbmdsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3Qgb3JjelxuVXNlcktub3duSG9zdHNGaWxlIC9mb28vYmFyXG4iKTsKKwkJY29uZmlnKCJIb3N0IG9yY3pcblVzZXJLbm93bkhvc3RzRmlsZSB+L2Zvby9iYXJcbiIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGMgPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChjKTsKLQkJYXNzZXJ0RXF1YWxzKCIvZm9vL2JhciIsIGMuZ2V0VmFsdWUoIlVzZXJLbm93bkhvc3RzRmlsZSIpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGhvbWUsICJmb28vYmFyIikuZ2V0UGF0aCgpLAorCQkJCWMuZ2V0VmFsdWUoIlVzZXJLbm93bkhvc3RzRmlsZSIpKTsKIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RMaXN0VmFsdWVNdWx0aXBsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBUaWxkZSBleHBhbnNpb24gb2NjdXJzIHdpdGhpbiB0aGUgcGFyc2VyCi0JCWNvbmZpZygiSG9zdCBvcmN6XG5Vc2VyS25vd25Ib3N0c0ZpbGUgXCJ+L2Zvby9iYSB6XCIgL2Zvby9iYXIgXG4iKTsKKwkJY29uZmlnKCJIb3N0IG9yY3pcblVzZXJLbm93bkhvc3RzRmlsZSBcIn4vZm9vL2JhIHpcIiB+L2Zvby9iYXIgXG4iKTsKIAkJZmluYWwgSG9zdENvbmZpZyBjID0gbG9va3VwKCJvcmN6Iik7CiAJCWFzc2VydE5vdE51bGwoYyk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7IG5ldyBGaWxlKGhvbWUsICJmb28vYmEgeiIpLmdldFBhdGgoKSwKLQkJCQkiL2Zvby9iYXIiIH0sCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKS5nZXRQYXRoKCkgfSwKIAkJCQljLmdldFZhbHVlcygiVXNlcktub3duSG9zdHNGaWxlIikudG9BcnJheSgpKTsKIAl9CiAKQEAgLTQwMywyMiArNDA0LDIzIEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZExvb2t1cHNXaXRoTW9kaWZpY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5RmlsZSBcIn4vZm9vL2JhIHpcIlxuSWRlbnRpdHlGaWxlIC9mb28vYmFyIik7CisJCWNvbmZpZygiSG9zdCBvcmN6XG5JZGVudGl0eUZpbGUgXCJ+L2Zvby9iYSB6XCJcbklkZW50aXR5RmlsZSB+L2Zvby9iYXIiKTsKIAkJZmluYWwgSG9zdENvbmZpZyBoID0gbG9va3VwKCJvcmN6Iik7CiAJCWFzc2VydE5vdE51bGwoaCk7CiAJCS8vIERvZXMgdGlsZGUgcmVwbGFjZW1lbnQKIAkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IE9iamVjdFtdIHsgbmV3IEZpbGUoaG9tZSwgImZvby9iYSB6IikuZ2V0UGF0aCgpLAotCQkJCSIvZm9vL2JhciIgfSwKKwkJCQluZXcgRmlsZShob21lLCAiZm9vL2JhciIpLmdldFBhdGgoKSB9LAogCQkJCWguZ2V0VmFsdWVzKFNzaENvbnN0YW50cy5JREVOVElUWV9GSUxFKS50b0FycmF5KCkpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE11bHRpSWRlbnRpdHlGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSWRlbnRpdHlGaWxlIFwifi9mb28vYmEgelwiXG5Ib3N0IG9yY3pcbklkZW50aXR5RmlsZSAvZm9vL2JhclxuSE9TVCAqXG5JZGVudGl0eUZpbGUgL2Zvby9iYXoiKTsKKwkJY29uZmlnKCJJZGVudGl0eUZpbGUgXCJ+L2Zvby9iYSB6XCJcbkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIH4vZm9vL2JhclxuSE9TVCAqXG5JZGVudGl0eUZpbGUgfi9mb28vYmF6Iik7CiAJCWZpbmFsIEhvc3RDb25maWcgaCA9IGxvb2t1cCgib3JjeiIpOwogCQlhc3NlcnROb3ROdWxsKGgpOwogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyBuZXcgRmlsZShob21lLCAiZm9vL2JhIHoiKS5nZXRQYXRoKCksCi0JCQkJIi9mb28vYmFyIiwgIi9mb28vYmF6IiB9LAorCQkJCW5ldyBGaWxlKGhvbWUsICJmb28vYmFyIikuZ2V0UGF0aCgpLAorCQkJCW5ldyBGaWxlKGhvbWUsICJmb28vYmF6IikuZ2V0UGF0aCgpIH0sCiAJCQkJaC5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJfQogCkBAIC00MzQsMjMgKzQzNiwyMyBAQCBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRlZFBhdHRlcm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhdHRlcm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29uZmlnKCJIb3N0IHJlcG8ub3IuY3pcbklkZW50aXR5RmlsZSB+L2Zvby9iYXJcbkhPU1QgKi5vci5jelxuSWRlbnRpdHlGaWxlIC9mb28vYmF6Iik7CisJCWNvbmZpZygiSG9zdCByZXBvLm9yLmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICoub3IuY3pcbklkZW50aXR5RmlsZSB+L2Zvby9iYXoiKTsKIAkJZmluYWwgSG9zdENvbmZpZyBoID0gbG9va3VwKCJyZXBvLm9yLmN6Iik7CiAJCWFzc2VydE5vdE51bGwoaCk7CiAJCWFzc2VydElkZW50aXR5KG5ldyBGaWxlKGhvbWUsICJmb28vYmFyIiksIGgpOwogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyBuZXcgRmlsZShob21lLCAiZm9vL2JhciIpLmdldFBhdGgoKSwKLQkJCQkiL2Zvby9iYXoiIH0sCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXoiKS5nZXRQYXRoKCkgfSwKIAkJCQloLmdldFZhbHVlcyhTc2hDb25zdGFudHMuSURFTlRJVFlfRklMRSkudG9BcnJheSgpKTsKIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RNdWx0aUhvc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29uZmlnKCJIb3N0IG9yY3ogKi5vci5jelxuSWRlbnRpdHlGaWxlIH4vZm9vL2JhclxuSE9TVCAqLm9yLmN6XG5JZGVudGl0eUZpbGUgL2Zvby9iYXoiKTsKKwkJY29uZmlnKCJIb3N0IG9yY3ogKi5vci5jelxuSWRlbnRpdHlGaWxlIH4vZm9vL2JhclxuSE9TVCAqLm9yLmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmF6Iik7CiAJCWZpbmFsIEhvc3RDb25maWcgaDEgPSBsb29rdXAoInJlcG8ub3IuY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoMSk7CiAJCWFzc2VydElkZW50aXR5KG5ldyBGaWxlKGhvbWUsICJmb28vYmFyIiksIGgxKTsKIAkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IE9iamVjdFtdIHsgbmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKS5nZXRQYXRoKCksCi0JCQkJIi9mb28vYmF6IiB9LAorCQkJCW5ldyBGaWxlKGhvbWUsICJmb28vYmF6IikuZ2V0UGF0aCgpIH0sCiAJCQkJaDEuZ2V0VmFsdWVzKFNzaENvbnN0YW50cy5JREVOVElUWV9GSUxFKS50b0FycmF5KCkpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGgyID0gbG9va3VwKCJvcmN6Iik7CiAJCWFzc2VydE5vdE51bGwoaDIpOwpAQCAtNTQ3LDE4ICs1NDksMzYgQEAgcHVibGljIHZvaWQgdGVzdEVvbENvbW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFblZhclN1YnN0aXR1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIC90bXAvJHtUU1RfVkFSfVxuIgotCQkJCSsgIkNlcnRpZmljYXRlRmlsZSAvdG1wLyR7fS9mb29cblVzZXIgJHtUU1RfVkFSfVxuSWRlbnRpdHlBZ2VudCAvdG1wLyR7VFNUX1ZBUi9iYXIiKTsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5RmlsZSB+L3RtcC8ke1RTVF9WQVJ9XG4iCisJCQkJKyAiQ2VydGlmaWNhdGVGaWxlIH4vdG1wLyR7fS9mb29cblVzZXIgJHtUU1RfVkFSfVxuSWRlbnRpdHlBZ2VudCB+L3RtcC8ke1RTVF9WQVIvYmFyIik7CiAJCUhvc3RDb25maWcgaCA9IGxvb2t1cCgib3JjeiIpOwogCQlhc3NlcnROb3ROdWxsKGgpOwotCQlhc3NlcnRFcXVhbHMoIi90bXAvVEVTVCIsCisJCUZpbGUgdG1wID0gbmV3IEZpbGUoaG9tZSwgInRtcCIpOworCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUodG1wLCAiVEVTVCIpLmdldFBhdGgoKSwKIAkJCQloLmdldFZhbHVlKFNzaENvbnN0YW50cy5JREVOVElUWV9GSUxFKSk7CiAJCS8vIE5vIHZhcmlhYmxlIG5hbWUKLQkJYXNzZXJ0RXF1YWxzKCIvdG1wLyR7fS9mb28iLCBoLmdldFZhbHVlKFNzaENvbnN0YW50cy5DRVJUSUZJQ0FURV9GSUxFKSk7CisJCWFzc2VydEVxdWFscyhuZXcgRmlsZShuZXcgRmlsZSh0bXAsICIke30iKSwgImZvbyIpLmdldFBhdGgoKSwKKwkJCQloLmdldFZhbHVlKFNzaENvbnN0YW50cy5DRVJUSUZJQ0FURV9GSUxFKSk7CiAJCS8vIFVzZXIgZG9lc24ndCBnZXQgZW52IHZhciBzdWJzdGl0dXRpb246CiAJCWFzc2VydFVzZXIoIiR7VFNUX1ZBUn0iLCBoKTsKIAkJLy8gVW50ZXJtaW5hdGVkOgotCQlhc3NlcnRFcXVhbHMoIi90bXAvJHtUU1RfVkFSL2JhciIsCisJCWFzc2VydEVxdWFscyhuZXcgRmlsZShuZXcgRmlsZSh0bXAsICIke1RTVF9WQVIiKSwgImJhciIpLmdldFBhdGgoKSwKKwkJCQloLmdldFZhbHVlKFNzaENvbnN0YW50cy5JREVOVElUWV9BR0VOVCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdElkZW50aXR5QWdlbnROb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbmZpZygiSG9zdCBvcmN6XG5JZGVudGl0eUFnZW50IG5vbmVcbiIpOworCQlIb3N0Q29uZmlnIGggPSBsb29rdXAoIm9yY3oiKTsKKwkJYXNzZXJ0RXF1YWxzKFNzaENvbnN0YW50cy5OT05FLAorCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5UKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlBZ2VudFNzaEF1dGhTb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbmZpZygiSG9zdCBvcmN6XG5JZGVudGl0eUFnZW50IFNTSF9BVVRIX1NPQ0tcbiIpOworCQlIb3N0Q29uZmlnIGggPSBsb29rdXAoIm9yY3oiKTsKKwkJYXNzZXJ0RXF1YWxzKFNzaENvbnN0YW50cy5FTlZfU1NIX0FVVEhfU09DS0VULAogCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5UKSk7CiAJfQogCkBAIC02MDcsMTMgKzYyNywxNiBAQCBwdWJsaWMgdm9pZCB0ZXN0Tm9NYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3QgZm9vLmJhclxuUG9ydCAyOTQxOFxuSWRlbnRpdHlGaWxlIC9mb29cblxuIgotCQkJCSsgIkhvc3QgKi5iYXJcblBvcnQgMjJcbklkZW50aXR5RmlsZSAvYmFyXG4iCi0JCQkJKyAiSG9zdCBmb28uYmFyXG5Qb3J0IDQ3XG5JZGVudGl0eUZpbGUgL2JhelxuIik7CisJCWNvbmZpZygiSG9zdCBmb28uYmFyXG5Qb3J0IDI5NDE4XG5JZGVudGl0eUZpbGUgfi9mb29cblxuIgorCQkJCSsgIkhvc3QgKi5iYXJcblBvcnQgMjJcbklkZW50aXR5RmlsZSB+L2JhclxuIgorCQkJCSsgIkhvc3QgZm9vLmJhclxuUG9ydCA0N1xuSWRlbnRpdHlGaWxlIH4vYmF6XG4iKTsKIAkJSG9zdENvbmZpZyBoID0gbG9va3VwKCJmb28uYmFyIik7CiAJCWFzc2VydE5vdE51bGwoaCk7CiAJCWFzc2VydFBvcnQoMjk0MTgsIGgpOwotCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyAiL2ZvbyIsICIvYmFyIiwgIi9iYXoiIH0sCisJCWFzc2VydEFycmF5RXF1YWxzKAorCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBGaWxlKGhvbWUsICJmb28iKS5nZXRQYXRoKCksCisJCQkJCQluZXcgRmlsZShob21lLCAiYmFyIikuZ2V0UGF0aCgpLAorCQkJCQkJbmV3IEZpbGUoaG9tZSwgImJheiIpLmdldFBhdGgoKSB9LAogCQkJCWguZ2V0VmFsdWVzKFNzaENvbnN0YW50cy5JREVOVElUWV9GSUxFKS50b0FycmF5KCkpOwogCX0KIApAQCAtNjMzLDQgKzY1Niw2MSBAQCBwdWJsaWMgdm9pZCB0ZXN0V2hpdGVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnROb3ROdWxsKGgpOwogCQlhc3NlcnRQb3J0KDIyLCBoKTsKIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUaW1lU3BlYygpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKG51bGwpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIgICIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygicyIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICBzIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIgK3MiKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiAtcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMW1zIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiNjAwIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiNjAwcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKDYwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiAgNjAwcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKDYwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiAgNjAwcyAgIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiXHQ2MDBzIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiIFx0NjAwICAiKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiAgNjAwIHMgICIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiNjAwIHMiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxMG0iKSk7CisJCWFzc2VydEVxdWFscyg1NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWgzMG0iKSk7CisJCWFzc2VydEVxdWFscyg1NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWggMzBtIikpOworCQlhc3NlcnRFcXVhbHMoNTQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoIFx0MzBtIikpOworCQlhc3NlcnRFcXVhbHMoNTQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoKzMwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDU0MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCArMzBtIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCArIDMwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWggLTMwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MzAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaDMwcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKDU0MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIzMG0gMWgiKSk7CisJCWFzc2VydEVxdWFscygzNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMzBtIDMwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDYwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMzAgMzAiKSk7CisJCWFzc2VydEVxdWFscygwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxIikpOworCQlhc3NlcnRFcXVhbHMoMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFTIikpOworCQlhc3NlcnRFcXVhbHMoMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFzIikpOworCQlhc3NlcnRFcXVhbHMoNjAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxTSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDYwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMW0iKSk7CisJCWFzc2VydEVxdWFscygzNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMUgiKSk7CisJCWFzc2VydEVxdWFscygzNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWgiKSk7CisJCWFzc2VydEVxdWFscyg4NjQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFEIikpOworCQlhc3NlcnRFcXVhbHMoODY0MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxZCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDYwNDgwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFXIikpOworCQlhc3NlcnRFcXVhbHMoNjA0ODAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXciKSk7CisJCWFzc2VydEVxdWFscygxNzI4MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIyZCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDYwNDgwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjF3IikpOworCQlhc3NlcnRFcXVhbHMoNjA0ODAwICsgMTcyODAwICsgMyAqIDM2MDAgKyAzMCAqIDYwICsgMTAsCisJCQkJT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjF3MmQzaDMwbTEwcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiLTciKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIi05ZCIpKTsKKwkJYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBPcGVuU3NoQ29uZmlnRmlsZQorCQkJCS50aW1lU3BlYyhJbnRlZ2VyLnRvU3RyaW5nKEludGVnZXIuTUFYX1ZBTFVFKSkpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlCisJCQkJLnRpbWVTcGVjKExvbmcudG9TdHJpbmcoSW50ZWdlci5NQVhfVkFMVUUgKyAxTCkpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZQorCQkJCS50aW1lU3BlYyhJbnRlZ2VyLnRvU3RyaW5nKEludGVnZXIuTUFYX1ZBTFVFIC8gNjAgKyAxKSArICdNJykpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwdyIpKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldkNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YWNlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldkNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiwgTWF0dGhpYXMgU29obiA8bWF0dGhpYXMuc29obkBzYXAuY29tPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIEFiYnJldkNvbmZpZ1Rlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoNywgdGVzdENvcmVBYmJyZXYobnVsbCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEF1dG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKDcsIHRlc3RDb3JlQWJicmV2KCJhdXRvIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5vKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscyg0MCwgdGVzdENvcmVBYmJyZXYoIm5vIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkTWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscyg0LCB0ZXN0Q29yZUFiYnJldigiNCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWYWxpZCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoMjIsIHRlc3RDb3JlQWJicmV2KCIyMiIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWYWxpZE1heCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoNDAsIHRlc3RDb3JlQWJicmV2KCI0MCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkKCkgeworCQlhc3NlcnRUaHJvd3MoSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MsCisJCQkJKCkgLT4gdGVzdENvcmVBYmJyZXYoImZvbyIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkMigpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCIyayIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTmVnYXRpdmUoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiLTEwMDAiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEJlbG93UmFuZ2UoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiMyIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQmVsb3dSYW5nZTIoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiLTEiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFib3ZlUmFuZ2UoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiNDEiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFib3ZlUmFuZ2UyKCkgeworCQlhc3NlcnRUaHJvd3MoSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MsCisJCQkJKCkgLT4gdGVzdENvcmVBYmJyZXYoIjEwMDAwMCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ05vKCkKKwkJCXRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoIjQwIiwgc2V0Q29yZUFiYnJldigibm8iKS50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpCisJCQl0aHJvd3MgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKCI3Iiwgc2V0Q29yZUFiYnJldigiYXV0byIpLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nMTIoKQorCQkJdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygiMTIiLCBzZXRDb3JlQWJicmV2KCIxMiIpLnRvU3RyaW5nKCkpOworCX0KKworCXByaXZhdGUgaW50IHRlc3RDb3JlQWJicmV2KFN0cmluZyB2YWx1ZSkKKwkJCXRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlyZXR1cm4gc2V0Q29yZUFiYnJldih2YWx1ZSkuZ2V0KCk7CisJfQorCisJcHJpdmF0ZSBBYmJyZXZDb25maWcgc2V0Q29yZUFiYnJldihTdHJpbmcgdmFsdWUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKwkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLCBudWxsLAorCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FCQlJFViwgdmFsdWUpOworCQljb25maWcuc2F2ZSgpOworCQlyZXR1cm4gQWJicmV2Q29uZmlnLnBhcnNlRnJvbUNvbmZpZyhkYik7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjZmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdENvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRDb25maWcuQ2xlYW51cE1vZGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDb21taXRDb25maWdUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbW1pdENvbmZpZyBjZmcgPSBwYXJzZSgiIik7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjbGVhbi11cCBtb2RlIiwgQ2xlYW51cE1vZGUuREVGQVVMVCwKKwkJCQljZmcuZ2V0Q2xlYW51cE1vZGUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0Q2xlYW51cCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSB2YWx1ZXMgPSB7ICJzdHJpcCIsICJ3aGl0ZXNwYWNlIiwgInZlcmJhdGltIiwgInNjaXNzb3JzIiwKKwkJCQkiZGVmYXVsdCIgfTsKKwkJQ2xlYW51cE1vZGVbXSBleHBlY3RlZCA9IHsgQ2xlYW51cE1vZGUuU1RSSVAsIENsZWFudXBNb2RlLldISVRFU1BBQ0UsCisJCQkJQ2xlYW51cE1vZGUuVkVSQkFUSU0sIENsZWFudXBNb2RlLlNDSVNTT1JTLAorCQkJCUNsZWFudXBNb2RlLkRFRkFVTFQgfTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkJCUNvbW1pdENvbmZpZyBjZmcgPSBwYXJzZSgiW2NvbW1pdF1cblx0Y2xlYW51cCA9ICIgKyB2YWx1ZXNbaV0pOworCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNsZWFuLXVwIG1vZGUiLCBleHBlY3RlZFtpXSwKKwkJCQkJY2ZnLmdldENsZWFudXBNb2RlKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSB2YWx1ZXMgPSB7ICJzdHJpcCIsICJ3aGl0ZXNwYWNlIiwgInZlcmJhdGltIiwgInNjaXNzb3JzIiwKKwkJCQkiZGVmYXVsdCIgfTsKKwkJQ2xlYW51cE1vZGVbXSBleHBlY3RlZCA9IHsgQ2xlYW51cE1vZGUuU1RSSVAsIENsZWFudXBNb2RlLldISVRFU1BBQ0UsCisJCQkJQ2xlYW51cE1vZGUuVkVSQkFUSU0sIENsZWFudXBNb2RlLlNDSVNTT1JTLAorCQkJCUNsZWFudXBNb2RlLkRFRkFVTFQgfTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkJCUNvbW1pdENvbmZpZyBjZmcgPSBwYXJzZSgiW2NvbW1pdF1cblx0Y2xlYW51cCA9ICIgKyB2YWx1ZXNbaV0pOworCQkJZm9yIChDbGVhbnVwTW9kZSBtb2RlIDogQ2xlYW51cE1vZGUudmFsdWVzKCkpIHsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykgeworCQkJCQlDbGVhbnVwTW9kZSByZXNvbHZlZCA9IGNmZy5yZXNvbHZlKG1vZGUsIGogPT0gMCk7CisJCQkJCWlmIChtb2RlICE9IENsZWFudXBNb2RlLkRFRkFVTFQpIHsKKwkJCQkJCWFzc2VydEVxdWFscygiQ2xlYW4tdXAgbW9kZSBzaG91bGQgYmUgdW5jaGFuZ2VkIiwgbW9kZSwKKwkJCQkJCQkJcmVzb2x2ZWQpOworCQkJCQl9IGVsc2UgaWYgKGkgKyAxIDwgdmFsdWVzLmxlbmd0aCkgeworCQkJCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNsZWFuLXVwIG1vZGUiLCBleHBlY3RlZFtpXSwKKwkJCQkJCQkJcmVzb2x2ZWQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNsZWFuLXVwIG1vZGUiLAorCQkJCQkJCQlqID09IDAgPyBDbGVhbnVwTW9kZS5TVFJJUAorCQkJCQkJCQkJCTogQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwKKwkJCQkJCQkJcmVzb2x2ZWQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5EZWZhdWx0VGhyb3dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydFRocm93cyhJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MsICgpIC0+IENvbW1pdENvbmZpZworCQkJCS5jbGVhblRleHQoIldoYXRldmVyIiwgQ2xlYW51cE1vZGUuREVGQVVMVCwgJyMnKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5WZXJiYXRpbSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJcbiAgXG5XaGF0ZXZlciAgXG5cblxuIyBBIGNvbW1lbnRcblxuTW9yZVx0IFxuXG5cbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsIG1lc3NhZ2UsCisJCQkJQ29tbWl0Q29uZmlnLmNsZWFuVGV4dChtZXNzYWdlLCBDbGVhbnVwTW9kZS5WRVJCQVRJTSwgJyMnKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5XaGl0ZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXHQgXG5cblxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwKKwkJCQkiV2hhdGV2ZXJcblxuIyBBIGNvbW1lbnRcblxuTW9yZVxuIiwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLldISVRFU1BBQ0UsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU3RyaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgQSBjb21tZW50XG5cbk1vcmVcdCBcblxuXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLCAiV2hhdGV2ZXJcblxuTW9yZVxuIiwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNUUklQLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblN0cmlwQ3VzdG9tQ2hhcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJcbiAgXG5XaGF0ZXZlciAgXG5cblxuIyBOb3QgYSBjb21tZW50XG5cbiAgIDxBIGNvbW1lbnRcbk1vcmVcdCBcblxuXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIE5vdCBhIGNvbW1lbnRcblxuTW9yZVxuIiwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNUUklQLCAnPCcpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVx0IFxuXG5cbiIKKwkJCQkrICIjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA+OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkJCQkrICJNb3JlXG5Nb3JlXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVxuIiwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzQ3VzdG9tQ2hhcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJcbiAgXG5XaGF0ZXZlciAgXG5cblxuIyBOb3QgYSBjb21tZW50XG5cbiAgIDxBIGNvbW1lbnRcbk1vcmVcdCBcblxuXG4iCisJCQkJKyAiPCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiTW9yZVxuTW9yZVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwKKwkJCQkiV2hhdGV2ZXJcblxuIyBOb3QgYSBjb21tZW50XG5cbiAgIDxBIGNvbW1lbnRcbk1vcmVcbiIsCisJCQkJQ29tbWl0Q29uZmlnLmNsZWFuVGV4dChtZXNzYWdlLCBDbGVhbnVwTW9kZS5TQ0lTU09SUywgJzwnKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5TY2lzc29yc0F0VG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkJCSsgIlxuICBcbldoYXRldmVyICBcblxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVx0IFxuXG5cbiIKKwkJCQkrICJNb3JlXG5Nb3JlXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLCAiIiwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzTm9TY2lzc29yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXHQgXG5cblxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwKKwkJCQkiV2hhdGV2ZXJcblxuIyBBIGNvbW1lbnRcblxuTW9yZVxuIiwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzTm9TY2lzc29yMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJUZXh0XG4iCisJCQkJKyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkJCSsgIk1vcmVcbk1vcmVcbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsIG1lc3NhZ2UsCisJCQkJQ29tbWl0Q29uZmlnLmNsZWFuVGV4dChtZXNzYWdlLCBDbGVhbnVwTW9kZS5TQ0lTU09SUywgJyMnKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5TY2lzc29yc05vU2Npc3NvcjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiVGV4dFxuIgorCQkJCS8vIFdyb25nIG51bWJlciBvZiBkYXNoZXMKKwkJCQkrICIjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkJCSsgIk1vcmVcbk1vcmVcbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsIG1lc3NhZ2UsCisJCQkJQ29tbWl0Q29uZmlnLmNsZWFuVGV4dChtZXNzYWdlLCBDbGVhbnVwTW9kZS5TQ0lTU09SUywgJyMnKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5TY2lzc29yc0F0RW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlRleHRcbiIKKwkJCQkrICIjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA+OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsICJUZXh0XG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbW1lbnRDaGFyRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21taXRDb25maWcgY2ZnID0gcGFyc2UoIiIpOworCQlhc3NlcnRFcXVhbHMoJyMnLCBjZmcuZ2V0Q29tbWVudENoYXIoKSk7CisJCWFzc2VydEZhbHNlKGNmZy5pc0F1dG9Db21tZW50Q2hhcigpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb21tZW50Q2hhckF1dG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCJbY29yZV1cblx0Y29tbWVudENoYXIgPSBhdXRvXG4iKTsKKwkJYXNzZXJ0RXF1YWxzKCcjJywgY2ZnLmdldENvbW1lbnRDaGFyKCkpOworCQlhc3NlcnRUcnVlKGNmZy5pc0F1dG9Db21tZW50Q2hhcigpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb21tZW50Q2hhckVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbW1pdENvbmZpZyBjZmcgPSBwYXJzZSgiW2NvcmVdXG5cdGNvbW1lbnRDaGFyID1cbiIpOworCQlhc3NlcnRFcXVhbHMoJyMnLCBjZmcuZ2V0Q29tbWVudENoYXIoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudENoYXJJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbW1pdENvbmZpZyBjZmcgPSBwYXJzZSgiW2NvcmVdXG5cdGNvbW1lbnRDaGFyID0gXCIgXCJcbiIpOworCQlhc3NlcnRFcXVhbHMoJyMnLCBjZmcuZ2V0Q29tbWVudENoYXIoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudENoYXJOb25Bc2NpaSgpIHRocm93cyBFeGNlcHRpb24geworCQlDb21taXRDb25maWcgY2ZnID0gcGFyc2UoIltjb3JlXVxuXHRjb21tZW50Q2hhciA9IMO2XG4iKTsKKwkJYXNzZXJ0RXF1YWxzKCcjJywgY2ZnLmdldENvbW1lbnRDaGFyKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbW1lbnRDaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbW1pdENvbmZpZyBjZmcgPSBwYXJzZSgiW2NvcmVdXG5cdGNvbW1lbnRDaGFyID0gX1xuIik7CisJCWFzc2VydEVxdWFscygnXycsIGNmZy5nZXRDb21tZW50Q2hhcigpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZXRlcm1pbmVDb21tZW50Q2hhcigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdGV4dCA9ICJBIGNvbW1pdCBtZXNzYWdlXG5cbkJvZHlcbiI7CisJCWFzc2VydEVxdWFscygnIycsIENvbW1pdENvbmZpZy5kZXRlcm1pbmVDb21tZW50Q2hhcih0ZXh0KSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5lQ29tbWVudENoYXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0ZXh0ID0gIkEgY29tbWl0IG1lc3NhZ2VcblxuQm9keVxuXG4jIENvbmZsaWN0czpcbiNcdGZvby50eHRcbiI7CisJCWNoYXIgY2ggPSBDb21taXRDb25maWcuZGV0ZXJtaW5lQ29tbWVudENoYXIodGV4dCk7CisJCWFzc2VydE5vdEVxdWFscygnIycsIGNoKTsKKwkJYXNzZXJ0VHJ1ZShjaCA+ICcgJyAmJiBjaCA8IDEyNyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5lQ29tbWVudENoYXIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0ZXh0ID0gIkEgY29tbWl0IG1lc3NhZ2VcblxuO0JvZHlcblxuIyBDb25mbGljdHM6XG4jXHRmb28udHh0XG4iOworCQljaGFyIGNoID0gQ29tbWl0Q29uZmlnLmRldGVybWluZUNvbW1lbnRDaGFyKHRleHQpOworCQlhc3NlcnROb3RFcXVhbHMoJyMnLCBjaCk7CisJCWFzc2VydE5vdEVxdWFscygnOycsIGNoKTsKKwkJYXNzZXJ0VHJ1ZShjaCA+ICcgJyAmJiBjaCA8IDEyNyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5lQ29tbWVudENoYXI0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0ZXh0ID0gIkEgY29tbWl0IG1lc3NhZ2VcblxuQm9keVxuXG4gICMgQ29uZmxpY3RzOlxuXHQgI1x0Zm9vLnR4dFxuIjsKKwkJY2hhciBjaCA9IENvbW1pdENvbmZpZy5kZXRlcm1pbmVDb21tZW50Q2hhcih0ZXh0KTsKKwkJYXNzZXJ0Tm90RXF1YWxzKCcjJywgY2gpOworCQlhc3NlcnRUcnVlKGNoID4gJyAnICYmIGNoIDwgMTI3KTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZXRlcm1pbmVDb21tZW50Q2hhcjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRleHQgPSAiQSBjb21taXQgbWVzc2FnZVxuXG5Cb2R5XG5cbiNhXG47YlxuQGNcbiFkXG4kXG4lXG5eXG4mXG58XG46IjsKKwkJY2hhciBjaCA9IENvbW1pdENvbmZpZy5kZXRlcm1pbmVDb21tZW50Q2hhcih0ZXh0KTsKKwkJYXNzZXJ0RXF1YWxzKDAsIGNoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBDb21taXRDb25maWcgcGFyc2UoU3RyaW5nIGNvbnRlbnQpCisJCQl0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjID0gbmV3IENvbmZpZygpOworCQljLmZyb21UZXh0KGNvbnRlbnQpOworCQlyZXR1cm4gYy5nZXQoQ29tbWl0Q29uZmlnLktFWSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdFRlbXBsYXRlQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmJhZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxLCAyMDIyIFNBUCBTRSBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuSkdpdFRlc3RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVSZXBvc2l0b3J5QnVpbGRlcjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOworCisvKgorICogVGhpcyB0ZXN0IHdhcyBtb3ZlZCBmcm9tIENvbmZpZ1Rlc3QgdG8gYWxsb3cgc2tpcHBpbmcgaXQgd2hlbiBydW5uaW5nIHRoZQorICogdGVzdCB1c2luZyBiYXplbCB3aGljaCBkb2Vzbid0IGFsbG93IHRlc3RzIHRvIGNyZWF0ZSBmaWxlcyBpbiB0aGUgaG9tZQorICogZGlyZWN0b3J5CisgKi8KK3B1YmxpYyBjbGFzcyBDb21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QgeworCisJQFJ1bGUKKwlwdWJsaWMgVGVtcG9yYXJ5Rm9sZGVyIHRtcCA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlUGF0aEluSG9tZURpcmVjb3J5KCkKKwkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKG51bGwpOworCQlGaWxlIHRlbXBGaWxlID0gdG1wLm5ld0ZpbGUoInRlc3RDb21taXRUZW1wbGF0ZS0iKTsKKwkJRmlsZSB3b3JrVHJlZSA9IHRtcC5uZXdGb2xkZXIoImR1bW15LXdvcmt0cmVlIik7CisJCVJlcG9zaXRvcnkgcmVwbyA9IEZpbGVSZXBvc2l0b3J5QnVpbGRlci5jcmVhdGUod29ya1RyZWUpOworCQlTdHJpbmcgdGVtcGxhdGVDb250ZW50ID0gImNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlIjsKKwkJSkdpdFRlc3RVdGlsLndyaXRlKHRlbXBGaWxlLCB0ZW1wbGF0ZUNvbnRlbnQpOworCQkvLyBwcm9wZXIgZXZhbHVhdGlvbiBvZiB0aGUgfi8gZGlyZWN0b3J5CisJCVN0cmluZyBob21lRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKKwkJRmlsZSB0ZW1wRmlsZUluSG9tZURpcmVjdG9yeSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImZpbGVJbkhvbWVGb2xkZXIiLAorCQkJCSIudG1wIiwgbmV3IEZpbGUoaG9tZURpcikpOworCQl0ZW1wRmlsZUluSG9tZURpcmVjdG9yeS5kZWxldGVPbkV4aXQoKTsKKwkJSkdpdFRlc3RVdGlsLndyaXRlKHRlbXBGaWxlSW5Ib21lRGlyZWN0b3J5LCB0ZW1wbGF0ZUNvbnRlbnQpOworCQlTdHJpbmcgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggPSAifi8iICsgdGVtcEZpbGVJbkhvbWVEaXJlY3RvcnkuZ2V0TmFtZSgpOworCQljb25maWcgPSBDb25maWdUZXN0CisJCQkJLnBhcnNlKCJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyBleHBlY3RlZFRlbXBsYXRlUGF0aCArICJcbiIpOworCQlTdHJpbmcgdGVtcGxhdGVQYXRoID0gY29uZmlnLmdldChDb21taXRDb25maWcuS0VZKQorCQkJCS5nZXRDb21taXRUZW1wbGF0ZVBhdGgoKTsKKwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVGVtcGxhdGVQYXRoLCB0ZW1wbGF0ZVBhdGgpOworCQlhc3NlcnRFcXVhbHModGVtcGxhdGVDb250ZW50LAorCQkJCWNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkuZ2V0Q29tbWl0VGVtcGxhdGVDb250ZW50KHJlcG8pKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCmluZGV4IDllZTU0ZDUuLmE4NWE0ZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCkBAIC0xMTc3LDcgKzExNzcsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFJlYWRMb25nKGxvbmcgZXhwLCBTdHJpbmcgYWN0KQogCQlhc3NlcnRFcXVhbHMoZXhwLCBjLmdldExvbmcoInMiLCBudWxsLCAiYSIsIDBMKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KQorCXN0YXRpYyBDb25maWcgcGFyc2UoU3RyaW5nIGNvbnRlbnQpCiAJCQl0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCXJldHVybiBwYXJzZShjb250ZW50LCBudWxsKTsKIAl9CkBAIC0xNDg4LDcgKzE0ODgsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0VGVtcGxhdGVDb25maWcoKQogCQlTdHJpbmcgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggPSB0ZW1wRmlsZS5nZXRQYXRoKCk7CiAKIAkJQ29uZmlnIGNvbmZpZyA9IHBhcnNlKAotCQkJCSJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyBleHBlY3RlZFRlbXBsYXRlUGF0aCArICJcbiIpOworCQkJCSJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkJCSsgQ29uZmlnLmVzY2FwZVZhbHVlKGV4cGVjdGVkVGVtcGxhdGVQYXRoKSArICJcbiIpOwogCiAJCVN0cmluZyB0ZW1wbGF0ZVBhdGggPSBjb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpCiAJCQkJLmdldENvbW1pdFRlbXBsYXRlUGF0aCgpOwpAQCAtMTUzNyw3ICsxNTM4LDggQEAgcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlRW5jb2RpbmcoKQogCQlKR2l0VGVzdFV0aWwud3JpdGUodGVtcEZpbGUsIHRlbXBsYXRlQ29udGVudCk7CiAJCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9IHRlbXBGaWxlLmdldFBhdGgoKTsKIAkJY29uZmlnID0gcGFyc2UoIltpMThuXVxuXHRjb21taXRFbmNvZGluZyA9IHV0Zi04XG4iCi0JCQkJKyAiW2NvbW1pdF1cblx0dGVtcGxhdGUgPSAiICsgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggKyAiXG4iKTsKKwkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkrIENvbmZpZy5lc2NhcGVWYWx1ZShleHBlY3RlZFRlbXBsYXRlUGF0aCkgKyAiXG4iKTsKIAkJYXNzZXJ0RXF1YWxzKHRlbXBsYXRlQ29udGVudCwKIAkJCQljb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpLmdldENvbW1pdFRlbXBsYXRlQ29udGVudChyZXBvKSk7CiAJCVN0cmluZyBjb21taXRFbmNvZGluZyA9IGNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkKQEAgLTE1NDYsMzEgKzE1NDgsNiBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0VGVtcGxhdGVFbmNvZGluZygpCiAJCQkJInV0Zi04IiwgY29tbWl0RW5jb2RpbmcpOwogCX0KIAotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlUGF0aEluSG9tZURpcmVjb3J5KCkKLQkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUNvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKG51bGwpOwotCQlGaWxlIHRlbXBGaWxlID0gdG1wLm5ld0ZpbGUoInRlc3RDb21taXRUZW1wbGF0ZS0iKTsKLQkJRmlsZSB3b3JrVHJlZSA9IHRtcC5uZXdGb2xkZXIoImR1bW15LXdvcmt0cmVlIik7Ci0JCVJlcG9zaXRvcnkgcmVwbyA9IEZpbGVSZXBvc2l0b3J5QnVpbGRlci5jcmVhdGUod29ya1RyZWUpOwotCQlTdHJpbmcgdGVtcGxhdGVDb250ZW50ID0gImNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlIjsKLQkJSkdpdFRlc3RVdGlsLndyaXRlKHRlbXBGaWxlLCB0ZW1wbGF0ZUNvbnRlbnQpOwotCQkvLyBwcm9wZXIgZXZhbHVhdGlvbiBvZiB0aGUgfi8gZGlyZWN0b3J5Ci0JCVN0cmluZyBob21lRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKLQkJRmlsZSB0ZW1wRmlsZUluSG9tZURpcmVjdG9yeSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImZpbGVJbkhvbWVGb2xkZXIiLAotCQkJCSIudG1wIiwgbmV3IEZpbGUoaG9tZURpcikpOwotCQl0ZW1wRmlsZUluSG9tZURpcmVjdG9yeS5kZWxldGVPbkV4aXQoKTsKLQkJSkdpdFRlc3RVdGlsLndyaXRlKHRlbXBGaWxlSW5Ib21lRGlyZWN0b3J5LCB0ZW1wbGF0ZUNvbnRlbnQpOwotCQlTdHJpbmcgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggPSB0ZW1wRmlsZUluSG9tZURpcmVjdG9yeS5nZXRQYXRoKCkKLQkJCQkucmVwbGFjZShob21lRGlyLCAifiIpOwotCQljb25maWcgPSBwYXJzZSgiW2NvbW1pdF1cblx0dGVtcGxhdGUgPSAiICsgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggKyAiXG4iKTsKLQkJU3RyaW5nIHRlbXBsYXRlUGF0aCA9IGNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkKLQkJCQkuZ2V0Q29tbWl0VGVtcGxhdGVQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFRlbXBsYXRlUGF0aCwgdGVtcGxhdGVQYXRoKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXBsYXRlQ29udGVudCwKLQkJCQljb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpLmdldENvbW1pdFRlbXBsYXRlQ29udGVudChyZXBvKSk7Ci0JfQotCiAJQFRlc3QoZXhwZWN0ZWQgPSBDb25maWdJbnZhbGlkRXhjZXB0aW9uLmNsYXNzKQogCXB1YmxpYyB2b2lkIHRlc3RDb21taXRUZW1wbGF0ZVdpdGhJbnZhbGlkRW5jb2RpbmcoKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKQEAgLTE1ODEsNyArMTU1OCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21taXRUZW1wbGF0ZVdpdGhJbnZhbGlkRW5jb2RpbmcoKQogCQlTdHJpbmcgdGVtcGxhdGVDb250ZW50ID0gImNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlIjsKIAkJSkdpdFRlc3RVdGlsLndyaXRlKHRlbXBGaWxlLCB0ZW1wbGF0ZUNvbnRlbnQpOwogCQljb25maWcgPSBwYXJzZSgiW2kxOG5dXG5cdGNvbW1pdEVuY29kaW5nID0gaW52YWxpZEVjb2RpbmdcbiIKLQkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyB0ZW1wRmlsZS5nZXRQYXRoKCkgKyAiXG4iKTsKKwkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkrIENvbmZpZy5lc2NhcGVWYWx1ZSh0ZW1wRmlsZS5nZXRQYXRoKCkpICsgIlxuIik7CiAJCWNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkuZ2V0Q29tbWl0VGVtcGxhdGVDb250ZW50KHJlcG8pOwogCX0KIApAQCAtMTU5NSw3ICsxNTczLDcgQEAgcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlV2l0aEludmFsaWRQYXRoKCkKIAkJU3RyaW5nIHRlbXBsYXRlQ29udGVudCA9ICJjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSI7CiAJCUpHaXRUZXN0VXRpbC53cml0ZSh0ZW1wRmlsZSwgdGVtcGxhdGVDb250ZW50KTsKIAkJLy8gY29tbWl0IG1lc3NhZ2UgZW5jb2RpbmcKLQkJU3RyaW5nIGV4cGVjdGVkVGVtcGxhdGVQYXRoID0gIi9ub25FeGlzdGluZ1RlbXBsYXRlIjsKKwkJU3RyaW5nIGV4cGVjdGVkVGVtcGxhdGVQYXRoID0gIn4vbm9uRXhpc3RpbmdUZW1wbGF0ZSI7CiAJCWNvbmZpZyA9IHBhcnNlKCJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyBleHBlY3RlZFRlbXBsYXRlUGF0aCArICJcbiIpOwogCQlTdHJpbmcgdGVtcGxhdGVQYXRoID0gY29uZmlnLmdldChDb21taXRDb25maWcuS0VZKQogCQkJCS5nZXRDb21taXRUZW1wbGF0ZVBhdGgoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YQppbmRleCBhZjhhNThmLi4wZmFmY2Q2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EaXJDYWNoZUNoZWNrb3V0VGVzdC5qYXZhCkBAIC0yLDcgKzIsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA3LCBEYXZlIFdhdHNvbiA8ZHdhdHNvbkBtaW12aXN0YS5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEsIFJvYmluIFJvc2VuYmVyZyA8cm9iaW4ucm9zZW5iZXJnQGRld2lyZS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjAgQ2hyaXN0aWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjIgQ2hyaXN0aWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yNDIsNiArMjQyLDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDaGVja291dCgpIHRocm93cyBFeGNlcHRpb24gewogCQlMaXN0ZW5lckhhbmRsZSBoYW5kbGUgPSBudWxsOwogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKIAkJCQlUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBkYl90ID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQloYW5kbGUgPSBkYi5nZXRMaXN0ZW5lckxpc3QoKQogCQkJCQkuYWRkV29ya2luZ1RyZWVNb2RpZmllZExpc3RlbmVyKHJlY29yZGVyKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwpAQCAtMjYxLDYgKzI2Miw3IEBAIHByaXZhdGUgdm9pZCBjaGVja291dExpbmVFbmRpbmdzKFN0cmluZyBpbkluZGV4LCBTdHJpbmcgZXhwZWN0ZWQsCiAJCQlTdHJpbmcgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOwogCQkJCVRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGRiX3QgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwogCQkJbWFzdGVyLmNvbW1pdCgpLmFkZCgiZiIsIGluSW5kZXgpLm1lc3NhZ2UoIm0wIikuY3JlYXRlKCk7CiAJCQlpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoYXR0cmlidXRlcykpIHsKQEAgLTMxMyw4ICszMTUsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRXaXRoTEYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0V2l0aExGQXV0bygpIHRocm93cyBFeGNlcHRpb24gewotCQljaGVja291dExpbmVFbmRpbmdzKCJmaXJzdCBsaW5lXG5zZWNvbmQgbGluZVxuIiwKLQkJCQkiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmVcbiIsICJmIHRleHQ9YXV0byIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSBTdHJpbmcuZm9ybWF0KCJmaXJzdCBsaW5lJW5zZWNvbmQgbGluZSVuIik7CisJCWNoZWNrb3V0TGluZUVuZGluZ3MoImZpcnN0IGxpbmVcbnNlY29uZCBsaW5lXG4iLCBleHBlY3RlZCwKKwkJCQkiZiB0ZXh0PWF1dG8iKTsKIAl9CiAKIAlAVGVzdApAQCAtMzI1LDkgKzMyOCw5IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVja291dFdpdGhMRkF1dG9Fb2xMZigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRXaXRoTEZBdXRvRW9sTmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBleHBlY3RlZCA9IFN0cmluZy5mb3JtYXQoImZpcnN0IGxpbmUlbnNlY29uZCBsaW5lJW4iKTsKIAkJY2hlY2tvdXRMaW5lRW5kaW5ncygKLQkJCQkiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmVcbiIsICJmaXJzdCBsaW5lXG5zZWNvbmQgbGluZVxuIgotCQkJCQkJLnJlcGxhY2VBbGwoIlxuIiwgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSksCisJCQkJImZpcnN0IGxpbmVcbnNlY29uZCBsaW5lXG4iLCBleHBlY3RlZCwKIAkJCQkiZiB0ZXh0PWF1dG8gZW9sPW5hdGl2ZSIpOwogCX0KIApAQCAtMjA2NCw2ICsyMDY3LDcgQEAgcHVibGljIHZvaWQgdGVzdFJlc2V0V2l0aENoYW5nZUluR2l0aWdub3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0V2l0aEVtcHR5SW5kZXhEb2VzbnRPdmVyd3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CiAJCQkJVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gZGJfdCA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJLy8gcHJlcGFyZSB0aGUgY29tbWl0cwogCQkJQnJhbmNoQnVpbGRlciBtYXN0ZXIgPSBkYl90LmJyYW5jaCgibWFzdGVyIik7CiAJCQlSZXZDb21taXQgbWVyZ2VDb21taXQgPSBtYXN0ZXIuY29tbWl0KCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVDAwMDFfUGVyc29uSWRlbnRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50VGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVDAwMDFfUGVyc29uSWRlbnRUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnRUZXN0LmphdmEKaW5kZXggZTliYWI3Yy4uOTdkYTE3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UMDAwMV9QZXJzb25JZGVudFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50VGVzdC5qYXZhCkBAIC0xMywxMiArMTMsMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudGltZS5ab25lSWQ7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLXB1YmxpYyBjbGFzcyBUMDAwMV9QZXJzb25JZGVudFRlc3QgeworcHVibGljIGNsYXNzIFBlcnNvbklkZW50VGVzdCB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDFfTmV3SWRlbnQoKSB7CkBAIC00Miw2ICs0NCwzNCBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAyX05ld0lkZW50KCkgewogCQkJCXAudG9FeHRlcm5hbFN0cmluZygpKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROZXdJZGVudEluc3RhbnQoKSB7CisJCVBlcnNvbklkZW50IHAgPSBuZXcgUGVyc29uSWRlbnQoIkEgVSBUaG9yIiwgImF1dGhvckBleGFtcGxlLmNvbSIsCisJCQkJSW5zdGFudC5vZkVwb2NoTWlsbGkoMTE0Mjg3ODUwMTAwMEwpLAorCQkJCVpvbmVJZC5vZigiQW1lcmljYS9OZXdfWW9yayIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJBIFUgVGhvciIsIHAuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhdXRob3JAZXhhbXBsZS5jb20iLCBwLmdldEVtYWlsQWRkcmVzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEluc3RhbnQub2ZFcG9jaE1pbGxpKDExNDI4Nzg1MDEwMDBMKSwKKwkJCQlwLmdldFdoZW5Bc0luc3RhbnQoKSk7CisJCWFzc2VydEVxdWFscygiQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4gMTE0Mjg3ODUwMSAtMDUwMCIsCisJCQkJcC50b0V4dGVybmFsU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoWm9uZUlkLm9mKCJHTVQtMDU6MDAiKSwgcC5nZXRab25lSWQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TmV3SWRlbnRJbnN0YW50MigpIHsKKwkJZmluYWwgUGVyc29uSWRlbnQgcCA9IG5ldyBQZXJzb25JZGVudCgiQSBVIFRob3IiLCAiYXV0aG9yQGV4YW1wbGUuY29tIiwKKwkJCQlJbnN0YW50Lm9mRXBvY2hNaWxsaSgxMTQyODc4NTAxMDAwTCksCisJCQkJWm9uZUlkLm9mKCJBc2lhL0tvbGthdGEiKSk7CisJCWFzc2VydEVxdWFscygiQSBVIFRob3IiLCBwLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYXV0aG9yQGV4YW1wbGUuY29tIiwgcC5nZXRFbWFpbEFkZHJlc3MoKSk7CisJCWFzc2VydEVxdWFscyhJbnN0YW50Lm9mRXBvY2hNaWxsaSgxMTQyODc4NTAxMDAwTCksCisJCQkJcC5nZXRXaGVuQXNJbnN0YW50KCkpOworCQlhc3NlcnRFcXVhbHMoIkEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+IDExNDI4Nzg1MDEgKzA1MzAiLAorCQkJCXAudG9FeHRlcm5hbFN0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKFpvbmVJZC5vZigiR01UKzA1OjMwIiksIHAuZ2V0Wm9uZUlkKCkpOworCX0KKwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQogCXB1YmxpYyB2b2lkIG51bGxGb3JOYW1lU2hvdWxkVGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlTWVzc2FnZUZvcm1hdHRlclRlc3QuamF2YQppbmRleCBkZWRiNTZjLi5hMjU3NmNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZU1lc3NhZ2VGb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkUmVmOwpAQCAtMTU3LDggKzE1OCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RJbnRvU3ltYm9saWNSZWZIZWFkUG9pbnRpbmdUb01hc3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNOb0Zvb3RlcigpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuIjsKIAkJU3RyaW5nIG1lc3NhZ2UgPSBmb3JtYXR0ZXIuZm9ybWF0V2l0aENvbmZsaWN0cyhvcmlnaW5hbE1lc3NhZ2UsCi0JCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAicGF0aDEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKCJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG5Db25mbGljdHM6XG5cdHBhdGgxXG4iLAorCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CisJCWFzc2VydEVxdWFscygiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcblxuIyBDb25mbGljdHM6XG4jXHRwYXRoMVxuIiwKIAkJCQltZXNzYWdlKTsKIAl9CiAKQEAgLTE2Niw4ICsxNjcsMTcgQEAgcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNOb0Zvb3RlcigpIHsKIAlwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0V2l0aENvbmZsaWN0c05vRm9vdGVyTm9MaW5lQnJlYWsoKSB7CiAJCVN0cmluZyBvcmlnaW5hbE1lc3NhZ2UgPSAiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHkiOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOwotCQlhc3NlcnRFcXVhbHMoIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbkNvbmZsaWN0czpcblx0cGF0aDFcbiIsCisJCQkJTGlzdC5vZigicGF0aDEiKSwgJyMnKTsKKwkJYXNzZXJ0RXF1YWxzKCJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG4jIENvbmZsaWN0czpcbiNcdHBhdGgxXG4iLAorCQkJCW1lc3NhZ2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNDdXN0b21DaGFyYWN0ZXIoKSB7CisJCVN0cmluZyBvcmlnaW5hbE1lc3NhZ2UgPSAiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHkiOworCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKKwkJCQlMaXN0Lm9mKCJwYXRoMSIpLCAnOycpOworCQlhc3NlcnRFcXVhbHMoIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbjsgQ29uZmxpY3RzOlxuO1x0cGF0aDFcbiIsCiAJCQkJbWVzc2FnZSk7CiAJfQogCkBAIC0xNzYsOSArMTg2LDkgQEAgcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNXaXRoRm9vdGVycygpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG5DaGFuZ2VJZDoiCiAJCQkJKyAiIEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOworCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CiAJCWFzc2VydEVxdWFscygKLQkJCQkiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcblxuQ29uZmxpY3RzOlxuXHRwYXRoMVxuXG4iCisJCQkJIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbiMgQ29uZmxpY3RzOlxuI1x0cGF0aDFcblxuIgogCQkJCQkJKyAiQ2hhbmdlSWQ6IEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iLAogCQkJCW1lc3NhZ2UpOwogCX0KQEAgLTE4OCw5ICsxOTgsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0V2l0aENvbmZsaWN0c1dpdGhGb290ZXJsaWtlTGluZUluQm9keSgpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuQnVnOjEyMzQ1Njdcbk1vcmUgQm9keVxuXG5DaGFuZ2VJZDoiCiAJCQkJKyAiIEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOworCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CiAJCWFzc2VydEVxdWFscygKLQkJCQkiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcbkJ1ZzoxMjM0NTY3XG5Nb3JlIEJvZHlcblxuQ29uZmxpY3RzOlxuXHRwYXRoMVxuXG4iCisJCQkJIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5CdWc6MTIzNDU2N1xuTW9yZSBCb2R5XG5cbiMgQ29uZmxpY3RzOlxuI1x0cGF0aDFcblxuIgogCQkJCQkJKyAiQ2hhbmdlSWQ6IEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iLAogCQkJCW1lc3NhZ2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyVGVzdC5qYXZhCmluZGV4IGRkODU3M2QuLmNiYWNhZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQpAQCAtMTgxMCw2ICsxODEwLDcgQEAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpY2F0aW9uVGltZVN0YW1wT3JkZXIoU3RyaW5nLi4uIHBhdGhlcykgewogCXByaXZhdGUgU3RyaW5nIHJlYWRCbG9iKE9iamVjdElkIHRyZWVpc2gsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTw/PiB0ciA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKTsKIAkJCQlSZXZXYWxrIHJ3ID0gdHIuZ2V0UmV2V2FsaygpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZUcmVlIHRyZWUgPSBydy5wYXJzZVRyZWUodHJlZWlzaCk7CiAJCQlSZXZPYmplY3Qgb2JqID0gdHIuZ2V0KHRyZWUsIHBhdGgpOwogCQkJaWYgKG9iaiA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCmluZGV4IDdmMGJmZWYuLmI5NjRlOTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247CkBAIC0yNzYsNyArMjc3LDggQEAgcHVibGljIHZvaWQgdGVzdFNhdmVkQ29uZmlnRmlsZVNob3VsZE5vdFJlYWRVc2VyR2l0Q29uZmlnKCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUF0b21pY0Jvb2xlYW4gdXNlckNvbmZpZ1RpbWVSZWFkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogCi0JCVBhdGggdXNlckNvbmZpZ0ZpbGUgPSBjcmVhdGVGaWxlKENPTlRFTlQxLmdldEJ5dGVzKCksICJob21lIik7CisJCVBhdGggdXNlckNvbmZpZ0ZpbGUgPSBjcmVhdGVGaWxlKAorCQkJCUNPTlRFTlQxLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpLCAiaG9tZSIpOwogCQltb2NrU3lzdGVtUmVhZGVyLnNldFVzZXJHaXRDb25maWcoCiAJCQkJbmV3IEZpbGVCYXNlZENvbmZpZyh1c2VyQ29uZmlnRmlsZS50b0ZpbGUoKSwgRlMuREVURUNURUQpIHsKIApAQCAtMjg5LDcgKzI5MSw4IEBAIHB1YmxpYyBsb25nIGdldFRpbWVVbml0KFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwKIAkJCQkJfQogCQkJCX0pOwogCi0JCVBhdGggZmlsZSA9IGNyZWF0ZUZpbGUoQ09OVEVOVDIuZ2V0Qnl0ZXMoKSwgInJlcG8iKTsKKwkJUGF0aCBmaWxlID0gY3JlYXRlRmlsZShDT05URU5UMi5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSwKKwkJCQkicmVwbyIpOwogCQlGaWxlQmFzZWRDb25maWcgZmlsZUJhc2VkQ29uZmlnID0gbmV3IEZpbGVCYXNlZENvbmZpZyhmaWxlLnRvRmlsZSgpLAogCQkJCUZTLkRFVEVDVEVEKTsKIAkJZmlsZUJhc2VkQ29uZmlnLnNhdmUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsa1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsa1Rlc3QuamF2YQppbmRleCBlYTk5NGYwLi5mNDQ2ZDA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGtUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVXYWxrVGVzdC5qYXZhCkBAIC0yMTcsNyArMjE3LDYgQEAgcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCQlhc3NlcnRFcXVhbHNGaWxlKG1vZHVsZXNHaXREaXIsIHN1YlJlcG8uZ2V0RGlyZWN0b3J5KCkpOwogCQkJCWFzc2VydEVxdWFsc0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgcGF0aCksCiAJCQkJCQlzdWJSZXBvLmdldFdvcmtUcmVlKCkpOwotCQkJCXN1YlJlcG8uY2xvc2UoKTsKIAkJCQlhc3NlcnRGYWxzZShnZW4ubmV4dCgpKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0Nvbm5lY3Rpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvblRlc3QuamF2YQppbmRleCA3ZDQzOGMxLi41MDVmMzM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvblRlc3QuamF2YQpAQCAtMTUsMTEgKzE1LDE1IEBACiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOwogCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZFJlZjsKQEAgLTMwLDYgKzM0LDE2IEBACiBwdWJsaWMgY2xhc3MgQmFzZVBhY2tDb25uZWN0aW9uVGVzdCB7CiAKIAlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWFkQWR2ZXJ0aXNlZFJlZnNTaG91bGRUaHJvd0V4Y2VwdGlvbldpdGhPcmlnaW5hbENhdXNlKCkgeworCQl0cnkgKEZhaWxpbmdCYXNlUGFja0Nvbm5lY3Rpb24gYmFzZVBhY2tDb25uZWN0aW9uID0KKwkJCQluZXcgRmFpbGluZ0Jhc2VQYWNrQ29ubmVjdGlvbigpKSB7CisJCQlFeGNlcHRpb24gcmVzdWx0ID0gYXNzZXJ0VGhyb3dzKE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJYmFzZVBhY2tDb25uZWN0aW9uOjpyZWFkQWR2ZXJ0aXNlZFJlZnMpOworCQkJYXNzZXJ0RXF1YWxzKEVPRkV4Y2VwdGlvbi5jbGFzcywgcmVzdWx0LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisJCX0KKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVXaXRoU3ltUmVmc0FkZHMoKSB7CiAJCWZpbmFsIFJlZiBtYWluUmVmID0gbmV3IE9iamVjdElkUmVmLlVucGVlbGVkKFJlZi5TdG9yYWdlLkxPT1NFLAogCQkJCSJyZWZzL2hlYWRzL21haW4iLCBPYmplY3RJZC5mcm9tU3RyaW5nKApAQCAtMjQ0LDQgKzI1OCwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlV2l0aFN5bVJlZnNGaWxsSW5IZWFkKCkgewogCQlhc3NlcnRFcXVhbHMob2lkTmFtZSwgaGVhZFJlZi5nZXRPYmplY3RJZCgpLm5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhvaWROYW1lLCBtYWluUmVmLmdldE9iamVjdElkKCkubmFtZSgpKTsKIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFpbGluZ0Jhc2VQYWNrQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrQ29ubmVjdGlvbiB7CisJCUZhaWxpbmdCYXNlUGFja0Nvbm5lY3Rpb24oKSB7CisJCQlzdXBlcihuZXcgVHJhbnNwb3J0TG9jYWwobmV3IFVSSWlzaCgpLAorCQkJCQluZXcgamF2YS5pby5GaWxlKCIiKSkpOworCQkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOGM1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrUHVzaENvbm5lY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAyMiBEYXJpdXMgSm9raWxlaHRvIDxkYXJpdXMuam9raWxlaHRvK29zQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAyMiBBbnRvbmlvIEJhcm9uZSA8c3ludG9ueXplQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW5kc1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNJdGVtOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaW5zdGFuY2VPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitwdWJsaWMgY2xhc3MgQmFzZVBhY2tQdXNoQ29ubmVjdGlvblRlc3QgeworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5vUmVtb3RlUmVwb3NpdG9yeSgpIHsKKwkJTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uIG9wZW5GZXRjaEV4Y2VwdGlvbiA9CisgICAgICAgICAgICAgICAgbmV3IE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbiggbmV3IFVSSWlzaCgpLCAibm90IGZvdW5kIik7CisJCUlPRXhjZXB0aW9uIGlvRXhjZXB0aW9uID0gbmV3IElPRXhjZXB0aW9uKCJub3QgcmVhZCIpOworCisJCXRyeSAoRmFpbGluZ0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24gZmJwcGMgPQorCQkJCW5ldyBGYWlsaW5nQmFzZVBhY2tQdXNoQ29ubmVjdGlvbihvcGVuRmV0Y2hFeGNlcHRpb24pKSB7CisJCQlUcmFuc3BvcnRFeGNlcHRpb24gcmVzdWx0ID0gZmJwcGMubm9SZXBvc2l0b3J5KGlvRXhjZXB0aW9uKTsKKworCQkJYXNzZXJ0RXF1YWxzKG9wZW5GZXRjaEV4Y2VwdGlvbiwgcmVzdWx0KTsKKwkJCWFzc2VydFRoYXQoQXJyYXlzLmFzTGlzdChyZXN1bHQuZ2V0U3VwcHJlc3NlZCgpKSwKKwkJCQkJaGFzSXRlbShpb0V4Y2VwdGlvbikpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaE5vdFBlcm1pdHRlZCgpIHsKKwkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goKTsKKwkJVHJhbnNwb3J0RXhjZXB0aW9uIG9wZW5GZXRjaEV4Y2VwdGlvbiA9IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odXJpLAorCQkJCSJhIHRyYW5zcG9ydCBleGNlcHRpb24iKTsKKwkJSU9FeGNlcHRpb24gaW9FeGNlcHRpb24gPSBuZXcgSU9FeGNlcHRpb24oIm5vdCByZWFkIik7CisKKwkJdHJ5IChGYWlsaW5nQmFzZVBhY2tQdXNoQ29ubmVjdGlvbiBmYnBwYyA9CisJCQkJbmV3IEZhaWxpbmdCYXNlUGFja1B1c2hDb25uZWN0aW9uKG9wZW5GZXRjaEV4Y2VwdGlvbikpIHsKKwkJCVRyYW5zcG9ydEV4Y2VwdGlvbiByZXN1bHQgPSBmYnBwYy5ub1JlcG9zaXRvcnkoaW9FeGNlcHRpb24pOworCisJCQlhc3NlcnRFcXVhbHMoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzLCByZXN1bHQuZ2V0Q2xhc3MoKSk7CisJCQlhc3NlcnRUaGF0KHJlc3VsdC5nZXRNZXNzYWdlKCksCisJCQkJCWVuZHNXaXRoKEpHaXRUZXh0LmdldCgpLnB1c2hOb3RQZXJtaXR0ZWQpKTsKKwkJCWFzc2VydEVxdWFscyhvcGVuRmV0Y2hFeGNlcHRpb24sIHJlc3VsdC5nZXRDYXVzZSgpKTsKKwkJCWFzc2VydFRoYXQoQXJyYXlzLmFzTGlzdChyZXN1bHQuZ2V0U3VwcHJlc3NlZCgpKSwKKwkJCQkJaGFzSXRlbShpb0V4Y2VwdGlvbikpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVhZEFkdmVydGlzZWRSZWZQcm9wYWdhdGVzQ2F1c2VBbmRTdXBwcmVzc2VkRXhjZXB0aW9ucygpIHsKKwkJSU9FeGNlcHRpb24gaW9FeGNlcHRpb24gPSBuZXcgSU9FeGNlcHRpb24oIm5vdCByZWFkIik7CisJCXRyeSAoRmFpbGluZ0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24gYmFzZVBhY2tDb25uZWN0aW9uID0KKwkJCQluZXcgRmFpbGluZ0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24oCisJCQkJCQluZXcgTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uKAorCQkJCQkJCQluZXcgVVJJaXNoKCksICJub3QgZm91bmQiLCBpb0V4Y2VwdGlvbikpKSB7CisJCQlFeGNlcHRpb24gcmVzdWx0ID0gYXNzZXJ0VGhyb3dzKE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJYmFzZVBhY2tDb25uZWN0aW9uOjpyZWFkQWR2ZXJ0aXNlZFJlZnMpOworCQkJYXNzZXJ0RXF1YWxzKGlvRXhjZXB0aW9uLCByZXN1bHQuZ2V0Q2F1c2UoKSk7CisJCQlhc3NlcnRUaGF0KEFycmF5cy5hc0xpc3QocmVzdWx0LmdldFN1cHByZXNzZWQoKSksCisJCQkJCWhhc0l0ZW0oaW5zdGFuY2VPZihFT0ZFeGNlcHRpb24uY2xhc3MpKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWlsaW5nQmFzZVBhY2tQdXNoQ29ubmVjdGlvbgorCQkJZXh0ZW5kcyBCYXNlUGFja1B1c2hDb25uZWN0aW9uIHsKKwkJRmFpbGluZ0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24oVHJhbnNwb3J0RXhjZXB0aW9uIG9wZW5GZXRjaEV4Y2VwdGlvbikgeworCQkJc3VwZXIobmV3IFRyYW5zcG9ydExvY2FsKG5ldyBVUklpc2goKSwKKwkJCQkJbmV3IGphdmEuaW8uRmlsZSgiIikpIHsKKwkJCQlAT3ZlcnJpZGUgcHVibGljIEZldGNoQ29ubmVjdGlvbiBvcGVuRmV0Y2goKQorCQkJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJCQkJCXRocm93IG9wZW5GZXRjaEV4Y2VwdGlvbjsKKwkJCQl9CisJCQl9KTsKKwkJCXBja0luID0gbmV3IFBhY2tldExpbmVJbihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKaW5kZXggMDU0ZWI5Yy4uYmI2MmEwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKQEAgLTgwLDYgKzgwLDcgQEAgcHVibGljIHZvaWQgdGVzdFdyaXRlU2luZ2xlUmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRoZW4gd2UgY2xvbmUgYSBuZXcgcmVwbyBmcm9tIHRoYXQgYnVuZGxlIGFuZCBkbyBhIHNpbXBsZSB0ZXN0LiBUaGlzCiAJCS8vIG1ha2VzIHN1cmUgd2UgY291bGQgcmVhZCB0aGUgYnVuZGxlIHdlIGNyZWF0ZWQuCiAJCVJlcG9zaXRvcnkgbmV3UmVwbyA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKG5ld1JlcG8pOwogCQlGZXRjaFJlc3VsdCBmZXRjaFJlc3VsdCA9IGZldGNoRnJvbUJ1bmRsZShuZXdSZXBvLCBidW5kbGUpOwogCQlSZWYgYWR2ZXJ0aXNlZFJlZiA9IGZldGNoUmVzdWx0CiAJCQkJLmdldEFkdmVydGlzZWRSZWYoInJlZnMvaGVhZHMvZmlyc3Rjb21taXQiKTsKQEAgLTExNiw2ICsxMTcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50YWxCdW5kbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gbWFrZXMgc3VyZQogCQkvLyB3ZSBjb3VsZCByZWFkIHRoZSBidW5kbGUgd2UgY3JlYXRlZC4KIAkJUmVwb3NpdG9yeSBuZXdSZXBvID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UobmV3UmVwbyk7CiAJCUZldGNoUmVzdWx0IGZldGNoUmVzdWx0ID0gZmV0Y2hGcm9tQnVuZGxlKG5ld1JlcG8sIGJ1bmRsZSk7CiAJCVJlZiBhZHZlcnRpc2VkUmVmID0gZmV0Y2hSZXN1bHQuZ2V0QWR2ZXJ0aXNlZFJlZigicmVmcy9oZWFkcy9hYSIpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEKaW5kZXggNjBiODA5OC4uOTNiZWRiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YQpAQCAtMTEwLDYgKzExMCw3IEBAIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdFRpbnlUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0xMzIsNiArMTMzLDcgQEAgcHVibGljIHZvaWQgdGVzdFRpbnlUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aER1cGxpY2F0ZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGRhdGEgPSBDb25zdGFudHMuZW5jb2RlKCIwMTIzNDU2Nzg5YWJjZGVmZyIpOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWFzc2VydFRydWUoZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5oYXMoZC5ibG9iKGRhdGEpKSk7CiAJCX0KIApAQCAtMTUxLDYgKzE1Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aER1cGxpY2F0ZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0UGFja1dpdGhUcmFpbGluZ0dhcmJhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmV2QmxvYiBhOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlhID0gZC5ibG9iKCJhIik7CiAJCX0KIApAQCAtMTgwLDYgKzE4Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aFRyYWlsaW5nR2FyYmFnZSgpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRnVsbEJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGRhdGEgPSBDb25zdGFudHMuZW5jb2RlKCIwMTIzNDU2Nzg5Iik7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWQuYmxvYihkYXRhKTsKIAkJfQogCkBAIC0yMTMsNiArMjE3LDcgQEAgcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVGdWxsQmxvYigpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRGVsdGFCbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0yNDYsNiArMjUxLDcgQEAgcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVEZWx0YUJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVEZWx0YVJlc3VsdFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmV2QmxvYiBhOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlhID0gZC5ibG9iKCIwMTIzNDU2Nzg5Iik7CiAJCX0KIApAQCAtMjc4LDYgKzI4NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRGVsdGFSZXN1bHRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE5vbk1hcmtpbmdJbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0zMTgsNiArMzI1LDcgQEAgcHVibGljIHZvaWQgbWFyayhpbnQgbWF4bGVuZ3RoKSB7CiAJcHVibGljIHZvaWQgdGVzdERhdGFBZnRlclBhY2tGb290ZXJTaW5nbGVSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJldkJsb2IgYTsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeSBkID0gbmV3IFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJYSA9IGQuYmxvYigiYSIpOwogCQl9CiAKQEAgLTM3OSw2ICszODcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGF0YUFmdGVyUGFja0Zvb3RlclNwbGl0SGVhZGVyUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gZGF0YSA9IENvbnN0YW50cy5lbmNvZGUoImEiKTsKIAkJUmV2QmxvYiBiOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQliID0gZC5ibG9iKGRhdGEpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZ1Rlc3QuamF2YQppbmRleCA2MTA5ZDZjLi5jYmMxZDU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNywgRGF2aWQgUHVyc2Vob3VzZSA8ZGF2aWQucHVyc2Vob3VzZUBnbWFpbC5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMiBEYXZpZCBQdXJzZWhvdXNlIDxkYXZpZC5wdXJzZWhvdXNlQGdtYWlsLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTAgKzE0LDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnLlB1c2hEZWZhdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWcuUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFB1c2hDb25maWdUZXN0IHsKKwogCUBUZXN0CiAJcHVibGljIHZvaWQgcHVzaFJlY3Vyc2VTdWJtb2R1bGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRUcnVlKFB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUuQ0hFQ0subWF0Y2hDb25maWdWYWx1ZSgiY2hlY2siKSk7CkBAIC01Miw0ICs1NSw1OSBAQCBwdWJsaWMgdm9pZCBwdXNoUmVjdXJzZVN1Ym1vZHVsZVRvQ29uZmlnVmFsdWUoKSB7CiAJCWFzc2VydEVxdWFscygiY2hlY2siLCBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlLkNIRUNLLnRvQ29uZmlnVmFsdWUoKSk7CiAJCWFzc2VydEVxdWFscygiZmFsc2UiLCBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlLk5PLnRvQ29uZmlnVmFsdWUoKSk7CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXNoRGVmYXVsdE1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuTk9USElORy5tYXRjaENvbmZpZ1ZhbHVlKCJub3RoaW5nIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0Lk5PVEhJTkcubWF0Y2hDb25maWdWYWx1ZSgiTk9USElORyIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5DVVJSRU5ULm1hdGNoQ29uZmlnVmFsdWUoImN1cnJlbnQiKSk7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuQ1VSUkVOVC5tYXRjaENvbmZpZ1ZhbHVlKCJDVVJSRU5UIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoInVwc3RyZWFtIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoIlVQU1RSRUFNIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoInRyYWNraW5nIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoIlRSQUNLSU5HIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlNJTVBMRS5tYXRjaENvbmZpZ1ZhbHVlKCJzaW1wbGUiKSk7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuU0lNUExFLm1hdGNoQ29uZmlnVmFsdWUoIlNJTVBMRSIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5NQVRDSElORy5tYXRjaENvbmZpZ1ZhbHVlKCJtYXRjaGluZyIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5NQVRDSElORy5tYXRjaENvbmZpZ1ZhbHVlKCJNQVRDSElORyIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1c2hEZWZhdWx0Tm9NYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRGYWxzZShQdXNoRGVmYXVsdC5OT1RISU5HLm1hdGNoQ29uZmlnVmFsdWUoIm4iKSk7CisJCWFzc2VydEZhbHNlKFB1c2hEZWZhdWx0LkNVUlJFTlQubWF0Y2hDb25maWdWYWx1ZSgiIikpOworCQlhc3NlcnRGYWxzZShQdXNoRGVmYXVsdC5VUFNUUkVBTS5tYXRjaENvbmZpZ1ZhbHVlKCJ0cmFjayIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1c2hEZWZhdWx0VG9Db25maWdWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmciLCBQdXNoRGVmYXVsdC5OT1RISU5HLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY3VycmVudCIsIFB1c2hEZWZhdWx0LkNVUlJFTlQudG9Db25maWdWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ1cHN0cmVhbSIsIFB1c2hEZWZhdWx0LlVQU1RSRUFNLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygic2ltcGxlIiwgUHVzaERlZmF1bHQuU0lNUExFLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygibWF0Y2hpbmciLCBQdXNoRGVmYXVsdC5NQVRDSElORy50b0NvbmZpZ1ZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEVtcHR5Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1c2hDb25maWcgY2ZnID0gcGFyc2UoIiIpOworCQlhc3NlcnRFcXVhbHMoUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5OTywgY2ZnLmdldFJlY3Vyc2VTdWJtb2R1bGVzKCkpOworCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuU0lNUExFLCBjZmcuZ2V0UHVzaERlZmF1bHQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1c2hDb25maWcgY2ZnID0gcGFyc2UoCisJCQkJIltwdXNoXVxuXHRkZWZhdWx0ID0gdHJhY2tpbmdcblx0cmVjdXJzZVN1Ym1vZHVsZXMgPSBvbi1kZW1hbmRcbiIpOworCQlhc3NlcnRFcXVhbHMoUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5PTl9ERU1BTkQsCisJCQkJY2ZnLmdldFJlY3Vyc2VTdWJtb2R1bGVzKCkpOworCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuVVBTVFJFQU0sIGNmZy5nZXRQdXNoRGVmYXVsdCgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBQdXNoQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGMgPSBuZXcgQ29uZmlnKCk7CisJCWMuZnJvbVRleHQoY29udGVudCk7CisJCXJldHVybiBjLmdldChQdXNoQ29uZmlnOjpuZXcpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEKaW5kZXggNjkyODg1OS4uMmU4YjMwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhCkBAIC0xNCwxNCArMTQsMTkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaG9va3MuUHJlUHVzaEhvb2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWRSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwpAQCAtMzEsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlRleHRQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50ZXN0LnJlc291cmNlcy5TYW1wbGVEYXRhUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlbW90ZVJlZlVwZGF0ZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtMjIwLDcgKzIyNiwxNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5leHBlY3RlZFJlbW90ZVZzRm9yY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkJLmZyb21TdHJpbmcoIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiKSk7CiAJCWZpbmFsIFJlZiByZWYgPSBuZXcgT2JqZWN0SWRSZWYuVW5wZWVsZWQoUmVmLlN0b3JhZ2UuTE9PU0UsICJyZWZzL2hlYWRzL21hc3RlciIsCiAJCQkJT2JqZWN0SWQuZnJvbVN0cmluZygiYWM3ZTdlNDRjMTg4NWVmYjQ3MmFkNTRhNzgzMjdkNjZiZmM0ZWNlZiIpKTsKLQkJdGVzdE9uZVVwZGF0ZVN0YXR1cyhycnUsIHJlZiwgU3RhdHVzLlJFSkVDVEVEX1JFTU9URV9DSEFOR0VELCBudWxsKTsKKwkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKGJ5dGVzLCB0cnVlLAorCQkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQkJUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKSB7CisJCQlNb2NrUHJlUHVzaEhvb2sgaG9vayA9IG5ldyBNb2NrUHJlUHVzaEhvb2soZGIsIG91dCwgZXJyKTsKKwkJCXRlc3RPbmVVcGRhdGVTdGF0dXMocnJ1LCByZWYsIFN0YXR1cy5SRUpFQ1RFRF9SRU1PVEVfQ0hBTkdFRCwgbnVsbCwKKwkJCQkJaG9vayk7CisJCQlvdXQuZmx1c2goKTsKKwkJCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwkJCWFzc2VydEVxdWFscygiIiwgcmVzdWx0KTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMjU2LDEwICsyNzIsMjIgQEAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1peGVkQ2FzZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZWZVcGRhdGVzLmFkZChycnVPayk7CiAJCXJlZlVwZGF0ZXMuYWRkKHJydVJlamVjdCk7CiAJCWFkdmVydGlzZWRSZWZzLmFkZChyZWZUb0NoYW5nZSk7Ci0JCWV4ZWN1dGVQdXNoKCk7Ci0JCWFzc2VydEVxdWFscyhTdGF0dXMuT0ssIHJydU9rLmdldFN0YXR1cygpKTsKLQkJYXNzZXJ0VHJ1ZShycnVPay5pc0Zhc3RGb3J3YXJkKCkpOwotCQlhc3NlcnRFcXVhbHMoU3RhdHVzLk5PTl9FWElTVElORywgcnJ1UmVqZWN0LmdldFN0YXR1cygpKTsKKwkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKGJ5dGVzLCB0cnVlLAorCQkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQkJUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKSB7CisJCQlNb2NrUHJlUHVzaEhvb2sgaG9vayA9IG5ldyBNb2NrUHJlUHVzaEhvb2soZGIsIG91dCwgZXJyKTsKKwkJCWV4ZWN1dGVQdXNoKGhvb2spOworCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSywgcnJ1T2suZ2V0U3RhdHVzKCkpOworCQkJYXNzZXJ0VHJ1ZShycnVPay5pc0Zhc3RGb3J3YXJkKCkpOworCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5OT05fRVhJU1RJTkcsIHJydVJlamVjdC5nZXRTdGF0dXMoKSk7CisJCQlvdXQuZmx1c2goKTsKKwkJCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIm51bGwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAiCisJCQkJCQkJKyAicmVmcy9oZWFkcy9tYXN0ZXIgMmMzNDkzMzViN2Y3OTcwNzJjZjcyOWM0ZjNiYjA5MTRlY2I2ZGVjOVxuIiwKKwkJCQkJcmVzdWx0KTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMzQ2LDEwICszNzQsMTggQEAgcHJpdmF0ZSBQdXNoUmVzdWx0IHRlc3RPbmVVcGRhdGVTdGF0dXMoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSwKIAkJCWZpbmFsIFJlZiBhZHZlcnRpc2VkUmVmLCBmaW5hbCBTdGF0dXMgZXhwZWN0ZWRTdGF0dXMsCiAJCQlCb29sZWFuIGZhc3RGb3J3YXJkKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLAogCQkJVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRlc3RPbmVVcGRhdGVTdGF0dXMocnJ1LCBhZHZlcnRpc2VkUmVmLCBleHBlY3RlZFN0YXR1cywKKwkJCQlmYXN0Rm9yd2FyZCwgbnVsbCk7CisJfQorCisJcHJpdmF0ZSBQdXNoUmVzdWx0IHRlc3RPbmVVcGRhdGVTdGF0dXMoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSwKKwkJCWZpbmFsIFJlZiBhZHZlcnRpc2VkUmVmLCBmaW5hbCBTdGF0dXMgZXhwZWN0ZWRTdGF0dXMsCisJCQlCb29sZWFuIGZhc3RGb3J3YXJkLCBQcmVQdXNoSG9vayBob29rKQorCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJcmVmVXBkYXRlcy5hZGQocnJ1KTsKIAkJaWYgKGFkdmVydGlzZWRSZWYgIT0gbnVsbCkKIAkJCWFkdmVydGlzZWRSZWZzLmFkZChhZHZlcnRpc2VkUmVmKTsKLQkJZmluYWwgUHVzaFJlc3VsdCByZXN1bHQgPSBleGVjdXRlUHVzaCgpOworCQlmaW5hbCBQdXNoUmVzdWx0IHJlc3VsdCA9IGV4ZWN1dGVQdXNoKGhvb2spOwogCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGF0dXMsIHJydS5nZXRTdGF0dXMoKSk7CiAJCWlmIChmYXN0Rm9yd2FyZCAhPSBudWxsKQogCQkJYXNzZXJ0RXF1YWxzKGZhc3RGb3J3YXJkLCBCb29sZWFuLnZhbHVlT2YocnJ1LmlzRmFzdEZvcndhcmQoKSkpOwpAQCAtMzU4LDcgKzM5NCwxMiBAQCBwcml2YXRlIFB1c2hSZXN1bHQgdGVzdE9uZVVwZGF0ZVN0YXR1cyhmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1LAogCiAJcHJpdmF0ZSBQdXNoUmVzdWx0IGV4ZWN1dGVQdXNoKCkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwKIAkJCVRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCXByb2Nlc3MgPSBuZXcgUHVzaFByb2Nlc3ModHJhbnNwb3J0LCByZWZVcGRhdGVzKTsKKwkJcmV0dXJuIGV4ZWN1dGVQdXNoKG51bGwpOworCX0KKworCXByaXZhdGUgUHVzaFJlc3VsdCBleGVjdXRlUHVzaChQcmVQdXNoSG9vayBob29rKQorCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJcHJvY2VzcyA9IG5ldyBQdXNoUHJvY2Vzcyh0cmFuc3BvcnQsIHJlZlVwZGF0ZXMsIGhvb2spOwogCQlyZXR1cm4gcHJvY2Vzcy5leGVjdXRlKG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKCkpOwogCX0KIApAQCAtNDE2LDQgKzQ1NywyMCBAQCBwdWJsaWMgdm9pZCBwdXNoKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQkJfQogCQl9CiAJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja1ByZVB1c2hIb29rIGV4dGVuZHMgUHJlUHVzaEhvb2sgeworCisJCXByaXZhdGUgZmluYWwgUHJpbnRTdHJlYW0gb3V0cHV0OworCisJCXB1YmxpYyBNb2NrUHJlUHVzaEhvb2soUmVwb3NpdG9yeSByZXBvLCBQcmludFN0cmVhbSBvdXQsCisJCQkJUHJpbnRTdHJlYW0gZXJyKSB7CisJCQlzdXBlcihyZXBvLCBvdXQsIGVycik7CisJCQlvdXRwdXQgPSBvdXQ7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZG9SdW4oKSB0aHJvd3MgQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQkJb3V0cHV0LnByaW50KGdldFN0ZGluQXJncygpKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YQppbmRleCBkMWU1NDQ2Li5hOTFiYzk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhCkBAIC03MywxMSArNzMsMTQgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc2V0VXAoKTsKIAogCQlzcmMgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShzcmMpOwogCQlkc3QgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShkc3QpOwogCiAJCS8vIEZpbGwgZHN0IHdpdGggYSBzb21lIGNvbW1vbiBoaXN0b3J5LgogCQkvLwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8Pihkc3QpKSB7CisJCQlkc3QuaW5jcmVtZW50T3BlbigpOwogCQkJYSA9IGQuYmxvYigiYSIpOwogCQkJQSA9IGQuY29tbWl0KGQudHJlZShkLmZpbGUoImEiLCBhKSkpOwogCQkJQiA9IGQuY29tbWl0KCkucGFyZW50KEEpLmNyZWF0ZSgpOwpAQCAtMTA2LDkgKzEwOSw2IEBAIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJIaWRlc1ByaXZhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQogCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgSGlkZVByaXZhdGVIb29rKCkpOwogCQkJCXJldHVybiBycDsKQEAgLTEzNiw4ICsxMzYsNiBAQCBwdWJsaWMgdm9pZCByZXNldHNIYXZlcygpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWRzdC5nZXREaXJlY3RvcnkoKSkgewogCQkJQE92ZXJyaWRlCiAJCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGRiKSB7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCVJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgQWR2ZXJ0aXNlUmVmc0hvb2soKSB7CiAJCQkJCUBPdmVycmlkZQpAQCAtMTczLDkgKzE3MSw2IEBAIHByaXZhdGUgVHJhbnNwb3J0TG9jYWwgbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpCiAJCXJldHVybiBuZXcgVHJhbnNwb3J0TG9jYWwoc3JjLCB1cmlPZihkc3QpLCBkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQogCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRDaGVja1JlY2VpdmVkT2JqZWN0cyh0cnVlKTsKIAkJCQlycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKHRydWUpOwpAQCAtMjExLDYgKzIwNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIE5vdyB1c2UgYiBidXQgaW4gYSBkaWZmZXJlbnQgY29tbWl0IHRoYW4gd2hhdCBpcyBoaWRkZW4uCiAJCS8vCiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gcyA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KHNyYykpIHsKKwkJCXNyYy5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZDb21taXQgTiA9IHMuY29tbWl0KCkucGFyZW50KEIpLmFkZCgicSIsIGIpLmNyZWF0ZSgpOwogCQkJcy51cGRhdGUoUl9NQVNURVIsIE4pOwogCkBAIC0yMjgsNyArMjI0LDYgQEAgcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCXRyeSAoVHJhbnNwb3J0TG9jYWwgdCA9IG5ld1RyYW5zcG9ydExvY2FsV2l0aFN0cmljdFZhbGlkYXRpb24oKSkgewogCQkJCXQuc2V0UHVzaFRoaW4odHJ1ZSk7CiAJCQkJciA9IHQucHVzaChQTSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHUpKTsKLQkJCQlkc3QuY2xvc2UoKTsKIAkJCX0KIAogCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSByZXN1bHQiLCByKTsKQEAgLTI5MCw2ICsyODUsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHJlY2VpdmUoZmluYWwgUmVjZWl2ZVBhY2sgcnAsCiAJcHVibGljIHZvaWQgdGVzdFVzaW5nSGlkZGVuRGVsdGFCYXNlRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYnl0ZVtdIGRlbHRhID0geyAweDEsIDB4MSwgMHgxLCAnYycgfTsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikKIAkJCQkJLmFkZCgicSIsCiAJCQkJCQkJcy5ibG9iKEJpbmFyeURlbHRhLmFwcGx5KApAQCAtMzQ4LDYgKzM0NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RVc2luZ0hpZGRlbkNvbW1vbkJsb2JGYWlscygpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBUcnkgdG8gdXNlIHRoZSAnYicgYmxvYiB0aGF0IGlzIGhpZGRlbi4KIAkJLy8KIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgcy5ibG9iKCJiIikpLmNyZWF0ZSgpOwogCiAJCQkvLyBCdXQgZG9uJ3QgaW5jbHVkZSBpdCBpbiB0aGUgcGFjay4KQEAgLTQwMSw2ICszOTgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdVbmtub3duQmxvYkZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRyeSB0byB1c2UgdGhlICduJyBibG9iIHRoYXQgaXMgbm90IG9uIHRoZSBzZXJ2ZXIuCiAJCS8vCiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gcyA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KHNyYykpIHsKKwkJCXNyYy5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZCbG9iIG4gPSBzLmJsb2IoIm4iKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgbikuY3JlYXRlKCk7CiAKQEAgLTQ5MSw2ICs0ODksNyBAQCBwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHNldHVwU291cmNlUmVwb0ludmFsaWRHaXRtb2R1bGVzKCkKIAkJCQkudG9TdHJpbmcoKTsKIAogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IHMgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihzcmMpKSB7CisJCQlzcmMuaW5jcmVtZW50T3BlbigpOwogCQkJUmV2QmxvYiBibG9iID0gcy5ibG9iKGZha2VHaXRtb2R1bGVzKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCIuZ2l0bW9kdWxlcyIsIGJsb2IpCiAJCQkJCS5jcmVhdGUoKTsKQEAgLTUxNyw2ICs1MTYsNyBAQCBwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHNldHVwU291cmNlUmVwb0ludmFsaWRHaXRtb2R1bGVzKCkKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RVc2luZ1Vua25vd25UcmVlRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgcy5ibG9iKCJhIikpLmNyZWF0ZSgpOwogCQkJUmV2VHJlZSB0ID0gcy5wYXJzZUJvZHkoTikuZ2V0VHJlZSgpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWNUZXN0LmphdmEKaW5kZXggNTU2OWJjYS4uZWYwODE3YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlY1Rlc3QuamF2YQpAQCAtNDQzLDYgKzQ0MywyNiBAQCBwdWJsaWMgdm9pZCBpbnZhbGlkU2V0RGVzdGluYXRpb24oKSB7CiAJCWEuc2V0RGVzdGluYXRpb24oInJlZnMvcmVtb3Rlcy9vcmlnaW4vKi8qIik7CiAJfQogCisJQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgaW52YWxpZE5lZ2F0aXZlQW5kRm9yY2UoKSB7CisJCWFzc2VydE5vdE51bGwobmV3IFJlZlNwZWMoIl4rcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgaW52YWxpZEZvcmNlQW5kTmVnYXRpdmUoKSB7CisJCWFzc2VydE5vdE51bGwobmV3IFJlZlNwZWMoIitecmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgaW52YWxpZE5lZ2F0aXZlTm9TcmNEZXN0KCkgeworCQlhc3NlcnROb3ROdWxsKG5ldyBSZWZTcGVjKCJeIikpOworCX0KKworCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIGludmFsaWROZWdhdGl2ZUJvdGhTcmNEZXN0KCkgeworCQlhc3NlcnROb3ROdWxsKG5ldyBSZWZTcGVjKCJecmVmcy9oZWFkcy8qOnJlZnMvaGVhZHMvKiIpKTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHNvdXJjZU9ubHl3aXRoV2lsZGNhcmQoKSB7CiAJCVJlZlNwZWMgYSA9IG5ldyBSZWZTcGVjKCJyZWZzL2hlYWRzLyoiLApAQCAtNDY2LDQgKzQ4Niw0NiBAQCBwdWJsaWMgdm9pZCBvbmx5V2lsZENhcmQoKSB7CiAJCWFzc2VydFRydWUoYS5tYXRjaFNvdXJjZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CiAJCWFzc2VydE51bGwoYS5nZXREZXN0aW5hdGlvbigpKTsKIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1hdGNoaW5nKCkgeworCQlSZWZTcGVjIGEgPSBuZXcgUmVmU3BlYygiOiIpOworCQlhc3NlcnRUcnVlKGEuaXNNYXRjaGluZygpKTsKKwkJYXNzZXJ0RmFsc2UoYS5pc0ZvcmNlVXBkYXRlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbWF0Y2hpbmdGb3JjZWQoKSB7CisJCVJlZlNwZWMgYSA9IG5ldyBSZWZTcGVjKCIrOiIpOworCQlhc3NlcnRUcnVlKGEuaXNNYXRjaGluZygpKTsKKwkJYXNzZXJ0VHJ1ZShhLmlzRm9yY2VVcGRhdGUoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBuZWdhdGl2ZVJlZlNwZWNXaXRoRGVzdCgpIHsKKwkJUmVmU3BlYyBhID0gbmV3IFJlZlNwZWMoIl46cmVmcy9yZWFkb25seS8qIik7CisJCWFzc2VydFRydWUoYS5pc05lZ2F0aXZlKCkpOworCQlhc3NlcnROdWxsKGEuZ2V0U291cmNlKCkpOworCQlhc3NlcnRFcXVhbHMoYS5nZXREZXN0aW5hdGlvbigpLCAicmVmcy9yZWFkb25seS8qIik7CisJfQorCisJLy8gQmVjYXVzZSBvZiBzb21lIG9mIHRoZSBBUEkncyBleGlzdGluZyBiZWhhdmlvciwgd2l0aG91dCBhIGNvbG9uIGF0IHRoZQorCS8vIGVuZCBvZiB0aGUgcmVmc3BlYywgZGVzdCB3aWxsIGJlIG51bGwuCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBuZWdhdGl2ZVJlZlNwZWNXaXRoU3JjQW5kTnVsbERlc3QoKSB7CisJCVJlZlNwZWMgYSA9IG5ldyBSZWZTcGVjKCJecmVmcy90ZXN0ZGF0YS8qIik7CisJCWFzc2VydFRydWUoYS5pc05lZ2F0aXZlKCkpOworCQlhc3NlcnROdWxsKGEuZ2V0RGVzdGluYXRpb24oKSk7CisJCWFzc2VydEVxdWFscyhhLmdldFNvdXJjZSgpLCAicmVmcy90ZXN0ZGF0YS8qIik7CisJfQorCisJLy8gQmVjYXVzZSBvZiBzb21lIG9mIHRoZSBBUEkncyBleGlzdGluZyBiZWhhdmlvciwgd2l0aCBhIGNvbG9uIGF0IHRoZSBlbmQKKwkvLyBvZiB0aGUgcmVmc3BlYywgZGVzdCB3aWxsIGJlIGVtcHR5LgorCUBUZXN0CisJcHVibGljIHZvaWQgbmVnYXRpdmVSZWZTcGVjV2l0aFNyY0FuZEVtcHR5RGVzdCgpIHsKKwkJUmVmU3BlYyBhID0gbmV3IFJlZlNwZWMoIl5yZWZzL3Rlc3RkYXRhLyo6Iik7CisJCWFzc2VydFRydWUoYS5pc05lZ2F0aXZlKCkpOworCQlhc3NlcnRUcnVlKGEuZ2V0RGVzdGluYXRpb24oKS5pc0VtcHR5KCkpOworCQlhc3NlcnRFcXVhbHMoYS5nZXRTb3VyY2UoKSwgInJlZnMvdGVzdGRhdGEvKiIpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRJbnB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRJbnB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWM4MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZElucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFNpZGVCYW5kSW5wdXRTdHJlYW1UZXN0IHsKKworCXByaXZhdGUgU3RyaW5nV3JpdGVyIG1lc3NhZ2VzOworCisJcHJpdmF0ZSBTaWRlQmFuZElucHV0U3RyZWFtIHNpZGViYW5kOworCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldHVwKCkgeworCQltZXNzYWdlcyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHByb2dyZXNzU2luZ2xlQ1IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KHBhY2tldCgibWVzc2FnZVxyIikpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2VcciIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvZ3Jlc3NTaW5nbGVMRigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWluaXQocGFja2V0KCJtZXNzYWdlXG4iKSk7CisJCWFzc2VydFRydWUoc2lkZWJhbmQucmVhZCgpIDwgMCk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZVxuIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9ncmVzc1NpbmdsZUNSTEYoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KHBhY2tldCgibWVzc2FnZVxyXG4iKSk7CisJCWFzc2VydFRydWUoc2lkZWJhbmQucmVhZCgpIDwgMCk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZVxyXG4iLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHByb2dyZXNzTXVsdGlDUigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWluaXQocGFja2V0KCJtZXNzYWdlICAgMCVccm1lc3NhZ2UgMTAwJVxyIikpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxybWVzc2FnZSAxMDAlXHIiLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHByb2dyZXNzTXVsdGlMRigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWluaXQocGFja2V0KCJtZXNzYWdlICAgMCVcbm1lc3NhZ2UgMTAwJVxuIikpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxubWVzc2FnZSAxMDAlXG4iLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHByb2dyZXNzTXVsdGlDUkxGKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW5pdChwYWNrZXQoIm1lc3NhZ2UgICAwJVxyXG5tZXNzYWdlIDEwMCVcclxuIikpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxyXG5tZXNzYWdlIDEwMCVcclxuIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9ncmVzc1BhcnRpYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KHBhY2tldCgibWVzc2FnZSIpKTsKKwkJYXNzZXJ0VHJ1ZShzaWRlYmFuZC5yZWFkKCkgPCAwKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwkJc2lkZWJhbmQuZHJhaW5NZXNzYWdlcygpOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2VcbiIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvZ3Jlc3NQYXJ0aWFsVHdvQ1IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KHBhY2tldCgibWVzc2FnZSIpICsgcGFja2V0KCJtZXNzYWdlXHIiKSk7CisJCWFzc2VydFRydWUoc2lkZWJhbmQucmVhZCgpIDwgMCk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZW1lc3NhZ2VcciIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvZ3Jlc3NQYXJ0aWFsVHdvTEYoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KHBhY2tldCgibWVzc2FnZSIpICsgcGFja2V0KCJtZXNzYWdlXG4iKSk7CisJCWFzc2VydFRydWUoc2lkZWJhbmQucmVhZCgpIDwgMCk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZW1lc3NhZ2VcbiIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvZ3Jlc3NQYXJ0aWFsVHdvQ1JMRigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWluaXQocGFja2V0KCJtZXNzYWdlIikgKyBwYWNrZXQoIm1lc3NhZ2VcclxuIikpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2VtZXNzYWdlXHJcbiIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvZ3Jlc3NQYXJ0aWFsVGhyZWVDUigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWluaXQocGFja2V0KCJtZXNzYWdlIikgKyBwYWNrZXQoIm1lc3NhZ2UiKSArIHBhY2tldCgibWVzc2FnZVxyIikpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2VtZXNzYWdlbWVzc2FnZVxyIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9ncmVzc1BhcnRpYWxUaHJlZUxGKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW5pdChwYWNrZXQoIm1lc3NhZ2UiKSArIHBhY2tldCgibWVzc2FnZSIpICsgcGFja2V0KCJtZXNzYWdlXG4iKSk7CisJCWFzc2VydFRydWUoc2lkZWJhbmQucmVhZCgpIDwgMCk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZW1lc3NhZ2VtZXNzYWdlXG4iLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHByb2dyZXNzUGFydGlhbFRocmVlQ1JMRigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWluaXQocGFja2V0KCJtZXNzYWdlIikgKyBwYWNrZXQoIm1lc3NhZ2UiKSArIHBhY2tldCgibWVzc2FnZVxyXG4iKSk7CisJCWFzc2VydFRydWUoc2lkZWJhbmQucmVhZCgpIDwgMCk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZW1lc3NhZ2VtZXNzYWdlXHJcbiIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgcHJvZ3Jlc3NQYXJ0aWFsQ1IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KHBhY2tldCgibWVzc2FnZSAgIDAlXHJtZXNzYWdlIDEwMCUiKSk7CisJCWFzc2VydFRydWUoc2lkZWJhbmQucmVhZCgpIDwgMCk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZSAgIDAlXHIiLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwkJc2lkZWJhbmQuZHJhaW5NZXNzYWdlcygpOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxybWVzc2FnZSAxMDAlXG4iLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHByb2dyZXNzUGFydGlhbExGKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW5pdChwYWNrZXQoIm1lc3NhZ2UgICAwJVxubWVzc2FnZSAxMDAlIikpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxuIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJCXNpZGViYW5kLmRyYWluTWVzc2FnZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtZXNzYWdlICAgMCVcbm1lc3NhZ2UgMTAwJVxuIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9ncmVzc1BhcnRpYWxDUkxGKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW5pdChwYWNrZXQoIm1lc3NhZ2UgICAwJVxyXG5tZXNzYWdlIDEwMCUiKSk7CisJCWFzc2VydFRydWUoc2lkZWJhbmQucmVhZCgpIDwgMCk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZSAgIDAlXHJcbiIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCQlzaWRlYmFuZC5kcmFpbk1lc3NhZ2VzKCk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZSAgIDAlXHJcbm1lc3NhZ2UgMTAwJVxuIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9ncmVzc1BhcnRpYWxTcGxpdENSKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW5pdChwYWNrZXQoIm1lc3NhZ2UiKSArICIwMDA2XDAwMWEiICsgcGFja2V0KCIgICAwJVxybWVzc2EiKQorCQkJCSsgcGFja2V0KCJnZSAxMDAlIikpOworCQlhc3NlcnRFcXVhbHMoJ2EnLCBzaWRlYmFuZC5yZWFkKCkpOworCQlhc3NlcnRFcXVhbHMoIiIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxyIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJCXNpZGViYW5kLmRyYWluTWVzc2FnZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtZXNzYWdlICAgMCVccm1lc3NhZ2UgMTAwJVxuIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9ncmVzc1BhcnRpYWxTcGxpdExGKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW5pdChwYWNrZXQoIm1lc3NhZ2UiKSArICIwMDA2XDAwMWEiICsgcGFja2V0KCIgICAwJVxubWVzc2EiKQorCQkJCSsgcGFja2V0KCJnZSAxMDAlIikpOworCQlhc3NlcnRFcXVhbHMoJ2EnLCBzaWRlYmFuZC5yZWFkKCkpOworCQlhc3NlcnRFcXVhbHMoIiIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxuIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJCXNpZGViYW5kLmRyYWluTWVzc2FnZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtZXNzYWdlICAgMCVcbm1lc3NhZ2UgMTAwJVxuIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9ncmVzc1BhcnRpYWxTcGxpdENSTEYoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KHBhY2tldCgibWVzc2FnZSIpICsgIjAwMDZcMDAxYSIgKyBwYWNrZXQoIiAgIDAlXHJcbm1lc3NhIikKKwkJCQkrIHBhY2tldCgiZ2UgMTAwJSIpKTsKKwkJYXNzZXJ0RXF1YWxzKCdhJywgc2lkZWJhbmQucmVhZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCIiLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwkJYXNzZXJ0VHJ1ZShzaWRlYmFuZC5yZWFkKCkgPCAwKTsKKwkJYXNzZXJ0RXF1YWxzKCJtZXNzYWdlICAgMCVcclxuIiwgbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJCXNpZGViYW5kLmRyYWluTWVzc2FnZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJtZXNzYWdlICAgMCVcclxubWVzc2FnZSAxMDAlXG4iLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHByb2dyZXNzSW50ZXJsZWF2ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KHBhY2tldCgibWVzc2FnZSAgIDAlXHIiKSArICIwMDA2XDAwMWEiICsgcGFja2V0KCJtZXNzYWdlICAxMCUiKQorCQkJCSsgIjAwMDZcMDAxYiIgKyBwYWNrZXQoIlxybWVzc2FnZSAxMDAlXG4iKSk7CisJCWFzc2VydEVxdWFscygnYScsIHNpZGViYW5kLnJlYWQoKSk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZSAgIDAlXHIiLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCdiJywgc2lkZWJhbmQucmVhZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtZXNzYWdlICAgMCVcciIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxybWVzc2FnZSAgMTAlXHJtZXNzYWdlIDEwMCVcbiIsCisJCQkJbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwcm9ncmVzc0ludGVybGVhdmVkUGFydGlhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWluaXQocGFja2V0KCJtZXNzYWdlICAgMCVcciIpICsgIjAwMDZcMDAxYSIgKyBwYWNrZXQoIm1lc3NhZ2UgIDEwJSIpCisJCQkJKyAiMDAwNlwwMDFiIiArIHBhY2tldCgiXHJtZXNzYWdlIDEwMCUiKSk7CisJCWFzc2VydEVxdWFscygnYScsIHNpZGViYW5kLnJlYWQoKSk7CisJCWFzc2VydEVxdWFscygibWVzc2FnZSAgIDAlXHIiLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCdiJywgc2lkZWJhbmQucmVhZCgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJtZXNzYWdlICAgMCVcciIsIG1lc3NhZ2VzLnRvU3RyaW5nKCkpOworCQlhc3NlcnRUcnVlKHNpZGViYW5kLnJlYWQoKSA8IDApOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxybWVzc2FnZSAgMTAlXHIiLCBtZXNzYWdlcy50b1N0cmluZygpKTsKKwkJc2lkZWJhbmQuZHJhaW5NZXNzYWdlcygpOworCQlhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgICAwJVxybWVzc2FnZSAgMTAlXHJtZXNzYWdlIDEwMCVcbiIsCisJCQkJbWVzc2FnZXMudG9TdHJpbmcoKSk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgcGFja2V0KFN0cmluZyBkYXRhKSB7CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCIlMDR4XDAwMiVzIiwgSW50ZWdlci52YWx1ZU9mKGRhdGEubGVuZ3RoKCkgKyA1KSwKKwkJCQlkYXRhKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgcGFja2V0cykgeworCQlJbnB1dFN0cmVhbSByYXdJbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkocGFja2V0cyArICIwMDAwIikuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworCQlzaWRlYmFuZCA9IG5ldyBTaWRlQmFuZElucHV0U3RyZWFtKHJhd0luLCBudWxsLCBtZXNzYWdlcywgbnVsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrVGVzdC5qYXZhCmluZGV4IDFjNWE1MjEuLjcxMzE5MDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tUZXN0LmphdmEKQEAgLTExMDcsNiArMTEwNyw2MSBAQCBwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFdpdGhXYWl0Rm9yRG9uZU9ubHlEb2VzTmVnb3RpYXRpb25BbmROb3RoaW5nVG9BY2soKQogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hTZXJ2ZXJTdG9wc05lZ290aWF0aW9uRm9yUmVmV2l0aG91dFBhcmVudHMoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBmb29Db21taXQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyQ29tbWl0ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy9jaGFuZ2VzLzAxLzEvMSIsIGZvb0NvbW1pdCk7CisJCXJlbW90ZS51cGRhdGUoInJlZnMvY2hhbmdlcy8wMi8yLzEiLCBiYXJDb21taXQpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQkJUGFja2V0TGluZUluLmRlbGltaXRlcigpLAorCQkJCSJ3YW50ICIgKyBmb29Db21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkJImhhdmUgIiArIGJhckNvbW1pdC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCQlQYWNrZXRMaW5lSW4uZW5kKCkpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiYWNrbm93bGVkZ21lbnRzIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwKKwkJCQlpcygiQUNLICIgKyBiYXJDb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInJlYWR5IikpOworCQlhc3NlcnRUcnVlKFBhY2tldExpbmVJbi5pc0RlbGltaXRlcihwY2tJbi5yZWFkU3RyaW5nKCkpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUcnVlKGNsaWVudC5nZXRPYmplY3REYXRhYmFzZSgpLmhhcyhmb29Db21taXQudG9PYmplY3RJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFNlcnZlckRvZXNOb3RTdG9wTmVnb3RpYXRpb25XaGVuT25lUmVmV2l0aG91dFBhcmVudEFuZE90aGVyV2l0aFBhcmVudHMoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBmb29Db21taXQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhckNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQoYmFyUGFyZW50KQorCQkJCS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGZvb0JhclBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ6IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBmb29CYXJDaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikKKwkJCQkucGFyZW50KGZvb0JhclBhcmVudCkKKwkJCQkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoInJlZnMvY2hhbmdlcy8wMS8xLzEiLCBmb29Db21taXQpOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL2NoYW5nZXMvMDIvMi8xIiwgYmFyQ2hpbGQpOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL2NoYW5nZXMvMDMvMy8xIiwgZm9vQmFyQ2hpbGQpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQkJUGFja2V0TGluZUluLmRlbGltaXRlcigpLAorCQkJCSJ3YW50ICIgKyBmb29Db21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkJIndhbnQgIiArIGJhckNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJCSJ3YW50ICIgKyBmb29CYXJDaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCQkiaGF2ZSAiICsgZm9vQmFyUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJCVBhY2tldExpbmVJbi5lbmQoKSk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJhY2tub3dsZWRnbWVudHMiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLAorCQkJCWlzKCJBQ0sgIiArIGZvb0JhclBhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUoUGFja2V0TGluZUluLmlzRW5kKHBja0luLnJlYWRTdHJpbmcoKSkpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCQlTdHJpbmcgY29tbW9uSW5CbG9iID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb25UZXN0LmphdmEKaW5kZXggZjI4OWE5Mi4uNWFkZjdmYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uVGVzdC5qYXZhCkBAIC05OSw3ICs5OSw3IEBACiBwdWJsaWMgY2xhc3MgV2Fsa0VuY3J5cHRpb25UZXN0IHsKIAogCS8qKgotCSAqIExvZ2dlciBzZXR1cDogJHtwcm9qZWN0X2xvY30vdHN0LXJzcmMvbG9nNGoucHJvcGVydGllcworCSAqIExvZ2dlciBzZXR1cDogJHtwcm9qZWN0X2xvY30vdHN0LXJzcmMvc2ltcGxlbG9nZ2VyLnByb3BlcnRpZXMKIAkgKi8KIAlzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFdhbGtFbmNyeXB0aW9uVGVzdC5jbGFzcyk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbHRlckNvbW1hbmRzVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsdGVyQ29tbWFuZHNUZXN0LmphdmEKaW5kZXggMzZmOTRmYi4uODlkMzFjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsdGVyQ29tbWFuZHNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsdGVyQ29tbWFuZHNUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE2LCBDaHJpc3RpYW4gSGFsc3RyaWNrIDxjaHJpc3RpYW4uaGFsc3RyaWNrQHNhcC5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNiwgMjAyMiBDaHJpc3RpYW4gSGFsc3RyaWNrIDxjaHJpc3RpYW4uaGFsc3RyaWNrQHNhcC5jb20+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDEyICsxMCwxNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuTWVyZ2VSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuRmlsdGVyQ29tbWFuZEZhY3Rvcnk7CkBAIC04Niw2ICs5MSwxNCBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzZWNvbmRDb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiU2Vjb25kIGNvbW1pdCIpLmNhbGwoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlTZXQ8U3RyaW5nPiBleGlzdGluZ0ZpbHRlcnMgPSBuZXcgSGFzaFNldDw+KAorCQkJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS5nZXRSZWdpc3RlcmVkRmlsdGVyQ29tbWFuZHMoKSk7CisJCWV4aXN0aW5nRmlsdGVycy5mb3JFYWNoKEZpbHRlckNvbW1hbmRSZWdpc3RyeTo6dW5yZWdpc3Rlcik7CisJCXN1cGVyLnRlYXJEb3duKCk7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0QnVpbHRpbkNsZWFuRmlsdGVyKCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKQEAgLTIxNyw0ICsyMzAsMTMzIEBAIHB1YmxpYyB2b2lkIHRlc3RCdWlsdGluQ2xlYW5BbmRTbXVkZ2VGaWx0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvCiAJCWNvbmZpZy5zYXZlKCk7CiAJfQogCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QnJhbmNoU3dpdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBidWlsdGluQ29tbWFuZFByZWZpeCA9ICJqZ2l0Oi8vYnVpbHRpbi90ZXN0LyI7CisJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS5yZWdpc3RlcihidWlsdGluQ29tbWFuZFByZWZpeCArICJzbXVkZ2UiLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ3MnKSk7CisJCUZpbHRlckNvbW1hbmRSZWdpc3RyeS5yZWdpc3RlcihidWlsdGluQ29tbWFuZFByZWZpeCArICJjbGVhbiIsCisJCQkJbmV3IFRlc3RDb21tYW5kRmFjdG9yeSgnYycpKTsKKwkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCWNvbmZpZy5zZXRTdHJpbmcoImZpbHRlciIsICJ0ZXN0IiwgInNtdWRnZSIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIik7CisJCWNvbmZpZy5zZXRTdHJpbmcoImZpbHRlciIsICJ0ZXN0IiwgImNsZWFuIiwKKwkJCQlidWlsdGluQ29tbWFuZFByZWZpeCArICJjbGVhbiIpOworCQljb25maWcuc2F2ZSgpOworCQkvLyBXZSdyZSBvbiB0aGUgdGVzdCBicmFuY2gKKwkJRmlsZSBhRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJhLnR4dCIsICJhIik7CisJCXdyaXRlVHJhc2hGaWxlKCIuZ2l0YXR0cmlidXRlcyIsICJhLnR4dCBmaWx0ZXI9dGVzdCIpOworCQlGaWxlIGNGaWxlID0gd3JpdGVUcmFzaEZpbGUoImNjL2MudHh0IiwgIkMiKTsKKwkJd3JpdGVUcmFzaEZpbGUoImNjLy5naXRhdHRyaWJ1dGVzIiwgImMudHh0IGZpbHRlcj10ZXN0Iik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIk9uIHRlc3QiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJvdGhlciIpLmNhbGwoKTsKKwkJd3JpdGVUcmFzaEZpbGUoImIudHh0IiwgImIiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImIudHh0IGZpbHRlcj10ZXN0Iik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIk9uIG90aGVyIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJ0ZXN0IikuY2FsbCgpOworCQljaGVja0ZpbGUoYUZpbGUsICJzY3NhIik7CisJCWNoZWNrRmlsZShjRmlsZSwgInNjc0MiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDaGVja291dFNpbmdsZUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGJ1aWx0aW5Db21tYW5kUHJlZml4ID0gImpnaXQ6Ly9idWlsdGluL3Rlc3QvIjsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIsCisJCQkJbmV3IFRlc3RDb21tYW5kRmFjdG9yeSgncycpKTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdjJykpOworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAic211ZGdlIiwKKwkJCQlidWlsdGluQ29tbWFuZFByZWZpeCArICJzbXVkZ2UiKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAiY2xlYW4iLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIik7CisJCWNvbmZpZy5zYXZlKCk7CisJCS8vIFdlJ3JlIG9uIHRoZSB0ZXN0IGJyYW5jaAorCQlGaWxlIGFGaWxlID0gd3JpdGVUcmFzaEZpbGUoImEudHh0IiwgImEiKTsKKwkJRmlsZSBhdHRyaWJ1dGVzID0gd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImEudHh0IGZpbHRlcj10ZXN0Iik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIk9uIHRlc3QiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJvdGhlciIpLmNhbGwoKTsKKwkJd3JpdGVUcmFzaEZpbGUoImIudHh0IiwgImIiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImIudHh0IGZpbHRlcj10ZXN0Iik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIk9uIG90aGVyIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCWFzc2VydEZhbHNlKGFGaWxlLmV4aXN0cygpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5leGlzdHMoKSk7CisJCWdpdC5jaGVja291dCgpLnNldFN0YXJ0UG9pbnQoInRlc3QiKS5hZGRQYXRoKCJhLnR4dCIpLmNhbGwoKTsKKwkJY2hlY2tGaWxlKGFGaWxlLCAic2NzYSIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0U2luZ2xlRmlsZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGJ1aWx0aW5Db21tYW5kUHJlZml4ID0gImpnaXQ6Ly9idWlsdGluL3Rlc3QvIjsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIsCisJCQkJbmV3IFRlc3RDb21tYW5kRmFjdG9yeSgncycpKTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdjJykpOworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAic211ZGdlIiwKKwkJCQlidWlsdGluQ29tbWFuZFByZWZpeCArICJzbXVkZ2UiKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAiY2xlYW4iLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIik7CisJCWNvbmZpZy5zYXZlKCk7CisJCS8vIFdlJ3JlIG9uIHRoZSB0ZXN0IGJyYW5jaAorCQlGaWxlIGFGaWxlID0gd3JpdGVUcmFzaEZpbGUoImEudHh0IiwgImEiKTsKKwkJRmlsZSBhdHRyaWJ1dGVzID0gd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImEudHh0IGZpbHRlcj10ZXN0Iik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIk9uIHRlc3QiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJvdGhlciIpLmNhbGwoKTsKKwkJd3JpdGVUcmFzaEZpbGUoImIudHh0IiwgImIiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImIudHh0IGZpbHRlcj10ZXN0Iik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIk9uIG90aGVyIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCWFzc2VydEZhbHNlKGFGaWxlLmV4aXN0cygpKTsKKwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5leGlzdHMoKSk7CisJCXdyaXRlVHJhc2hGaWxlKCIuZ2l0YXR0cmlidXRlcyIsICIiKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0U3RhcnRQb2ludCgidGVzdCIpLmFkZFBhdGgoImEudHh0IikuY2FsbCgpOworCQljaGVja0ZpbGUoYUZpbGUsICJzY3NhIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGJ1aWx0aW5Db21tYW5kUHJlZml4ID0gImpnaXQ6Ly9idWlsdGluL3Rlc3QvIjsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIsCisJCQkJbmV3IFRlc3RDb21tYW5kRmFjdG9yeSgncycpKTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdjJykpOworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAic211ZGdlIiwKKwkJCQlidWlsdGluQ29tbWFuZFByZWZpeCArICJzbXVkZ2UiKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAiY2xlYW4iLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIik7CisJCWNvbmZpZy5zYXZlKCk7CisJCS8vIFdlJ3JlIG9uIHRoZSB0ZXN0IGJyYW5jaC4gU2V0IHVwIHR3byBicmFuY2hlcyB0aGF0IGFyZSBleHBlY3RlZCB0bworCQkvLyBtZXJnZSBjbGVhbmx5LgorCQlGaWxlIGFGaWxlID0gd3JpdGVUcmFzaEZpbGUoImEudHh0IiwgImEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImEudHh0IGZpbHRlcj10ZXN0Iik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJUmV2Q29tbWl0IGFDb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlhc3NlcnRGYWxzZShhRmlsZS5leGlzdHMoKSk7CisJCWdpdC5icmFuY2hDcmVhdGUoKS5zZXROYW1lKCJvdGhlciIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCXdyaXRlVHJhc2hGaWxlKCJiL2IudHh0IiwgImIiKTsKKwkJd3JpdGVUcmFzaEZpbGUoImIvLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCU1lcmdlUmVzdWx0IHJlc3VsdCA9IGdpdC5tZXJnZSgpLmluY2x1ZGUoYUNvbW1pdCkuY2FsbCgpOworCQlhc3NlcnRFcXVhbHMoTWVyZ2VSZXN1bHQuTWVyZ2VTdGF0dXMuTUVSR0VELCByZXN1bHQuZ2V0TWVyZ2VTdGF0dXMoKSk7CisJCWNoZWNrRmlsZShhRmlsZSwgInNjc2EiKTsKKwl9CisKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Ib29rVGVzdC5qYXZhCmluZGV4IDMzZWQzNjAuLjEyMzFhZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSG9va1Rlc3QuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CkBAIC03Nyw3ICs3OCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RGYWlsZWRDb21taXRNc2dIb29rQmxvY2tzQ29tbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJCSJSZWplY3RlZCBieSBcImNvbW1pdC1tc2dcIiBob29rLlxuc3RkZXJyXG4iLAogCQkJCQllLmdldE1lc3NhZ2UoKSk7CiAJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IGZyb20gY29tbWl0LW1zZyBob29rIiwgInRlc3RcbiIsCi0JCQkJCW91dC50b1N0cmluZygpKTsKKwkJCQkJb3V0LnRvU3RyaW5nKFVURl84KSk7CiAJCX0KIAl9CiAKQEAgLTk1LDcgKzk2LDcgQEAgcHVibGljIHZvaWQgdGVzdENvbW1pdE1zZ0hvb2tSZWNlaXZlc0NvcnJlY3RQYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImNvbW1pdCIpCiAJCQkJLnNldEhvb2tPdXRwdXRTdHJlYW0obmV3IFByaW50U3RyZWFtKG91dCkpLmNhbGwoKTsKIAkJYXNzZXJ0RXF1YWxzKCIuZ2l0L0NPTU1JVF9FRElUTVNHXG4iLAotCQkJCW91dC50b1N0cmluZygiVVRGLTgiKSk7CisJCQkJb3V0LnRvU3RyaW5nKFVURl84KSk7CiAJfQogCiAJQFRlc3QKQEAgLTEyOSw5ICsxMzAsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0UG9zdENvbW1pdFJ1bkhvb2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQluZXcgUHJpbnRTdHJlYW0ob3V0KSwgbmV3IFByaW50U3RyZWFtKGVyciksICJzdGRpbiIpOwogCiAJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBob29rIG91dHB1dCIsICJ0ZXN0IGFyZzEgYXJnMlxuc3RkaW5cbiIsCi0JCQkJb3V0LnRvU3RyaW5nKCJVVEYtOCIpKTsKKwkJCQlvdXQudG9TdHJpbmcoVVRGXzgpKTsKIAkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG91dHB1dCBvbiBzdGRlcnIgc3RyZWFtIiwgInN0ZGVyclxuIiwKLQkJCQllcnIudG9TdHJpbmcoIlVURi04IikpOworCQkJCWVyci50b1N0cmluZyhVVEZfOCkpOwogCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZXhpdCBjb2RlIiwgMCwgcmVzLmdldEV4aXRDb2RlKCkpOwogCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgcHJvY2VzcyBzdGF0dXMiLCBQcm9jZXNzUmVzdWx0LlN0YXR1cy5PSywKIAkJCQlyZXMuZ2V0U3RhdHVzKCkpOwpAQCAtMTYwLDcgKzE2MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RBbGxDb21taXRIb29rcygpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBob29rIG91dHB1dCIsCiAJCQkJInRlc3QgcHJlLWNvbW1pdFxudGVzdCBjb21taXQtbXNnIC5naXQvQ09NTUlUX0VESVRNU0dcbnRlc3QgcG9zdC1jb21taXRcbiIsCi0JCQkJb3V0LnRvU3RyaW5nKCJVVEYtOCIpKTsKKwkJCQlvdXQudG9TdHJpbmcoVVRGXzgpKTsKIAl9CiAKIAlAVGVzdApAQCAtMTgxLDkgKzE4Miw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSdW5Ib29rKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBob29rIG91dHB1dCIsCiAJCQkJInRlc3QgYXJnMSBhcmcyXG5zdGRpblxuIiArIGRiLmdldERpcmVjdG9yeSgpLmdldEFic29sdXRlUGF0aCgpCiAJCQkJCQkrICdcbicgKyBkYi5nZXRXb3JrVHJlZSgpLmdldEFic29sdXRlUGF0aCgpICsgJ1xuJywKLQkJCQlvdXQudG9TdHJpbmcoIlVURi04IikpOworCQkJCW91dC50b1N0cmluZyhVVEZfOCkpOwogCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IG9uIHN0ZGVyciBzdHJlYW0iLCAic3RkZXJyXG4iLAotCQkJCWVyci50b1N0cmluZygiVVRGLTgiKSk7CisJCQkJZXJyLnRvU3RyaW5nKFVURl84KSk7CiAJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBleGl0IGNvZGUiLCAwLCByZXMuZ2V0RXhpdENvZGUoKSk7CiAJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBwcm9jZXNzIHN0YXR1cyIsIFByb2Nlc3NSZXN1bHQuU3RhdHVzLk9LLAogCQkJCXJlcy5nZXRTdGF0dXMoKSk7CkBAIC0yMTQsOSArMjE1LDkgQEAgcHVibGljIHZvaWQgdGVzdFJ1bkhvb2tIb29rc1BhdGhSZWxhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQkidGVzdCBhcmcxIGFyZzJcbnN0ZGluXG4iCiAJCQkJCQkJKyBkYi5nZXREaXJlY3RvcnkoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICdcbicKIAkJCQkJCQkrIGRiLmdldFdvcmtUcmVlKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAnXG4nLAotCQkJCQlvdXQudG9TdHJpbmcoIlVURi04IikpOworCQkJCQlvdXQudG9TdHJpbmcoVVRGXzgpKTsKIAkJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBvdXRwdXQgb24gc3RkZXJyIHN0cmVhbSIsICJzdGRlcnJcbiIsCi0JCQkJCWVyci50b1N0cmluZygiVVRGLTgiKSk7CisJCQkJCWVyci50b1N0cmluZyhVVEZfOCkpOwogCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGV4aXQgY29kZSIsIDAsIHJlcy5nZXRFeGl0Q29kZSgpKTsKIAkJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBwcm9jZXNzIHN0YXR1cyIsIFByb2Nlc3NSZXN1bHQuU3RhdHVzLk9LLAogCQkJCQlyZXMuZ2V0U3RhdHVzKCkpOwpAQCAtMjQ5LDkgKzI1MCw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSdW5Ib29rSG9va3NQYXRoQWJzb2x1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJInRlc3QgYXJnMSBhcmcyXG5zdGRpblxuIgogCQkJCQkJCSsgZGIuZ2V0RGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAnXG4nCiAJCQkJCQkJKyBkYi5nZXRXb3JrVHJlZSgpLmdldEFic29sdXRlUGF0aCgpICsgJ1xuJywKLQkJCQkJb3V0LnRvU3RyaW5nKCJVVEYtOCIpKTsKKwkJCQkJb3V0LnRvU3RyaW5nKFVURl84KSk7CiAJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IG9uIHN0ZGVyciBzdHJlYW0iLCAic3RkZXJyXG4iLAotCQkJCQllcnIudG9TdHJpbmcoIlVURi04IikpOworCQkJCQllcnIudG9TdHJpbmcoVVRGXzgpKTsKIAkJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBleGl0IGNvZGUiLCAwLCByZXMuZ2V0RXhpdENvZGUoKSk7CiAJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgcHJvY2VzcyBzdGF0dXMiLCBQcm9jZXNzUmVzdWx0LlN0YXR1cy5PSywKIAkJCQkJcmVzLmdldFN0YXR1cygpKTsKQEAgLTI4MSw5ICsyODIsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0SG9va1BhdGhXaXRoQmxhbmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJInRlc3QgYXJnMSBhcmcyXG5zdGRpblxuIgogCQkJCQkJCSsgZGIuZ2V0RGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAnXG4nCiAJCQkJCQkJKyBkYi5nZXRXb3JrVHJlZSgpLmdldEFic29sdXRlUGF0aCgpICsgJ1xuJywKLQkJCQkJb3V0LnRvU3RyaW5nKCJVVEYtOCIpKTsKKwkJCQkJb3V0LnRvU3RyaW5nKFVURl84KSk7CiAJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IG9uIHN0ZGVyciBzdHJlYW0iLCAic3RkZXJyXG4iLAotCQkJCQllcnIudG9TdHJpbmcoIlVURi04IikpOworCQkJCQllcnIudG9TdHJpbmcoVVRGXzgpKTsKIAkJCWFzc2VydEVxdWFscygidW5leHBlY3RlZCBleGl0IGNvZGUiLCAwLCByZXMuZ2V0RXhpdENvZGUoKSk7CiAJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgcHJvY2VzcyBzdGF0dXMiLCBQcm9jZXNzUmVzdWx0LlN0YXR1cy5PSywKIAkJCQkJcmVzLmdldFN0YXR1cygpKTsKQEAgLTMxMCw3ICszMTEsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkUHJlQ29tbWl0SG9va0Jsb2NrQ29tbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJCSJSZWplY3RlZCBieSBcInByZS1jb21taXRcIiBob29rLlxuc3RkZXJyXG4iLAogCQkJCQllLmdldE1lc3NhZ2UoKSk7CiAJCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgb3V0cHV0IGZyb20gcHJlLWNvbW1pdCBob29rIiwgInRlc3RcbiIsCi0JCQkJCW91dC50b1N0cmluZygpKTsKKwkJCQkJb3V0LnRvU3RyaW5nKFVURl84KSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWI4YmQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24uamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMTE0MTg5OTI2NiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNi4xIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Ik5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbihVUklpc2gsIFN0cmluZywgVGhyb3dhYmxlKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdERhdGFiYXNlIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMzM2Njk1MzM3Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0RGF0YWJhc2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0QXBwcm94aW1hdGVPYmplY3RDb3VudCgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVHlwZWRDb25maWdHZXR0ZXIuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuVHlwZWRDb25maWdHZXR0ZXIiPgorICAgICAgICA8ZmlsdGVyIGlkPSI0MDM3NjczMzYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UeXBlZENvbmZpZ0dldHRlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJVTlNFVF9JTlQiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGlkPSI0MDM4MDQyMDQiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UeXBlZENvbmZpZ0dldHRlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJnZXRJbnRJblJhbmdlKENvbmZpZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgaW50LCBpbnQsIGludCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5tZXJnZS5SZXNvbHZlTWVyZ2VyIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMzM4NzkyNTQ2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ib3JnLmVjbGlwc2UuamdpdC5tZXJnZS5SZXNvbHZlTWVyZ2VyIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImFkZENoZWNrb3V0TWV0YWRhdGEoU3RyaW5nLCBBdHRyaWJ1dGVzKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjMzODc5MjU0NiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJhZGRUb0NoZWNrb3V0KFN0cmluZywgRGlyQ2FjaGVFbnRyeSwgQXR0cmlidXRlcykiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGlkPSIzMzg3OTI1NDYiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlJlc29sdmVNZXJnZXIiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0icHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIsIENhbm9uaWNhbFRyZWVQYXJzZXIsIENhbm9uaWNhbFRyZWVQYXJzZXIsIERpckNhY2hlQnVpbGRJdGVyYXRvciwgV29ya2luZ1RyZWVJdGVyYXRvciwgYm9vbGVhbiwgQXR0cmlidXRlcykiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Bd3NSZXF1ZXN0U2lnbmVyVjQuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuQXdzUmVxdWVzdFNpZ25lclY0Ij4KKyAgICAgICAgPGZpbHRlciBpZD0iMTEwODM0NDgzNCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNi4zIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkF3c1JlcXVlc3RTaWduZXJWNCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24uamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuQmFzZVBhY2tQdXNoQ29ubmVjdGlvbiI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjMzODc5MjU0NiI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkJhc2VQYWNrUHVzaENvbm5lY3Rpb24iLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ibm9SZXBvc2l0b3J5KCkiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWciPgorICAgICAgICA8ZmlsdGVyIGlkPSIzMzg3MjI5MDciPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlB1c2hDb25maWcoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9IdHRwU3VwcG9ydC5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQiPgorICAgICAgICA8ZmlsdGVyIGlkPSIxMTQxODk5MjY2Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4xMyIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI2LjMiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0idXJsRW5jb2RlKFN0cmluZywgYm9vbGVhbikiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvcmVzb3VyY2U+Cis8L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDFhMzk3OGYuLjZlZmJmZmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNzAsNiArNzAsOCBAQAogIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iNy4wLjAiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmO3ZlcnNpb249IjcuMC4wIjsKKyAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKICBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7dmVyc2lvbj0iNy4wLjAiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0LApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCmluZGV4IGVlOTdjMjYuLjY2YWRhZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKQEAgLTIwOSwxMiArMjA5LDE0IEBACiBjb3VsZE5vdEdldFJlcG9TdGF0aXN0aWNzPUNvdWxkIG5vdCBnZXQgcmVwb3NpdG9yeSBzdGF0aXN0aWNzCiBjb3VsZE5vdEZpbmRUYWJJbkxpbmU9Q291bGQgbm90IGZpbmQgdGFiIGluIGxpbmUgezB9LiBUYWIgaXMgdGhlIG1hbmRhdG9yeSBzZXBhcmF0b3IgZm9yIHRoZSBOZXRzY2FwZSBDb29raWUgRmlsZSBGb3JtYXQuCiBjb3VsZE5vdEZpbmRTaXhUYWJzSW5MaW5lPUNvdWxkIG5vdCBmaW5kIDYgdGFicyBidXQgb25seSB7MH0gaW4gbGluZSAnezF9Jy4gNyB0YWIgc2VwYXJhdGVkIGNvbHVtbnMgcGVyIGxpbmUgYXJlIG1hbmRhdG9yeSBmb3IgdGhlIE5ldHNjYXBlIENvb2tpZSBGaWxlIEZvcm1hdC4KK2NvdWxkTm90SGFzaEJ5dGVBcnJheVdpdGhTaGEyNTY9Q291bGQgbm90IGhhc2ggYnl0ZSBhcnJheSB3aXRoIFNIQS0yNTYgYWxnb3JpdGhtLgogY291bGROb3RMb2NrSEVBRD1Db3VsZCBub3QgbG9jayBIRUFECiBjb3VsZE5vdFBlcnNpc3RDb29raWVzPUNvdWxkIG5vdCBwZXJzaXN0IHJlY2VpdmVkIGNvb2tpZXMgaW4gZmlsZSAnJ3swfScnCiBjb3VsZE5vdFJlYWRDb29raWVGaWxlPUNvdWxkIG5vdCByZWFkIGNvb2tpZSBmaWxlICcnezB9JycKIGNvdWxkTm90UmVhZEluZGV4SW5PbmVHbz1Db3VsZCBub3QgcmVhZCBpbmRleCBpbiBvbmUgZ28sIG9ubHkgezB9IG91dCBvZiB7MX0gcmVhZAogY291bGROb3RSZWFkT2JqZWN0V2hpbGVQYXJzaW5nQ29tbWl0PUNvdWxkIG5vdCByZWFkIGFuIG9iamVjdCB3aGlsZSBwYXJzaW5nIGNvbW1pdCB7MH0KIGNvdWxkTm90UmV3aW5kVG9VcHN0cmVhbUNvbW1pdD1Db3VsZCBub3QgcmV3aW5kIHRvIHVwc3RyZWFtIGNvbW1pdAorY291bGROb3RTaWduU3RyaW5nV2l0aEtleT1Db3VsZCBub3Qgc2lnbiBzdHJpbmcgd2l0aCBrZXkuCiBjb3VsZE5vdFVSTEVuY29kZVRvVVRGOD1Db3VsZCBub3QgVVJMIGVuY29kZSB0byBVVEYtOAogY291bnRpbmdPYmplY3RzPUNvdW50aW5nIG9iamVjdHMKIGNvcnJ1cHRQYWNrPVBhY2sgZmlsZSB7MH0gaXMgY29ycnVwdCwgcmVtb3ZpbmcgaXQgZnJvbSBwYWNrIGxpc3QKQEAgLTIzNyw2ICsyMzksOSBAQAogZGVsZXRpbmdOb3RTdXBwb3J0ZWQ9RGVsZXRpbmcgezB9IG5vdCBzdXBwb3J0ZWQuCiBkZXN0aW5hdGlvbklzTm90QVdpbGRjYXJkPURlc3RpbmF0aW9uIGlzIG5vdCBhIHdpbGRjYXJkLgogZGV0YWNoZWRIZWFkRGV0ZWN0ZWQ9SEVBRCBpcyBkZXRhY2hlZAorZGlmZlRvb2xOb3RHaXZlbkVycm9yPU5vIGRpZmYgdG9vbCBwcm92aWRlZCBhbmQgbm8gZGVmYXVsdHMgY29uZmlndXJlZC4KK2RpZmZUb29sTm90U3BlY2lmaWVkSW5HaXRBdHRyaWJ1dGVzRXJyb3I9RGlmZiB0b29sIHNwZWNpZmllZCBpbiBnaXQgYXR0cmlidXRlcyBjYW5ub3QgYmUgZm91bmQuCitkaWZmVG9vbE51bGxFcnJvcj1QYXJhbWV0ZXIgZm9yIGRpZmYgdG9vbCBjYW5ub3QgYmUgbnVsbC4KIGRpckNhY2hlRG9lc05vdEhhdmVBQmFja2luZ0ZpbGU9RGlyQ2FjaGUgZG9lcyBub3QgaGF2ZSBhIGJhY2tpbmcgZmlsZQogZGlyQ2FjaGVGaWxlSXNOb3RMb2NrZWQ9RGlyQ2FjaGUgezB9IG5vdCBsb2NrZWQKIGRpckNhY2hlSXNOb3RMb2NrZWQ9RGlyQ2FjaGUgaXMgbm90IGxvY2tlZApAQCAtMzU0LDYgKzM1OSw4IEBACiBpbk1lbW9yeUJ1ZmZlckxpbWl0RXhjZWVkZWQ9SW4tbWVtb3J5IGJ1ZmZlciBsaW1pdCBleGNlZWRlZAogaW5wdXREaWRudE1hdGNoTGVuZ3RoPUlucHV0IGRpZCBub3QgbWF0Y2ggc3VwcGxpZWQgbGVuZ3RoLiB7MH0gYnl0ZXMgYXJlIG1pc3NpbmcuCiBpbnB1dFN0cmVhbU11c3RTdXBwb3J0TWFyaz1JbnB1dFN0cmVhbSBtdXN0IHN1cHBvcnQgbWFyaygpCitpbnRlZ2VyVmFsdWVOb3RJblJhbmdlPUludGVnZXIgdmFsdWUgezB9LnsxfSA9IHsyfSBub3QgaW4gcmFuZ2UgezN9Li57NH0KK2ludGVnZXJWYWx1ZU5vdEluUmFuZ2VTdWJTZWN0aW9uPUludGVnZXIgdmFsdWUgezB9LnsxfS57Mn0gPSB7M30gbm90IGluIHJhbmdlIHs0fS4uezV9CiBpbnRlZ2VyVmFsdWVPdXRPZlJhbmdlPUludGVnZXIgdmFsdWUgezB9LnsxfSBvdXQgb2YgcmFuZ2UKIGludGVybmFsUmV2aXNpb25FcnJvcj1pbnRlcm5hbCByZXZpc2lvbiBlcnJvcgogaW50ZXJuYWxTZXJ2ZXJFcnJvcj1pbnRlcm5hbCBzZXJ2ZXIgZXJyb3IKQEAgLTM2MSw5ICszNjgsMTEgQEAKIGluVGhlRnV0dXJlPWluIHRoZSBmdXR1cmUKIGludmFsaWRBZHZlcnRpc2VtZW50T2Y9aW52YWxpZCBhZHZlcnRpc2VtZW50IG9mIHswfQogaW52YWxpZEFuY2VzdHJ5TGVuZ3RoPUludmFsaWQgYW5jZXN0cnkgbGVuZ3RoCitpbnZhbGlkQXdzQXBpU2lnbmF0dXJlVmVyc2lvbj1JbnZhbGlkIGF3cy5hcGkuc2lnbmF0dXJlLnZlcnNpb246IHswfQogaW52YWxpZEJvb2xlYW5WYWx1ZT1JbnZhbGlkIGJvb2xlYW4gdmFsdWU6IHswfS57MX09ezJ9CiBpbnZhbGlkQ2hhbm5lbD1JbnZhbGlkIGNoYW5uZWwgezB9CiBpbnZhbGlkQ29tbWl0UGFyZW50TnVtYmVyPUludmFsaWQgY29tbWl0IHBhcmVudCBudW1iZXIKK2ludmFsaWRDb3JlQWJicmV2PUludmFsaWQgdmFsdWUgezB9IG9mIG9wdGlvbiBjb3JlLmFiYnJldgogaW52YWxpZERlcHRoPUludmFsaWQgZGVwdGg6IHswfQogaW52YWxpZEVuY29kaW5nPUludmFsaWQgZW5jb2RpbmcgZnJvbSBnaXQgY29uZmlnIGkxOG4uY29tbWl0RW5jb2Rpbmc6IHswfQogaW52YWxpZEVuY3J5cHRpb249SW52YWxpZCBlbmNyeXB0aW9uCkBAIC0zOTAsNiArMzk5LDcgQEAKIGludmFsaWRNb2RlRm9yPUludmFsaWQgbW9kZSB7MH0gZm9yIHsxfSB7Mn0gaW4gezN9LgogaW52YWxpZE1vZGVGb3JQYXRoPUludmFsaWQgbW9kZSB7MH0gZm9yIHBhdGggezF9CiBpbnZhbGlkTmFtZUNvbnRhaW5zRG90RG90PUludmFsaWQgbmFtZSAoY29udGFpbnMgIi4uIik6IHswfQoraW52YWxpZE5lZ2F0aXZlQW5kRm9yY2U9IFJlZlNwZWMgY2FuJ3QgYmUgbmVnYXRpdmUgYW5kIGZvcmNlZnVsLgogaW52YWxpZE9iamVjdD1JbnZhbGlkIHswfSB7MX06IHsyfQogaW52YWxpZE9sZElkU2VudD1pbnZhbGlkIG9sZCBpZCBzZW50CiBpbnZhbGlkUGFja2V0TGluZUhlYWRlcj1JbnZhbGlkIHBhY2tldCBsaW5lIGhlYWRlcjogezB9CkBAIC00NTMsMTEgKzQ2MywxNCBAQAogbWVyZ2VVc2luZ1N0cmF0ZWd5UmVzdWx0ZWRJbkRlc2NyaXB0aW9uPU1lcmdlIG9mIHJldmlzaW9ucyB7MH0gd2l0aCBiYXNlIHsxfSB1c2luZyBzdHJhdGVneSB7Mn0gcmVzdWx0ZWQgaW46IHszfS4gezR9CiBtZXJnZVJlY3Vyc2l2ZUNvbmZsaWN0c1doZW5NZXJnaW5nQ29tbW9uQW5jZXN0b3JzPU11bHRpcGxlIGNvbW1vbiBhbmNlc3RvcnMgd2VyZSBmb3VuZCBhbmQgbWVyZ2luZyB0aGVtIHJlc3VsdGVkIGluIGEgY29uZmxpY3Q6IHswfSwgezF9CiBtZXJnZVJlY3Vyc2l2ZVRvb01hbnlNZXJnZUJhc2VzRm9yID0gIk1vcmUgdGhhbiB7MH0gbWVyZ2UgYmFzZXMgZm9yOlxuIGEgezF9XG4gYiB7Mn0gZm91bmQ6XG4gIGNvdW50IHszfSIKK21lcmdlVG9vbE5vdEdpdmVuRXJyb3I9Tm8gbWVyZ2UgdG9vbCBwcm92aWRlZCBhbmQgbm8gZGVmYXVsdHMgY29uZmlndXJlZC4KK21lcmdlVG9vbE51bGxFcnJvcj1QYXJhbWV0ZXIgZm9yIG1lcmdlIHRvb2wgY2Fubm90IGJlIG51bGwuCiBtZXNzYWdlQW5kVGFnZ2VyTm90QWxsb3dlZEluVW5hbm5vdGF0ZWRUYWdzID0gVW5hbm5vdGF0ZWQgdGFncyBjYW5ub3QgaGF2ZSBhIG1lc3NhZ2Ugb3IgdGFnZ2VyCiBtaW51dGVzQWdvPXswfSBtaW51dGVzIGFnbwogbWlzbWF0Y2hPZmZzZXQ9bWlzbWF0Y2ggb2Zmc2V0IGZvciBvYmplY3QgezB9CiBtaXNtYXRjaENSQz1taXNtYXRjaCBDUkMgZm9yIG9iamVjdCB7MH0KIG1pc3NpbmdBY2Nlc3NrZXk9TWlzc2luZyBhY2Nlc3NrZXkuCittaXNzaW5nQXdzUmVnaW9uPU1pc3NpbmcgcmVnaW9uIChlLmcuIHVzLXdlc3QtMikuCiBtaXNzaW5nQ29uZmlndXJhdGlvbkZvcktleT1ObyB2YWx1ZSBmb3Iga2V5IHswfSBmb3VuZCBpbiBjb25maWd1cmF0aW9uCiBtaXNzaW5nQ29va2llRmlsZT1Db25maWd1cmVkIGh0dHAuY29va2llRmlsZSAnJ3swfScnIGlzIG1pc3NpbmcKIG1pc3NpbmdDUkM9bWlzc2luZyBDUkMgZm9yIG9iamVjdCB7MH0KQEAgLTU2NCw2ICs1NzcsMTEgQEAKIHB1c2hDZXJ0aWZpY2F0ZUludmFsaWRGaWVsZFZhbHVlPVB1c2ggY2VydGlmaWNhdGUgaGFzIG1pc3Npbmcgb3IgaW52YWxpZCB2YWx1ZSBmb3IgezB9OiB7MX0KIHB1c2hDZXJ0aWZpY2F0ZUludmFsaWRIZWFkZXI9UHVzaCBjZXJ0aWZpY2F0ZSBoYXMgaW52YWxpZCBoZWFkZXIgZm9ybWF0CiBwdXNoQ2VydGlmaWNhdGVJbnZhbGlkU2lnbmF0dXJlPVB1c2ggY2VydGlmaWNhdGUgaGFzIGludmFsaWQgc2lnbmF0dXJlIGZvcm1hdAorcHVzaERlZmF1bHROb3RoaW5nPU5vIHJlZnNwZWMgZ2l2ZW4gYW5kIHB1c2guZGVmYXVsdD1ub3RoaW5nOyBubyB1cHN0cmVhbSBicmFuY2ggY2FuIGJlIGRldGVybWluZWQKK3B1c2hEZWZhdWx0Tm9VcHN0cmVhbT1ObyB1cHN0cmVhbSBicmFuY2ggZm91bmQgZm9yIGxvY2FsIGJyYW5jaCAnJ3swfScnCitwdXNoRGVmYXVsdFNpbXBsZT1wdXNoLmRlZmF1bHQ9c2ltcGxlIHJlcXVpcmVzIGxvY2FsIGJyYW5jaCBuYW1lICcnezB9JycgdG8gYmUgZXF1YWwgdG8gdXBzdHJlYW0gdHJhY2tlZCBicmFuY2ggbmFtZSAnJ3sxfScnCitwdXNoRGVmYXVsdFRyaWFuZ3VsYXJVcHN0cmVhbT1wdXNoLmRlZmF1bHQ9dXBzdHJlYW0gY2Fubm90IGJlIHVzZWQgd2hlbiB0aGUgcHVzaCByZW1vdGUgJyd7MH0nJyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmV0Y2ggcmVtb3RlICcnezF9JycKK3B1c2hEZWZhdWx0VW5rbm93bj1Vbmtub3duIHB1c2guZGVmYXVsdD17MH07IGNhbm5vdCBwdXNoCiBwdXNoSXNOb3RTdXBwb3J0ZWRGb3JCdW5kbGVUcmFuc3BvcnQ9UHVzaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBidW5kbGUgdHJhbnNwb3J0CiBwdXNoTm90UGVybWl0dGVkPXB1c2ggbm90IHBlcm1pdHRlZAogcHVzaE9wdGlvbnNOb3RTdXBwb3J0ZWQ9UHVzaCBvcHRpb25zIG5vdCBzdXBwb3J0ZWQ7IHJlY2VpdmVkIHswfQpAQCAtNzM5LDYgKzc1Nyw3IEBACiB1bmFibGVUb1NpZ25Db21taXROb1NlY3JldEtleT1VbmFibGUgdG8gc2lnbiBjb21taXQuIFNpZ25pbmcga2V5IG5vdCBhdmFpbGFibGUuCiB1bmF1dGhvcml6ZWQ9VW5hdXRob3JpemVkCiB1bmVuY29kZWFibGVGaWxlPVVuZW5jb2RhYmxlIGZpbGU6IHswfQordW5leHBlY3RlZEF3c0FwaVNpZ25hdHVyZVZlcnNpb249VW5leHBlY3RlZCBBV1MgQVBJIFNpZ25hdHVyZSBWZXJzaW9uOiB7MH0KIHVuZXhwZWN0ZWRDb21wYXJlUmVzdWx0PVVuZXhwZWN0ZWQgbWV0YWRhdGEgY29tcGFyaXNvbiByZXN1bHQ6IHswfQogdW5leHBlY3RlZEVuZE9mQ29uZmlnRmlsZT1VbmV4cGVjdGVkIGVuZCBvZiBjb25maWcgZmlsZQogdW5leHBlY3RlZEVuZE9mSW5wdXQ9VW5leHBlY3RlZCBlbmQgb2YgaW5wdXQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhCmluZGV4IDc5MjJmOWUuLmNlYmE4OWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YQpAQCAtOSw2ICs5LDggQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKQEAgLTI4LDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50cy5Xb3JraW5nVHJlZU1vZGlmaWVkRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CkBAIC0xMjQsNyArMTI3LDcgQEAgcHVibGljIENoZXJyeVBpY2tSZXN1bHQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE5vTWVzc2FnZUV4Y2VwdGlvbiwKIAkJCQlmaW5hbCBSZXZDb21taXQgc3JjUGFyZW50ID0gZ2V0UGFyZW50Q29tbWl0KHNyY0NvbW1pdCwgcmV2V2Fsayk7CiAKIAkJCQlTdHJpbmcgb3VyTmFtZSA9IGNhbGN1bGF0ZU91ck5hbWUoaGVhZFJlZik7Ci0JCQkJU3RyaW5nIGNoZXJyeVBpY2tOYW1lID0gc3JjQ29tbWl0LmdldElkKCkuYWJicmV2aWF0ZSg3KS5uYW1lKCkKKwkJCQlTdHJpbmcgY2hlcnJ5UGlja05hbWUgPSBzcmNDb21taXQuZ2V0SWQoKS5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkubmFtZSgpCiAJCQkJCQkrICIgIiArIHNyY0NvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAogCiAJCQkJTWVyZ2VyIG1lcmdlciA9IHN0cmF0ZWd5Lm5ld01lcmdlcihyZXBvKTsKQEAgLTE4MSw5ICsxODQsMTMgQEAgcHVibGljIENoZXJyeVBpY2tSZXN1bHQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE5vTWVzc2FnZUV4Y2VwdGlvbiwKIAogCQkJCQlTdHJpbmcgbWVzc2FnZTsKIAkJCQkJaWYgKHVubWVyZ2VkUGF0aHMgIT0gbnVsbCkgeworCQkJCQkJQ29tbWl0Q29uZmlnIGNmZyA9IHJlcG8uZ2V0Q29uZmlnKCkKKwkJCQkJCQkJLmdldChDb21taXRDb25maWcuS0VZKTsKKwkJCQkJCW1lc3NhZ2UgPSBzcmNDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKTsKKwkJCQkJCWNoYXIgY29tbWVudENoYXIgPSBjZmcuZ2V0Q29tbWVudENoYXIobWVzc2FnZSk7CiAJCQkJCQltZXNzYWdlID0gbmV3IE1lcmdlTWVzc2FnZUZvcm1hdHRlcigpCi0JCQkJCQkJLmZvcm1hdFdpdGhDb25mbGljdHMoc3JjQ29tbWl0LmdldEZ1bGxNZXNzYWdlKCksCi0JCQkJCQkJCQkJdW5tZXJnZWRQYXRocyk7CisJCQkJCQkJCS5mb3JtYXRXaXRoQ29uZmxpY3RzKG1lc3NhZ2UsIHVubWVyZ2VkUGF0aHMsCisJCQkJCQkJCQkJY29tbWVudENoYXIpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJbWVzc2FnZSA9IHNyY0NvbW1pdC5nZXRGdWxsTWVzc2FnZSgpOwogCQkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEKaW5kZXggMzdmMWQ0OC4uM2IzYmFmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5BYm9ydGVkQnlIb29rRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5DYW5jZWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbjsKQEAgLTQ2LDYgKzQ3LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzLlByZUNvbW1pdEhvb2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRDb25maWcuQ2xlYW51cE1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkdwZ0NvbmZpZzsKQEAgLTEzMyw2ICsxMzYsMTIgQEAgcHVibGljIGNsYXNzIENvbW1pdENvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPFJldkNvbW1pdD4gewogCiAJcHJpdmF0ZSBDcmVkZW50aWFsc1Byb3ZpZGVyIGNyZWRlbnRpYWxzUHJvdmlkZXI7CiAKKwlwcml2YXRlIEBOb25OdWxsIENsZWFudXBNb2RlIGNsZWFudXBNb2RlID0gQ2xlYW51cE1vZGUuVkVSQkFUSU07CisKKwlwcml2YXRlIGJvb2xlYW4gY2xlYW5EZWZhdWx0SXNTdHJpcCA9IHRydWU7CisKKwlwcml2YXRlIENoYXJhY3RlciBjb21tZW50Q2hhcjsKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBDb21taXRDb21tYW5kCiAJICoKQEAgLTIwMCw3ICsyMDksNyBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBBYm9ydGVkQnlIb29rRXhjZXB0aW9uLAogCQkJCXRocm93IG5ldyBXcm9uZ1JlcG9zaXRvcnlTdGF0ZUV4Y2VwdGlvbigKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmNvbW1pdEFtZW5kT25Jbml0aWFsTm90UG9zc2libGUpOwogCi0JCQlpZiAoaGVhZElkICE9IG51bGwpCisJCQlpZiAoaGVhZElkICE9IG51bGwpIHsKIAkJCQlpZiAoYW1lbmQpIHsKIAkJCQkJUmV2Q29tbWl0IHByZXZpb3VzQ29tbWl0ID0gcncucGFyc2VDb21taXQoaGVhZElkKTsKIAkJCQkJZm9yIChSZXZDb21taXQgcCA6IHByZXZpb3VzQ29tbWl0LmdldFBhcmVudHMoKSkKQEAgLTIxMCw3ICsyMTksNyBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBBYm9ydGVkQnlIb29rRXhjZXB0aW9uLAogCQkJCX0gZWxzZSB7CiAJCQkJCXBhcmVudHMuYWRkKDAsIGhlYWRJZCk7CiAJCQkJfQotCisJCQl9CiAJCQlpZiAoIW5vVmVyaWZ5KSB7CiAJCQkJbWVzc2FnZSA9IEhvb2tzCiAJCQkJCQkuY29tbWl0TXNnKHJlcG8sCkBAIC0yMTksNiArMjI4LDMzIEBAIHB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIEFib3J0ZWRCeUhvb2tFeGNlcHRpb24sCiAJCQkJCQkuc2V0Q29tbWl0TWVzc2FnZShtZXNzYWdlKS5jYWxsKCk7CiAJCQl9CiAKKwkJCUNvbW1pdENvbmZpZyBjb25maWcgPSBudWxsOworCQkJaWYgKENsZWFudXBNb2RlLkRFRkFVTFQuZXF1YWxzKGNsZWFudXBNb2RlKSkgeworCQkJCWNvbmZpZyA9IHJlcG8uZ2V0Q29uZmlnKCkuZ2V0KENvbW1pdENvbmZpZy5LRVkpOworCQkJCWNsZWFudXBNb2RlID0gY29uZmlnLnJlc29sdmUoY2xlYW51cE1vZGUsIGNsZWFuRGVmYXVsdElzU3RyaXApOworCQkJfQorCQkJY2hhciBjb21tZW50cyA9IChjaGFyKSAwOworCQkJaWYgKENsZWFudXBNb2RlLlNUUklQLmVxdWFscyhjbGVhbnVwTW9kZSkKKwkJCQkJfHwgQ2xlYW51cE1vZGUuU0NJU1NPUlMuZXF1YWxzKGNsZWFudXBNb2RlKSkgeworCQkJCWlmIChjb21tZW50Q2hhciA9PSBudWxsKSB7CisJCQkJCWlmIChjb25maWcgPT0gbnVsbCkgeworCQkJCQkJY29uZmlnID0gcmVwby5nZXRDb25maWcoKS5nZXQoQ29tbWl0Q29uZmlnLktFWSk7CisJCQkJCX0KKwkJCQkJaWYgKGNvbmZpZy5pc0F1dG9Db21tZW50Q2hhcigpKSB7CisJCQkJCQkvLyBXZSdyZSBzdXBwb3NlZCB0byBwaWNrIGEgY2hhcmFjdGVyIHRoYXQgaXNuJ3QgdXNlZCwKKwkJCQkJCS8vIGJ1dCB0aGVuIGNsZWFuaW5nIHVwIHdvbid0IHJlbW92ZSBhbnkgbGluZXMuIFNvIGRvbid0CisJCQkJCQkvLyBib3RoZXIuCisJCQkJCQljb21tZW50cyA9IChjaGFyKSAwOworCQkJCQkJY2xlYW51cE1vZGUgPSBDbGVhbnVwTW9kZS5XSElURVNQQUNFOworCQkJCQl9IGVsc2UgeworCQkJCQkJY29tbWVudHMgPSBjb25maWcuZ2V0Q29tbWVudENoYXIoKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWNvbW1lbnRzID0gY29tbWVudENoYXIuY2hhclZhbHVlKCk7CisJCQkJfQorCQkJfQorCQkJbWVzc2FnZSA9IENvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgY2xlYW51cE1vZGUsIGNvbW1lbnRzKTsKKwogCQkJUmV2Q29tbWl0IHJldkNvbW1pdDsKIAkJCURpckNhY2hlIGluZGV4ID0gcmVwby5sb2NrRGlyQ2FjaGUoKTsKIAkJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgb2RpID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpKSB7CkBAIC0yODcsOCArMzIzLDE0IEBAIHByaXZhdGUgdm9pZCBjaGVja0lmRW1wdHkoUmV2V2FsayBydywgT2JqZWN0SWQgaGVhZElkLCBPYmplY3RJZCBpbmRleFRyZWVJZCkKIAlwcml2YXRlIHZvaWQgc2lnbihDb21taXRCdWlsZGVyIGNvbW1pdCkgdGhyb3dzIFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiwKIAkJCUNhbmNlbGVkRXhjZXB0aW9uLCBVbnN1cHBvcnRlZFNpZ25pbmdGb3JtYXRFeGNlcHRpb24gewogCQlpZiAoZ3BnU2lnbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oCi0JCQkJCUpHaXRUZXh0LmdldCgpLnNpZ25pbmdTZXJ2aWNlVW5hdmFpbGFibGUpOworCQkJZ3BnU2lnbmVyID0gR3BnU2lnbmVyLmdldERlZmF1bHQoKTsKKwkJCWlmIChncGdTaWduZXIgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oCisJCQkJCQlKR2l0VGV4dC5nZXQoKS5zaWduaW5nU2VydmljZVVuYXZhaWxhYmxlKTsKKwkJCX0KKwkJfQorCQlpZiAoc2lnbmluZ0tleSA9PSBudWxsKSB7CisJCQlzaWduaW5nS2V5ID0gZ3BnQ29uZmlnLmdldFNpZ25pbmdLZXkoKTsKIAkJfQogCQlpZiAoZ3BnU2lnbmVyIGluc3RhbmNlb2YgR3BnT2JqZWN0U2lnbmVyKSB7CiAJCQkoKEdwZ09iamVjdFNpZ25lcikgZ3BnU2lnbmVyKS5zaWduT2JqZWN0KGNvbW1pdCwKQEAgLTYyMywxMiArNjY1LDYgQEAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NPcHRpb25zKFJlcG9zaXRvcnlTdGF0ZSBzdGF0ZSwgUmV2V2FsayBydykKIAkJCXNpZ25Db21taXQgPSBncGdDb25maWcuaXNTaWduQ29tbWl0cygpID8gQm9vbGVhbi5UUlVFCiAJCQkJCTogQm9vbGVhbi5GQUxTRTsKIAkJfQotCQlpZiAoc2lnbmluZ0tleSA9PSBudWxsKSB7Ci0JCQlzaWduaW5nS2V5ID0gZ3BnQ29uZmlnLmdldFNpZ25pbmdLZXkoKTsKLQkJfQotCQlpZiAoZ3BnU2lnbmVyID09IG51bGwpIHsKLQkJCWdwZ1NpZ25lciA9IEdwZ1NpZ25lci5nZXREZWZhdWx0KCk7Ci0JCX0KIAl9CiAKIAlwcml2YXRlIGJvb2xlYW4gaXNNZXJnZUR1cmluZ1JlYmFzZShSZXBvc2l0b3J5U3RhdGUgc3RhdGUpIHsKQEAgLTY1OCw2ICs2OTQsNTcgQEAgcHVibGljIENvbW1pdENvbW1hbmQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewogCX0KIAogCS8qKgorCSAqIFNldHMgdGhlIHtAbGluayBDbGVhbnVwTW9kZX0gdG8gYXBwbHkgdG8gdGhlIGNvbW1pdCBtZXNzYWdlLiBJZiBub3QKKwkgKiBjYWxsZWQsIHtAbGluayBDb21taXRDb21tYW5kfSBhcHBsaWVzIHtAbGluayBDbGVhbnVwTW9kZSNWRVJCQVRJTX0uCisJICoKKwkgKiBAcGFyYW0gbW9kZQorCSAqICAgICAgICAgICAge0BsaW5rIENsZWFudXBNb2RlfSB0byBzZXQKKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgQ29tbWl0Q29tbWFuZCBzZXRDbGVhbnVwTW9kZShATm9uTnVsbCBDbGVhbnVwTW9kZSBtb2RlKSB7CisJCWNoZWNrQ2FsbGFibGUoKTsKKwkJdGhpcy5jbGVhbnVwTW9kZSA9IG1vZGU7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGRlZmF1bHQgY2xlYW4gbW9kZSBpZiB7QGxpbmsgI3NldENsZWFudXBNb2RlKENsZWFudXBNb2RlKQorCSAqIHNldENsZWFudXBNb2RlKENsZWFudXBNb2RlLkRFRkFVTFQpfSBpcyBzZXQgYW5kIGdpdCBjb25maWcKKwkgKiB7QGNvZGUgY29tbWl0LmNsZWFudXAgPSBkZWZhdWx0fSBvciBpcyBub3Qgc2V0LgorCSAqCisJICogQHBhcmFtIHN0cmlwCisJICogICAgICAgICAgICBpZiB7QGNvZGUgdHJ1ZX0sIGRlZmF1bHQgdG8ge0BsaW5rIENsZWFudXBNb2RlI1NUUklQfTsKKwkgKiAgICAgICAgICAgIG90aGVyd2lzZSBkZWZhdWx0IHRvIHtAbGluayBDbGVhbnVwTW9kZSNXSElURVNQQUNFfQorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBDb21taXRDb21tYW5kIHNldERlZmF1bHRDbGVhbihib29sZWFuIHN0cmlwKSB7CisJCWNoZWNrQ2FsbGFibGUoKTsKKwkJdGhpcy5jbGVhbkRlZmF1bHRJc1N0cmlwID0gc3RyaXA7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIHRvIGFwcGx5IHdoZW4gY2xlYW5pbmcgYSBjb21taXQgbWVzc2FnZS4gSWYKKwkgKiB7QGNvZGUgbnVsbH0gKHRoZSBkZWZhdWx0KSBhbmQgdGhlIHtAbGluayAjc2V0Q2xlYW51cE1vZGUoQ2xlYW51cE1vZGUpCisJICogY2xlYW4tdXAgbW9kZX0gaXMge0BsaW5rIENsZWFudXBNb2RlI1NUUklQfSBvcgorCSAqIHtAbGluayBDbGVhbnVwTW9kZSNTQ0lTU09SU30sIHRoZSB2YWx1ZSBvZiBnaXQgY29uZmlnCisJICoge0Bjb2RlIGNvcmUuY29tbWVudENoYXJ9IHdpbGwgYmUgdXNlZC4KKwkgKgorCSAqIEBwYXJhbSBjb21tZW50Q2hhcgorCSAqICAgICAgICAgICAgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLCBvciB7QGNvZGUgbnVsbH0gdG8gdXNlIHRoZSB2YWx1ZSBmcm9tCisJICogICAgICAgICAgICB0aGUgZ2l0IGNvbmZpZworCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBDb21taXRDb21tYW5kIHNldENvbW1lbnRDaGFyYWN0ZXIoQ2hhcmFjdGVyIGNvbW1lbnRDaGFyKSB7CisJCWNoZWNrQ2FsbGFibGUoKTsKKwkJdGhpcy5jb21tZW50Q2hhciA9IGNvbW1lbnRDaGFyOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKIAkgKiBTZXQgd2hldGhlciB0byBhbGxvdyB0byBjcmVhdGUgYW4gZW1wdHkgY29tbWl0CiAJICoKIAkgKiBAcGFyYW0gYWxsb3dFbXB0eQpAQCAtODA2LDcgKzg5Myw3IEBAIHB1YmxpYyBDb21taXRDb21tYW5kIHNldEFsbChib29sZWFuIGFsbCkgewogCSAqIGNvbW1hbmQgbGluZS4KIAkgKgogCSAqIEBwYXJhbSBhbWVuZAotCSAqICAgICAgICAgICAgd2hldGhlciB0byBhbW1lbmQgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2gKKwkgKiAgICAgICAgICAgIHdoZXRoZXIgdG8gYW1lbmQgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2gKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwogCXB1YmxpYyBDb21taXRDb21tYW5kIHNldEFtZW5kKGJvb2xlYW4gYW1lbmQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKaW5kZXggMWU1MjRmYS4uODA1YTg4NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKQEAgLTExLDYgKzExLDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9SRUZTOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9UQUdTOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UeXBlZENvbmZpZ0dldHRlci5VTlNFVF9JTlQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtMzMsNiArMzQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoLkZpbGVOYW1lTWF0Y2hlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFiYnJldkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwpAQCAtODksNiArOTEsMTEgQEAgcHVibGljIGNsYXNzIERlc2NyaWJlQ29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8U3RyaW5nPiB7CiAJcHJpdmF0ZSBib29sZWFuIGFsd2F5czsKIAogCS8qKgorCSAqIFRoZSBwcmVmaXggbGVuZ3RoIHRvIHVzZSB3aGVuIGFiYnJldmlhdGluZyBhIGNvbW1pdCBoYXNoLgorCSAqLworCXByaXZhdGUgaW50IGFiYnJldiA9IFVOU0VUX0lOVDsKKworCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBEZXNjcmliZUNvbW1hbmQuCiAJICoKIAkgKiBAcGFyYW0gcmVwbwpAQCAtMjA1LDEyICsyMTIsMzMgQEAgcHVibGljIERlc2NyaWJlQ29tbWFuZCBzZXRBbHdheXMoYm9vbGVhbiBhbHdheXMpIHsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCisJLyoqCisJICogU2V0cyB0aGUgcHJlZml4IGxlbmd0aCB0byB1c2Ugd2hlbiBhYmJyZXZpYXRpbmcgYW4gb2JqZWN0IFNIQS0xLgorCSAqCisJICogQHBhcmFtIGFiYnJldgorCSAqICAgICAgICAgICAgbWluaW11bSBsZW5ndGggb2YgdGhlIGFiYnJldmlhdGVkIHN0cmluZy4gTXVzdCBiZSBpbiB0aGUgcmFuZ2UKKwkgKiAgICAgICAgICAgIFt7QHZhbHVlIEFiYnJldkNvbmZpZyNNSU5fQUJCUkVWfSwKKwkgKiAgICAgICAgICAgIHtAdmFsdWUgQ29uc3RhbnRzI09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIfV0uCisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIERlc2NyaWJlQ29tbWFuZCBzZXRBYmJyZXYoaW50IGFiYnJldikgeworCQlpZiAoYWJicmV2ID09IDApIHsKKwkJCXRoaXMuYWJicmV2ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYWJicmV2ID0gQWJicmV2Q29uZmlnLmNhcEFiYnJldihhYmJyZXYpOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKwogCXByaXZhdGUgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbihSZWYgdGFnLCBpbnQgZGVwdGgsIE9iamVjdElkIHRpcCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdHJpbmcuZm9ybWF0KAotCQkJCSIlcy0lZC1nJXMiLCBmb3JtYXRSZWZOYW1lKHRhZy5nZXROYW1lKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJSW50ZWdlci52YWx1ZU9mKGRlcHRoKSwgdy5nZXRPYmplY3RSZWFkZXIoKS5hYmJyZXZpYXRlKHRpcCkKLQkJCQkJCS5uYW1lKCkpOworCQlpZiAoYWJicmV2ID09IDApIHsKKwkJCXJldHVybiBmb3JtYXRSZWZOYW1lKHRhZy5nZXROYW1lKCkpOworCQl9CisJCXJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy0lZC1nJXMiLCBmb3JtYXRSZWZOYW1lKHRhZy5nZXROYW1lKCkpLCAvLyROT04tTkxTLTEkCisJCQkJSW50ZWdlci52YWx1ZU9mKGRlcHRoKSwKKwkJCQl3LmdldE9iamVjdFJlYWRlcigpLmFiYnJldmlhdGUodGlwLCBhYmJyZXYpLm5hbWUoKSk7CiAJfQogCiAJLyoqCkBAIC0zMDIsNiArMzMwLDkgQEAgcHVibGljIFN0cmluZyBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKIAkJCQlzZXRUYXJnZXQoQ29uc3RhbnRzLkhFQUQpOwogCQkJfQorCQkJaWYgKGFiYnJldiA9PSBVTlNFVF9JTlQpIHsKKwkJCQlhYmJyZXYgPSBBYmJyZXZDb25maWcucGFyc2VGcm9tQ29uZmlnKHJlcG8pLmdldCgpOworCQkJfQogCiAJCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQogCQkJCQkuZ2V0UmVmc0J5UHJlZml4KHVzZUFsbCA/IFJfUkVGUyA6IFJfVEFHUyk7CkBAIC00MTMsNyArNDQ0LDEyIEBAIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCB0aXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkJCS8vIGlmIGFsbCB0aGUgbm9kZXMgYXJlIGRvbWluYXRlZCBieSBhbGwgdGhlIHRhZ3MsIHRoZSB3YWxrIHN0b3BzCiAJCQlpZiAoY2FuZGlkYXRlcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gYWx3YXlzID8gdy5nZXRPYmplY3RSZWFkZXIoKS5hYmJyZXZpYXRlKHRhcmdldCkubmFtZSgpIDogbnVsbDsKKwkJCQlyZXR1cm4gYWx3YXlzCisJCQkJCQk/IHcuZ2V0T2JqZWN0UmVhZGVyKCkKKwkJCQkJCQkJLmFiYnJldmlhdGUodGFyZ2V0LAorCQkJCQkJCQkJCUFiYnJldkNvbmZpZy5jYXBBYmJyZXYoYWJicmV2KSkKKwkJCQkJCQkJLm5hbWUoKQorCQkJCQkJOiBudWxsOwogCQkJfQogCiAJCQlDYW5kaWRhdGUgYmVzdCA9IENvbGxlY3Rpb25zLm1pbihjYW5kaWRhdGVzLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTHNSZW1vdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mc1JlbW90ZUNvbW1hbmQuamF2YQppbmRleCAwYzY5MTA2Li5jMzQxNTU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mc1JlbW90ZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mc1JlbW90ZUNvbW1hbmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIwMjAgQ2hyaXN0b3BoIEJyaWxsIDxlZ29yZTkxMUBlZ29yZTkxMS5kZT4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDIyIENocmlzdG9waCBCcmlsbCA8ZWdvcmU5MTFAZWdvcmU5MTEuZGU+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTksNiArOSw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjAsOCArMjEsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkludmFsaWRSZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwpAQCAtMzAsNiArMzEsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZlNwZWM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcmxDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIAogLyoqCiAgKiBUaGUgbHMtcmVtb3RlIGNvbW1hbmQKQEAgLTE1Myw3ICsxNTYsNyBAQCBwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gZXhlY3V0ZSgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sCiAKIAkJdHJ5IChUcmFuc3BvcnQgdHJhbnNwb3J0ID0gcmVwbyAhPSBudWxsCiAJCQkJPyBUcmFuc3BvcnQub3BlbihyZXBvLCByZW1vdGUpCi0JCQkJOiBUcmFuc3BvcnQub3BlbihuZXcgVVJJaXNoKHJlbW90ZSkpKSB7CisJCQkJOiBUcmFuc3BvcnQub3BlbihuZXcgVVJJaXNoKHRyYW5zbGF0ZShyZW1vdGUpKSkpIHsKIAkJCXRyYW5zcG9ydC5zZXRPcHRpb25VcGxvYWRQYWNrKHVwbG9hZFBhY2spOwogCQkJY29uZmlndXJlKHRyYW5zcG9ydCk7CiAJCQlDb2xsZWN0aW9uPFJlZlNwZWM+IHJlZlNwZWNzID0gbmV3IEFycmF5TGlzdDw+KDEpOwpAQCAtMTg1LDExICsxODgsMTYgQEAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZWY+IGV4ZWN1dGUoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLAogCQkJdGhyb3cgbmV3IEpHaXRJbnRlcm5hbEV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuZXhjZXB0aW9uQ2F1Z2h0RHVyaW5nRXhlY3V0aW9uT2ZMc1JlbW90ZUNvbW1hbmQsCiAJCQkJCWUpOwotCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb24oCi0JCQkJCWUuZ2V0TWVzc2FnZSgpLAotCQkJCQllKTsKKwkJCQkJZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9CiAJfQogCisJcHJpdmF0ZSBTdHJpbmcgdHJhbnNsYXRlKFN0cmluZyB1cmkpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworCQlVcmxDb25maWcgdXJscyA9IG5ldyBVcmxDb25maWcoCisJCQkJU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0VXNlckNvbmZpZygpKTsKKwkJcmV0dXJuIHVybHMucmVwbGFjZSh1cmkpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKaW5kZXggZWY1NmQ4MC4uZWQ0YTUzNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50cy5Xb3JraW5nVHJlZU1vZGlmaWVkRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnLkNvbmZpZ0VudW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CkBAIC00MDQsOCArNDA1LDExIEBAIHB1YmxpYyBNZXJnZVJlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgTm9IZWFkRXhjZXB0aW9uLAogCQkJCQkJCU1lcmdlU3RhdHVzLkZBSUxFRCwgbWVyZ2VTdHJhdGVneSwgbG93TGV2ZWxSZXN1bHRzLAogCQkJCQkJCWZhaWxpbmdQYXRocywgbnVsbCk7CiAJCQkJfQorCQkJCUNvbW1pdENvbmZpZyBjZmcgPSByZXBvLmdldENvbmZpZygpLmdldChDb21taXRDb25maWcuS0VZKTsKKwkJCQljaGFyIGNvbW1lbnRDaGFyID0gY2ZnLmdldENvbW1lbnRDaGFyKG1lc3NhZ2UpOwogCQkJCVN0cmluZyBtZXJnZU1lc3NhZ2VXaXRoQ29uZmxpY3RzID0gbmV3IE1lcmdlTWVzc2FnZUZvcm1hdHRlcigpCi0JCQkJCQkuZm9ybWF0V2l0aENvbmZsaWN0cyhtZXJnZU1lc3NhZ2UsIHVubWVyZ2VkUGF0aHMpOworCQkJCQkJLmZvcm1hdFdpdGhDb25mbGljdHMobWVyZ2VNZXNzYWdlLCB1bm1lcmdlZFBhdGhzLAorCQkJCQkJCQljb21tZW50Q2hhcik7CiAJCQkJcmVwby53cml0ZU1lcmdlQ29tbWl0TXNnKG1lcmdlTWVzc2FnZVdpdGhDb25mbGljdHMpOwogCQkJCXJldHVybiBuZXcgTWVyZ2VSZXN1bHQobnVsbCwgbWVyZ2VyLmdldEJhc2VDb21taXRJZCgpLAogCQkJCQkJbmV3IE9iamVjdElkW10geyBoZWFkQ29tbWl0LmdldElkKCksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YQppbmRleCBhYTVhNjM0Li4wODM1M2RmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwLCBDaHJpcyBBbmlzemN6eWsgPGNhbmlzemN6eWtAZ21haWwuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjIgQ2hyaXMgQW5pc3pjenlrIDxjYW5pc3pjenlrQGdtYWlsLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsNyArMjEsOSBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuRGV0YWNoZWRIZWFkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkludmFsaWRSZWZOYW1lRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5JbnZhbGlkUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uOwpAQCAtMjksMTEgKzMxLDE2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVG9vTGFyZ2VQYWNrRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkJyYW5jaENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5OdWxsUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWcuUHVzaERlZmF1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUHVzaFJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZMZWFzZVNwZWM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmU3BlYzsKQEAgLTUyLDcgKzU5LDcgQEAKIHB1YmxpYyBjbGFzcyBQdXNoQ29tbWFuZCBleHRlbmRzCiAJCVRyYW5zcG9ydENvbW1hbmQ8UHVzaENvbW1hbmQsIEl0ZXJhYmxlPFB1c2hSZXN1bHQ+PiB7CiAKLQlwcml2YXRlIFN0cmluZyByZW1vdGUgPSBDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTsKKwlwcml2YXRlIFN0cmluZyByZW1vdGU7CiAKIAlwcml2YXRlIGZpbmFsIExpc3Q8UmVmU3BlYz4gcmVmU3BlY3M7CiAKQEAgLTcxLDYgKzc4LDEwIEBAIHB1YmxpYyBjbGFzcyBQdXNoQ29tbWFuZCBleHRlbmRzCiAKIAlwcml2YXRlIExpc3Q8U3RyaW5nPiBwdXNoT3B0aW9uczsKIAorCS8vIExlZ2FjeSBiZWhhdmlvciBhcyBkZWZhdWx0LiBVc2Ugc2V0UHVzaERlZmF1bHQobnVsbCkgdG8gZGV0ZXJtaW5lIHRoZQorCS8vIHZhbHVlIGZyb20gdGhlIGdpdCBjb25maWcuCisJcHJpdmF0ZSBQdXNoRGVmYXVsdCBwdXNoRGVmYXVsdCA9IFB1c2hEZWZhdWx0LkNVUlJFTlQ7CisKIAkvKioKIAkgKiA8cD4KIAkgKiBDb25zdHJ1Y3RvciBmb3IgUHVzaENvbW1hbmQuCkBAIC05OCwxOSArMTA5LDIwIEBAIHB1YmxpYyBJdGVyYWJsZTxQdXNoUmVzdWx0PiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwKIAkJCUludmFsaWRSZW1vdGVFeGNlcHRpb24sCiAJCQlvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJY2hlY2tDYWxsYWJsZSgpOworCQlzZXRDYWxsYWJsZShmYWxzZSk7CiAKIAkJQXJyYXlMaXN0PFB1c2hSZXN1bHQ+IHB1c2hSZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KDMpOwogCiAJCXRyeSB7CisJCQlDb25maWcgY29uZmlnID0gcmVwby5nZXRDb25maWcoKTsKKwkJCXJlbW90ZSA9IGRldGVybWluZVJlbW90ZShjb25maWcsIHJlbW90ZSk7CiAJCQlpZiAocmVmU3BlY3MuaXNFbXB0eSgpKSB7Ci0JCQkJUmVtb3RlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcocmVwby5nZXRDb25maWcoKSwKKwkJCQlSZW1vdGVDb25maWcgcmMgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywKIAkJCQkJCWdldFJlbW90ZSgpKTsKLQkJCQlyZWZTcGVjcy5hZGRBbGwoY29uZmlnLmdldFB1c2hSZWZTcGVjcygpKTsKLQkJCX0KLQkJCWlmIChyZWZTcGVjcy5pc0VtcHR5KCkpIHsKLQkJCQlSZWYgaGVhZCA9IHJlcG8uZXhhY3RSZWYoQ29uc3RhbnRzLkhFQUQpOwotCQkJCWlmIChoZWFkICE9IG51bGwgJiYgaGVhZC5pc1N5bWJvbGljKCkpCi0JCQkJCXJlZlNwZWNzLmFkZChuZXcgUmVmU3BlYyhoZWFkLmdldExlYWYoKS5nZXROYW1lKCkpKTsKKwkJCQlyZWZTcGVjcy5hZGRBbGwocmMuZ2V0UHVzaFJlZlNwZWNzKCkpOworCQkJCWlmIChyZWZTcGVjcy5pc0VtcHR5KCkpIHsKKwkJCQkJZGV0ZXJtaW5lRGVmYXVsdFJlZlNwZWNzKGNvbmZpZyk7CisJCQkJfQogCQkJfQogCiAJCQlpZiAoZm9yY2UpIHsKQEAgLTExOCw4ICsxMzAsOCBAQCBwdWJsaWMgSXRlcmFibGU8UHVzaFJlc3VsdD4gY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sCiAJCQkJCXJlZlNwZWNzLnNldChpLCByZWZTcGVjcy5nZXQoaSkuc2V0Rm9yY2VVcGRhdGUodHJ1ZSkpOwogCQkJfQogCi0JCQlmaW5hbCBMaXN0PFRyYW5zcG9ydD4gdHJhbnNwb3J0czsKLQkJCXRyYW5zcG9ydHMgPSBUcmFuc3BvcnQub3BlbkFsbChyZXBvLCByZW1vdGUsIFRyYW5zcG9ydC5PcGVyYXRpb24uUFVTSCk7CisJCQlMaXN0PFRyYW5zcG9ydD4gdHJhbnNwb3J0cyA9IFRyYW5zcG9ydC5vcGVuQWxsKHJlcG8sIHJlbW90ZSwKKwkJCQkJVHJhbnNwb3J0Lk9wZXJhdGlvbi5QVVNIKTsKIAkJCWZvciAoQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gRXhwbGljaXRseSBjbG9zZWQgaW4gZmluYWxseQogCQkJCQlmaW5hbCBUcmFuc3BvcnQgdHJhbnNwb3J0IDogdHJhbnNwb3J0cykgewogCQkJCXRyYW5zcG9ydC5zZXRQdXNoVGhpbih0aGluKTsKQEAgLTE3MSw2ICsxODMsMTAyIEBAIHB1YmxpYyBJdGVyYWJsZTxQdXNoUmVzdWx0PiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwKIAkJcmV0dXJuIHB1c2hSZXN1bHRzOwogCX0KIAorCXByaXZhdGUgU3RyaW5nIGRldGVybWluZVJlbW90ZShDb25maWcgY29uZmlnLCBTdHJpbmcgcmVtb3RlTmFtZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChyZW1vdGVOYW1lICE9IG51bGwpIHsKKwkJCXJldHVybiByZW1vdGVOYW1lOworCQl9CisJCVJlZiBoZWFkID0gcmVwby5leGFjdFJlZihDb25zdGFudHMuSEVBRCk7CisJCVN0cmluZyBlZmZlY3RpdmVSZW1vdGUgPSBudWxsOworCQlCcmFuY2hDb25maWcgYnJhbmNoQ2ZnID0gbnVsbDsKKwkJaWYgKGhlYWQgIT0gbnVsbCAmJiBoZWFkLmlzU3ltYm9saWMoKSkgeworCQkJU3RyaW5nIGN1cnJlbnRCcmFuY2ggPSBoZWFkLmdldExlYWYoKS5nZXROYW1lKCk7CisJCQlicmFuY2hDZmcgPSBuZXcgQnJhbmNoQ29uZmlnKGNvbmZpZywKKwkJCQkJUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZShjdXJyZW50QnJhbmNoKSk7CisJCQllZmZlY3RpdmVSZW1vdGUgPSBicmFuY2hDZmcuZ2V0UHVzaFJlbW90ZSgpOworCQl9CisJCWlmIChlZmZlY3RpdmVSZW1vdGUgPT0gbnVsbCkgeworCQkJZWZmZWN0aXZlUmVtb3RlID0gY29uZmlnLmdldFN0cmluZygKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFVTSF9ERUZBVUxUKTsKKwkJCWlmIChlZmZlY3RpdmVSZW1vdGUgPT0gbnVsbCAmJiBicmFuY2hDZmcgIT0gbnVsbCkgeworCQkJCWVmZmVjdGl2ZVJlbW90ZSA9IGJyYW5jaENmZy5nZXRSZW1vdGUoKTsKKwkJCX0KKwkJfQorCQlpZiAoZWZmZWN0aXZlUmVtb3RlID09IG51bGwpIHsKKwkJCWVmZmVjdGl2ZVJlbW90ZSA9IENvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOworCQl9CisJCXJldHVybiBlZmZlY3RpdmVSZW1vdGU7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q3VycmVudEJyYW5jaCgpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIERldGFjaGVkSGVhZEV4Y2VwdGlvbiB7CisJCVJlZiBoZWFkID0gcmVwby5leGFjdFJlZihDb25zdGFudHMuSEVBRCk7CisJCWlmIChoZWFkICE9IG51bGwgJiYgaGVhZC5pc1N5bWJvbGljKCkpIHsKKwkJCXJldHVybiBoZWFkLmdldExlYWYoKS5nZXROYW1lKCk7CisJCX0KKwkJdGhyb3cgbmV3IERldGFjaGVkSGVhZEV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBkZXRlcm1pbmVEZWZhdWx0UmVmU3BlY3MoQ29uZmlnIGNvbmZpZykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKKwkJaWYgKHB1c2hEZWZhdWx0ID09IG51bGwpIHsKKwkJCXB1c2hEZWZhdWx0ID0gY29uZmlnLmdldChQdXNoQ29uZmlnOjpuZXcpLmdldFB1c2hEZWZhdWx0KCk7CisJCX0KKwkJc3dpdGNoIChwdXNoRGVmYXVsdCkgeworCQljYXNlIENVUlJFTlQ6CisJCQlyZWZTcGVjcy5hZGQobmV3IFJlZlNwZWMoZ2V0Q3VycmVudEJyYW5jaCgpKSk7CisJCQlicmVhazsKKwkJY2FzZSBNQVRDSElORzoKKwkJCXJlZlNwZWNzLmFkZChuZXcgUmVmU3BlYygiOiIpKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgTk9USElORzoKKwkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbigKKwkJCQkJSkdpdFRleHQuZ2V0KCkucHVzaERlZmF1bHROb3RoaW5nKTsKKwkJY2FzZSBTSU1QTEU6CisJCWNhc2UgVVBTVFJFQU06CisJCQlTdHJpbmcgY3VycmVudEJyYW5jaCA9IGdldEN1cnJlbnRCcmFuY2goKTsKKwkJCUJyYW5jaENvbmZpZyBicmFuY2hDZmcgPSBuZXcgQnJhbmNoQ29uZmlnKGNvbmZpZywKKwkJCQkJUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZShjdXJyZW50QnJhbmNoKSk7CisJCQlTdHJpbmcgZmV0Y2hSZW1vdGUgPSBicmFuY2hDZmcuZ2V0UmVtb3RlKCk7CisJCQlpZiAoZmV0Y2hSZW1vdGUgPT0gbnVsbCkgeworCQkJCWZldGNoUmVtb3RlID0gQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CisJCQl9CisJCQlib29sZWFuIGlzVHJpYW5ndWxhciA9ICFmZXRjaFJlbW90ZS5lcXVhbHMocmVtb3RlKTsKKwkJCWlmIChpc1RyaWFuZ3VsYXIpIHsKKwkJCQlpZiAoUHVzaERlZmF1bHQuVVBTVFJFQU0uZXF1YWxzKHB1c2hEZWZhdWx0KSkgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkucHVzaERlZmF1bHRUcmlhbmd1bGFyVXBzdHJlYW0sCisJCQkJCQkJcmVtb3RlLCBmZXRjaFJlbW90ZSkpOworCQkJCX0KKwkJCQkvLyBTdHJhbmdlLCBidXQgY29uc2lzdGVudCB3aXRoIEMgZ2l0OiAic2ltcGxlIiBkb2Vzbid0IGV2ZW4KKwkJCQkvLyBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgY29uZmlndXJlZCB1cHN0cmVhbSwgYW5kIGlmIHNvLCB0aGF0CisJCQkJLy8gaXQgaXMgZXF1YWwgdG8gdGhlIGxvY2FsIGJyYW5jaCBuYW1lLiBJdCBqdXN0IGJlY29tZXMKKwkJCQkvLyAiY3VycmVudCIuCisJCQkJcmVmU3BlY3MuYWRkKG5ldyBSZWZTcGVjKGN1cnJlbnRCcmFuY2gpKTsKKwkJCX0gZWxzZSB7CisJCQkJU3RyaW5nIHRyYWNrZWRCcmFuY2ggPSBicmFuY2hDZmcuZ2V0TWVyZ2UoKTsKKwkJCQlpZiAoYnJhbmNoQ2ZnLmlzUmVtb3RlTG9jYWwoKSB8fCB0cmFja2VkQnJhbmNoID09IG51bGwKKwkJCQkJCXx8ICF0cmFja2VkQnJhbmNoLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5wdXNoRGVmYXVsdE5vVXBzdHJlYW0sCisJCQkJCQkJY3VycmVudEJyYW5jaCkpOworCQkJCX0KKwkJCQlpZiAoUHVzaERlZmF1bHQuU0lNUExFLmVxdWFscyhwdXNoRGVmYXVsdCkKKwkJCQkJCSYmICF0cmFja2VkQnJhbmNoLmVxdWFscyhjdXJyZW50QnJhbmNoKSkgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkucHVzaERlZmF1bHRTaW1wbGUsIGN1cnJlbnRCcmFuY2gsCisJCQkJCQkJdHJhY2tlZEJyYW5jaCkpOworCQkJCX0KKwkJCQlyZWZTcGVjcy5hZGQobmV3IFJlZlNwZWMoY3VycmVudEJyYW5jaCArICc6JyArIHRyYWNrZWRCcmFuY2gpKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGhyb3cgbmV3IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5wdXNoRGVmYXVsdFVua25vd24sIHB1c2hEZWZhdWx0KSk7CisJCX0KKwl9CisKIAkvKioKIAkgKiBUaGUgcmVtb3RlICh1cmkgb3IgbmFtZSkgdXNlZCBmb3IgdGhlIHB1c2ggb3BlcmF0aW9uLiBJZiBubyByZW1vdGUgaXMKIAkgKiBzZXQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDxjb2RlPkNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FPC9jb2RlPiB3aWxsCkBAIC0zMzYsOSArNDQ0LDM3IEBAIHB1YmxpYyBQdXNoQ29tbWFuZCBzZXRSZWZTcGVjcyhMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CiAJfQogCiAJLyoqCisJICogUmV0cmlldmVzIHRoZSB7QGxpbmsgUHVzaERlZmF1bHR9IGN1cnJlbnRseSBzZXQuCisJICoKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUHVzaERlZmF1bHR9LCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IHNldAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUHVzaERlZmF1bHQgZ2V0UHVzaERlZmF1bHQoKSB7CisJCXJldHVybiBwdXNoRGVmYXVsdDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIGFuIGV4cGxpY2l0IHtAbGluayBQdXNoRGVmYXVsdH0uIFRoZSBkZWZhdWx0IHVzZWQgaWYgdGhpcyBpcyBub3QKKwkgKiBjYWxsZWQgaXMge0BsaW5rIFB1c2hEZWZhdWx0I0NVUlJFTlR9IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2l0aAorCSAqIGVhcmxpZXIgSkdpdCB2ZXJzaW9ucy4KKwkgKgorCSAqIEBwYXJhbSBwdXNoRGVmYXVsdAorCSAqICAgICAgICAgICAge0BsaW5rIFB1c2hEZWZhdWx0fSB0byBzZXQ7IGlmIHtAY29kZSBudWxsfSB0aGUgdmFsdWUgZGVmaW5lZAorCSAqICAgICAgICAgICAgaW4gdGhlIGdpdCBjb25maWcgd2lsbCBiZSB1c2VkLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFB1c2hDb21tYW5kIHNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0IHB1c2hEZWZhdWx0KSB7CisJCWNoZWNrQ2FsbGFibGUoKTsKKwkJdGhpcy5wdXNoRGVmYXVsdCA9IHB1c2hEZWZhdWx0OworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKIAkgKiBQdXNoIGFsbCBicmFuY2hlcyB1bmRlciByZWZzL2hlYWRzLyouCiAJICoKLQkgKiBAcmV0dXJuIHtjb2RlIHRoaXN9CisJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KIAlwdWJsaWMgUHVzaENvbW1hbmQgc2V0UHVzaEFsbCgpIHsKIAkJcmVmU3BlY3MuYWRkKFRyYW5zcG9ydC5SRUZTUEVDX1BVU0hfQUxMKTsKQEAgLTM0OCw3ICs0ODQsNyBAQCBwdWJsaWMgUHVzaENvbW1hbmQgc2V0UHVzaEFsbCgpIHsKIAkvKioKIAkgKiBQdXNoIGFsbCB0YWdzIHVuZGVyIHJlZnMvdGFncy8qLgogCSAqCi0JICogQHJldHVybiB7Y29kZSB0aGlzfQorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCiAJcHVibGljIFB1c2hDb21tYW5kIHNldFB1c2hUYWdzKCkgewogCQlyZWZTcGVjcy5hZGQoVHJhbnNwb3J0LlJFRlNQRUNfVEFHUyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEKaW5kZXggYTI2ZmZjMi4uNGUwZDlkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlJlYmFzZVJlc3VsdC5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuUmVzZXRDb21tYW5kLlJlc2V0VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQ2hlY2tvdXRDb25mbGljdEV4Y2VwdGlvbjsKQEAgLTUyLDYgKzUzLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFiYnJldmlhdGVkT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0Q29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZy5DbGVhbnVwTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CkBAIC0yMDUsNiArMjA4LDggQEAgcHVibGljIGVudW0gT3BlcmF0aW9uIHsKIAogCXByaXZhdGUgSW50ZXJhY3RpdmVIYW5kbGVyIGludGVyYWN0aXZlSGFuZGxlcjsKIAorCXByaXZhdGUgQ29tbWl0Q29uZmlnIGNvbW1pdENvbmZpZzsKKwogCXByaXZhdGUgYm9vbGVhbiBzdG9wQWZ0ZXJJbml0aWFsaXphdGlvbiA9IGZhbHNlOwogCiAJcHJpdmF0ZSBSZXZDb21taXQgbmV3SGVhZDsKQEAgLTI0Niw2ICsyNTEsNyBAQCBwdWJsaWMgUmViYXNlUmVzdWx0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBOb0hlYWRFeGNlcHRpb24sCiAJCWxhc3RTdGVwV2FzRm9yd2FyZCA9IGZhbHNlOwogCQljaGVja0NhbGxhYmxlKCk7CiAJCWNoZWNrUGFyYW1ldGVycygpOworCQljb21taXRDb25maWcgPSByZXBvLmdldENvbmZpZygpLmdldChDb21taXRDb25maWcuS0VZKTsKIAkJdHJ5IHsKIAkJCXN3aXRjaCAob3BlcmF0aW9uKSB7CiAJCQljYXNlIEFCT1JUOgpAQCAtNDQxLDExICs0NDcsMTcgQEAgcHJpdmF0ZSBSZWJhc2VSZXN1bHQgcHJvY2Vzc1N0ZXAoUmViYXNlVG9kb0xpbmUgc3RlcCwgYm9vbGVhbiBzaG91bGRQaWNrKQogCQkJcmV0dXJuIG51bGw7IC8vIGNvbnRpbnVlIHJlYmFzZSBwcm9jZXNzIG9uIHBpY2sgY29tbWFuZAogCQljYXNlIFJFV09SRDoKIAkJCVN0cmluZyBvbGRNZXNzYWdlID0gY29tbWl0VG9QaWNrLmdldEZ1bGxNZXNzYWdlKCk7Ci0JCQlTdHJpbmcgbmV3TWVzc2FnZSA9IGludGVyYWN0aXZlSGFuZGxlcgotCQkJCQkubW9kaWZ5Q29tbWl0TWVzc2FnZShvbGRNZXNzYWdlKTsKKwkJCUNsZWFudXBNb2RlIG1vZGUgPSBjb21taXRDb25maWcucmVzb2x2ZShDbGVhbnVwTW9kZS5ERUZBVUxULCB0cnVlKTsKKwkJCWJvb2xlYW5bXSBkb0NoYW5nZUlkID0geyBmYWxzZSB9OworCQkJU3RyaW5nIG5ld01lc3NhZ2UgPSBlZGl0Q29tbWl0TWVzc2FnZShkb0NoYW5nZUlkLCBvbGRNZXNzYWdlLCBtb2RlLAorCQkJCQljb21taXRDb25maWcuZ2V0Q29tbWVudENoYXIob2xkTWVzc2FnZSkpOwogCQkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChyZXBvKSkgewotCQkJCW5ld0hlYWQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShuZXdNZXNzYWdlKS5zZXRBbWVuZCh0cnVlKQotCQkJCQkJLnNldE5vVmVyaWZ5KHRydWUpLmNhbGwoKTsKKwkJCQluZXdIZWFkID0gZ2l0LmNvbW1pdCgpCisJCQkJCQkuc2V0TWVzc2FnZShuZXdNZXNzYWdlKQorCQkJCQkJLnNldEFtZW5kKHRydWUpCisJCQkJCQkuc2V0Tm9WZXJpZnkodHJ1ZSkKKwkJCQkJCS5zZXRJbnNlcnRDaGFuZ2VJZChkb0NoYW5nZUlkWzBdKQorCQkJCQkJLmNhbGwoKTsKIAkJCX0KIAkJCXJldHVybiBudWxsOwogCQljYXNlIEVESVQ6CkBAIC00NjAsMTcgKzQ3Miw0OSBAQCBwcml2YXRlIFJlYmFzZVJlc3VsdCBwcm9jZXNzU3RlcChSZWJhc2VUb2RvTGluZSBzdGVwLCBib29sZWFuIHNob3VsZFBpY2spCiAJCQlyZXNldFNvZnRUb1BhcmVudCgpOwogCQkJTGlzdDxSZWJhc2VUb2RvTGluZT4gc3RlcHMgPSByZXBvLnJlYWRSZWJhc2VUb2RvKAogCQkJCQlyZWJhc2VTdGF0ZS5nZXRQYXRoKEdJVF9SRUJBU0VfVE9ETyksIGZhbHNlKTsKLQkJCVJlYmFzZVRvZG9MaW5lIG5leHRTdGVwID0gc3RlcHMuaXNFbXB0eSgpID8gbnVsbCA6IHN0ZXBzLmdldCgwKTsKKwkJCWJvb2xlYW4gaXNMYXN0ID0gc3RlcHMuaXNFbXB0eSgpOworCQkJaWYgKCFpc0xhc3QpIHsKKwkJCQlzd2l0Y2ggKHN0ZXBzLmdldCgwKS5nZXRBY3Rpb24oKSkgeworCQkJCWNhc2UgRklYVVA6CisJCQkJY2FzZSBTUVVBU0g6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWlzTGFzdCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KIAkJCUZpbGUgbWVzc2FnZUZpeHVwRmlsZSA9IHJlYmFzZVN0YXRlLmdldEZpbGUoTUVTU0FHRV9GSVhVUCk7CiAJCQlGaWxlIG1lc3NhZ2VTcXVhc2hGaWxlID0gcmViYXNlU3RhdGUuZ2V0RmlsZShNRVNTQUdFX1NRVUFTSCk7Ci0JCQlpZiAoaXNTcXVhc2ggJiYgbWVzc2FnZUZpeHVwRmlsZS5leGlzdHMoKSkKKwkJCWlmIChpc1NxdWFzaCAmJiBtZXNzYWdlRml4dXBGaWxlLmV4aXN0cygpKSB7CiAJCQkJbWVzc2FnZUZpeHVwRmlsZS5kZWxldGUoKTsKLQkJCW5ld0hlYWQgPSBkb1NxdWFzaEZpeHVwKGlzU3F1YXNoLCBjb21taXRUb1BpY2ssIG5leHRTdGVwLAorCQkJfQorCQkJbmV3SGVhZCA9IGRvU3F1YXNoRml4dXAoaXNTcXVhc2gsIGNvbW1pdFRvUGljaywgaXNMYXN0LAogCQkJCQltZXNzYWdlRml4dXBGaWxlLCBtZXNzYWdlU3F1YXNoRmlsZSk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCisJcHJpdmF0ZSBTdHJpbmcgZWRpdENvbW1pdE1lc3NhZ2UoYm9vbGVhbltdIGRvQ2hhbmdlSWQsIFN0cmluZyBtZXNzYWdlLAorCQkJQE5vbk51bGwgQ2xlYW51cE1vZGUgbW9kZSwgY2hhciBjb21tZW50Q2hhcikgeworCQlTdHJpbmcgbmV3TWVzc2FnZTsKKwkJQ29tbWl0Q29uZmlnLkNsZWFudXBNb2RlIGNsZWFudXA7CisJCWlmIChpbnRlcmFjdGl2ZUhhbmRsZXIgaW5zdGFuY2VvZiBJbnRlcmFjdGl2ZUhhbmRsZXIyKSB7CisJCQlJbnRlcmFjdGl2ZUhhbmRsZXIyLk1vZGlmeVJlc3VsdCBtb2RpZmljYXRpb24gPSAoKEludGVyYWN0aXZlSGFuZGxlcjIpIGludGVyYWN0aXZlSGFuZGxlcikKKwkJCQkJLmVkaXRDb21taXRNZXNzYWdlKG1lc3NhZ2UsIG1vZGUsIGNvbW1lbnRDaGFyKTsKKwkJCW5ld01lc3NhZ2UgPSBtb2RpZmljYXRpb24uZ2V0TWVzc2FnZSgpOworCQkJY2xlYW51cCA9IG1vZGlmaWNhdGlvbi5nZXRDbGVhbnVwTW9kZSgpOworCQkJaWYgKENsZWFudXBNb2RlLkRFRkFVTFQuZXF1YWxzKGNsZWFudXApKSB7CisJCQkJY2xlYW51cCA9IG1vZGU7CisJCQl9CisJCQlkb0NoYW5nZUlkWzBdID0gbW9kaWZpY2F0aW9uLnNob3VsZEFkZENoYW5nZUlkKCk7CisJCX0gZWxzZSB7CisJCQluZXdNZXNzYWdlID0gaW50ZXJhY3RpdmVIYW5kbGVyLm1vZGlmeUNvbW1pdE1lc3NhZ2UobWVzc2FnZSk7CisJCQljbGVhbnVwID0gQ29tbWl0Q29uZmlnLkNsZWFudXBNb2RlLlNUUklQOworCQkJZG9DaGFuZ2VJZFswXSA9IGZhbHNlOworCQl9CisJCXJldHVybiBDb21taXRDb25maWcuY2xlYW5UZXh0KG5ld01lc3NhZ2UsIGNsZWFudXAsIGNvbW1lbnRDaGFyKTsKKwl9CisKIAlwcml2YXRlIFJlYmFzZVJlc3VsdCBjaGVycnlQaWNrQ29tbWl0KFJldkNvbW1pdCBjb21taXRUb1BpY2spCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvbiwgTm9NZXNzYWdlRXhjZXB0aW9uLAogCQkJVW5tZXJnZWRQYXRoc0V4Y2VwdGlvbiwgQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbiwKQEAgLTcwNyw3ICs3NTEsNyBAQCBwcml2YXRlIHZvaWQgY2hlY2tTdGVwcyhMaXN0PFJlYmFzZVRvZG9MaW5lPiBzdGVwcykKIAl9CiAKIAlwcml2YXRlIFJldkNvbW1pdCBkb1NxdWFzaEZpeHVwKGJvb2xlYW4gaXNTcXVhc2gsIFJldkNvbW1pdCBjb21taXRUb1BpY2ssCi0JCQlSZWJhc2VUb2RvTGluZSBuZXh0U3RlcCwgRmlsZSBtZXNzYWdlRml4dXAsIEZpbGUgbWVzc2FnZVNxdWFzaCkKKwkJCWJvb2xlYW4gaXNMYXN0LCBGaWxlIG1lc3NhZ2VGaXh1cCwgRmlsZSBtZXNzYWdlU3F1YXNoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24gewogCiAJCWlmICghbWVzc2FnZVNxdWFzaC5leGlzdHMoKSkgewpAQCAtNzE3LDI0ICs3NjEsMjAgQEAgcHJpdmF0ZSBSZXZDb21taXQgZG9TcXVhc2hGaXh1cChib29sZWFuIGlzU3F1YXNoLCBSZXZDb21taXQgY29tbWl0VG9QaWNrLAogCiAJCQlpbml0aWFsaXplU3F1YXNoRml4dXBGaWxlKE1FU1NBR0VfU1FVQVNILAogCQkJCQlwcmV2aW91c0NvbW1pdC5nZXRGdWxsTWVzc2FnZSgpKTsKLQkJCWlmICghaXNTcXVhc2gpCi0JCQkJaW5pdGlhbGl6ZVNxdWFzaEZpeHVwRmlsZShNRVNTQUdFX0ZJWFVQLAotCQkJCQlwcmV2aW91c0NvbW1pdC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJCWlmICghaXNTcXVhc2gpIHsKKwkJCQlyZWJhc2VTdGF0ZS5jcmVhdGVGaWxlKE1FU1NBR0VfRklYVVAsCisJCQkJCQlwcmV2aW91c0NvbW1pdC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJCX0KIAkJfQotCQlTdHJpbmcgY3VyclNxdWFzaE1lc3NhZ2UgPSByZWJhc2VTdGF0ZQotCQkJCS5yZWFkRmlsZShNRVNTQUdFX1NRVUFTSCk7CisJCVN0cmluZyBjdXJyU3F1YXNoTWVzc2FnZSA9IHJlYmFzZVN0YXRlLnJlYWRGaWxlKE1FU1NBR0VfU1FVQVNIKTsKIAogCQlpbnQgY291bnQgPSBwYXJzZVNxdWFzaEZpeHVwU2VxdWVuY2VDb3VudChjdXJyU3F1YXNoTWVzc2FnZSkgKyAxOwogCiAJCVN0cmluZyBjb250ZW50ID0gY29tcG9zZVNxdWFzaE1lc3NhZ2UoaXNTcXVhc2gsCiAJCQkJY29tbWl0VG9QaWNrLCBjdXJyU3F1YXNoTWVzc2FnZSwgY291bnQpOwogCQlyZWJhc2VTdGF0ZS5jcmVhdGVGaWxlKE1FU1NBR0VfU1FVQVNILCBjb250ZW50KTsKLQkJaWYgKG1lc3NhZ2VGaXh1cC5leGlzdHMoKSkKLQkJCXJlYmFzZVN0YXRlLmNyZWF0ZUZpbGUoTUVTU0FHRV9GSVhVUCwgY29udGVudCk7CiAKLQkJcmV0dXJuIHNxdWFzaEludG9QcmV2aW91cygKLQkJCQkhbWVzc2FnZUZpeHVwLmV4aXN0cygpLAotCQkJCW5leHRTdGVwKTsKKwkJcmV0dXJuIHNxdWFzaEludG9QcmV2aW91cyghbWVzc2FnZUZpeHVwLmV4aXN0cygpLCBpc0xhc3QpOwogCX0KIAogCXByaXZhdGUgdm9pZCByZXNldFNvZnRUb1BhcmVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwKQEAgLTc1NiwyNiArNzk2LDMxIEBAIHByaXZhdGUgdm9pZCByZXNldFNvZnRUb1BhcmVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAl9CiAKIAlwcml2YXRlIFJldkNvbW1pdCBzcXVhc2hJbnRvUHJldmlvdXMoYm9vbGVhbiBzZXF1ZW5jZUNvbnRhaW5zU3F1YXNoLAotCQkJUmViYXNlVG9kb0xpbmUgbmV4dFN0ZXApCisJCQlib29sZWFuIGlzTGFzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKIAkJUmV2Q29tbWl0IHJldE5ld0hlYWQ7Ci0JCVN0cmluZyBjb21taXRNZXNzYWdlID0gcmViYXNlU3RhdGUKLQkJCQkucmVhZEZpbGUoTUVTU0FHRV9TUVVBU0gpOwotCisJCVN0cmluZyBjb21taXRNZXNzYWdlOworCQlpZiAoIWlzTGFzdCB8fCBzZXF1ZW5jZUNvbnRhaW5zU3F1YXNoKSB7CisJCQljb21taXRNZXNzYWdlID0gcmViYXNlU3RhdGUucmVhZEZpbGUoTUVTU0FHRV9TUVVBU0gpOworCQl9IGVsc2UgeworCQkJY29tbWl0TWVzc2FnZSA9IHJlYmFzZVN0YXRlLnJlYWRGaWxlKE1FU1NBR0VfRklYVVApOworCQl9CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQocmVwbykpIHsKLQkJCWlmIChuZXh0U3RlcCA9PSBudWxsIHx8ICgobmV4dFN0ZXAuZ2V0QWN0aW9uKCkgIT0gQWN0aW9uLkZJWFVQKQotCQkJCQkmJiAobmV4dFN0ZXAuZ2V0QWN0aW9uKCkgIT0gQWN0aW9uLlNRVUFTSCkpKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgbGFzdCBzdGVwIGluIHRoaXMgc2VxdWVuY2UKKwkJCWlmIChpc0xhc3QpIHsKKwkJCQlib29sZWFuW10gZG9DaGFuZ2VJZCA9IHsgZmFsc2UgfTsKIAkJCQlpZiAoc2VxdWVuY2VDb250YWluc1NxdWFzaCkgewotCQkJCQljb21taXRNZXNzYWdlID0gaW50ZXJhY3RpdmVIYW5kbGVyCi0JCQkJCQkJLm1vZGlmeUNvbW1pdE1lc3NhZ2UoY29tbWl0TWVzc2FnZSk7CisJCQkJCWNoYXIgY29tbWVudENoYXIgPSBjb21taXRNZXNzYWdlLmNoYXJBdCgwKTsKKwkJCQkJY29tbWl0TWVzc2FnZSA9IGVkaXRDb21taXRNZXNzYWdlKGRvQ2hhbmdlSWQsIGNvbW1pdE1lc3NhZ2UsCisJCQkJCQkJQ2xlYW51cE1vZGUuU1RSSVAsIGNvbW1lbnRDaGFyKTsKIAkJCQl9CiAJCQkJcmV0TmV3SGVhZCA9IGdpdC5jb21taXQoKQotCQkJCQkJLnNldE1lc3NhZ2Uoc3RyaXBDb21tZW50TGluZXMoY29tbWl0TWVzc2FnZSkpCi0JCQkJCQkuc2V0QW1lbmQodHJ1ZSkuc2V0Tm9WZXJpZnkodHJ1ZSkuY2FsbCgpOworCQkJCQkJLnNldE1lc3NhZ2UoY29tbWl0TWVzc2FnZSkKKwkJCQkJCS5zZXRBbWVuZCh0cnVlKQorCQkJCQkJLnNldE5vVmVyaWZ5KHRydWUpCisJCQkJCQkuc2V0SW5zZXJ0Q2hhbmdlSWQoZG9DaGFuZ2VJZFswXSkKKwkJCQkJCS5jYWxsKCk7CiAJCQkJcmViYXNlU3RhdGUuZ2V0RmlsZShNRVNTQUdFX1NRVUFTSCkuZGVsZXRlKCk7CiAJCQkJcmViYXNlU3RhdGUuZ2V0RmlsZShNRVNTQUdFX0ZJWFVQKS5kZWxldGUoKTsKLQogCQkJfSBlbHNlIHsKIAkJCQkvLyBOZXh0IHN0ZXAgaXMgZWl0aGVyIFNxdWFzaCBvciBGaXh1cAogCQkJCXJldE5ld0hlYWQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShjb21taXRNZXNzYWdlKQpAQCAtNzg1LDQ2ICs4MzAsNjEgQEAgcHJpdmF0ZSBSZXZDb21taXQgc3F1YXNoSW50b1ByZXZpb3VzKGJvb2xlYW4gc2VxdWVuY2VDb250YWluc1NxdWFzaCwKIAkJcmV0dXJuIHJldE5ld0hlYWQ7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0cmlwQ29tbWVudExpbmVzKFN0cmluZyBjb21taXRNZXNzYWdlKSB7Ci0JCVN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChTdHJpbmcgbGluZSA6IGNvbW1pdE1lc3NhZ2Uuc3BsaXQoIlxuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCIjIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGxpbmUpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghY29tbWl0TWVzc2FnZS5lbmRzV2l0aCgiXG4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpbnQgYnVmZmVyU2l6ZSA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJCWlmIChidWZmZXJTaXplID4gMCAmJiByZXN1bHQuY2hhckF0KGJ1ZmZlclNpemUgLSAxKSA9PSAnXG4nKSB7Ci0JCQkJcmVzdWx0LmRlbGV0ZUNoYXJBdChidWZmZXJTaXplIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQogCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb21wb3NlU3F1YXNoTWVzc2FnZShib29sZWFuIGlzU3F1YXNoLAorCXByaXZhdGUgU3RyaW5nIGNvbXBvc2VTcXVhc2hNZXNzYWdlKGJvb2xlYW4gaXNTcXVhc2gsCiAJCQlSZXZDb21taXQgY29tbWl0VG9QaWNrLCBTdHJpbmcgY3VyclNxdWFzaE1lc3NhZ2UsIGludCBjb3VudCkgewogCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJU3RyaW5nIG9yZGluYWwgPSBnZXRPcmRpbmFsKGNvdW50KTsKLQkJc2Iuc2V0TGVuZ3RoKDApOwotCQlzYi5hcHBlbmQoIiMgVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mICIpLmFwcGVuZChjb3VudCkKLQkJCQkuYXBwZW5kKCIgY29tbWl0cy5cbiIpOwotCQkvLyBBZGQgdGhlIHByZXZpb3VzIG1lc3NhZ2Ugd2l0aG91dCBoZWFkZXIgKGkuZSBmaXJzdCBsaW5lKQotCQlzYi5hcHBlbmQoY3VyclNxdWFzaE1lc3NhZ2UKLQkJCQkuc3Vic3RyaW5nKGN1cnJTcXVhc2hNZXNzYWdlLmluZGV4T2YoJ1xuJykgKyAxKSk7Ci0JCXNiLmFwcGVuZCgiXG4iKTsKLQkJaWYgKGlzU3F1YXNoKSB7Ci0JCQlzYi5hcHBlbmQoIiMgVGhpcyBpcyB0aGUgIikuYXBwZW5kKGNvdW50KS5hcHBlbmQob3JkaW5hbCkKLQkJCQkJLmFwcGVuZCgiIGNvbW1pdCBtZXNzYWdlOlxuIik7Ci0JCQlzYi5hcHBlbmQoY29tbWl0VG9QaWNrLmdldEZ1bGxNZXNzYWdlKCkpOworCQkvLyBjdXJyU3F1YXNoTWVzc2FnZSBpcyBhbHdheXMgbm9uLWVtcHR5IGhlcmUsIGFuZCB0aGUgZmlyc3QgY2hhcmFjdGVyCisJCS8vIGlzIHRoZSBjb21tZW50IGNoYXJhY3RlciB1c2VkIHNvIGZhci4KKwkJY2hhciBjb21tZW50Q2hhciA9IGN1cnJTcXVhc2hNZXNzYWdlLmNoYXJBdCgwKTsKKwkJU3RyaW5nIG5ld01lc3NhZ2UgPSBjb21taXRUb1BpY2suZ2V0RnVsbE1lc3NhZ2UoKTsKKwkJaWYgKCFpc1NxdWFzaCkgeworCQkJc2IuYXBwZW5kKGNvbW1lbnRDaGFyKS5hcHBlbmQoIiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgIikKKwkJCQkJLmFwcGVuZChjb3VudCkuYXBwZW5kKCIgY29tbWl0cy5cbiIpOworCQkJLy8gQWRkIHRoZSBwcmV2aW91cyBtZXNzYWdlIHdpdGhvdXQgaGVhZGVyIChpLmUgZmlyc3QgbGluZSkKKwkJCXNiLmFwcGVuZChjdXJyU3F1YXNoTWVzc2FnZQorCQkJCQkuc3Vic3RyaW5nKGN1cnJTcXVhc2hNZXNzYWdlLmluZGV4T2YoJ1xuJykgKyAxKSk7CisJCQlzYi5hcHBlbmQoJ1xuJyk7CisJCQlzYi5hcHBlbmQoY29tbWVudENoYXIpLmFwcGVuZCgiIFRoZSAiKS5hcHBlbmQoY291bnQpLmFwcGVuZChvcmRpbmFsKQorCQkJCQkuYXBwZW5kKCIgY29tbWl0IG1lc3NhZ2Ugd2lsbCBiZSBza2lwcGVkOlxuIikKKwkJCQkJLmFwcGVuZChjb21tZW50Q2hhcikuYXBwZW5kKCcgJyk7CisJCQlzYi5hcHBlbmQobmV3TWVzc2FnZS5yZXBsYWNlQWxsKCIoW1xuXHJdKSIsCisJCQkJCSIkMSIgKyBjb21tZW50Q2hhciArICcgJykpOwogCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKCIjIFRoZSAiKS5hcHBlbmQoY291bnQpLmFwcGVuZChvcmRpbmFsKQotCQkJCQkuYXBwZW5kKCIgY29tbWl0IG1lc3NhZ2Ugd2lsbCBiZSBza2lwcGVkOlxuIyAiKTsKLQkJCXNiLmFwcGVuZChjb21taXRUb1BpY2suZ2V0RnVsbE1lc3NhZ2UoKS5yZXBsYWNlQWxsKCIoW1xuXHJdKSIsCi0JCQkJCSIkMSMgIikpOworCQkJU3RyaW5nIGN1cnJlbnRNZXNzYWdlID0gY3VyclNxdWFzaE1lc3NhZ2U7CisJCQlpZiAoY29tbWl0Q29uZmlnLmlzQXV0b0NvbW1lbnRDaGFyKCkpIHsKKwkJCQkvLyBGaWd1cmUgb3V0IGEgbmV3IGNvbW1lbnQgY2hhcmFjdGVyIHRha2luZyBpbnRvIGFjY291bnQgdGhlCisJCQkJLy8gbmV3IG1lc3NhZ2UKKwkJCQlTdHJpbmcgY2xlYW5lZCA9IENvbW1pdENvbmZpZy5jbGVhblRleHQoY3VycmVudE1lc3NhZ2UsCisJCQkJCQlDb21taXRDb25maWcuQ2xlYW51cE1vZGUuU1RSSVAsIGNvbW1lbnRDaGFyKSArICdcbicKKwkJCQkJCSsgbmV3TWVzc2FnZTsKKwkJCQljaGFyIG5ld0NvbW1lbnRDaGFyID0gY29tbWl0Q29uZmlnLmdldENvbW1lbnRDaGFyKGNsZWFuZWQpOworCQkJCWlmIChuZXdDb21tZW50Q2hhciAhPSBjb21tZW50Q2hhcikgeworCQkJCQljdXJyZW50TWVzc2FnZSA9IHJlcGxhY2VDb21tZW50Q2hhcihjdXJyZW50TWVzc2FnZSwKKwkJCQkJCQljb21tZW50Q2hhciwgbmV3Q29tbWVudENoYXIpOworCQkJCQljb21tZW50Q2hhciA9IG5ld0NvbW1lbnRDaGFyOworCQkJCX0KKwkJCX0KKwkJCXNiLmFwcGVuZChjb21tZW50Q2hhcikuYXBwZW5kKCIgVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mICIpCisJCQkJCS5hcHBlbmQoY291bnQpLmFwcGVuZCgiIGNvbW1pdHMuXG4iKTsKKwkJCS8vIEFkZCB0aGUgcHJldmlvdXMgbWVzc2FnZSB3aXRob3V0IGhlYWRlciAoaS5lIGZpcnN0IGxpbmUpCisJCQlzYi5hcHBlbmQoCisJCQkJCWN1cnJlbnRNZXNzYWdlLnN1YnN0cmluZyhjdXJyZW50TWVzc2FnZS5pbmRleE9mKCdcbicpICsgMSkpOworCQkJc2IuYXBwZW5kKCdcbicpOworCQkJc2IuYXBwZW5kKGNvbW1lbnRDaGFyKS5hcHBlbmQoIiBUaGlzIGlzIHRoZSAiKS5hcHBlbmQoY291bnQpCisJCQkJCS5hcHBlbmQob3JkaW5hbCkuYXBwZW5kKCIgY29tbWl0IG1lc3NhZ2U6XG4iKTsKKwkJCXNiLmFwcGVuZChuZXdNZXNzYWdlKTsKIAkJfQogCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKIAl9CiAKKwlwcml2YXRlIFN0cmluZyByZXBsYWNlQ29tbWVudENoYXIoU3RyaW5nIG1lc3NhZ2UsIGNoYXIgb2xkQ2hhciwKKwkJCWNoYXIgbmV3Q2hhcikgeworCQkvLyAoP20pIC0gU3dpdGNoIG9uIG11bHRpLWxpbmUgbWF0Y2hpbmc7IFxoIC0gaG9yaXpvbnRhbCB3aGl0ZXNwYWNlCisJCXJldHVybiBtZXNzYWdlLnJlcGxhY2VBbGwoIig/bSleKFxcaCopIiArIG9sZENoYXIsICIkMSIgKyBuZXdDaGFyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCiAJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE9yZGluYWwoaW50IGNvdW50KSB7CiAJCXN3aXRjaCAoY291bnQgJSAxMCkgewogCQljYXNlIDE6CkBAIC04NTgsMTAgKzkxOCwxMSBAQCBzdGF0aWMgaW50IHBhcnNlU3F1YXNoRml4dXBTZXF1ZW5jZUNvdW50KFN0cmluZyBjdXJyU3F1YXNoTWVzc2FnZSkgewogCiAJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTcXVhc2hGaXh1cEZpbGUoU3RyaW5nIG1lc3NhZ2VGaWxlLAogCQkJU3RyaW5nIGZ1bGxNZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZWJhc2VTdGF0ZQotCQkJCS5jcmVhdGVGaWxlKAotCQkJCQkJbWVzc2FnZUZpbGUsCi0JCQkJCQkiIyBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgMSBjb21taXRzLlxuIyBUaGUgZmlyc3QgY29tbWl0J3MgbWVzc2FnZSBpczpcbiIgKyBmdWxsTWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQpOworCQljaGFyIGNvbW1lbnRDaGFyID0gY29tbWl0Q29uZmlnLmdldENvbW1lbnRDaGFyKGZ1bGxNZXNzYWdlKTsKKwkJcmViYXNlU3RhdGUuY3JlYXRlRmlsZShtZXNzYWdlRmlsZSwKKwkJCQljb21tZW50Q2hhciArICIgVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIDEgY29tbWl0cy5cbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJKyBjb21tZW50Q2hhciArICIgVGhlIGZpcnN0IGNvbW1pdCdzIG1lc3NhZ2UgaXM6XG4iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCSsgZnVsbE1lc3NhZ2UpOwogCX0KIAogCXByaXZhdGUgU3RyaW5nIGdldE91ckNvbW1pdE5hbWUoKSB7CkBAIC0xNjI1LDI2ICsxNjg2LDEwNiBAQCBwdWJsaWMgUmViYXNlQ29tbWFuZCBzZXRQcmVzZXJ2ZU1lcmdlcyhib29sZWFuIHByZXNlcnZlKSB7CiAJfQogCiAJLyoqCi0JICogQWxsb3dzIGNvbmZpZ3VyZSByZWJhc2UgaW50ZXJhY3RpdmUgcHJvY2VzcyBhbmQgbW9kaWZ5IGNvbW1pdCBtZXNzYWdlCisJICogQWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgaW50ZXJhY3RpdmUgcmViYXNlIHByb2Nlc3Mgc3RlcHMgYW5kIHRvIG1vZGlmeQorCSAqIGNvbW1pdCBtZXNzYWdlcy4KIAkgKi8KIAlwdWJsaWMgaW50ZXJmYWNlIEludGVyYWN0aXZlSGFuZGxlciB7CisKIAkJLyoqCi0JCSAqIEdpdmVuIGxpc3Qgb2Yge0Bjb2RlIHN0ZXBzfSBzaG91bGQgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHVzZXIKLQkJICogcmViYXNlIGNvbmZpZ3VyYXRpb24KKwkJICogQ2FsbGJhY2sgQVBJIHRvIG1vZGlmeSB0aGUgaW5pdGlhbCBsaXN0IG9mIGludGVyYWN0aXZlIHJlYmFzZSBzdGVwcy4KKwkJICoKIAkJICogQHBhcmFtIHN0ZXBzCi0JCSAqICAgICAgICAgICAgaW5pdGlhbCBjb25maWd1cmF0aW9uIG9mIHJlYmFzZSBpbnRlcmFjdGl2ZQorCQkgKiAgICAgICAgICAgIGluaXRpYWwgY29uZmlndXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSByZWJhc2UKIAkJICovCiAJCXZvaWQgcHJlcGFyZVN0ZXBzKExpc3Q8UmViYXNlVG9kb0xpbmU+IHN0ZXBzKTsKIAogCQkvKioKLQkJICogVXNlZCBmb3IgZWRpdGluZyBjb21taXQgbWVzc2FnZSBvbiBSRVdPUkQKKwkJICogVXNlZCBmb3IgZWRpdGluZyBjb21taXQgbWVzc2FnZSBvbiBSRVdPUkQgb3IgU1FVQVNILgogCQkgKgotCQkgKiBAcGFyYW0gY29tbWl0CisJCSAqIEBwYXJhbSBtZXNzYWdlCisJCSAqICAgICAgICAgICAgZXhpc3RpbmcgY29tbWl0IG1lc3NhZ2UKIAkJICogQHJldHVybiBuZXcgY29tbWl0IG1lc3NhZ2UKIAkJICovCi0JCVN0cmluZyBtb2RpZnlDb21taXRNZXNzYWdlKFN0cmluZyBjb21taXQpOworCQlTdHJpbmcgbW9kaWZ5Q29tbWl0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSk7CiAJfQogCisJLyoqCisJICogRXh0ZW5kcyB7QGxpbmsgSW50ZXJhY3RpdmVIYW5kbGVyfSB3aXRoIGFuIGVuaGFuY2VkIGNhbGxiYWNrIGZvciBlZGl0aW5nCisJICogY29tbWl0IG1lc3NhZ2VzLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJhY3RpdmVIYW5kbGVyMiBleHRlbmRzIEludGVyYWN0aXZlSGFuZGxlciB7CisKKwkJLyoqCisJCSAqIENhbGxiYWNrIEFQSSBmb3IgZWRpdGluZyBhIGNvbW1pdCBtZXNzYWdlIG9uIFJFV09SRCBvciBTUVVBU0guCisJCSAqIDxwPgorCQkgKiBUaGUgY2FsbGJhY2sgZ2V0cyB0aGUgY29tbWVudCBjaGFyYWN0ZXIgY3VycmVudGx5IHNldCwgYW5kIHRoZQorCQkgKiBjbGVhbi11cCBtb2RlLiBJdCBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBwcmVzZW50aW5nIHRoZQorCQkgKiBtZXNzYWdlIHRvIHRoZSB1c2VyLCBhbmQgaXQgYWxzbyBoYXMgdGhlIHBvc3NpYmlsaXR5IHRvIGNsZWFuIHRoZQorCQkgKiBtZXNzYWdlIGl0c2VsZiAoaW4gd2hpY2ggY2FzZSB0aGUgcmV0dXJuZWQge0BsaW5rIE1vZGlmeVJlc3VsdH0KKwkJICogc2hvdWxkIGhhdmUge0BsaW5rIENsZWFudXBNb2RlI1ZFUkJBVElNfSBzZXQgbGVzdCBKR2l0IGNsZWFucyB0aGUKKwkJICogbWVzc2FnZSBhZ2FpbikuIEl0IGNhbiBhbHNvIG92ZXJyaWRlIHRoZSBpbml0aWFsIGNsZWFuLXVwIG1vZGUgYnkKKwkJICogcmV0dXJuaW5nIGNsZWFuLXVwIG1vZGUgb3RoZXIgdGhhbiB7QGxpbmsgQ2xlYW51cE1vZGUjREVGQVVMVH0uIElmIGl0CisJCSAqIGRvZXMgcmV0dXJuIHtAY29kZSBERUZBVUxUfSwgdGhlIHBhc3NlZC1pbiB7QGNvZGUgbW9kZX0gd2lsbCBiZQorCQkgKiBhcHBsaWVkLgorCQkgKiA8L3A+CisJCSAqCisJCSAqIEBwYXJhbSBtZXNzYWdlCisJCSAqICAgICAgICAgICAgZXhpc3RpbmcgY29tbWl0IG1lc3NhZ2UKKwkJICogQHBhcmFtIG1vZGUKKwkJICogICAgICAgICAgICB7QGxpbmsgQ2xlYW51cE1vZGV9IGN1cnJlbnRseSBzZXQKKwkJICogQHBhcmFtIGNvbW1lbnRDaGFyCisJCSAqICAgICAgICAgICAgY29tbWVudCBjaGFyYWN0ZXIgdXNlZAorCQkgKiBAcmV0dXJuIGEge0BsaW5rIE1vZGlmeVJlc3VsdH0KKwkJICovCisJCUBOb25OdWxsCisJCU1vZGlmeVJlc3VsdCBlZGl0Q29tbWl0TWVzc2FnZShATm9uTnVsbCBTdHJpbmcgbWVzc2FnZSwKKwkJCQlATm9uTnVsbCBDbGVhbnVwTW9kZSBtb2RlLCBjaGFyIGNvbW1lbnRDaGFyKTsKKworCQlAT3ZlcnJpZGUKKwkJZGVmYXVsdCBTdHJpbmcgbW9kaWZ5Q29tbWl0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworCQkJLy8gU2hvdWxkIGFjdHVhbGx5IG5vdCBiZSBjYWxsZWQ7IGJ1dCBkbyBzb21ldGhpbmcgcmVhc29uYWJsZSBhbnl3YXkKKwkJCU1vZGlmeVJlc3VsdCByZXN1bHQgPSBlZGl0Q29tbWl0TWVzc2FnZSgKKwkJCQkJbWVzc2FnZSA9PSBudWxsID8gIiIgOiBtZXNzYWdlLCBDbGVhbnVwTW9kZS5TVFJJUCwgLy8kTk9OLU5MUy0xJAorCQkJCQknIycpOworCQkJcmV0dXJuIHJlc3VsdC5nZXRNZXNzYWdlKCk7CisJCX0KKworCQkvKioKKwkJICogRGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgZWRpdGluZyBhIGNvbW1pdCBtZXNzYWdlOiB0aGUgbmV3IG1lc3NhZ2UsCisJCSAqIGFuZCBob3cgaXQgc2hvdWxkIGJlIGNsZWFuZWQuCisJCSAqLworCQlpbnRlcmZhY2UgTW9kaWZ5UmVzdWx0IHsKKworCQkJLyoqCisJCQkgKiBSZXRyaWV2ZXMgdGhlIG5ldyBjb21taXQgbWVzc2FnZS4KKwkJCSAqCisJCQkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlCisJCQkgKi8KKwkJCUBOb25OdWxsCisJCQlTdHJpbmcgZ2V0TWVzc2FnZSgpOworCisJCQkvKioKKwkJCSAqIFRlbGxzIGhvdyB0aGUgbWVzc2FnZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gc2hvdWxkIGJlCisJCQkgKiBjbGVhbmVkLgorCQkJICoKKwkJCSAqIEByZXR1cm4gdGhlIHtAbGluayBDbGVhbnVwTW9kZX0KKwkJCSAqLworCQkJQE5vbk51bGwKKwkJCUNsZWFudXBNb2RlIGdldENsZWFudXBNb2RlKCk7CisKKwkJCS8qKgorCQkJICogVGVsbHMgd2hldGhlciBhIEdlcnJpdCBDaGFuZ2UtSWQgc2hvdWxkIGJlIGNvbXB1dGVkIGFuZCBhZGRlZCB0bworCQkJICogdGhlIGNvbW1pdCBtZXNzYWdlLCBhcyB3aXRoCisJCQkgKiB7QGxpbmsgQ29tbWl0Q29tbWFuZCNzZXRJbnNlcnRDaGFuZ2VJZChib29sZWFuKX0uCisJCQkgKgorCQkJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSBDaGFuZ2UtSWQgc2hvdWxkIGJlIGhhbmRsZWQsCisJCQkgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisJCQkgKi8KKwkJCWJvb2xlYW4gc2hvdWxkQWRkQ2hhbmdlSWQoKTsKKwkJfQorCX0KIAogCVBlcnNvbklkZW50IHBhcnNlQXV0aG9yKGJ5dGVbXSByYXcpIHsKIAkJaWYgKHJhdy5sZW5ndGggPT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmQuamF2YQppbmRleCAyMmVmNGQwLi41MTNmNTc5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZC5qYXZhCkBAIC05LDYgKzksOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwpAQCAtMjgsNiArMzAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzLldvcmtpbmdUcmVlTW9kaWZpZWRFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuTnVsbFByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKQEAgLTEyOCw4ICsxMzEsOSBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgTm9NZXNzYWdlRXhjZXB0aW9uLCBVbm1lcmdlZFBhdGhzRXhjZXB0aW9uLAogCQkJCXJldldhbGsucGFyc2VIZWFkZXJzKHNyY1BhcmVudCk7CiAKIAkJCQlTdHJpbmcgb3VyTmFtZSA9IGNhbGN1bGF0ZU91ck5hbWUoaGVhZFJlZik7Ci0JCQkJU3RyaW5nIHJldmVydE5hbWUgPSBzcmNDb21taXQuZ2V0SWQoKS5hYmJyZXZpYXRlKDcpLm5hbWUoKQotCQkJCQkJKyAiICIgKyBzcmNDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgcmV2ZXJ0TmFtZSA9IHNyY0NvbW1pdC5nZXRJZCgpCisJCQkJCQkuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpLm5hbWUoKSArICIgIiAvLyROT04tTkxTLTEkCisJCQkJCQkrIHNyY0NvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKTsKIAogCQkJCVJlc29sdmVNZXJnZXIgbWVyZ2VyID0gKFJlc29sdmVNZXJnZXIpIHN0cmF0ZWd5Lm5ld01lcmdlcihyZXBvKTsKIAkJCQltZXJnZXIuc2V0V29ya2luZ1RyZWVJdGVyYXRvcihuZXcgRmlsZVRyZWVJdGVyYXRvcihyZXBvKSk7CkBAIC0xODIsOSArMTg2LDEyIEBAIHB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBOb01lc3NhZ2VFeGNlcHRpb24sIFVubWVyZ2VkUGF0aHNFeGNlcHRpb24sCiAJCQkJCQkJCU1lcmdlU3RhdHVzLkNPTkZMSUNUSU5HLCBzdHJhdGVneSwKIAkJCQkJCQkJbWVyZ2VyLmdldE1lcmdlUmVzdWx0cygpLCBmYWlsaW5nUGF0aHMsIG51bGwpOwogCQkJCQlpZiAoIW1lcmdlci5mYWlsZWQoKSAmJiAhdW5tZXJnZWRQYXRocy5pc0VtcHR5KCkpIHsKKwkJCQkJCUNvbW1pdENvbmZpZyBjb25maWcgPSByZXBvLmdldENvbmZpZygpCisJCQkJCQkJCS5nZXQoQ29tbWl0Q29uZmlnLktFWSk7CisJCQkJCQljaGFyIGNvbW1lbnRDaGFyID0gY29uZmlnLmdldENvbW1lbnRDaGFyKG5ld01lc3NhZ2UpOwogCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBuZXcgTWVyZ2VNZXNzYWdlRm9ybWF0dGVyKCkKLQkJCQkJCS5mb3JtYXRXaXRoQ29uZmxpY3RzKG5ld01lc3NhZ2UsCi0JCQkJCQkJCW1lcmdlci5nZXRVbm1lcmdlZFBhdGhzKCkpOworCQkJCQkJCQkuZm9ybWF0V2l0aENvbmZsaWN0cyhuZXdNZXNzYWdlLAorCQkJCQkJCQkJCW1lcmdlci5nZXRVbm1lcmdlZFBhdGhzKCksIGNvbW1lbnRDaGFyKTsKIAkJCQkJCXJlcG8ud3JpdGVSZXZlcnRIZWFkKHNyY0NvbW1pdC5nZXRJZCgpKTsKIAkJCQkJCXJlcG8ud3JpdGVNZXJnZUNvbW1pdE1zZyhtZXNzYWdlKTsKIAkJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmQuamF2YQppbmRleCAzNWZkODk5Li5mN2ExZjRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmQuamF2YQpAQCAtOSw2ICs5LDggQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTMwMiw3ICszMDQsOCBAQCBwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJCWJ1aWxkZXIuc2V0UGFyZW50SWQoaGVhZENvbW1pdCk7CiAJCQkJYnVpbGRlci5zZXRUcmVlSWQoY2FjaGUud3JpdGVUcmVlKGluc2VydGVyKSk7CiAJCQkJYnVpbGRlci5zZXRNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGluZGV4TWVzc2FnZSwgYnJhbmNoLAotCQkJCQkJaGVhZENvbW1pdC5hYmJyZXZpYXRlKDcpLm5hbWUoKSwKKwkJCQkJCWhlYWRDb21taXQuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpCisJCQkJCQkJCS5uYW1lKCksCiAJCQkJCQloZWFkQ29tbWl0LmdldFNob3J0TWVzc2FnZSgpKSk7CiAJCQkJT2JqZWN0SWQgaW5kZXhDb21taXQgPSBpbnNlcnRlci5pbnNlcnQoYnVpbGRlcik7CiAKQEAgLTMxOSw3ICszMjIsMTAgQEAgcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCQkJYnVpbGRlci5zZXRQYXJlbnRJZHMobmV3IE9iamVjdElkWzBdKTsKIAkJCQkJYnVpbGRlci5zZXRUcmVlSWQodW50cmFja2VkRGlyQ2FjaGUud3JpdGVUcmVlKGluc2VydGVyKSk7CiAJCQkJCWJ1aWxkZXIuc2V0TWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChNU0dfVU5UUkFDS0VELAotCQkJCQkJCWJyYW5jaCwgaGVhZENvbW1pdC5hYmJyZXZpYXRlKDcpLm5hbWUoKSwKKwkJCQkJCQlicmFuY2gsCisJCQkJCQkJaGVhZENvbW1pdAorCQkJCQkJCQkJLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKQorCQkJCQkJCQkJLm5hbWUoKSwKIAkJCQkJCQloZWFkQ29tbWl0LmdldFNob3J0TWVzc2FnZSgpKSk7CiAJCQkJCXVudHJhY2tlZENvbW1pdCA9IGluc2VydGVyLmluc2VydChidWlsZGVyKTsKIAkJCQl9CkBAIC0zMzksNyArMzQ1LDggQEAgcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJCQkJYnVpbGRlci5hZGRQYXJlbnRJZCh1bnRyYWNrZWRDb21taXQpOwogCQkJCWJ1aWxkZXIuc2V0TWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCXdvcmtpbmdEaXJlY3RvcnlNZXNzYWdlLCBicmFuY2gsCi0JCQkJCQloZWFkQ29tbWl0LmFiYnJldmlhdGUoNykubmFtZSgpLAorCQkJCQkJaGVhZENvbW1pdC5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkKKwkJCQkJCQkJLm5hbWUoKSwKIAkJCQkJCWhlYWRDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCkpKTsKIAkJCQlidWlsZGVyLnNldFRyZWVJZChjYWNoZS53cml0ZVRyZWUoaW5zZXJ0ZXIpKTsKIAkJCQljb21taXRJZCA9IGluc2VydGVyLmluc2VydChidWlsZGVyKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXR0cmlidXRlcy9BdHRyaWJ1dGVzSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hdHRyaWJ1dGVzL0F0dHJpYnV0ZXNIYW5kbGVyLmphdmEKaW5kZXggNjM4ZGQ4Mi4uN2VjNzg1OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hdHRyaWJ1dGVzL0F0dHJpYnV0ZXNIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hdHRyaWJ1dGVzL0F0dHJpYnV0ZXNIYW5kbGVyLmphdmEKQEAgLTEsNDMgKzEsMTEgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUsIEl2YW4gTW90c2NoIDxpdmFuLm1vdHNjaEBic2lhZy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIDIwMjIgSXZhbiBNb3RzY2ggPGl2YW4ubW90c2NoQGJzaWFnLmNvbT4gYW5kIG90aGVycwogICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCi0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgogICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgotICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCi0gKiBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQotICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKLSAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzOwogCkBAIC00Niw2ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLkF0dHJpYnV0ZS5TdGF0ZTsKQEAgLTg0LDYgKzUzLDggQEAgcHVibGljIGNsYXNzIEF0dHJpYnV0ZXNIYW5kbGVyIHsKIAogCXByaXZhdGUgZmluYWwgVHJlZVdhbGsgdHJlZVdhbGs7CiAKKwlwcml2YXRlIGZpbmFsIFN1cHBsaWVyPENhbm9uaWNhbFRyZWVQYXJzZXI+IGF0dHJpYnV0ZXNUcmVlOworCiAJcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVzTm9kZSBnbG9iYWxOb2RlOwogCiAJcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVzTm9kZSBpbmZvTm9kZTsKQEAgLTk4LDIyICs2OSw0MSBAQCBwdWJsaWMgY2xhc3MgQXR0cmlidXRlc0hhbmRsZXIgewogCSAqIEBwYXJhbSB0cmVlV2FsawogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2Fsa30KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiBAZGVwcmVjYXRlZCBzaW5jZSA2LjEsIHVzZSB7QGxpbmsgI0F0dHJpYnV0ZXNIYW5kbGVyKFRyZWVXYWxrLCBTdXBwbGllcil9CisJICogICAgICAgICAgICAgaW5zdGVhZAogCSAqLworCUBEZXByZWNhdGVkCiAJcHVibGljIEF0dHJpYnV0ZXNIYW5kbGVyKFRyZWVXYWxrIHRyZWVXYWxrKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0aGlzKHRyZWVXYWxrLCAoKSAtPiB0cmVlV2Fsay5nZXRUcmVlKENhbm9uaWNhbFRyZWVQYXJzZXIuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5BdHRyaWJ1dGVzSGFuZGxlcn0gd2l0aAorCSAqIGRlZmF1bHQgcnVsZXMgYXMgd2VsbCBhcyBtZXJnZWQgcnVsZXMgZnJvbSBnbG9iYWwsIGluZm8gYW5kIHdvcmt0cmVlIHJvb3QKKwkgKiBhdHRyaWJ1dGVzCisJICoKKwkgKiBAcGFyYW0gdHJlZVdhbGsKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGt9CisJICogQHBhcmFtIGF0dHJpYnV0ZXNUcmVlCisJICogICAgICAgICAgICB0aGUgdHJlZSB0byByZWFkIC5naXRhdHRyaWJ1dGVzIGZyb20KKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIEF0dHJpYnV0ZXNIYW5kbGVyKFRyZWVXYWxrIHRyZWVXYWxrLAorCQkJU3VwcGxpZXI8Q2Fub25pY2FsVHJlZVBhcnNlcj4gYXR0cmlidXRlc1RyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRoaXMudHJlZVdhbGsgPSB0cmVlV2FsazsKLQkJQXR0cmlidXRlc05vZGVQcm92aWRlciBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID10cmVlV2Fsay5nZXRBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyKCk7CisJCXRoaXMuYXR0cmlidXRlc1RyZWUgPSBhdHRyaWJ1dGVzVHJlZTsKKwkJQXR0cmlidXRlc05vZGVQcm92aWRlciBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID0gdHJlZVdhbGsKKwkJCQkuZ2V0QXR0cmlidXRlc05vZGVQcm92aWRlcigpOwogCQl0aGlzLmdsb2JhbE5vZGUgPSBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyICE9IG51bGwKIAkJCQk/IGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIuZ2V0R2xvYmFsQXR0cmlidXRlc05vZGUoKSA6IG51bGw7CiAJCXRoaXMuaW5mb05vZGUgPSBhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyICE9IG51bGwKIAkJCQk/IGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIuZ2V0SW5mb0F0dHJpYnV0ZXNOb2RlKCkgOiBudWxsOwogCiAJCUF0dHJpYnV0ZXNOb2RlIHJvb3ROb2RlID0gYXR0cmlidXRlc05vZGUodHJlZVdhbGssCi0JCQkJcm9vdE9mKAotCQkJCQkJdHJlZVdhbGsuZ2V0VHJlZShXb3JraW5nVHJlZUl0ZXJhdG9yLmNsYXNzKSksCi0JCQkJcm9vdE9mKAotCQkJCQkJdHJlZVdhbGsuZ2V0VHJlZShEaXJDYWNoZUl0ZXJhdG9yLmNsYXNzKSksCi0JCQkJcm9vdE9mKHRyZWVXYWxrCi0JCQkJCQkuZ2V0VHJlZShDYW5vbmljYWxUcmVlUGFyc2VyLmNsYXNzKSkpOworCQkJCXJvb3RPZih0cmVlV2Fsay5nZXRUcmVlKFdvcmtpbmdUcmVlSXRlcmF0b3IuY2xhc3MpKSwKKwkJCQlyb290T2YodHJlZVdhbGsuZ2V0VHJlZShEaXJDYWNoZUl0ZXJhdG9yLmNsYXNzKSksCisJCQkJcm9vdE9mKGF0dHJpYnV0ZXNUcmVlLmdldCgpKSk7CiAKIAkJZXhwYW5zaW9ucy5wdXQoQklOQVJZX1JVTEVfS0VZLCBCSU5BUllfUlVMRV9BVFRSSUJVVEVTKTsKIAkJZm9yIChBdHRyaWJ1dGVzTm9kZSBub2RlIDogbmV3IEF0dHJpYnV0ZXNOb2RlW10geyBnbG9iYWxOb2RlLCByb290Tm9kZSwKQEAgLTE1Miw3ICsxNDIsNyBAQCBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlpc0RpcmVjdG9yeSwKIAkJCQl0cmVlV2Fsay5nZXRUcmVlKFdvcmtpbmdUcmVlSXRlcmF0b3IuY2xhc3MpLAogCQkJCXRyZWVXYWxrLmdldFRyZWUoRGlyQ2FjaGVJdGVyYXRvci5jbGFzcyksCi0JCQkJdHJlZVdhbGsuZ2V0VHJlZShDYW5vbmljYWxUcmVlUGFyc2VyLmNsYXNzKSwKKwkJCQlhdHRyaWJ1dGVzVHJlZS5nZXQoKSwKIAkJCQlhdHRyaWJ1dGVzKTsKIAogCQkvLyBHZXRzIHRoZSBhdHRyaWJ1dGVzIGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBhdHRyaWJ1dGUgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ibGFtZS9CbGFtZUdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ibGFtZS9CbGFtZUdlbmVyYXRvci5qYXZhCmluZGV4IDEwZDc3NTIuLjc3OTY3ZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYmxhbWUvQmxhbWVHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2JsYW1lL0JsYW1lR2VuZXJhdG9yLmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9Xb3JrVHJlZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZi5GaWx0ZXJlZFJlbmFtZURldGVjdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5NdXRhYmxlT2JqZWN0SWQ7CkBAIC0xMTA5LDkgKzExMTAsMTAgQEAgcHJpdmF0ZSBEaWZmRW50cnkgZmluZFJlbmFtZShSZXZDb21taXQgcGFyZW50LCBSZXZDb21taXQgY29tbWl0LAogCiAJCXRyZWVXYWxrLnNldEZpbHRlcihUcmVlRmlsdGVyLkFOWV9ESUZGKTsKIAkJdHJlZVdhbGsucmVzZXQocGFyZW50LmdldFRyZWUoKSwgY29tbWl0LmdldFRyZWUoKSk7Ci0JCXJlbmFtZURldGVjdG9yLnJlc2V0KCk7Ci0JCXJlbmFtZURldGVjdG9yLmFkZEFsbChEaWZmRW50cnkuc2Nhbih0cmVlV2FsaykpOwotCQlmb3IgKERpZmZFbnRyeSBlbnQgOiByZW5hbWVEZXRlY3Rvci5jb21wdXRlKCkpIHsKKwkJTGlzdDxEaWZmRW50cnk+IGRpZmZzID0gRGlmZkVudHJ5LnNjYW4odHJlZVdhbGspOworCQlGaWx0ZXJlZFJlbmFtZURldGVjdG9yIGZpbHRlcmVkUmVuYW1lRGV0ZWN0b3IgPSBuZXcgRmlsdGVyZWRSZW5hbWVEZXRlY3RvcigKKwkJCQlyZW5hbWVEZXRlY3Rvcik7CisJCWZvciAoRGlmZkVudHJ5IGVudCA6IGZpbHRlcmVkUmVuYW1lRGV0ZWN0b3IuY29tcHV0ZShkaWZmcywgcGF0aCkpIHsKIAkJCWlmIChpc1JlbmFtZShlbnQpICYmIGVudC5nZXROZXdQYXRoKCkuZXF1YWxzKHBhdGguZ2V0UGF0aCgpKSkKIAkJCQlyZXR1cm4gZW50OwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvQ29udGVudFNvdXJjZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0NvbnRlbnRTb3VyY2UuamF2YQppbmRleCAxYTQxZGYzLi42NGZmMTljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvQ29udGVudFNvdXJjZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9Db250ZW50U291cmNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDIwIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAyMSBHb29nbGUgSW5jLiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC05MSw2ICs5MSwyOSBAQCBwdWJsaWMgc3RhdGljIENvbnRlbnRTb3VyY2UgY3JlYXRlKFdvcmtpbmdUcmVlSXRlcmF0b3IgaXRlcmF0b3IpIHsKIAlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0TG9hZGVyIG9wZW4oU3RyaW5nIHBhdGgsIE9iamVjdElkIGlkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uOwogCisJLyoqCisJICogQ2xvc2VzIHRoZSB1c2VkIHJlc291cmNlcyBsaWtlIE9iamVjdFJlYWRlciwgVHJlZVdhbGsgZXRjLiBEZWZhdWx0CisJICogaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorCSAqCisJICogQHNpbmNlIDYuMgorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQkvLyBEbyBub3RoaW5nCisJfQorCisJLyoqCisJICogQ2hlY2tzIGlmIHRoZSBzb3VyY2UgaXMgZnJvbSAid29ya2luZyB0cmVlIiwgc28gaXQgY2FuIGJlIGFjY2Vzc2VkIGFzIGEKKwkgKiBmaWxlIGRpcmVjdGx5LgorCSAqCisJICogQHNpbmNlIDYuMgorCSAqCisJICogQHJldHVybiB0cnVlIGlmIHdvcmtpbmcgdHJlZSBzb3VyY2UgYW5kIGZhbHNlIG90aGVyd2lzZSAobG9hZGVyIG11c3QgYmUKKwkgKiAgICAgICAgIHVzZWQpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNXb3JraW5nVHJlZVNvdXJjZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwogCXByaXZhdGUgc3RhdGljIGNsYXNzIE9iamVjdFJlYWRlclNvdXJjZSBleHRlbmRzIENvbnRlbnRTb3VyY2UgewogCQlwcml2YXRlIGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXI7CiAKQEAgLTExMSw2ICsxMzQsMTYgQEAgcHVibGljIGxvbmcgc2l6ZShTdHJpbmcgcGF0aCwgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihTdHJpbmcgcGF0aCwgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gcmVhZGVyLm9wZW4oaWQsIENvbnN0YW50cy5PQkpfQkxPQik7CiAJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY2xvc2UoKSB7CisJCQlyZWFkZXIuY2xvc2UoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdUcmVlU291cmNlKCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV29ya2luZ1RyZWVTb3VyY2UgZXh0ZW5kcyBDb250ZW50U291cmNlIHsKQEAgLTE5NCw2ICsyMjcsMTYgQEAgcHJpdmF0ZSB2b2lkIHNlZWsoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24ocGF0aCk7CiAJCQl9CiAJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY2xvc2UoKSB7CisJCQl0dy5jbG9zZSgpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ1RyZWVTb3VyY2UoKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQogCX0KIAogCS8qKiBBIHBhaXIgb2Ygc291cmNlcyB0byBhY2Nlc3MgdGhlIG9sZCBhbmQgbmV3IHNpZGVzIG9mIGEgRGlmZkVudHJ5LiAqLwpAQCAtMjYxLDUgKzMwNCwzNyBAQCBwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oRGlmZkVudHJ5LlNpZGUgc2lkZSwgRGlmZkVudHJ5IGVudCkKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCQl9CiAJCX0KKworCQkvKioKKwkJICogQ2xvc2VzIHVzZWQgcmVzb3VyY2VzLgorCQkgKgorCQkgKiBAc2luY2UgNi4yCisJCSAqLworCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwkJCW9sZFNvdXJjZS5jbG9zZSgpOworCQkJbmV3U291cmNlLmNsb3NlKCk7CisJCX0KKworCQkvKioKKwkJICogQ2hlY2tzIGlmIHNvdXJjZSAoc2lkZSkgaXMgYSAid29ya2luZyB0cmVlIi4KKwkJICoKKwkJICogQHNpbmNlIDYuMgorCQkgKgorCQkgKiBAcGFyYW0gc2lkZQorCQkgKiAgICAgICAgICAgIHdoaWNoIHNpZGUgb2YgdGhlIGVudHJ5IHRvIHJlYWQgKE9MRCBvciBORVcpLgorCQkgKiBAcmV0dXJuIGlzIHRoZSBzb3VyY2UgYSAid29ya2luZyB0cmVlIgorCQkgKgorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNXb3JraW5nVHJlZVNvdXJjZShEaWZmRW50cnkuU2lkZSBzaWRlKSB7CisJCQlzd2l0Y2ggKHNpZGUpIHsKKwkJCWNhc2UgT0xEOgorCQkJCXJldHVybiBvbGRTb3VyY2UuaXNXb3JraW5nVHJlZVNvdXJjZSgpOworCQkJY2FzZSBORVc6CisJCQkJcmV0dXJuIG5ld1NvdXJjZS5pc1dvcmtpbmdUcmVlU291cmNlKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJCX0KKwkJfQorCiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEKaW5kZXggNDlkYTk1Yy4uMWE1Zjc0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuQ2hhbmdlVHlwZS5SRU5BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuU2lkZS5ORVc7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRW50cnkuU2lkZS5PTEQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5lbmNvZGU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5lbmNvZGVBU0NJSTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGUuR0lUTElOSzsKQEAgLTkwLDcgKzkxLDcgQEAgcHVibGljIGNsYXNzIERpZmZGb3JtYXR0ZXIgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKIAogCXByaXZhdGUgaW50IGNvbnRleHQgPSAzOwogCi0JcHJpdmF0ZSBpbnQgYWJicmV2aWF0aW9uTGVuZ3RoID0gNzsKKwlwcml2YXRlIGludCBhYmJyZXZpYXRpb25MZW5ndGggPSBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CiAKIAlwcml2YXRlIERpZmZBbGdvcml0aG0gZGlmZkFsZ29yaXRobTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUNoZWNrb3V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ2hlY2tvdXQuamF2YQppbmRleCBjOTA0YTc4Li5mNmZjMzkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ2hlY2tvdXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ2hlY2tvdXQuamF2YQpAQCAtNCw3ICs0LDggQEAKICAqIENvcHlyaWdodCAoQykgMjAwOCwgUm9nZXIgQy4gU29hcmVzIDxyb2dlcnNvYXJlc0BpbnRlbGluZXQuY29tLmJyPgogICogQ29weXJpZ2h0IChDKSAyMDA2LCBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIENocmlzaWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTksIDIwMjAsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcsIDIwMjIsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yNSw5ICsyNiw5IEBACiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpAQCAtMTEyLDcgKzExMyw3IEBAIHB1YmxpYyBDaGVja291dE1ldGFkYXRhKEVvbFN0cmVhbVR5cGUgZW9sU3RyZWFtVHlwZSwKIAogCXByaXZhdGUgUmVwb3NpdG9yeSByZXBvOwogCi0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgQ2hlY2tvdXRNZXRhZGF0YT4gdXBkYXRlZCA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIENoZWNrb3V0TWV0YWRhdGE+IHVwZGF0ZWQgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAKIAlwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IGNvbmZsaWN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCkBAIC0yOTksNyArMzAwLDcgQEAgcHVibGljIHZvaWQgcHJlU2NhblR3b1RyZWVzKCkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJd2FsayA9IG5ldyBOYW1lQ29uZmxpY3RUcmVlV2FsayhyZXBvKTsKIAkJYnVpbGRlciA9IGRjLmJ1aWxkZXIoKTsKIAotCQlhZGRUcmVlKHdhbGssIGhlYWRDb21taXRUcmVlKTsKKwkJd2Fsay5zZXRIZWFkKGFkZFRyZWUod2FsaywgaGVhZENvbW1pdFRyZWUpKTsKIAkJYWRkVHJlZSh3YWxrLCBtZXJnZUNvbW1pdFRyZWUpOwogCQlpbnQgZGNpUG9zID0gd2Fsay5hZGRUcmVlKG5ldyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoYnVpbGRlcikpOwogCQl3YWxrLmFkZFRyZWUod29ya2luZ1RyZWUpOwpAQCAtMzE1LDEzICszMTYsNiBAQCBwdWJsaWMgdm9pZCBwcmVTY2FuVHdvVHJlZXMoKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZFRyZWUoVHJlZVdhbGsgdHcsIE9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXR3LmFkZFRyZWUobmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCkpOwotCQllbHNlCi0JCQl0dy5hZGRUcmVlKGlkKTsKLQl9Ci0KIAkvKioKIAkgKiBTY2FuIGluZGV4IGFuZCBtZXJnZSB0cmVlIChubyBIRUFEKS4gVXNlZCBlLmcuIGZvciBpbml0aWFsIGNoZWNrb3V0IHdoZW4KIAkgKiB0aGVyZSBpcyBubyBoZWFkIHlldC4KQEAgLTM0MSw3ICszMzUsNyBAQCBwdWJsaWMgdm9pZCBwcmVzY2FuT25lVHJlZSgpCiAJCWJ1aWxkZXIgPSBkYy5idWlsZGVyKCk7CiAKIAkJd2FsayA9IG5ldyBOYW1lQ29uZmxpY3RUcmVlV2FsayhyZXBvKTsKLQkJYWRkVHJlZSh3YWxrLCBtZXJnZUNvbW1pdFRyZWUpOworCQl3YWxrLnNldEhlYWQoYWRkVHJlZSh3YWxrLCBtZXJnZUNvbW1pdFRyZWUpKTsKIAkJaW50IGRjaVBvcyA9IHdhbGsuYWRkVHJlZShuZXcgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yKGJ1aWxkZXIpKTsKIAkJd2Fsay5hZGRUcmVlKHdvcmtpbmdUcmVlKTsKIAkJd29ya2luZ1RyZWUuc2V0RGlyQ2FjaGVJdGVyYXRvcih3YWxrLCBkY2lQb3MpOwpAQCAtMzU2LDYgKzM1MCwxNCBAQCBwdWJsaWMgdm9pZCBwcmVzY2FuT25lVHJlZSgpCiAJCWNvbmZsaWN0cy5yZW1vdmVBbGwocmVtb3ZlZCk7CiAJfQogCisJcHJpdmF0ZSBpbnQgYWRkVHJlZShUcmVlV2FsayB0dywgT2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlpZiAoaWQgPT0gbnVsbCkgeworCQkJcmV0dXJuIHR3LmFkZFRyZWUobmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCkpOworCQl9CisJCXJldHVybiB0dy5hZGRUcmVlKGlkKTsKKwl9CisKIAkvKioKIAkgKiBQcm9jZXNzaW5nIGFuIGVudHJ5IGluIHRoZSBjb250ZXh0IG9mIHtAbGluayAjcHJlc2Nhbk9uZVRyZWUoKX0gd2hlbiBvbmx5CiAJICogb25lIHRyZWUgaXMgZ2l2ZW4KQEAgLTM4MiwxNyArMzg0LDE0IEBAIHZvaWQgcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgbSwgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yIGksCiAJCQkJCQkvLyBmYWlsT25Db25mbGljdCBpcyBmYWxzZS4gUHV0dGluZyBzb21ldGhpbmcgdG8gY29uZmxpY3RzCiAJCQkJCQkvLyB3b3VsZCBtZWFuIHdlIGRlbGV0ZSBpdC4gSW5zdGVhZCB3ZSB3YW50IHRoZSBtZXJnZUNvbW1pdAogCQkJCQkJLy8gY29udGVudCB0byBiZSBjaGVja2VkIG91dC4KLQkJCQkJCXVwZGF0ZShtLmdldEVudHJ5UGF0aFN0cmluZygpLCBtLmdldEVudHJ5T2JqZWN0SWQoKSwKLQkJCQkJCQkJbS5nZXRFbnRyeUZpbGVNb2RlKCkpOworCQkJCQkJdXBkYXRlKG0pOwogCQkJCQl9CiAJCQkJfSBlbHNlCi0JCQkJCXVwZGF0ZShtLmdldEVudHJ5UGF0aFN0cmluZygpLCBtLmdldEVudHJ5T2JqZWN0SWQoKSwKLQkJCQkJCW0uZ2V0RW50cnlGaWxlTW9kZSgpKTsKKwkJCQkJdXBkYXRlKG0pOwogCQkJfSBlbHNlIGlmIChmID09IG51bGwgfHwgIW0uaWRFcXVhbChpKSkgewogCQkJCS8vIFRoZSB3b3JraW5nIHRyZWUgZmlsZSBpcyBtaXNzaW5nIG9yIHRoZSBtZXJnZSBjb250ZW50IGRpZmZlcnMKIAkJCQkvLyBmcm9tIGluZGV4IGNvbnRlbnQKLQkJCQl1cGRhdGUobS5nZXRFbnRyeVBhdGhTdHJpbmcoKSwgbS5nZXRFbnRyeU9iamVjdElkKCksCi0JCQkJCQltLmdldEVudHJ5RmlsZU1vZGUoKSk7CisJCQkJdXBkYXRlKG0pOwogCQkJfSBlbHNlIGlmIChpLmdldERpckNhY2hlRW50cnkoKSAhPSBudWxsKSB7CiAJCQkJLy8gVGhlIGluZGV4IGNvbnRhaW5zIGEgZmlsZSAoYW5kIG5vdCBhIGZvbGRlcikKIAkJCQlpZiAoZi5pc01vZGlmaWVkKGkuZ2V0RGlyQ2FjaGVFbnRyeSgpLCB0cnVlLApAQCAtNDAwLDggKzM5OSw3IEBAIHZvaWQgcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgbSwgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yIGksCiAJCQkJCQl8fCBpLmdldERpckNhY2hlRW50cnkoKS5nZXRTdGFnZSgpICE9IDApCiAJCQkJCS8vIFRoZSB3b3JraW5nIHRyZWUgZmlsZSBpcyBkaXJ0eSBvciB0aGUgaW5kZXggY29udGFpbnMgYQogCQkJCQkvLyBjb25mbGljdAotCQkJCQl1cGRhdGUobS5nZXRFbnRyeVBhdGhTdHJpbmcoKSwgbS5nZXRFbnRyeU9iamVjdElkKCksCi0JCQkJCQkJbS5nZXRFbnRyeUZpbGVNb2RlKCkpOworCQkJCQl1cGRhdGUobSk7CiAJCQkJZWxzZSB7CiAJCQkJCS8vIHVwZGF0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBpbmRleCB3aXRoIHRoZSBvbmUgZnJvbSB0aGUKIAkJCQkJLy8gZmlsZSBpZiBub3Qgc2V0LCBhcyB3ZSBhcmUgc3VyZSB0byBiZSBpbiBzeW5jIGhlcmUuCkBAIC04MDIsNyArODAwLDcgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBoLCBDYW5vbmljYWxUcmVlUGFyc2VyIG0sCiAJCQkJaWYgKGYgIT0gbnVsbCAmJiBpc01vZGlmaWVkU3VidHJlZV9JbmRleFdvcmtpbmd0cmVlKG5hbWUpKSB7CiAJCQkJCWNvbmZsaWN0KG5hbWUsIGRjZSwgaCwgbSk7IC8vIDEKIAkJCQl9IGVsc2UgewotCQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7IC8vIDIKKwkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOyAvLyAyCiAJCQkJfQogCiAJCQkJYnJlYWs7CkBAIC04MjgsNyArODI2LDcgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBoLCBDYW5vbmljYWxUcmVlUGFyc2VyIG0sCiAJCQkJLy8gYXJlIGZvdW5kIGxhdGVyCiAJCQkJYnJlYWs7CiAJCQljYXNlIDB4RDBGOiAvLyAxOQotCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsKKwkJCQl1cGRhdGUoMSwgbmFtZSwgbUlkLCBtTW9kZSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDB4REYwOiAvLyBjb25mbGljdCB3aXRob3V0IGEgcnVsZQogCQkJY2FzZSAweDBGRDogLy8gMTUKQEAgLTgzOSw3ICs4MzcsNyBAQCB2b2lkIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGgsIENhbm9uaWNhbFRyZWVQYXJzZXIgbSwKIAkJCQkJaWYgKGlzTW9kaWZpZWRTdWJ0cmVlX0luZGV4V29ya2luZ3RyZWUobmFtZSkpCiAJCQkJCQljb25mbGljdChuYW1lLCBkY2UsIGgsIG0pOyAvLyA4CiAJCQkJCWVsc2UKLQkJCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsgLy8gNworCQkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOyAvLyA3CiAJCQkJfSBlbHNlCiAJCQkJCWNvbmZsaWN0KG5hbWUsIGRjZSwgaCwgbSk7IC8vIDkKIAkJCQlicmVhazsKQEAgLTg1OSw3ICs4NTcsNyBAQCB2b2lkIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGgsIENhbm9uaWNhbFRyZWVQYXJzZXIgbSwKIAkJCQlicmVhazsKIAkJCWNhc2UgMHgwREY6IC8vIDE2IDE3CiAJCQkJaWYgKCFpc01vZGlmaWVkU3VidHJlZV9JbmRleFdvcmtpbmd0cmVlKG5hbWUpKQotCQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7CisJCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsKIAkJCQllbHNlCiAJCQkJCWNvbmZsaWN0KG5hbWUsIGRjZSwgaCwgbSk7CiAJCQkJYnJlYWs7CkBAIC05MjksNyArOTI3LDcgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBoLCBDYW5vbmljYWxUcmVlUGFyc2VyIG0sCiAJCQkJLy8gQXQgbGVhc3Qgb25lIG9mIEhlYWQsIEluZGV4LCBNZXJnZSBpcyBub3QgZW1wdHkKIAkJCQkvLyAtPiBvbmx5IE1lcmdlIGNvbnRhaW5zIHNvbWV0aGluZyBmb3IgdGhpcyBwYXRoLiBVc2UgaXQhCiAJCQkJLy8gUG90ZW50aWFsbHkgdXBkYXRlIHRoZSBmaWxlCi0JCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOyAvLyAxCisJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOyAvLyAxCiAJCQllbHNlIGlmIChtID09IG51bGwpCiAJCQkJLy8gTm90aGluZyBpbiBNZXJnZQogCQkJCS8vIFNvbWV0aGluZyBpbiBIZWFkCkBAIC05NDcsNyArOTQ1LDcgQEAgZWxzZSBpZiAobSA9PSBudWxsKQogCQkJCS8vIGZpbmQgaW4gTWVyZ2UuIFBvdGVudGlhbGx5IHVwZGF0ZXMgdGhlIGZpbGUuCiAJCQkJaWYgKGVxdWFsSWRBbmRNb2RlKGhJZCwgaE1vZGUsIG1JZCwgbU1vZGUpKSB7CiAJCQkJCWlmIChpbml0aWFsQ2hlY2tvdXQgfHwgZm9yY2UpIHsKLQkJCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsKKwkJCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWtlZXAobmFtZSwgZGNlLCBmKTsKIAkJCQkJfQpAQCAtMTEzMSw3ICsxMTI5LDcgQEAgJiYgaXNNb2RpZmllZF9JbmRleFRyZWUobmFtZSwgaUlkLCBpTW9kZSwgbUlkLCBtTW9kZSwKIAogCQkJCQkJLy8gVE9ETyBjaGVjayB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBzb21lIHVuc2F2ZWQKIAkJCQkJCS8vIGZpbGUgY29udGVudAotCQkJCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOworCQkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOwogCQkJCQl9IGVsc2UgaWYgKGRjZSAhPSBudWxsCiAJCQkJCQkJJiYgKGYgIT0gbnVsbCAmJiBmLmlzTW9kaWZpZWQoZGNlLCB0cnVlLAogCQkJCQkJCQkJdGhpcy53YWxrLmdldE9iamVjdFJlYWRlcigpKSkpIHsKQEAgLTExNTAsNyArMTE0OCw3IEBAICYmIGlzTW9kaWZpZWRfSW5kZXhUcmVlKG5hbWUsIGlJZCwgaU1vZGUsIG1JZCwgbU1vZGUsCiAJCQkJCQkvLyAtPiBTdGFuZGFyZCBjYXNlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gYnJhbmNoZXM6CiAJCQkJCQkvLyBOb3RoaW5nIG5ldyBpbiBpbmRleCBidXQgc29tZXRoaW5nIGRpZmZlcmVudCBpbgogCQkJCQkJLy8gTWVyZ2UuIFVwZGF0ZSBpbmRleCBhbmQgZmlsZQotCQkJCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOworCQkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKIAkJCQkJLy8gSGVhZCBkaWZmZXJzIGZyb20gaW5kZXggb3IgbWVyZ2UgaXMgc2FtZSBhcyBpbmRleApAQCAtMTIzNywxMiArMTIzNSwxNyBAQCBwcml2YXRlIHZvaWQgcmVtb3ZlKFN0cmluZyBwYXRoKSB7CiAJCXJlbW92ZWQuYWRkKHBhdGgpOwogCX0KIAotCXByaXZhdGUgdm9pZCB1cGRhdGUoU3RyaW5nIHBhdGgsIE9iamVjdElkIG1JZCwgRmlsZU1vZGUgbW9kZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHVwZGF0ZShDYW5vbmljYWxUcmVlUGFyc2VyIHRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXVwZGF0ZSgwLCB0cmVlLmdldEVudHJ5UGF0aFN0cmluZygpLCB0cmVlLmdldEVudHJ5T2JqZWN0SWQoKSwKKwkJCQl0cmVlLmdldEVudHJ5RmlsZU1vZGUoKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZShpbnQgaW5kZXgsIFN0cmluZyBwYXRoLCBPYmplY3RJZCBtSWQsCisJCQlGaWxlTW9kZSBtb2RlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIUZpbGVNb2RlLlRSRUUuZXF1YWxzKG1vZGUpKSB7CiAJCQl1cGRhdGVkLnB1dChwYXRoLCBuZXcgQ2hlY2tvdXRNZXRhZGF0YSgKLQkJCQkJd2Fsay5nZXRFb2xTdHJlYW1UeXBlKENIRUNLT1VUX09QKSwKLQkJCQkJd2Fsay5nZXRGaWx0ZXJDb21tYW5kKENvbnN0YW50cy5BVFRSX0ZJTFRFUl9UWVBFX1NNVURHRSkpKTsKKwkJCQkJd2Fsay5nZXRDaGVja291dEVvbFN0cmVhbVR5cGUoaW5kZXgpLAorCQkJCQl3YWxrLmdldFNtdWRnZUNvbW1hbmQoaW5kZXgpKSk7CiAKIAkJCURpckNhY2hlRW50cnkgZW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShwYXRoLCBEaXJDYWNoZUVudHJ5LlNUQUdFXzApOwogCQkJZW50cnkuc2V0T2JqZWN0SWQobUlkKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKaW5kZXggNThmNzBmNS4uMWRkOTc2YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKQEAgLTI5LDQgKzI5LDE5IEBAIHB1YmxpYyBjbGFzcyBOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24gZXh0ZW5kcyBUcmFuc3BvcnRFeGNlcHRpb24gewogCXB1YmxpYyBOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24oVVJJaXNoIHVyaSwgU3RyaW5nIHMpIHsKIAkJc3VwZXIodXJpLCBzKTsKIAl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGEgcmVwb3NpdG9yeSBkb2VzIG5vdCBleGlzdC4KKwkgKgorCSAqIEBwYXJhbSB1cmkKKwkgKiAgICAgICAgICAgIFVSSSB1c2VkIGZvciB0cmFuc3BvcnQKKwkgKiBAcGFyYW0gcworCSAqICAgICAgICAgICAgbWVzc2FnZQorCSAqIEBwYXJhbSBjYXVzZQorCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBleGNlcHRpb24KKwkgKiBAc2luY2UgNS4xMworCSAqLworCXB1YmxpYyBOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24oVVJJaXNoIHVyaSwgU3RyaW5nIHMsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcih1cmksIHMsIGNhdXNlKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vQmFyZVN1cGVycHJvamVjdFdyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYyNmFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXIuamF2YQpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOworCitpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfVEFHUzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5NYW5pZmVzdEVycm9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5SZW1vdGVGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5SZW1vdGVSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Db21tYW5kLlJlbW90ZVVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvUHJvamVjdC5Db3B5RmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb1Byb2plY3QuTGlua0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsLlJlcG9UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdEluc2VydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGUuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOworCisvKioKKyAqIFdyaXRlcyAuZ2l0bW9kdWxlcyBhbmQgZ2l0bGlua3Mgb2YgcGFyc2VkIG1hbmlmZXN0IHByb2plY3RzIGludG8gYSBiYXJlCisgKiByZXBvc2l0b3J5LgorICoKKyAqIFRvIHdyaXRlIG9uIGEgcmVndWxhciByZXBvc2l0b3J5LCBzZWUge0BsaW5rIFJlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXJ9LgorICovCitjbGFzcyBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19GQUlMVVJFX01BWF9SRVRSSUVTID0gNTsKKworCS8vIFJldHJ5IGV4cG9uZW50aWFsbHkgd2l0aCBkZWxheXMgaW4gdGhpcyByYW5nZQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0ZBSUxVUkVfTUlOX1JFVFJZX0RFTEFZX01JTExJUyA9IDUwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfRkFJTFVSRV9NQVhfUkVUUllfREVMQVlfTUlMTElTID0gNTAwMDsKKworCXByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSByZXBvOworCisJcHJpdmF0ZSBmaW5hbCBVUkkgdGFyZ2V0VXJpOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0QnJhbmNoOworCisJcHJpdmF0ZSBmaW5hbCBSZW1vdGVSZWFkZXIgY2FsbGJhY2s7CisKKwlwcml2YXRlIGZpbmFsIEJhcmVXcml0ZXJDb25maWcgY29uZmlnOworCisJcHJpdmF0ZSBmaW5hbCBQZXJzb25JZGVudCBhdXRob3I7CisKKwlwcml2YXRlIExpc3Q8RXh0cmFDb250ZW50PiBleHRyYUNvbnRlbnRzOworCisJc3RhdGljIGNsYXNzIEJhcmVXcml0ZXJDb25maWcgeworCQlib29sZWFuIGlnbm9yZVJlbW90ZUZhaWx1cmVzID0gZmFsc2U7CisKKwkJYm9vbGVhbiByZWNvcmRSZW1vdGVCcmFuY2ggPSB0cnVlOworCisJCWJvb2xlYW4gcmVjb3JkU3VibW9kdWxlTGFiZWxzID0gdHJ1ZTsKKworCQlib29sZWFuIHJlY29yZFNoYWxsb3dTdWJtb2R1bGVzID0gdHJ1ZTsKKworCQlzdGF0aWMgQmFyZVdyaXRlckNvbmZpZyBnZXREZWZhdWx0KCkgeworCQkJcmV0dXJuIG5ldyBCYXJlV3JpdGVyQ29uZmlnKCk7CisJCX0KKworCQlwcml2YXRlIEJhcmVXcml0ZXJDb25maWcoKSB7CisJCX0KKwl9CisKKwlzdGF0aWMgY2xhc3MgRXh0cmFDb250ZW50IHsKKwkJZmluYWwgU3RyaW5nIHBhdGg7CisKKwkJZmluYWwgU3RyaW5nIGNvbnRlbnQ7CisKKwkJRXh0cmFDb250ZW50KFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudCkgeworCQkJdGhpcy5wYXRoID0gcGF0aDsKKwkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7CisJCX0KKwl9CisKKwlCYXJlU3VwZXJwcm9qZWN0V3JpdGVyKFJlcG9zaXRvcnkgcmVwbywgVVJJIHRhcmdldFVyaSwKKwkJCVN0cmluZyB0YXJnZXRCcmFuY2gsCisJCQlQZXJzb25JZGVudCBhdXRob3IsIFJlbW90ZVJlYWRlciBjYWxsYmFjaywKKwkJCUJhcmVXcml0ZXJDb25maWcgY29uZmlnLAorCQkJTGlzdDxFeHRyYUNvbnRlbnQ+IGV4dHJhQ29udGVudHMpIHsKKwkJYXNzZXJ0IChyZXBvLmlzQmFyZSgpKTsKKwkJdGhpcy5yZXBvID0gcmVwbzsKKwkJdGhpcy50YXJnZXRVcmkgPSB0YXJnZXRVcmk7CisJCXRoaXMudGFyZ2V0QnJhbmNoID0gdGFyZ2V0QnJhbmNoOworCQl0aGlzLmF1dGhvciA9IGF1dGhvcjsKKwkJdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKwkJdGhpcy5leHRyYUNvbnRlbnRzID0gZXh0cmFDb250ZW50czsKKwl9CisKKwlSZXZDb21taXQgd3JpdGUoTGlzdDxSZXBvUHJvamVjdD4gcmVwb1Byb2plY3RzKQorCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CisJCURpckNhY2hlIGluZGV4ID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7CisJCU9iamVjdEluc2VydGVyIGluc2VydGVyID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpOworCisJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7CisJCQlwcmVwYXJlSW5kZXgocmVwb1Byb2plY3RzLCBpbmRleCwgaW5zZXJ0ZXIpOworCQkJT2JqZWN0SWQgdHJlZUlkID0gaW5kZXgud3JpdGVUcmVlKGluc2VydGVyKTsKKwkJCWxvbmcgcHJldkRlbGF5ID0gMDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgTE9DS19GQUlMVVJFX01BWF9SRVRSSUVTIC0gMTsgaSsrKSB7CisJCQkJdHJ5IHsKKwkJCQkJcmV0dXJuIGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoaW5zZXJ0ZXIsIHJ3LCB0cmVlSWQpOworCQkJCX0gY2F0Y2ggKENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24gZSkgeworCQkJCQlwcmV2RGVsYXkgPSBGaWxlVXRpbHMuZGVsYXkocHJldkRlbGF5LAorCQkJCQkJCUxPQ0tfRkFJTFVSRV9NSU5fUkVUUllfREVMQVlfTUlMTElTLAorCQkJCQkJCUxPQ0tfRkFJTFVSRV9NQVhfUkVUUllfREVMQVlfTUlMTElTKTsKKwkJCQkJVGhyZWFkLnNsZWVwKHByZXZEZWxheSk7CisJCQkJCXJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5yZWZyZXNoKCk7CisJCQkJfQorCQkJfQorCQkJLy8gSW4gdGhlIGxhc3QgdHJ5LCBqdXN0IHByb3BhZ2F0ZSB0aGUgZXhjZXB0aW9ucworCQkJcmV0dXJuIGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoaW5zZXJ0ZXIsIHJ3LCB0cmVlSWQpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBNYW5pZmVzdEVycm9yRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByZXBhcmVJbmRleChMaXN0PFJlcG9Qcm9qZWN0PiBwcm9qZWN0cywgRGlyQ2FjaGUgaW5kZXgsCisJCQlPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24geworCQlDb25maWcgY2ZnID0gbmV3IENvbmZpZygpOworCQlTdHJpbmdCdWlsZGVyIGF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlEaXJDYWNoZUJ1aWxkZXIgYnVpbGRlciA9IGluZGV4LmJ1aWxkZXIoKTsKKwkJZm9yIChSZXBvUHJvamVjdCBwcm9qIDogcHJvamVjdHMpIHsKKwkJCVN0cmluZyBuYW1lID0gcHJvai5nZXROYW1lKCk7CisJCQlTdHJpbmcgcGF0aCA9IHByb2ouZ2V0UGF0aCgpOworCQkJU3RyaW5nIHVybCA9IHByb2ouZ2V0VXJsKCk7CisJCQlPYmplY3RJZCBvYmplY3RJZDsKKwkJCWlmIChPYmplY3RJZC5pc0lkKHByb2ouZ2V0UmV2aXNpb24oKSkpIHsKKwkJCQlvYmplY3RJZCA9IE9iamVjdElkLmZyb21TdHJpbmcocHJvai5nZXRSZXZpc2lvbigpKTsKKwkJCX0gZWxzZSB7CisJCQkJb2JqZWN0SWQgPSBjYWxsYmFjay5zaGExKHVybCwgcHJvai5nZXRSZXZpc2lvbigpKTsKKwkJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCAmJiAhY29uZmlnLmlnbm9yZVJlbW90ZUZhaWx1cmVzKSB7CisJCQkJCXRocm93IG5ldyBSZW1vdGVVbmF2YWlsYWJsZUV4Y2VwdGlvbih1cmwpOworCQkJCX0KKwkJCQlpZiAoY29uZmlnLnJlY29yZFJlbW90ZUJyYW5jaCkgeworCQkJCQkvLyAiYnJhbmNoIiBmaWVsZCBpcyBvbmx5IGZvciBub24tdGFnIHJlZmVyZW5jZXMuCisJCQkJCS8vIEtlZXAgdGFncyBpbiAicmVmIiBmaWVsZCBhcyBoaW50IGZvciBvdGhlciB0b29scy4KKwkJCQkJU3RyaW5nIGZpZWxkID0gcHJvai5nZXRSZXZpc2lvbigpLnN0YXJ0c1dpdGgoUl9UQUdTKSA/ICJyZWYiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQk6ICJicmFuY2giOyAvLyROT04tTkxTLTEkCisJCQkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsIGZpZWxkLCAvLyROT04tTkxTLTEkCisJCQkJCQkJcHJvai5nZXRSZXZpc2lvbigpKTsKKwkJCQl9CisKKwkJCQlpZiAoY29uZmlnLnJlY29yZFNoYWxsb3dTdWJtb2R1bGVzCisJCQkJCQkmJiBwcm9qLmdldFJlY29tbWVuZFNoYWxsb3coKSAhPSBudWxsKSB7CisJCQkJCS8vIFRoZSBzaGFsbG93IHJlY29tbWVuZGF0aW9uIGlzIGxvc2luZyBpbmZvcm1hdGlvbi4KKwkJCQkJLy8gQXMgdGhlIHJlcG8gbWFuaWZlc3RzIHN0b3JlcyB0aGUgcmVjb21tZW5kZWQKKwkJCQkJLy8gZGVwdGggaW4gdGhlICdjbG9uZS1kZXB0aCcgZmllbGQsIHdoaWxlCisJCQkJCS8vIGdpdCBjb3JlIG9ubHkgdXNlcyBhIGJpbmFyeSAnc2hhbGxvdyA9IHRydWUvZmFsc2UnCisJCQkJCS8vIGhpbnQsIHdlJ2xsIG1hcCBhbnkgZGVwdGggdG8gJ3NoYWxsb3cgPSB0cnVlJworCQkJCQljZmcuc2V0Qm9vbGVhbigic3VibW9kdWxlIiwgbmFtZSwgInNoYWxsb3ciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQl0cnVlKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoY29uZmlnLnJlY29yZFN1Ym1vZHVsZUxhYmVscykgeworCQkJCVN0cmluZ0J1aWxkZXIgcmVjID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQlyZWMuYXBwZW5kKCIvIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZWMuYXBwZW5kKHBhdGgpOworCQkJCWZvciAoU3RyaW5nIGdyb3VwIDogcHJvai5nZXRHcm91cHMoKSkgeworCQkJCQlyZWMuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcmVjLmFwcGVuZChncm91cCk7CisJCQkJfQorCQkJCXJlYy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlhdHRyaWJ1dGVzLmFwcGVuZChyZWMudG9TdHJpbmcoKSk7CisJCQl9CisKKwkJCVVSSSBzdWJtb2RVcmwgPSBVUkkuY3JlYXRlKHVybCk7CisJCQlpZiAodGFyZ2V0VXJpICE9IG51bGwpIHsKKwkJCQlzdWJtb2RVcmwgPSBSZXBvQ29tbWFuZC5yZWxhdGl2aXplKHRhcmdldFVyaSwgc3VibW9kVXJsKTsKKwkJCX0KKwkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsICJwYXRoIiwgcGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJY2ZnLnNldFN0cmluZygic3VibW9kdWxlIiwgbmFtZSwgInVybCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlzdWJtb2RVcmwudG9TdHJpbmcoKSk7CisKKwkJCS8vIGNyZWF0ZSBnaXRsaW5rCisJCQlpZiAob2JqZWN0SWQgIT0gbnVsbCkgeworCQkJCURpckNhY2hlRW50cnkgZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KHBhdGgpOworCQkJCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOworCQkJCWRjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuR0lUTElOSyk7CisJCQkJYnVpbGRlci5hZGQoZGNFbnRyeSk7CisKKwkJCQlmb3IgKENvcHlGaWxlIGNvcHlmaWxlIDogcHJvai5nZXRDb3B5RmlsZXMoKSkgeworCQkJCQlSZW1vdGVGaWxlIHJmID0gY2FsbGJhY2sucmVhZEZpbGVXaXRoTW9kZSh1cmwsCisJCQkJCQkJcHJvai5nZXRSZXZpc2lvbigpLCBjb3B5ZmlsZS5zcmMpOworCQkJCQlvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCisJCQkJCQkJcmYuZ2V0Q29udGVudHMoKSk7CisJCQkJCWRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShjb3B5ZmlsZS5kZXN0KTsKKwkJCQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7CisJCQkJCWRjRW50cnkuc2V0RmlsZU1vZGUocmYuZ2V0RmlsZU1vZGUoKSk7CisJCQkJCWJ1aWxkZXIuYWRkKGRjRW50cnkpOworCQkJCX0KKwkJCQlmb3IgKExpbmtGaWxlIGxpbmtmaWxlIDogcHJvai5nZXRMaW5rRmlsZXMoKSkgeworCQkJCQlTdHJpbmcgbGluazsKKwkJCQkJaWYgKGxpbmtmaWxlLmRlc3QuY29udGFpbnMoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlsaW5rID0gRmlsZVV0aWxzLnJlbGF0aXZpemVHaXRQYXRoKAorCQkJCQkJCQlsaW5rZmlsZS5kZXN0LnN1YnN0cmluZygwLAorCQkJCQkJCQkJCWxpbmtmaWxlLmRlc3QubGFzdEluZGV4T2YoJy8nKSksCisJCQkJCQkJCXByb2ouZ2V0UGF0aCgpICsgIi8iICsgbGlua2ZpbGUuc3JjKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGVsc2UgeworCQkJCQkJbGluayA9IHByb2ouZ2V0UGF0aCgpICsgIi8iICsgbGlua2ZpbGUuc3JjOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKworCQkJCQlvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCisJCQkJCQkJbGluay5nZXRCeXRlcyhVVEZfOCkpOworCQkJCQlkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkobGlua2ZpbGUuZGVzdCk7CisJCQkJCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOworCQkJCQlkY0VudHJ5LnNldEZpbGVNb2RlKEZpbGVNb2RlLlNZTUxJTkspOworCQkJCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJU3RyaW5nIGNvbnRlbnQgPSBjZmcudG9UZXh0KCk7CisKKwkJLy8gY3JlYXRlIGEgbmV3IERpckNhY2hlRW50cnkgZm9yIC5naXRtb2R1bGVzIGZpbGUuCisJCURpckNhY2hlRW50cnkgZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KAorCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOworCQlPYmplY3RJZCBvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCisJCQkJY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOworCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKKwkJZGNFbnRyeS5zZXRGaWxlTW9kZShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpOworCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKKworCQlpZiAoY29uZmlnLnJlY29yZFN1Ym1vZHVsZUxhYmVscykgeworCQkJLy8gY3JlYXRlIGEgbmV3IERpckNhY2hlRW50cnkgZm9yIC5naXRhdHRyaWJ1dGVzIGZpbGUuCisJCQlEaXJDYWNoZUVudHJ5IGRjRW50cnlBdHRyID0gbmV3IERpckNhY2hlRW50cnkoCisJCQkJCUNvbnN0YW50cy5ET1RfR0lUX0FUVFJJQlVURVMpOworCQkJT2JqZWN0SWQgYXR0cklkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKKwkJCQkJYXR0cmlidXRlcy50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCQlkY0VudHJ5QXR0ci5zZXRPYmplY3RJZChhdHRySWQpOworCQkJZGNFbnRyeUF0dHIuc2V0RmlsZU1vZGUoRmlsZU1vZGUuUkVHVUxBUl9GSUxFKTsKKwkJCWJ1aWxkZXIuYWRkKGRjRW50cnlBdHRyKTsKKwkJfQorCisJCWZvciAoRXh0cmFDb250ZW50IGVjIDogZXh0cmFDb250ZW50cykgeworCQkJRGlyQ2FjaGVFbnRyeSBleHRyYURjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShlYy5wYXRoKTsKKworCQkJT2JqZWN0SWQgb2lkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKKwkJCQkJZWMuY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOworCQkJZXh0cmFEY0VudHJ5LnNldE9iamVjdElkKG9pZCk7CisJCQlleHRyYURjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuUkVHVUxBUl9GSUxFKTsKKwkJCWJ1aWxkZXIuYWRkKGV4dHJhRGNFbnRyeSk7CisJCX0KKworCQlidWlsZGVyLmZpbmlzaCgpOworCX0KKworCXByaXZhdGUgUmV2Q29tbWl0IGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsCisJCQlSZXZXYWxrIHJ3LCBPYmplY3RJZCB0cmVlSWQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24geworCQlPYmplY3RJZCBoZWFkSWQgPSByZXBvLnJlc29sdmUodGFyZ2V0QnJhbmNoICsgIl57Y29tbWl0fSIpOyAvLyROT04tTkxTLTEkCisJCWlmIChoZWFkSWQgIT0gbnVsbAorCQkJCSYmIHJ3LnBhcnNlQ29tbWl0KGhlYWRJZCkuZ2V0VHJlZSgpLmdldElkKCkuZXF1YWxzKHRyZWVJZCkpIHsKKwkJCS8vIE5vIGNoYW5nZS4gRG8gbm90aGluZy4KKwkJCXJldHVybiBydy5wYXJzZUNvbW1pdChoZWFkSWQpOworCQl9CisKKwkJQ29tbWl0QnVpbGRlciBjb21taXQgPSBuZXcgQ29tbWl0QnVpbGRlcigpOworCQljb21taXQuc2V0VHJlZUlkKHRyZWVJZCk7CisJCWlmIChoZWFkSWQgIT0gbnVsbCkgeworCQkJY29tbWl0LnNldFBhcmVudElkcyhoZWFkSWQpOworCQl9CisJCWNvbW1pdC5zZXRBdXRob3IoYXV0aG9yKTsKKwkJY29tbWl0LnNldENvbW1pdHRlcihhdXRob3IpOworCQljb21taXQuc2V0TWVzc2FnZShSZXBvVGV4dC5nZXQoKS5yZXBvQ29tbWl0TWVzc2FnZSk7CisKKwkJT2JqZWN0SWQgY29tbWl0SWQgPSBpbnNlcnRlci5pbnNlcnQoY29tbWl0KTsKKwkJaW5zZXJ0ZXIuZmx1c2goKTsKKworCQlSZWZVcGRhdGUgcnUgPSByZXBvLnVwZGF0ZVJlZih0YXJnZXRCcmFuY2gpOworCQlydS5zZXROZXdPYmplY3RJZChjb21taXRJZCk7CisJCXJ1LnNldEV4cGVjdGVkT2xkT2JqZWN0SWQoaGVhZElkICE9IG51bGwgPyBoZWFkSWQgOiBPYmplY3RJZC56ZXJvSWQoKSk7CisJCVJlc3VsdCByYyA9IHJ1LnVwZGF0ZShydyk7CisJCXN3aXRjaCAocmMpIHsKKwkJY2FzZSBORVc6CisJCWNhc2UgRk9SQ0VEOgorCQljYXNlIEZBU1RfRk9SV0FSRDoKKwkJCS8vIFN1Y2Nlc3NmdWwuIERvIG5vdGhpbmcuCisJCQlicmVhazsKKwkJY2FzZSBSRUpFQ1RFRDoKKwkJY2FzZSBMT0NLX0ZBSUxVUkU6CisJCQl0aHJvdyBuZXcgQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJSkdpdFRleHQuZ2V0KCkuY2Fubm90TG9jaywgdGFyZ2V0QnJhbmNoKSwgcnUuZ2V0UmVmKCksIHJjKTsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBKR2l0SW50ZXJuYWxFeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVwZGF0aW5nUmVmRmFpbGVkLAorCQkJCQkJCXRhcmdldEJyYW5jaCwgY29tbWl0SWQubmFtZSgpLCByYykpOworCQl9CisKKwkJcmV0dXJuIHJ3LnBhcnNlQ29tbWl0KGNvbW1pdElkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVndWxhclN1cGVycHJvamVjdFdyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFiOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9SRU1PVEVTOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5TdWJtb2R1bGVBZGRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Db21tYW5kLk1hbmlmZXN0RXJyb3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Qcm9qZWN0LkNvcHlGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvUHJvamVjdC5MaW5rRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWwuUmVwb1RleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKKworLyoqCisgKiBXcml0ZXMgLmdpdG1vZHVsZXMgYW5kIGdpdGxpbmtzIG9mIHBhcnNlZCBtYW5pZmVzdCBwcm9qZWN0cyBpbnRvIGEgcmVndWxhcgorICogcmVwb3NpdG9yeSAodXNpbmcgZ2l0IHN1Ym1vZHVsZSBjb21tYW5kcykKKyAqCisgKiBUbyB3cml0ZSBvbiBhIGJhcmUgcmVwb3NpdG9yeSwgdXNlIHtAbGluayBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyfQorICovCitjbGFzcyBSZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyIHsKKworCXByaXZhdGUgUmVwb3NpdG9yeSByZXBvOworCisJcHJpdmF0ZSBQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKKworCVJlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIoUmVwb3NpdG9yeSByZXBvLCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQl0aGlzLnJlcG8gPSByZXBvOworCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOworCX0KKworCVJldkNvbW1pdCB3cml0ZShMaXN0PFJlcG9Qcm9qZWN0PiByZXBvUHJvamVjdHMpCisJCQl0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChyZXBvKSkgeworCQkJZm9yIChSZXBvUHJvamVjdCBwcm9qIDogcmVwb1Byb2plY3RzKSB7CisJCQkJYWRkU3VibW9kdWxlKHByb2ouZ2V0TmFtZSgpLCBwcm9qLmdldFVybCgpLCBwcm9qLmdldFBhdGgoKSwKKwkJCQkJCXByb2ouZ2V0UmV2aXNpb24oKSwgcHJvai5nZXRDb3B5RmlsZXMoKSwKKwkJCQkJCXByb2ouZ2V0TGlua0ZpbGVzKCksIGdpdCk7CisJCQl9CisJCQlyZXR1cm4gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoUmVwb1RleHQuZ2V0KCkucmVwb0NvbW1pdE1lc3NhZ2UpCisJCQkJCS5jYWxsKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBNYW5pZmVzdEVycm9yRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFN1Ym1vZHVsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHVybCwgU3RyaW5nIHBhdGgsCisJCQlTdHJpbmcgcmV2aXNpb24sIExpc3Q8Q29weUZpbGU+IGNvcHlmaWxlcywgTGlzdDxMaW5rRmlsZT4gbGlua2ZpbGVzLAorCQkJR2l0IGdpdCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlhc3NlcnQgKCFyZXBvLmlzQmFyZSgpKTsKKwkJYXNzZXJ0IChnaXQgIT0gbnVsbCk7CisJCWlmICghbGlua2ZpbGVzLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorCQkJCQlKR2l0VGV4dC5nZXQoKS5ub25CYXJlTGlua0ZpbGVzTm90U3VwcG9ydGVkKTsKKwkJfQorCisJCVN1Ym1vZHVsZUFkZENvbW1hbmQgYWRkID0gZ2l0LnN1Ym1vZHVsZUFkZCgpLnNldE5hbWUobmFtZSkuc2V0UGF0aChwYXRoKQorCQkJCS5zZXRVUkkodXJsKTsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJYWRkLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKKwkJfQorCisJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGFkZC5jYWxsKCk7CisJCWlmIChyZXZpc2lvbiAhPSBudWxsKSB7CisJCQl0cnkgKEdpdCBzdWIgPSBuZXcgR2l0KHN1YlJlcG8pKSB7CisJCQkJc3ViLmNoZWNrb3V0KCkuc2V0TmFtZShmaW5kUmVmKHJldmlzaW9uLCBzdWJSZXBvKSkuY2FsbCgpOworCQkJfQorCQkJc3ViUmVwby5jbG9zZSgpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKHBhdGgpLmNhbGwoKTsKKwkJfQorCQlmb3IgKENvcHlGaWxlIGNvcHlmaWxlIDogY29weWZpbGVzKSB7CisJCQljb3B5ZmlsZS5jb3B5KCk7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oY29weWZpbGUuZGVzdCkuY2FsbCgpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRSZWYoU3RyaW5nIHJlZiwgUmVwb3NpdG9yeSByZXBvKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKCFPYmplY3RJZC5pc0lkKHJlZikpIHsKKwkJCVJlZiByID0gcmVwby5leGFjdFJlZihSX1JFTU9URVMgKyBERUZBVUxUX1JFTU9URV9OQU1FICsgIi8iICsgcmVmKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHIgIT0gbnVsbCkgeworCQkJCXJldHVybiByLmdldE5hbWUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVmOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKaW5kZXggZTBhODIyNC4uNmU5NDNlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kLmphdmEKQEAgLTksMTEgKzksNiBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9SRU1PVEVTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9UQUdTOwotCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0zMSwzNCArMjYsMjEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlN1Ym1vZHVsZUFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSW52YWxpZFJlZk5hbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uQmFyZVN1cGVycHJvamVjdFdyaXRlci5FeHRyYUNvbnRlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLk1hbmlmZXN0UGFyc2VyLkluY2x1ZGVkRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb1Byb2plY3QuQ29weUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Qcm9qZWN0LkxpbmtGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5pbnRlcm5hbC5SZXBvVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGUuUmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CiAKQEAgLTgwLDEyICs2Miw3IEBACiAgKiBAc2luY2UgMy40CiAgKi8KIHB1YmxpYyBjbGFzcyBSZXBvQ29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8UmV2Q29tbWl0PiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfRkFJTFVSRV9NQVhfUkVUUklFUyA9IDU7CiAKLQkvLyBSZXRyeSBleHBvbmVudGlhbGx5IHdpdGggZGVsYXlzIGluIHRoaXMgcmFuZ2UKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19GQUlMVVJFX01JTl9SRVRSWV9ERUxBWV9NSUxMSVMgPSA1MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0ZBSUxVUkVfTUFYX1JFVFJZX0RFTEFZX01JTExJUyA9IDUwMDA7CiAKIAlwcml2YXRlIFN0cmluZyBtYW5pZmVzdFBhdGg7CiAJcHJpdmF0ZSBTdHJpbmcgYmFzZVVyaTsKQEAgLTkzLDE3ICs3MCwxOCBAQCBwdWJsaWMgY2xhc3MgUmVwb0NvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPFJldkNvbW1pdD4gewogCXByaXZhdGUgU3RyaW5nIGdyb3Vwc1BhcmFtOwogCXByaXZhdGUgU3RyaW5nIGJyYW5jaDsKIAlwcml2YXRlIFN0cmluZyB0YXJnZXRCcmFuY2ggPSBDb25zdGFudHMuSEVBRDsKLQlwcml2YXRlIGJvb2xlYW4gcmVjb3JkUmVtb3RlQnJhbmNoID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVjb3JkU3VibW9kdWxlTGFiZWxzID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVjb3JkU2hhbGxvd1N1Ym1vZHVsZXMgPSB0cnVlOwogCXByaXZhdGUgUGVyc29uSWRlbnQgYXV0aG9yOwogCXByaXZhdGUgUmVtb3RlUmVhZGVyIGNhbGxiYWNrOwogCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CiAJcHJpdmF0ZSBJbmNsdWRlZEZpbGVSZWFkZXIgaW5jbHVkZWRSZWFkZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZVJlbW90ZUZhaWx1cmVzID0gZmFsc2U7CisKKwlwcml2YXRlIEJhcmVTdXBlcnByb2plY3RXcml0ZXIuQmFyZVdyaXRlckNvbmZpZyBiYXJlV3JpdGVyQ29uZmlnID0gQmFyZVN1cGVycHJvamVjdFdyaXRlci5CYXJlV3JpdGVyQ29uZmlnCisJCQkuZ2V0RGVmYXVsdCgpOwogCiAJcHJpdmF0ZSBQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKIAorCXByaXZhdGUgZmluYWwgTGlzdDxFeHRyYUNvbnRlbnQ+IGV4dHJhQ29udGVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwogCS8qKgogCSAqIEEgY2FsbGJhY2sgdG8gZ2V0IHJlZiBzaGExIG9mIGEgcmVwb3NpdG9yeSBmcm9tIGl0cyB1cmkuCiAJICoKQEAgLTI2OSwxNCArMjQ3LDE0IEBAIHB1YmxpYyBSZW1vdGVGaWxlIHJlYWRGaWxlV2l0aE1vZGUoU3RyaW5nIHVyaSwgU3RyaW5nIHJlZiwgU3RyaW5nIHBhdGgpCiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFuaWZlc3RFcnJvckV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7CisJc3RhdGljIGNsYXNzIE1hbmlmZXN0RXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBHaXRBUElFeGNlcHRpb24gewogCQlNYW5pZmVzdEVycm9yRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogCQkJc3VwZXIoUmVwb1RleHQuZ2V0KCkuaW52YWxpZE1hbmlmZXN0LCBjYXVzZSk7CiAJCX0KIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW1vdGVVbmF2YWlsYWJsZUV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7CisJc3RhdGljIGNsYXNzIFJlbW90ZVVuYXZhaWxhYmxlRXhjZXB0aW9uIGV4dGVuZHMgR2l0QVBJRXhjZXB0aW9uIHsKIAkJUmVtb3RlVW5hdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIHVyaSkgewogCQkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoUmVwb1RleHQuZ2V0KCkuZXJyb3JSZW1vdGVVbmF2YWlsYWJsZSwgdXJpKSk7CiAJCX0KQEAgLTQyMSw3ICszOTksNyBAQCBwdWJsaWMgUmVwb0NvbW1hbmQgc2V0VGFyZ2V0QnJhbmNoKFN0cmluZyBicmFuY2gpIHsKIAkgKiBAc2luY2UgNC4yCiAJICovCiAJcHVibGljIFJlcG9Db21tYW5kIHNldFJlY29yZFJlbW90ZUJyYW5jaChib29sZWFuIGVuYWJsZSkgewotCQl0aGlzLnJlY29yZFJlbW90ZUJyYW5jaCA9IGVuYWJsZTsKKwkJdGhpcy5iYXJlV3JpdGVyQ29uZmlnLnJlY29yZFJlbW90ZUJyYW5jaCA9IGVuYWJsZTsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCkBAIC00MzYsNyArNDE0LDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldFJlY29yZFJlbW90ZUJyYW5jaChib29sZWFuIGVuYWJsZSkgewogCSAqIEBzaW5jZSA0LjQKIAkgKi8KIAlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCXRoaXMucmVjb3JkU3VibW9kdWxlTGFiZWxzID0gZW5hYmxlOworCQl0aGlzLmJhcmVXcml0ZXJDb25maWcucmVjb3JkU3VibW9kdWxlTGFiZWxzID0gZW5hYmxlOwogCQlyZXR1cm4gdGhpczsKIAl9CiAKQEAgLTQ1MSw3ICs0MjksNyBAQCBwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKGJvb2xlYW4gZW5hYmxlKSB7CiAJICogQHNpbmNlIDQuNAogCSAqLwogCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZWNvbW1lbmRTaGFsbG93KGJvb2xlYW4gZW5hYmxlKSB7Ci0JCXRoaXMucmVjb3JkU2hhbGxvd1N1Ym1vZHVsZXMgPSBlbmFibGU7CisJCXRoaXMuYmFyZVdyaXRlckNvbmZpZy5yZWNvcmRTaGFsbG93U3VibW9kdWxlcyA9IGVuYWJsZTsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCkBAIC00ODUsNyArNDYzLDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldFByb2dyZXNzTW9uaXRvcihQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCSAqIEBzaW5jZSA0LjMKIAkgKi8KIAlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0SWdub3JlUmVtb3RlRmFpbHVyZXMoYm9vbGVhbiBpZ25vcmUpIHsKLQkJdGhpcy5pZ25vcmVSZW1vdGVGYWlsdXJlcyA9IGlnbm9yZTsKKwkJdGhpcy5iYXJlV3JpdGVyQ29uZmlnLmlnbm9yZVJlbW90ZUZhaWx1cmVzID0gaWdub3JlOwogCQlyZXR1cm4gdGhpczsKIAl9CiAKQEAgLTUzNCw2ICs1MTIsMjIgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldEluY2x1ZGVkRmlsZVJlYWRlcihJbmNsdWRlZEZpbGVSZWFkZXIgcmVhZGVyKSB7CiAJCXJldHVybiB0aGlzOwogCX0KIAorCS8qKgorCSAqIENyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudCBpbiB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeQorCSAqCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIHdoZXJlIHRvIGNyZWF0ZSB0aGUgZmlsZSBpbiB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeQorCSAqIEBwYXJhbSBjb250ZW50cworCSAqICAgICAgICAgICAgY29udGVudCBmb3IgdGhlIGNyZWF0ZSBmaWxlCisJICogQHJldHVybiB0aGlzIGNvbW1hbmQKKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUmVwb0NvbW1hbmQgYWRkVG9EZXN0aW5hdGlvbihTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnRzKSB7CisJCXRoaXMuZXh0cmFDb250ZW50cy5hZGQobmV3IEV4dHJhQ29udGVudChwYXRoLCBjb250ZW50cykpOworCQlyZXR1cm4gdGhpczsKKwl9CisKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewpAQCAtNTcwLDI0MCArNTY0LDE4IEBAIHB1YmxpYyBSZXZDb21taXQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQl9CiAKIAkJaWYgKHJlcG8uaXNCYXJlKCkpIHsKLQkJCWlmIChhdXRob3IgPT0gbnVsbCkKLQkJCQlhdXRob3IgPSBuZXcgUGVyc29uSWRlbnQocmVwbyk7Ci0JCQlpZiAoY2FsbGJhY2sgPT0gbnVsbCkKLQkJCQljYWxsYmFjayA9IG5ldyBEZWZhdWx0UmVtb3RlUmVhZGVyKCk7CiAJCQlMaXN0PFJlcG9Qcm9qZWN0PiByZW5hbWVkUHJvamVjdHMgPSByZW5hbWVQcm9qZWN0cyhmaWx0ZXJlZFByb2plY3RzKTsKLQotCQkJRGlyQ2FjaGUgaW5kZXggPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKLQkJCU9iamVjdEluc2VydGVyIGluc2VydGVyID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpOwotCi0JCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhyZXBvKSkgewotCQkJCXByZXBhcmVJbmRleChyZW5hbWVkUHJvamVjdHMsIGluZGV4LCBpbnNlcnRlcik7Ci0JCQkJT2JqZWN0SWQgdHJlZUlkID0gaW5kZXgud3JpdGVUcmVlKGluc2VydGVyKTsKLQkJCQlsb25nIHByZXZEZWxheSA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBMT0NLX0ZBSUxVUkVfTUFYX1JFVFJJRVMgLSAxOyBpKyspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiBjb21taXRUcmVlT25DdXJyZW50VGlwKAotCQkJCQkJCWluc2VydGVyLCBydywgdHJlZUlkKTsKLQkJCQkJfSBjYXRjaCAoQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlwcmV2RGVsYXkgPSBGaWxlVXRpbHMuZGVsYXkocHJldkRlbGF5LAotCQkJCQkJCQlMT0NLX0ZBSUxVUkVfTUlOX1JFVFJZX0RFTEFZX01JTExJUywKLQkJCQkJCQkJTE9DS19GQUlMVVJFX01BWF9SRVRSWV9ERUxBWV9NSUxMSVMpOwotCQkJCQkJVGhyZWFkLnNsZWVwKHByZXZEZWxheSk7Ci0JCQkJCQlyZXBvLmdldFJlZkRhdGFiYXNlKCkucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEluIHRoZSBsYXN0IHRyeSwganVzdCBwcm9wYWdhdGUgdGhlIGV4Y2VwdGlvbnMKLQkJCQlyZXR1cm4gY29tbWl0VHJlZU9uQ3VycmVudFRpcChpbnNlcnRlciwgcncsIHRyZWVJZCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgTWFuaWZlc3RFcnJvckV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KHJlcG8pKSB7Ci0JCQlmb3IgKFJlcG9Qcm9qZWN0IHByb2ogOiBmaWx0ZXJlZFByb2plY3RzKSB7Ci0JCQkJYWRkU3VibW9kdWxlKHByb2ouZ2V0TmFtZSgpLCBwcm9qLmdldFVybCgpLCBwcm9qLmdldFBhdGgoKSwKLQkJCQkJCXByb2ouZ2V0UmV2aXNpb24oKSwgcHJvai5nZXRDb3B5RmlsZXMoKSwKLQkJCQkJCXByb2ouZ2V0TGlua0ZpbGVzKCksIGdpdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoUmVwb1RleHQuZ2V0KCkucmVwb0NvbW1pdE1lc3NhZ2UpCi0JCQkJCS5jYWxsKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBNYW5pZmVzdEVycm9yRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVJbmRleChMaXN0PFJlcG9Qcm9qZWN0PiBwcm9qZWN0cywgRGlyQ2FjaGUgaW5kZXgsCi0JCQlPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24gewotCQlDb25maWcgY2ZnID0gbmV3IENvbmZpZygpOwotCQlTdHJpbmdCdWlsZGVyIGF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlEaXJDYWNoZUJ1aWxkZXIgYnVpbGRlciA9IGluZGV4LmJ1aWxkZXIoKTsKLQkJZm9yIChSZXBvUHJvamVjdCBwcm9qIDogcHJvamVjdHMpIHsKLQkJCVN0cmluZyBuYW1lID0gcHJvai5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgcGF0aCA9IHByb2ouZ2V0UGF0aCgpOwotCQkJU3RyaW5nIHVybCA9IHByb2ouZ2V0VXJsKCk7Ci0JCQlPYmplY3RJZCBvYmplY3RJZDsKLQkJCWlmIChPYmplY3RJZC5pc0lkKHByb2ouZ2V0UmV2aXNpb24oKSkpIHsKLQkJCQlvYmplY3RJZCA9IE9iamVjdElkLmZyb21TdHJpbmcocHJvai5nZXRSZXZpc2lvbigpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2JqZWN0SWQgPSBjYWxsYmFjay5zaGExKHVybCwgcHJvai5nZXRSZXZpc2lvbigpKTsKLQkJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCAmJiAhaWdub3JlUmVtb3RlRmFpbHVyZXMpIHsKLQkJCQkJdGhyb3cgbmV3IFJlbW90ZVVuYXZhaWxhYmxlRXhjZXB0aW9uKHVybCk7Ci0JCQkJfQotCQkJCWlmIChyZWNvcmRSZW1vdGVCcmFuY2gpIHsKLQkJCQkJLy8gImJyYW5jaCIgZmllbGQgaXMgb25seSBmb3Igbm9uLXRhZyByZWZlcmVuY2VzLgotCQkJCQkvLyBLZWVwIHRhZ3MgaW4gInJlZiIgZmllbGQgYXMgaGludCBmb3Igb3RoZXIgdG9vbHMuCi0JCQkJCVN0cmluZyBmaWVsZCA9IHByb2ouZ2V0UmV2aXNpb24oKS5zdGFydHNXaXRoKFJfVEFHUykgPyAicmVmIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJOiAiYnJhbmNoIjsgLy8kTk9OLU5MUy0xJAotCQkJCQljZmcuc2V0U3RyaW5nKCJzdWJtb2R1bGUiLCBuYW1lLCBmaWVsZCwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXByb2ouZ2V0UmV2aXNpb24oKSk7Ci0JCQkJfQotCi0JCQkJaWYgKHJlY29yZFNoYWxsb3dTdWJtb2R1bGVzCi0JCQkJCQkmJiBwcm9qLmdldFJlY29tbWVuZFNoYWxsb3coKSAhPSBudWxsKSB7Ci0JCQkJCS8vIFRoZSBzaGFsbG93IHJlY29tbWVuZGF0aW9uIGlzIGxvc2luZyBpbmZvcm1hdGlvbi4KLQkJCQkJLy8gQXMgdGhlIHJlcG8gbWFuaWZlc3RzIHN0b3JlcyB0aGUgcmVjb21tZW5kZWQKLQkJCQkJLy8gZGVwdGggaW4gdGhlICdjbG9uZS1kZXB0aCcgZmllbGQsIHdoaWxlCi0JCQkJCS8vIGdpdCBjb3JlIG9ubHkgdXNlcyBhIGJpbmFyeSAnc2hhbGxvdyA9IHRydWUvZmFsc2UnCi0JCQkJCS8vIGhpbnQsIHdlJ2xsIG1hcCBhbnkgZGVwdGggdG8gJ3NoYWxsb3cgPSB0cnVlJwotCQkJCQljZmcuc2V0Qm9vbGVhbigic3VibW9kdWxlIiwgbmFtZSwgInNoYWxsb3ciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVjb3JkU3VibW9kdWxlTGFiZWxzKSB7Ci0JCQkJU3RyaW5nQnVpbGRlciByZWMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJCXJlYy5hcHBlbmQoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlYy5hcHBlbmQocGF0aCk7Ci0JCQkJZm9yIChTdHJpbmcgZ3JvdXAgOiBwcm9qLmdldEdyb3VwcygpKSB7Ci0JCQkJCXJlYy5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZWMuYXBwZW5kKGdyb3VwKTsKLQkJCQl9Ci0JCQkJcmVjLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWF0dHJpYnV0ZXMuYXBwZW5kKHJlYy50b1N0cmluZygpKTsKLQkJCX0KLQotCQkJVVJJIHN1Ym1vZFVybCA9IFVSSS5jcmVhdGUodXJsKTsKLQkJCWlmICh0YXJnZXRVcmkgIT0gbnVsbCkgewotCQkJCXN1Ym1vZFVybCA9IHJlbGF0aXZpemUodGFyZ2V0VXJpLCBzdWJtb2RVcmwpOwotCQkJfQotCQkJY2ZnLnNldFN0cmluZygic3VibW9kdWxlIiwgbmFtZSwgInBhdGgiLCBwYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQljZmcuc2V0U3RyaW5nKCJzdWJtb2R1bGUiLCBuYW1lLCAidXJsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXN1Ym1vZFVybC50b1N0cmluZygpKTsKLQotCQkJLy8gY3JlYXRlIGdpdGxpbmsKLQkJCWlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0JCQkJRGlyQ2FjaGVFbnRyeSBkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkocGF0aCk7Ci0JCQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7Ci0JCQkJZGNFbnRyeS5zZXRGaWxlTW9kZShGaWxlTW9kZS5HSVRMSU5LKTsKLQkJCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKLQotCQkJCWZvciAoQ29weUZpbGUgY29weWZpbGUgOiBwcm9qLmdldENvcHlGaWxlcygpKSB7Ci0JCQkJCVJlbW90ZUZpbGUgcmYgPSBjYWxsYmFjay5yZWFkRmlsZVdpdGhNb2RlKHVybCwKLQkJCQkJCQlwcm9qLmdldFJldmlzaW9uKCksIGNvcHlmaWxlLnNyYyk7Ci0JCQkJCW9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKLQkJCQkJCQlyZi5nZXRDb250ZW50cygpKTsKLQkJCQkJZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KGNvcHlmaWxlLmRlc3QpOwotCQkJCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKLQkJCQkJZGNFbnRyeS5zZXRGaWxlTW9kZShyZi5nZXRGaWxlTW9kZSgpKTsKLQkJCQkJYnVpbGRlci5hZGQoZGNFbnRyeSk7Ci0JCQkJfQotCQkJCWZvciAoTGlua0ZpbGUgbGlua2ZpbGUgOiBwcm9qLmdldExpbmtGaWxlcygpKSB7Ci0JCQkJCVN0cmluZyBsaW5rOwotCQkJCQlpZiAobGlua2ZpbGUuZGVzdC5jb250YWlucygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxpbmsgPSBGaWxlVXRpbHMucmVsYXRpdml6ZUdpdFBhdGgoCi0JCQkJCQkJCWxpbmtmaWxlLmRlc3Quc3Vic3RyaW5nKDAsCi0JCQkJCQkJCQkJbGlua2ZpbGUuZGVzdC5sYXN0SW5kZXhPZignLycpKSwKLQkJCQkJCQkJcHJvai5nZXRQYXRoKCkgKyAiLyIgKyBsaW5rZmlsZS5zcmMpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsaW5rID0gcHJvai5nZXRQYXRoKCkgKyAiLyIgKyBsaW5rZmlsZS5zcmM7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCW9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKLQkJCQkJCQlsaW5rLmdldEJ5dGVzKFVURl84KSk7Ci0JCQkJCWRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShsaW5rZmlsZS5kZXN0KTsKLQkJCQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7Ci0JCQkJCWRjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuU1lNTElOSyk7Ci0JCQkJCWJ1aWxkZXIuYWRkKGRjRW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgY29udGVudCA9IGNmZy50b1RleHQoKTsKLQotCQkvLyBjcmVhdGUgYSBuZXcgRGlyQ2FjaGVFbnRyeSBmb3IgLmdpdG1vZHVsZXMgZmlsZS4KLQkJRGlyQ2FjaGVFbnRyeSBkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkoCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVRfTU9EVUxFUyk7Ci0JCU9iamVjdElkIG9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwKLQkJCQljb250ZW50LmdldEJ5dGVzKFVURl84KSk7Ci0JCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOwotCQlkY0VudHJ5LnNldEZpbGVNb2RlKEZpbGVNb2RlLlJFR1VMQVJfRklMRSk7Ci0JCWJ1aWxkZXIuYWRkKGRjRW50cnkpOwotCi0JCWlmIChyZWNvcmRTdWJtb2R1bGVMYWJlbHMpIHsKLQkJCS8vIGNyZWF0ZSBhIG5ldyBEaXJDYWNoZUVudHJ5IGZvciAuZ2l0YXR0cmlidXRlcyBmaWxlLgotCQkJRGlyQ2FjaGVFbnRyeSBkY0VudHJ5QXR0ciA9IG5ldyBEaXJDYWNoZUVudHJ5KAotCQkJCQlDb25zdGFudHMuRE9UX0dJVF9BVFRSSUJVVEVTKTsKLQkJCU9iamVjdElkIGF0dHJJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCi0JCQkJCWF0dHJpYnV0ZXMudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOwotCQkJZGNFbnRyeUF0dHIuc2V0T2JqZWN0SWQoYXR0cklkKTsKLQkJCWRjRW50cnlBdHRyLnNldEZpbGVNb2RlKEZpbGVNb2RlLlJFR1VMQVJfRklMRSk7Ci0JCQlidWlsZGVyLmFkZChkY0VudHJ5QXR0cik7CisJCQlCYXJlU3VwZXJwcm9qZWN0V3JpdGVyIHdyaXRlciA9IG5ldyBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyKHJlcG8sIHRhcmdldFVyaSwKKwkJCQkJdGFyZ2V0QnJhbmNoLAorCQkJCQlhdXRob3IgPT0gbnVsbCA/IG5ldyBQZXJzb25JZGVudChyZXBvKSA6IGF1dGhvciwKKwkJCQkJY2FsbGJhY2sgPT0gbnVsbCA/IG5ldyBEZWZhdWx0UmVtb3RlUmVhZGVyKCkgOiBjYWxsYmFjaywKKwkJCQkJYmFyZVdyaXRlckNvbmZpZywgZXh0cmFDb250ZW50cyk7CisJCQlyZXR1cm4gd3JpdGVyLndyaXRlKHJlbmFtZWRQcm9qZWN0cyk7CiAJCX0KIAotCQlidWlsZGVyLmZpbmlzaCgpOwotCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0IGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsCi0JCQlSZXZXYWxrIHJ3LCBPYmplY3RJZCB0cmVlSWQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24gewotCQlPYmplY3RJZCBoZWFkSWQgPSByZXBvLnJlc29sdmUodGFyZ2V0QnJhbmNoICsgIl57Y29tbWl0fSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChoZWFkSWQgIT0gbnVsbCAmJiBydy5wYXJzZUNvbW1pdChoZWFkSWQpLmdldFRyZWUoKS5nZXRJZCgpLmVxdWFscyh0cmVlSWQpKSB7Ci0JCQkvLyBObyBjaGFuZ2UuIERvIG5vdGhpbmcuCi0JCQlyZXR1cm4gcncucGFyc2VDb21taXQoaGVhZElkKTsKLQkJfQotCi0JCUNvbW1pdEJ1aWxkZXIgY29tbWl0ID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKLQkJY29tbWl0LnNldFRyZWVJZCh0cmVlSWQpOwotCQlpZiAoaGVhZElkICE9IG51bGwpCi0JCQljb21taXQuc2V0UGFyZW50SWRzKGhlYWRJZCk7Ci0JCWNvbW1pdC5zZXRBdXRob3IoYXV0aG9yKTsKLQkJY29tbWl0LnNldENvbW1pdHRlcihhdXRob3IpOwotCQljb21taXQuc2V0TWVzc2FnZShSZXBvVGV4dC5nZXQoKS5yZXBvQ29tbWl0TWVzc2FnZSk7Ci0KLQkJT2JqZWN0SWQgY29tbWl0SWQgPSBpbnNlcnRlci5pbnNlcnQoY29tbWl0KTsKLQkJaW5zZXJ0ZXIuZmx1c2goKTsKLQotCQlSZWZVcGRhdGUgcnUgPSByZXBvLnVwZGF0ZVJlZih0YXJnZXRCcmFuY2gpOwotCQlydS5zZXROZXdPYmplY3RJZChjb21taXRJZCk7Ci0JCXJ1LnNldEV4cGVjdGVkT2xkT2JqZWN0SWQoaGVhZElkICE9IG51bGwgPyBoZWFkSWQgOiBPYmplY3RJZC56ZXJvSWQoKSk7Ci0JCVJlc3VsdCByYyA9IHJ1LnVwZGF0ZShydyk7Ci0JCXN3aXRjaCAocmMpIHsKLQkJCWNhc2UgTkVXOgotCQkJY2FzZSBGT1JDRUQ6Ci0JCQljYXNlIEZBU1RfRk9SV0FSRDoKLQkJCQkvLyBTdWNjZXNzZnVsLiBEbyBub3RoaW5nLgotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUpFQ1RFRDoKLQkJCWNhc2UgTE9DS19GQUlMVVJFOgotCQkJCXRocm93IG5ldyBDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuY2Fubm90TG9jaywgdGFyZ2V0QnJhbmNoKSwKLQkJCQkJCXJ1LmdldFJlZigpLCByYyk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBKR2l0SW50ZXJuYWxFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlKR2l0VGV4dC5nZXQoKS51cGRhdGluZ1JlZkZhaWxlZCwKLQkJCQkJCXRhcmdldEJyYW5jaCwgY29tbWl0SWQubmFtZSgpLCByYykpOwotCQl9Ci0KLQkJcmV0dXJuIHJ3LnBhcnNlQ29tbWl0KGNvbW1pdElkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU3VibW9kdWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgdXJsLCBTdHJpbmcgcGF0aCwKLQkJCVN0cmluZyByZXZpc2lvbiwgTGlzdDxDb3B5RmlsZT4gY29weWZpbGVzLCBMaXN0PExpbmtGaWxlPiBsaW5rZmlsZXMsCi0JCQlHaXQgZ2l0KSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWFzc2VydCAoIXJlcG8uaXNCYXJlKCkpOwotCQlhc3NlcnQgKGdpdCAhPSBudWxsKTsKLQkJaWYgKCFsaW5rZmlsZXMuaXNFbXB0eSgpKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0JCQkJCUpHaXRUZXh0LmdldCgpLm5vbkJhcmVMaW5rRmlsZXNOb3RTdXBwb3J0ZWQpOwotCQl9Ci0KLQkJU3VibW9kdWxlQWRkQ29tbWFuZCBhZGQgPSBnaXQuc3VibW9kdWxlQWRkKCkuc2V0TmFtZShuYW1lKS5zZXRQYXRoKHBhdGgpCi0JCQkJLnNldFVSSSh1cmwpOwotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJYWRkLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQotCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBhZGQuY2FsbCgpOwotCQlpZiAocmV2aXNpb24gIT0gbnVsbCkgewotCQkJdHJ5IChHaXQgc3ViID0gbmV3IEdpdChzdWJSZXBvKSkgewotCQkJCXN1Yi5jaGVja291dCgpLnNldE5hbWUoZmluZFJlZihyZXZpc2lvbiwgc3ViUmVwbykpLmNhbGwoKTsKLQkJCX0KLQkJCXN1YlJlcG8uY2xvc2UoKTsKLQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihwYXRoKS5jYWxsKCk7Ci0JCX0KLQkJZm9yIChDb3B5RmlsZSBjb3B5ZmlsZSA6IGNvcHlmaWxlcykgewotCQkJY29weWZpbGUuY29weSgpOwotCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGNvcHlmaWxlLmRlc3QpLmNhbGwoKTsKLQkJfQorCQlSZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyIHdyaXRlciA9IG5ldyBSZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyKHJlcG8sIG1vbml0b3IpOworCQlyZXR1cm4gd3JpdGVyLndyaXRlKGZpbHRlcmVkUHJvamVjdHMpOwogCX0KIAogCS8qKgpAQCAtOTEwLDEzICs2ODIsNCBAQCBzdGF0aWMgVVJJIHJlbGF0aXZpemUoVVJJIGN1cnJlbnQsIFVSSSB0YXJnZXQpIHsKIAkJcmV0dXJuIFVSSS5jcmVhdGUoai50b1N0cmluZygpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZFJlZihTdHJpbmcgcmVmLCBSZXBvc2l0b3J5IHJlcG8pCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIU9iamVjdElkLmlzSWQocmVmKSkgewotCQkJUmVmIHIgPSByZXBvLmV4YWN0UmVmKFJfUkVNT1RFUyArIERFRkFVTFRfUkVNT1RFX05BTUUgKyAiLyIgKyByZWYpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAociAhPSBudWxsKQotCQkJCXJldHVybiByLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcmVmOwotCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvUHJlUHVzaEhvb2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvUHJlUHVzaEhvb2suamF2YQppbmRleCA1MzVjNmI5Li40M2RiYzM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL1ByZVB1c2hIb29rLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9QcmVQdXNoSG9vay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBPYmVvLiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIDIwMjIgT2JlbyBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0zOCw2ICszOCw4IEBAIHB1YmxpYyBjbGFzcyBQcmVQdXNoSG9vayBleHRlbmRzIEdpdEhvb2s8U3RyaW5nPiB7CiAKIAlwcml2YXRlIFN0cmluZyByZWZzOwogCisJcHJpdmF0ZSBib29sZWFuIGRyeVJ1bjsKKwogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBQcmVQdXNoSG9vawogCSAqIDxwPgpAQCAtMTQ1LDYgKzE0NywyNyBAQCBwdWJsaWMgdm9pZCBzZXRSZW1vdGVMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKIAl9CiAKIAkvKioKKwkgKiBTZXRzIHdoZXRoZXIgdGhlIHB1c2ggaXMgYSBkcnkgcnVuLgorCSAqCisJICogQHBhcmFtIGRyeVJ1bgorCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoZSBwdXNoIGlzIGEgZHJ5IHJ1biwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKwkgKiBAc2luY2UgNi4yCisJICovCisJcHVibGljIHZvaWQgc2V0RHJ5UnVuKGJvb2xlYW4gZHJ5UnVuKSB7CisJCXRoaXMuZHJ5UnVuID0gZHJ5UnVuOworCX0KKworCS8qKgorCSAqIFRlbGxzIHdoZXRoZXIgdGhlIHB1c2ggaXMgYSBkcnkgcnVuLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHB1c2ggaXMgYSBkcnkgcnVuLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorCSAqIEBzaW5jZSA2LjIKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RyeVJ1bigpIHsKKwkJcmV0dXJuIGRyeVJ1bjsKKwl9CisKKwkvKioKIAkgKiBTZXQgUmVmcwogCSAqCiAJICogQHBhcmFtIHRvUmVmcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCmluZGV4IGY3ZWJlNGYuLmVmZGI4ZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKQEAgLTIzOCwxMiArMjM4LDE0IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgY291bGROb3RGaW5kU2l4VGFic0luTGluZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNvdWxkTm90R2V0QWR2ZXJ0aXNlZFJlZjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNvdWxkTm90R2V0UmVwb1N0YXRpc3RpY3M7CisJLyoqKi8gcHVibGljIFN0cmluZyBjb3VsZE5vdEhhc2hCeXRlQXJyYXlXaXRoU2hhMjU2OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY291bGROb3RMb2NrSEVBRDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNvdWxkTm90UGVyc2lzdENvb2tpZXM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBjb3VsZE5vdFJlYWRDb29raWVGaWxlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY291bGROb3RSZWFkSW5kZXhJbk9uZUdvOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY291bGROb3RSZWFkT2JqZWN0V2hpbGVQYXJzaW5nQ29tbWl0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY291bGROb3RSZXdpbmRUb1Vwc3RyZWFtQ29tbWl0OworCS8qKiovIHB1YmxpYyBTdHJpbmcgY291bGROb3RTaWduU3RyaW5nV2l0aEtleTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNvdWxkTm90VVJMRW5jb2RlVG9VVEY4OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY291bnRpbmdPYmplY3RzOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY3JlYXRlQnJhbmNoRmFpbGVkVW5rbm93blJlYXNvbjsKQEAgLTI2NSw2ICsyNjcsOSBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRlbGV0aW5nTm90U3VwcG9ydGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVzdGluYXRpb25Jc05vdEFXaWxkY2FyZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRldGFjaGVkSGVhZERldGVjdGVkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGlmZlRvb2xOb3RHaXZlbkVycm9yOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGlmZlRvb2xOb3RTcGVjaWZpZWRJbkdpdEF0dHJpYnV0ZXNFcnJvcjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRpZmZUb29sTnVsbEVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGlyQ2FjaGVEb2VzTm90SGF2ZUFCYWNraW5nRmlsZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRpckNhY2hlRmlsZUlzTm90TG9ja2VkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGlyQ2FjaGVJc05vdExvY2tlZDsKQEAgLTM4Miw2ICszODcsOCBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGluTWVtb3J5QnVmZmVyTGltaXRFeGNlZWRlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGlucHV0RGlkbnRNYXRjaExlbmd0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGlucHV0U3RyZWFtTXVzdFN1cHBvcnRNYXJrOworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW50ZWdlclZhbHVlTm90SW5SYW5nZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludGVnZXJWYWx1ZU5vdEluUmFuZ2VTdWJTZWN0aW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW50ZWdlclZhbHVlT3V0T2ZSYW5nZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludGVybmFsUmV2aXNpb25FcnJvcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludGVybmFsU2VydmVyRXJyb3I7CkBAIC0zODksOSArMzk2LDExIEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5UaGVGdXR1cmU7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkQWR2ZXJ0aXNlbWVudE9mOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEFuY2VzdHJ5TGVuZ3RoOworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEF3c0FwaVNpZ25hdHVyZVZlcnNpb247CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkQm9vbGVhblZhbHVlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZENoYW5uZWw7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkQ29tbWl0UGFyZW50TnVtYmVyOworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZENvcmVBYmJyZXY7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRGVwdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRW5jb2Rpbmc7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRW5jcnlwdGlvbjsKQEAgLTQxOCw2ICs0MjcsNyBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRNb2RlRm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZE1vZGVGb3JQYXRoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZE5hbWVDb250YWluc0RvdERvdDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWROZWdhdGl2ZUFuZEZvcmNlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZE9iamVjdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRPbGRJZFNlbnQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkUGFja2V0TGluZUhlYWRlcjsKQEAgLTQ4MSwxMSArNDkxLDE0IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVyZ2VVc2luZ1N0cmF0ZWd5UmVzdWx0ZWRJbkRlc2NyaXB0aW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVyZ2VSZWN1cnNpdmVDb25mbGljdHNXaGVuTWVyZ2luZ0NvbW1vbkFuY2VzdG9yczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1lcmdlUmVjdXJzaXZlVG9vTWFueU1lcmdlQmFzZXNGb3I7CisJLyoqKi8gcHVibGljIFN0cmluZyBtZXJnZVRvb2xOb3RHaXZlbkVycm9yOworCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVyZ2VUb29sTnVsbEVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbWVzc2FnZUFuZFRhZ2dlck5vdEFsbG93ZWRJblVuYW5ub3RhdGVkVGFnczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1pbnV0ZXNBZ287CiAJLyoqKi8gcHVibGljIFN0cmluZyBtaXNtYXRjaE9mZnNldDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1pc21hdGNoQ1JDOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbWlzc2luZ0FjY2Vzc2tleTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIG1pc3NpbmdBd3NSZWdpb247CiAJLyoqKi8gcHVibGljIFN0cmluZyBtaXNzaW5nQ29uZmlndXJhdGlvbkZvcktleTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1pc3NpbmdDb29raWVGaWxlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbWlzc2luZ0NSQzsKQEAgLTU5Miw2ICs2MDUsMTEgQEAgcHVibGljIHN0YXRpYyBKR2l0VGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoQ2VydGlmaWNhdGVJbnZhbGlkRmllbGRWYWx1ZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hDZXJ0aWZpY2F0ZUludmFsaWRIZWFkZXI7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoQ2VydGlmaWNhdGVJbnZhbGlkU2lnbmF0dXJlOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaERlZmF1bHROb3RoaW5nOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaERlZmF1bHROb1Vwc3RyZWFtOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaERlZmF1bHRTaW1wbGU7CisJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoRGVmYXVsdFRyaWFuZ3VsYXJVcHN0cmVhbTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hEZWZhdWx0VW5rbm93bjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hJc05vdFN1cHBvcnRlZEZvckJ1bmRsZVRyYW5zcG9ydDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hOb3RQZXJtaXR0ZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoT3B0aW9uc05vdFN1cHBvcnRlZDsKQEAgLTc2Nyw2ICs3ODUsNyBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuYWJsZVRvU2lnbkNvbW1pdE5vU2VjcmV0S2V5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5hdXRob3JpemVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5lbmNvZGVhYmxlRmlsZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRBd3NBcGlTaWduYXR1cmVWZXJzaW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZENvbXBhcmVSZXN1bHQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkRW5kT2ZDb25maWdGaWxlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZEVuZE9mSW5wdXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmYvRmlsdGVyZWRSZW5hbWVEZXRlY3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmL0ZpbHRlcmVkUmVuYW1lRGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjU2MjRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmL0ZpbHRlcmVkUmVuYW1lRGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiwgU2ltZW9uIEFuZHJlZXYgYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmY7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5LkNoYW5nZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLlJlbmFtZURldGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuUGF0aEZpbHRlcjsKKworLyoqCisgKiBQcm92aWRlcyByZW5hbWUgZGV0ZWN0aW9uIGluIHNwZWNpYWwgY2FzZXMgc3VjaCBhcyBibGFtZSwgd2hlcmUgb25seSBhIHN1YnNldAorICogb2YgdGhlIHJlbmFtZXMgZGV0ZWN0ZWQgYnkge0BsaW5rIFJlbmFtZURldGVjdG9yfSBpcyBvZiBpbnRlcmVzdC4KKyAqLworcHVibGljIGNsYXNzIEZpbHRlcmVkUmVuYW1lRGV0ZWN0b3IgeworCisJcHJpdmF0ZSBmaW5hbCBSZW5hbWVEZXRlY3RvciByZW5hbWVEZXRlY3RvcjsKKworCS8qKgorCSAqIEBwYXJhbSByZXBvc2l0b3J5CisJICogICAgICAgICAgICBUaGUgcmVwb3NpdG9yeSBpbiB3aGljaCB0byBjaGVjayBmb3IgcmVuYW1lcy4KKwkgKi8KKwlwdWJsaWMgRmlsdGVyZWRSZW5hbWVEZXRlY3RvcihSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKKwkJdGhpcyhuZXcgUmVuYW1lRGV0ZWN0b3IocmVwb3NpdG9yeSkpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSByZW5hbWVEZXRlY3RvcgorCSAqICAgICAgICAgICAgVGhlIHtAbGluayBSZW5hbWVEZXRlY3Rvcn0gdG8gdXNlIHdoZW4gY2hlY2tpbmcgZm9yIHJlbmFtZXMuCisJICovCisJcHVibGljIEZpbHRlcmVkUmVuYW1lRGV0ZWN0b3IoUmVuYW1lRGV0ZWN0b3IgcmVuYW1lRGV0ZWN0b3IpIHsKKwkJdGhpcy5yZW5hbWVEZXRlY3RvciA9IHJlbmFtZURldGVjdG9yOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBkaWZmcworCSAqICAgICAgICAgICAgVGhlIHNldCBvZiBjaGFuZ2VzIHRvIGNoZWNrLgorCSAqIEBwYXJhbSBwYXRoRmlsdGVyCisJICogICAgICAgICAgICBGaWx0ZXIgb3V0IGNoYW5nZXMgdGhhdCBkaWRuJ3QgYWZmZWN0IHRoaXMgcGF0aC4KKwkgKiBAcmV0dXJuIFRoZSBzdWJzZXQgb2YgY2hhbmdlcyB0aGF0IGFmZmVjdCBvbmx5IHRoZSBmaWx0ZXJlZCBwYXRoLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgTGlzdDxEaWZmRW50cnk+IGNvbXB1dGUoTGlzdDxEaWZmRW50cnk+IGRpZmZzLAorCQkJUGF0aEZpbHRlciBwYXRoRmlsdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gY29tcHV0ZShkaWZmcywgQXJyYXlzLmFzTGlzdChwYXRoRmlsdGVyKSk7CisJfQorCisJLyoqCisJICogVHJpZXMgdG8gYXZvaWQgY29tcHV0YXRpb24gb3ZlcmhlYWQgaW4ge0BsaW5rIFJlbmFtZURldGVjdG9yI2NvbXB1dGUoKX0KKwkgKiBieSBmaWx0ZXJpbmcgZGlmZnMgcmVsYXRlZCB0byB0aGUgcGF0aCBmaWx0ZXJzIG9ubHkuCisJICogPHA+CisJICogTm90ZTogY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IG9wdGltaXplcyBhZGRlZCBvciByZW1vdmVkIGRpZmZzLAorCSAqIGZ1cnRoZXIgb3B0aW1pemF0aW9uIGlzIHBvc3NpYmxlLgorCSAqCisJICogQHBhcmFtIGNoYW5nZXMKKwkgKiAgICAgICAgICAgIFRoZSBzZXQgb2YgY2hhbmdlcyB0byBjaGVjay4KKwkgKiBAcGFyYW0gcGF0aEZpbHRlcnMKKwkgKiAgICAgICAgICAgIEZpbHRlciBvdXQgY2hhbmdlcyB0aGF0IGRpZG4ndCBhZmZlY3QgdGhlc2UgcGF0aHMuCisJICogQHJldHVybiBUaGUgc3Vic2V0IG9mIGNoYW5nZXMgdGhhdCBhZmZlY3Qgb25seSB0aGUgZmlsdGVyZWQgcGF0aHMuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqIEBzZWUgUmVuYW1lRGV0ZWN0b3IjY29tcHV0ZSgpCisJICovCisJcHVibGljIExpc3Q8RGlmZkVudHJ5PiBjb21wdXRlKExpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzLAorCQkJTGlzdDxQYXRoRmlsdGVyPiBwYXRoRmlsdGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlpZiAocGF0aEZpbHRlcnMgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5IHBhdGggZmlsdGVycyIpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlTZXQ8U3RyaW5nPiBwYXRocyA9IG5ldyBIYXNoU2V0PD4ocGF0aEZpbHRlcnMuc2l6ZSgpKTsKKwkJZm9yIChQYXRoRmlsdGVyIHBhdGhGaWx0ZXIgOiBwYXRoRmlsdGVycykgeworCQkJcGF0aHMuYWRkKHBhdGhGaWx0ZXIuZ2V0UGF0aCgpKTsKKwkJfQorCisJCUxpc3Q8RGlmZkVudHJ5PiBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCS8vIEZvciBuZXcgcGF0aDogc2tpcCBBREQncyB0aGF0IGRvbid0IG1hdGNoIGdpdmVuIHBhdGhzCisJCWZvciAoRGlmZkVudHJ5IGRpZmYgOiBjaGFuZ2VzKSB7CisJCQlDaGFuZ2VUeXBlIGNoYW5nZVR5cGUgPSBkaWZmLmdldENoYW5nZVR5cGUoKTsKKwkJCWlmIChjaGFuZ2VUeXBlICE9IENoYW5nZVR5cGUuQURECisJCQkJCXx8IHBhdGhzLmNvbnRhaW5zKGRpZmYuZ2V0TmV3UGF0aCgpKSkgeworCQkJCWZpbHRlcmVkLmFkZChkaWZmKTsKKwkJCX0KKwkJfQorCisJCXJlbmFtZURldGVjdG9yLnJlc2V0KCk7CisJCXJlbmFtZURldGVjdG9yLmFkZEFsbChmaWx0ZXJlZCk7CisJCUxpc3Q8RGlmZkVudHJ5PiBzb3VyY2VDaGFuZ2VzID0gcmVuYW1lRGV0ZWN0b3IuY29tcHV0ZSgpOworCisJCWZpbHRlcmVkLmNsZWFyKCk7CisKKwkJLy8gRm9yIG9sZCBwYXRoOiBza2lwIERFTEVURSdzIHRoYXQgZG9uJ3QgbWF0Y2ggZ2l2ZW4gcGF0aHMKKwkJZm9yIChEaWZmRW50cnkgZGlmZiA6IGNoYW5nZXMpIHsKKwkJCUNoYW5nZVR5cGUgY2hhbmdlVHlwZSA9IGRpZmYuZ2V0Q2hhbmdlVHlwZSgpOworCQkJaWYgKGNoYW5nZVR5cGUgIT0gQ2hhbmdlVHlwZS5ERUxFVEUKKwkJCQkJfHwgcGF0aHMuY29udGFpbnMoZGlmZi5nZXRPbGRQYXRoKCkpKSB7CisJCQkJZmlsdGVyZWQuYWRkKGRpZmYpOworCQkJfQorCQl9CisKKwkJcmVuYW1lRGV0ZWN0b3IucmVzZXQoKTsKKwkJcmVuYW1lRGV0ZWN0b3IuYWRkQWxsKGZpbHRlcmVkKTsKKwkJTGlzdDxEaWZmRW50cnk+IHRhcmdldENoYW5nZXMgPSByZW5hbWVEZXRlY3Rvci5jb21wdXRlKCk7CisKKwkJTGlzdDxEaWZmRW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCWZvciAoRGlmZkVudHJ5IHNvdXJjZUNoYW5nZSA6IHNvdXJjZUNoYW5nZXMpIHsKKwkJCWlmIChwYXRocy5jb250YWlucyhzb3VyY2VDaGFuZ2UuZ2V0TmV3UGF0aCgpKSkgeworCQkJCXJlc3VsdC5hZGQoc291cmNlQ2hhbmdlKTsKKwkJCX0KKwkJfQorCQlmb3IgKERpZmZFbnRyeSB0YXJnZXRDaGFuZ2UgOiB0YXJnZXRDaGFuZ2VzKSB7CisJCQlpZiAocGF0aHMuY29udGFpbnModGFyZ2V0Q2hhbmdlLmdldE9sZFBhdGgoKSkpIHsKKwkJCQlyZXN1bHQuYWRkKHRhcmdldENoYW5nZSk7CisJCQl9CisJCX0KKworCQlyZW5hbWVEZXRlY3Rvci5yZXNldCgpOworCQlyZXR1cm4gcmVzdWx0OworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Db21tYW5kRXhlY3V0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Db21tYW5kRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVmNTI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0NvbW1hbmRFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vV29ya1RyZWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUy5FeGVjdXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTX1BPU0lYOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GU19XaW4zMjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlNfV2luMzJfQ3lnd2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3lzdGVtUmVhZGVyOworCisvKioKKyAqIFJ1bnMgYSBjb21tYW5kIHdpdGggaGVscCBvZiBGUy4KKyAqLworcHVibGljIGNsYXNzIENvbW1hbmRFeGVjdXRvciB7CisKKwlwcml2YXRlIEZTIGZzOworCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrRXhpdENvZGU7CisKKwlwcml2YXRlIEZpbGUgY29tbWFuZEZpbGU7CisKKwlwcml2YXRlIGJvb2xlYW4gdXNlTXN5czI7CisKKwkvKioKKwkgKiBAcGFyYW0gZnMKKwkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbQorCSAqIEBwYXJhbSBjaGVja0V4aXRDb2RlCisJICogICAgICAgICAgICBzaG91bGQgdGhlIGV4aXQgY29kZSBiZSBjaGVja2VkIGZvciBlcnJvcnMgPworCSAqLworCXB1YmxpYyBDb21tYW5kRXhlY3V0b3IoRlMgZnMsIGJvb2xlYW4gY2hlY2tFeGl0Q29kZSkgeworCQl0aGlzLmZzID0gZnM7CisJCXRoaXMuY2hlY2tFeGl0Q29kZSA9IGNoZWNrRXhpdENvZGU7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNvbW1hbmQKKwkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHN0cmluZworCSAqIEBwYXJhbSB3b3JraW5nRGlyCisJICogICAgICAgICAgICB0aGUgd29ya2luZyBkaXJlY3RvcnkKKwkgKiBAcGFyYW0gZW52CisJICogICAgICAgICAgICB0aGUgZW52aXJvbm1lbnQKKwkgKiBAcmV0dXJuIHRoZSBleGVjdXRpb24gcmVzdWx0CisJICogQHRocm93cyBUb29sRXhjZXB0aW9uCisJICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgRXhlY3V0aW9uUmVzdWx0IHJ1bihTdHJpbmcgY29tbWFuZCwgRmlsZSB3b3JraW5nRGlyLAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBlbnYpCisJCQl0aHJvd3MgVG9vbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gY29tbWFuZEFycmF5ID0gY3JlYXRlQ29tbWFuZEFycmF5KGNvbW1hbmQpOworCQl0cnkgeworCQkJUHJvY2Vzc0J1aWxkZXIgcGIgPSBmcy5ydW5JblNoZWxsKGNvbW1hbmRBcnJheVswXSwKKwkJCQkJQXJyYXlzLmNvcHlPZlJhbmdlKGNvbW1hbmRBcnJheSwgMSwgY29tbWFuZEFycmF5Lmxlbmd0aCkpOworCQkJcGIuZGlyZWN0b3J5KHdvcmtpbmdEaXIpOworCQkJTWFwPFN0cmluZywgU3RyaW5nPiBlbnZwID0gcGIuZW52aXJvbm1lbnQoKTsKKwkJCWlmIChlbnYgIT0gbnVsbCkgeworCQkJCWVudnAucHV0QWxsKGVudik7CisJCQl9CisJCQlFeGVjdXRpb25SZXN1bHQgcmVzdWx0ID0gZnMuZXhlY3V0ZShwYiwgbnVsbCk7CisJCQlpbnQgcmMgPSByZXN1bHQuZ2V0UmMoKTsKKwkJCWlmIChyYyAhPSAwKSB7CisJCQkJYm9vbGVhbiBleGVjRXJyb3IgPSBpc0NvbW1hbmRFeGVjdXRpb25FcnJvcihyYyk7CisJCQkJaWYgKGNoZWNrRXhpdENvZGUgfHwgZXhlY0Vycm9yKSB7CisJCQkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKAorCQkJCQkJCSJKR2l0OiB0b29sIGV4ZWN1dGlvbiByZXR1cm4gY29kZTogIiArIHJjICsgIlxuIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJCSsgImNoZWNrRXhpdENvZGU6ICIgKyBjaGVja0V4aXRDb2RlICsgIlxuIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJCSsgImV4ZWNFcnJvcjogIiArIGV4ZWNFcnJvciArICJcbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJCQkrICJzdGRlcnI6IFxuIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkrIG5ldyBTdHJpbmcoCisJCQkJCQkJCQkJCXJlc3VsdC5nZXRTdGRlcnIoKS50b0J5dGVBcnJheSgpLAorCQkJCQkJCQkJCQlTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKQorCQkJCQkJCQkJCQkJCS5nZXREZWZhdWx0Q2hhcnNldCgpKSwKKwkJCQkJCQlyZXN1bHQsIGV4ZWNFcnJvcik7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBmaW5hbGx5IHsKKwkJCWRlbGV0ZUNvbW1hbmRBcnJheSgpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIHRoZSBleGVjdXRhYmxlIHBhdGgKKwkgKiBAcGFyYW0gd29ya2luZ0RpcgorCSAqICAgICAgICAgICAgdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisJICogQHBhcmFtIGVudgorCSAqICAgICAgICAgICAgdGhlIGVudmlyb25tZW50CisJICogQHJldHVybiB0aGUgZXhlY3V0aW9uIHJlc3VsdAorCSAqIEB0aHJvd3MgVG9vbEV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gY2hlY2tFeGVjdXRhYmxlKFN0cmluZyBwYXRoLCBGaWxlIHdvcmtpbmdEaXIsCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGVudikKKwkJCXRocm93cyBUb29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQljaGVja1VzZU1zeXMyKHBhdGgpOworCQlTdHJpbmcgY29tbWFuZCA9IG51bGw7CisJCWlmIChmcyBpbnN0YW5jZW9mIEZTX1dpbjMyICYmICF1c2VNc3lzMikgeworCQkJUGF0aCBwID0gUGF0aHMuZ2V0KHBhdGgpOworCQkJLy8gV2luMzIgKGFuZCBub3QgY3lnd2luIG9yIE1TWVMyKSB3aGVyZSBhY2NlcHRzIG9ubHkgY29tbWFuZCAvIGV4ZQorCQkJLy8gbmFtZSBhcyBwYXJhbWV0ZXIKKwkJCS8vIHNvIGNoZWNrIGlmIGV4aXN0cyBhbmQgZXhlY3V0YWJsZSBpbiB0aGlzIGNhc2UKKwkJCWlmIChwLmlzQWJzb2x1dGUoKSAmJiBGaWxlcy5pc0V4ZWN1dGFibGUocCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCS8vIHRyeSB3aGVyZSBjb21tYW5kIGZvciBhbGwgb3RoZXIgY2FzZXMKKwkJCWNvbW1hbmQgPSAid2hlcmUgIiArIEV4dGVybmFsVG9vbFV0aWxzLnF1b3RlUGF0aChwYXRoKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJY29tbWFuZCA9ICJ3aGljaCAiICsgRXh0ZXJuYWxUb29sVXRpbHMucXVvdGVQYXRoKHBhdGgpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJYm9vbGVhbiBhdmFpbGFibGUgPSB0cnVlOworCQl0cnkgeworCQkJRXhlY3V0aW9uUmVzdWx0IHJjID0gcnVuKGNvbW1hbmQsIHdvcmtpbmdEaXIsIGVudik7CisJCQlpZiAocmMuZ2V0UmMoKSAhPSAwKSB7CisJCQkJYXZhaWxhYmxlID0gZmFsc2U7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gfCBOb1dvcmtUcmVlRXhjZXB0aW9uCisJCQkJfCBUb29sRXhjZXB0aW9uIGUpIHsKKwkJCS8vIG5vIG9wOiBpcyB0cnVlIHRvIG5vdCBoaWRlIHBvc3NpYmxlIHRvb2xzIGZyb20gdXNlcgorCQl9CisJCXJldHVybiBhdmFpbGFibGU7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZUNvbW1hbmRBcnJheSgpIHsKKwkJZGVsZXRlQ29tbWFuZEZpbGUoKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZ1tdIGNyZWF0ZUNvbW1hbmRBcnJheShTdHJpbmcgY29tbWFuZCkKKwkJCXRocm93cyBUb29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGNvbW1hbmRBcnJheSA9IG51bGw7CisJCWNoZWNrVXNlTXN5czIoY29tbWFuZCk7CisJCWNyZWF0ZUNvbW1hbmRGaWxlKGNvbW1hbmQpOworCQlpZiAoZnMgaW5zdGFuY2VvZiBGU19QT1NJWCkgeworCQkJY29tbWFuZEFycmF5ID0gbmV3IFN0cmluZ1sxXTsKKwkJCWNvbW1hbmRBcnJheVswXSA9IGNvbW1hbmRGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKwkJfSBlbHNlIGlmIChmcyBpbnN0YW5jZW9mIEZTX1dpbjMyKSB7CisJCQlpZiAodXNlTXN5czIpIHsKKwkJCQljb21tYW5kQXJyYXkgPSBuZXcgU3RyaW5nWzNdOworCQkJCWNvbW1hbmRBcnJheVswXSA9ICJiYXNoLmV4ZSI7IC8vJE5PTi1OTFMtMSQKKwkJCQljb21tYW5kQXJyYXlbMV0gPSAiLWMiOyAvLyROT04tTkxTLTEkCisJCQkJY29tbWFuZEFycmF5WzJdID0gY29tbWFuZEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpLnJlcGxhY2UoIlxcIiwgLy8kTk9OLU5MUy0xJAorCQkJCQkJIi8iKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQljb21tYW5kQXJyYXkgPSBuZXcgU3RyaW5nWzFdOworCQkJCWNvbW1hbmRBcnJheVswXSA9IGNvbW1hbmRGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChmcyBpbnN0YW5jZW9mIEZTX1dpbjMyX0N5Z3dpbikgeworCQkJY29tbWFuZEFycmF5ID0gbmV3IFN0cmluZ1sxXTsKKwkJCWNvbW1hbmRBcnJheVswXSA9IGNvbW1hbmRGaWxlLmdldENhbm9uaWNhbFBhdGgoKS5yZXBsYWNlKCJcXCIsICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IFRvb2xFeGNlcHRpb24oCisJCQkJCSJKR2l0OiBmaWxlIHN5c3RlbSBub3Qgc3VwcG9ydGVkOiAiICsgZnMudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gY29tbWFuZEFycmF5OworCX0KKworCXByaXZhdGUgdm9pZCBjaGVja1VzZU1zeXMyKFN0cmluZyBjb21tYW5kKSB7CisJCXVzZU1zeXMyID0gZmFsc2U7CisJCVN0cmluZyB1c2VNc3lzMlN0ciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamdpdC51c2Vtc3lzMmJhc2giKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwodXNlTXN5czJTdHIpKSB7CisJCQlpZiAodXNlTXN5czJTdHIuZXF1YWxzSWdub3JlQ2FzZSgiYXV0byIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl1c2VNc3lzMiA9IGNvbW1hbmQuY29udGFpbnMoIi5zaCIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCXVzZU1zeXMyID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4odXNlTXN5czJTdHIpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbW1hbmRGaWxlKFN0cmluZyBjb21tYW5kKQorCQkJdGhyb3dzIFRvb2xFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBudWxsOworCQlpZiAodXNlTXN5czIgfHwgZnMgaW5zdGFuY2VvZiBGU19QT1NJWAorCQkJCXx8IGZzIGluc3RhbmNlb2YgRlNfV2luMzJfQ3lnd2luKSB7CisJCQlmaWxlRXh0ZW5zaW9uID0gIi5zaCI7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIGlmIChmcyBpbnN0YW5jZW9mIEZTX1dpbjMyKSB7CisJCQlmaWxlRXh0ZW5zaW9uID0gIi5jbWQiOyAvLyROT04tTkxTLTEkCisJCQljb21tYW5kID0gIkBlY2hvIG9mZiIgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpICsgY29tbWFuZCAvLyROT04tTkxTLTEkCisJCQkJCSsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSArICJleGl0IC9CICVFUlJPUkxFVkVMJSI7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKAorCQkJCQkiSkdpdDogZmlsZSBzeXN0ZW0gbm90IHN1cHBvcnRlZDogIiArIGZzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJY29tbWFuZEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCIuX18iLCAvLyROT04tTkxTLTEkCisJCQkJIl9famdpdF90b29sIiArIGZpbGVFeHRlbnNpb24pOyAvLyROT04tTkxTLTEkCisJCXRyeSAoT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbW1hbmRGaWxlKSkgeworCQkJYnl0ZVtdIHN0clRvQnl0ZXMgPSBjb21tYW5kCisJCQkJCS5nZXRCeXRlcyhTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0Q2hhcnNldCgpKTsKKwkJCW91dFN0cmVhbS53cml0ZShzdHJUb0J5dGVzKTsKKwkJCW91dFN0cmVhbS5jbG9zZSgpOworCQl9CisJCWNvbW1hbmRGaWxlLnNldEV4ZWN1dGFibGUodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZUNvbW1hbmRGaWxlKCkgeworCQlpZiAoY29tbWFuZEZpbGUgIT0gbnVsbCAmJiBjb21tYW5kRmlsZS5leGlzdHMoKSkgeworCQkJY29tbWFuZEZpbGUuZGVsZXRlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNDb21tYW5kRXhlY3V0aW9uRXJyb3IoaW50IHJjKSB7CisJCWlmICh1c2VNc3lzMiB8fCBmcyBpbnN0YW5jZW9mIEZTX1BPU0lYCisJCQkJfHwgZnMgaW5zdGFuY2VvZiBGU19XaW4zMl9DeWd3aW4pIHsKKwkJCS8vIDEyNjogcGVybWlzc2lvbiBmb3IgZXhlY3V0aW5nIGNvbW1hbmQgZGVuaWVkCisJCQkvLyAxMjc6IGNvbW1hbmQgbm90IGZvdW5kCisJCQlpZiAoKHJjID09IDEyNikgfHwgKHJjID09IDEyNykpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChmcyBpbnN0YW5jZW9mIEZTX1dpbjMyKSB7CisJCQkvLyA5MDA5LCAweDIzMzE6IFByb2dyYW0gaXMgbm90IHJlY29nbml6ZWQgYXMgYW4gaW50ZXJuYWwgb3IKKwkJCS8vIGV4dGVybmFsIGNvbW1hbmQsIG9wZXJhYmxlIHByb2dyYW0gb3IgYmF0Y2ggZmlsZS4gSW5kaWNhdGVzIHRoYXQKKwkJCS8vIGNvbW1hbmQsIGFwcGxpY2F0aW9uIG5hbWUgb3IgcGF0aCBoYXMgYmVlbiBtaXNzcGVsbGVkIHdoZW4KKwkJCS8vIGNvbmZpZ3VyaW5nIHRoZSBBY3Rpb24uCisJCQlpZiAocmMgPT0gOTAwOSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Db21tYW5kTGluZURpZmZUb29sLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvQ29tbWFuZExpbmVEaWZmVG9vbC5qYXZhCmluZGV4IDUwOTUxNWMuLjAwZGVjMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Db21tYW5kTGluZURpZmZUb29sLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0NvbW1hbmRMaW5lRGlmZlRvb2wuamF2YQpAQCAtMTExLDcgKzExMSw3IEBAIHB1YmxpYyBlbnVtIENvbW1hbmRMaW5lRGlmZlRvb2wgewogCSAqIFNlZTogPGEgaHJlZj0KIAkgKiAiaHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWwiPmh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sPC9hPgogCSAqLwotCWd2aW1kaWZmKCJndmlld2RpZmYiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCWd2aW1kaWZmKCJndmltZGlmZiIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCiAJLyoqCiAJICogU2VlOiA8YSBocmVmPQogCSAqICJodHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbCI+aHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWw8L2E+CkBAIC0xNjAsNyArMTYwLDcgQEAgcHVibGljIGVudW0gQ29tbWFuZExpbmVEaWZmVG9vbCB7CiAJICogU2VlOiA8YSBocmVmPQogCSAqICJodHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbCI+aHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWw8L2E+CiAJICovCi0JdmltZGlmZigidmlld2RpZmYiLCBndmltZGlmZiksCisJdmltZGlmZigidmltZGlmZiIsIGd2aW1kaWZmKSwKIAkvKioKIAkgKiBTZWU6IDxhIGhyZWY9CiAJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Db21tYW5kTGluZU1lcmdlVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0NvbW1hbmRMaW5lTWVyZ2VUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyMjEyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Db21tYW5kTGluZU1lcmdlVG9vbC5qYXZhCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjIsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworLyoqCisgKiBQcmUtZGVmaW5lZCBtZXJnZSB0b29scy4KKyAqCisgKiBBZGRzIHNhbWUgbWVyZ2UgdG9vbHMgYXMgYWxzbyBwcmUtZGVmaW5lZCBpbiBDLUdpdCBzZWUgImdpdC1jb3JlXG1lcmdldG9vbHNcIgorICogc2VlIGxpbmtzIHRvIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gZm9yIHRoZSB0b29scworICoKKyAqIDxwcmU+CisgKiBhcmF4aXMKKyAqIGJjCisgKiBiYzMKKyAqIGNvZGVjb21wYXJlCisgKiBkZWx0YXdhbGtlcgorICogZGlmZm1lcmdlCisgKiBkaWZmdXNlCisgKiBlY21lcmdlCisgKiBlbWVyZ2UKKyAqIGV4YW1kaWZmCisgKiBndWlmZnkKKyAqIGd2aW1kaWZmCisgKiBndmltZGlmZjIKKyAqIGd2aW1kaWZmMworICoga2RpZmYzCisgKiBrb21wYXJlCisgKiBtZWxkCisgKiBvcGVuZGlmZgorICogcDRtZXJnZQorICogdGtkaWZmCisgKiB0b3J0b2lzZW1lcmdlCisgKiB2aW1kaWZmCisgKiB2aW1kaWZmMgorICogdmltZGlmZjMKKyAqIHdpbm1lcmdlCisgKiB4eGRpZmYKKyAqIDwvcHJlPgorICoKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgZW51bSBDb21tYW5kTGluZU1lcmdlVG9vbCB7CisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5hcmF4aXMuY29tL21lcmdlL2RvY3VtZW50YXRpb24td2luZG93cy9jb21tYW5kLWxpbmUuZW4iPmh0dHBzOi8vd3d3LmFyYXhpcy5jb20vbWVyZ2UvZG9jdW1lbnRhdGlvbi13aW5kb3dzL2NvbW1hbmQtbGluZS5lbjwvYT4KKwkgKi8KKwlhcmF4aXMoImNvbXBhcmUiLAorCQkJIi13YWl0IC1tZXJnZSAtMyAtYTEgXCIkQkFTRVwiIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIgXCIkTUVSR0VEXCIiLAorCQkJIi13YWl0IC0yIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIgXCIkTUVSR0VEXCIiLAorCQkJZmFsc2UpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cuc2Nvb3RlcnNvZnR3YXJlLmNvbS92NGhlbHAvaW5kZXguaHRtbD9jb21tYW5kX2xpbmVfcmVmZXJlbmNlLmh0bWwiPmh0dHBzOi8vd3d3LnNjb290ZXJzb2Z0d2FyZS5jb20vdjRoZWxwL2luZGV4Lmh0bWw/Y29tbWFuZF9saW5lX3JlZmVyZW5jZS5odG1sPC9hPgorCSAqLworCWJjKCJiY29tcCIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIFwiJEJBU0VcIiAtLW1lcmdlb3V0cHV0PVwiJE1FUkdFRFwiIiwKKwkJCSJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIC0tbWVyZ2VvdXRwdXQ9XCIkTUVSR0VEXCIiLAorCQkJZmFsc2UpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cuc2Nvb3RlcnNvZnR3YXJlLmNvbS92NGhlbHAvaW5kZXguaHRtbD9jb21tYW5kX2xpbmVfcmVmZXJlbmNlLmh0bWwiPmh0dHBzOi8vd3d3LnNjb290ZXJzb2Z0d2FyZS5jb20vdjRoZWxwL2luZGV4Lmh0bWw/Y29tbWFuZF9saW5lX3JlZmVyZW5jZS5odG1sPC9hPgorCSAqLworCWJjMygiYmNvbXBhcmUiLCBiYyksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5kZXZhcnQuY29tL2NvZGVjb21wYXJlL2RvY3MvaW5kZXguaHRtbD9tZXJnaW5nX3ZpYV9jb21tYW5kX2xpbmUuaHRtIj5odHRwczovL3d3dy5kZXZhcnQuY29tL2NvZGVjb21wYXJlL2RvY3MvaW5kZXguaHRtbD9tZXJnaW5nX3ZpYV9jb21tYW5kX2xpbmUuaHRtPC9hPgorCSAqLworCWNvZGVjb21wYXJlKCJDb2RlTWVyZ2UiLAorCQkJIi1NRj1cIiRMT0NBTFwiIC1URj1cIiRSRU1PVEVcIiAtQkY9XCIkQkFTRVwiIC1SRj1cIiRNRVJHRURcIiIsCisJCQkiLU1GPVwiJExPQ0FMXCIgLVRGPVwiJFJFTU9URVwiIC1SRj1cIiRNRVJHRURcIiIsCisJCQlmYWxzZSksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5kZWx0YXdhbGtlci5jb20vaW50ZWdyYXRlL2NvbW1hbmQtbGluZSI+aHR0cHM6Ly93d3cuZGVsdGF3YWxrZXIuY29tL2ludGVncmF0ZS9jb21tYW5kLWxpbmU8L2E+CisJICogPHA+CisJICogSGludDogJChwd2QpIGNvbW1hbmQgbXVzdCBiZSBkZWZpbmVkCisJICogPC9wPgorCSAqLworCWRlbHRhd2Fsa2VyKCJEZWx0YVdhbGtlciIsCisJCQkiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiBcIiRCQVNFXCIgLXB3ZD1cIiQocHdkKVwiIC1tZXJnZWQ9XCIkTUVSR0VEXCIiLAorCQkJIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIgLXB3ZD1cIiQocHdkKVwiIC1tZXJnZWQ9XCIkTUVSR0VEXCIiLAorCQkJdHJ1ZSksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3NvdXJjZWdlYXIuY29tL2RpZmZtZXJnZS93ZWJoZWxwL3NlY19fY2xhcmdzX19kaWZmLmh0bWwiPmh0dHBzOi8vc291cmNlZ2Vhci5jb20vZGlmZm1lcmdlL3dlYmhlbHAvc2VjX19jbGFyZ3NfX2RpZmYuaHRtbDwvYT4KKwkgKi8KKwlkaWZmbWVyZ2UoImRpZmZtZXJnZSIsIC8vJE5PTi1OTFMtMSQKKwkJCSItLW1lcmdlIC0tcmVzdWx0PVwiJE1FUkdFRFwiIFwiJExPQ0FMXCIgXCIkQkFTRVwiIFwiJFJFTU9URVwiIiwKKwkJCSItLW1lcmdlIC0tcmVzdWx0PVwiJE1FUkdFRFwiIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiLAorCQkJdHJ1ZSksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vZGlmZnVzZS5zb3VyY2Vmb3JnZS5uZXQvbWFudWFsLmh0bWwjaW50cm9kdWN0aW9uLXVzYWdlIj5odHRwOi8vZGlmZnVzZS5zb3VyY2Vmb3JnZS5uZXQvbWFudWFsLmh0bWwjaW50cm9kdWN0aW9uLXVzYWdlPC9hPgorCSAqIDxwPgorCSAqIEhpbnQ6IGNoZWNrIHRoZSAnIHwgY2F0JyBmb3IgdGhlIGNhbGwKKwkgKiA8L3A+CisJICovCisJZGlmZnVzZSgiZGlmZnVzZSIsICJcIiRMT0NBTFwiIFwiJE1FUkdFRFwiIFwiJFJFTU9URVwiIFwiJEJBU0VcIiIsCisJCQkiXCIkTE9DQUxcIiBcIiRNRVJHRURcIiBcIiRSRU1PVEVcIiIsIGZhbHNlKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly93d3cuZWxsaWVjb21wdXRpbmcuY29tL2VuL09ubGluZURvYy9lY21lcmdlX2VuLzQ0MjA1MTY3LmFzcCI+aHR0cDovL3d3dy5lbGxpZWNvbXB1dGluZy5jb20vZW4vT25saW5lRG9jL2VjbWVyZ2VfZW4vNDQyMDUxNjcuYXNwPC9hPgorCSAqLworCWVjbWVyZ2UoImVjbWVyZ2UiLAorCQkJIi0tZGVmYXVsdCAtLW1vZGU9bWVyZ2UzIFwiJEJBU0VcIiBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIC0tdG89XCIkTUVSR0VEXCIiLAorCQkJIi0tZGVmYXVsdCAtLW1vZGU9bWVyZ2UyIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIgLS10bz1cIiRNRVJHRURcIiIsCisJCQlmYWxzZSksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2VtYWNzL21hbnVhbC9odG1sX25vZGUvZW1hY3MvT3ZlcnZpZXctb2YtRW1lcmdlLmh0bWwiPmh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZW1hY3MvbWFudWFsL2h0bWxfbm9kZS9lbWFjcy9PdmVydmlldy1vZi1FbWVyZ2UuaHRtbDwvYT4KKwkgKiA8cD4KKwkgKiBIaW50OiAkKGJhc2VuYW1lKSBjb21tYW5kIG11c3QgYmUgZGVmaW5lZAorCSAqIDwvcD4KKwkgKi8KKwllbWVyZ2UoImVtYWNzIiwKKwkJCSItZiBlbWVyZ2UtZmlsZXMtd2l0aC1hbmNlc3Rvci1jb21tYW5kIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIgXCIkQkFTRVwiIFwiJChiYXNlbmFtZSBcIiRNRVJHRURcIilcIiIsCisJCQkiLWYgZW1lcmdlLWZpbGVzLWNvbW1hbmQgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiBcIiQoYmFzZW5hbWUgXCIkTUVSR0VEXCIpXCIiLAorCQkJdHJ1ZSksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5wcmVzdG9zb2Z0LmNvbS9wcy5hc3A/cGFnZT1odG1saGVscC9lZHAvY29tbWFuZF9saW5lX29wdGlvbnMiPmh0dHBzOi8vd3d3LnByZXN0b3NvZnQuY29tL3BzLmFzcD9wYWdlPWh0bWxoZWxwL2VkcC9jb21tYW5kX2xpbmVfb3B0aW9uczwvYT4KKwkgKi8KKwlleGFtZGlmZigiRXhhbURpZmYiLAorCQkJIi1tZXJnZSBcIiRMT0NBTFwiIFwiJEJBU0VcIiBcIiRSRU1PVEVcIiAtbzpcIiRNRVJHRURcIiAtbmgiLAorCQkJIi1tZXJnZSBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIC1vOlwiJE1FUkdFRFwiIC1uaCIsCisJCQlmYWxzZSksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5ndWlmZnkuY29tL2hlbHAvR3VpZmZ5SGVscC9HdWlmZnlDbWQuaHRtbCI+aHR0cHM6Ly93d3cuZ3VpZmZ5LmNvbS9oZWxwL0d1aWZmeUhlbHAvR3VpZmZ5Q21kLmh0bWw8L2E+CisJICovCisJZ3VpZmZ5KCJndWlmZnkiLCAiLXMgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiBcIiRCQVNFXCIgXCIkTUVSR0VEXCIiLAorCQkJIi1tIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIgXCIkTUVSR0VEXCIiLCB0cnVlKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KKwkgKi8KKwlndmltZGlmZigiZ3ZpbSIsCisJCQkiLWYgLWQgLWMgJzR3aW5jbWQgdyB8IHdpbmNtZCBKJyBcIiRMT0NBTFwiIFwiJEJBU0VcIiBcIiRSRU1PVEVcIiBcIiRNRVJHRURcIiIsCisJCQkiLWYgLWQgLWMgJ3dpbmNtZCBsJyBcIiRMT0NBTFwiIFwiJE1FUkdFRFwiIFwiJFJFTU9URVwiIiwKKwkJCXRydWUpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWwiPmh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sPC9hPgorCSAqLworCWd2aW1kaWZmMigiZ3ZpbSIsICItZiAtZCAtYyAnd2luY21kIGwnIFwiJExPQ0FMXCIgXCIkTUVSR0VEXCIgXCIkUkVNT1RFXCIiLAorCQkJIi1mIC1kIC1jICd3aW5jbWQgbCcgXCIkTE9DQUxcIiBcIiRNRVJHRURcIiBcIiRSRU1PVEVcIiIsIHRydWUpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0gImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj48L2E+CisJICovCisJZ3ZpbWRpZmYzKCJndmltIiwKKwkJCSItZiAtZCAtYyAnaGlkIHwgaGlkIHwgaGlkJyBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIFwiJEJBU0VcIiBcIiRNRVJHRURcIiIsCisJCQkiLWYgLWQgLWMgJ2hpZCB8IGhpZCcgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiBcIiRNRVJHRURcIiIsIHRydWUpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL2tkaWZmMy5zb3VyY2Vmb3JnZS5uZXQvZG9jL2RvY3VtZW50YXRpb24uaHRtbCI+aHR0cDovL2tkaWZmMy5zb3VyY2Vmb3JnZS5uZXQvZG9jL2RvY3VtZW50YXRpb24uaHRtbDwvYT4KKwkgKi8KKwlrZGlmZjMoImtkaWZmMyIsCisJCQkiLS1hdXRvIC0tTDEgXCIkTUVSR0VEIChCYXNlKVwiIC0tTDIgXCIkTUVSR0VEIChMb2NhbClcIiAtLUwzIFwiJE1FUkdFRCAoUmVtb3RlKVwiIC1vIFwiJE1FUkdFRFwiIFwiJEJBU0VcIiBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiwKKwkJCSItLWF1dG8gLS1MMSBcIiRNRVJHRUQgKExvY2FsKVwiIC0tTDIgXCIkTUVSR0VEIChSZW1vdGUpXCIgLW8gXCIkTUVSR0VEXCIgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIsCisJCQl0cnVlKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly9tZWxkbWVyZ2Uub3JnL2hlbHAvZmlsZS1tb2RlLmh0bWwiPmh0dHA6Ly9tZWxkbWVyZ2Uub3JnL2hlbHAvZmlsZS1tb2RlLmh0bWw8L2E+CisJICogPHA+CisJICogSGludDogdXNlIG1lbGQgd2l0aCBvdXRwdXQgb3B0aW9uIG9ubHkgKG5ldyB2ZXJzaW9ucykKKwkgKiA8L3A+CisJICovCisJbWVsZCgibWVsZCIsICItLW91dHB1dD1cIiRNRVJHRURcIiBcIiRMT0NBTFwiIFwiJEJBU0VcIiBcIiRSRU1PVEVcIiIsCisJCQkiXCIkTE9DQUxcIiBcIiRNRVJHRURcIiBcIiRSRU1PVEVcIiIsCisJCQlmYWxzZSksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8vd3d3Lm1hbnBhZ2V6LmNvbS9tYW4vMS9vcGVuZGlmZi8iPmh0dHA6Ly93d3cubWFucGFnZXouY29tL21hbi8xL29wZW5kaWZmLzwvYT4KKwkgKiA8cD4KKwkgKiBIaW50OiBjaGVjayB0aGUgJyB8IGNhdCcgZm9yIHRoZSBjYWxsCisJICogPC9wPgorCSAqLworCW9wZW5kaWZmKCJvcGVuZGlmZiIsCisJCQkiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiAtYW5jZXN0b3IgXCIkQkFTRVwiIC1tZXJnZSBcIiRNRVJHRURcIiIsCisJCQkiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiAtbWVyZ2UgXCIkTUVSR0VEXCIiLAorCQkJZmFsc2UpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cucGVyZm9yY2UuY29tL21hbnVhbHMvdjE1LjEvY21kcmVmL3A0X21lcmdlLmh0bWwiPmh0dHBzOi8vd3d3LnBlcmZvcmNlLmNvbS9tYW51YWxzL3YxNS4xL2NtZHJlZi9wNF9tZXJnZS5odG1sPC9hPgorCSAqIDxwPgorCSAqIEhpbnQ6IGNoZWNrIGhvdyB0byBmaXggIm5vIGJhc2UgcHJlc2VudCIgLyBjcmVhdGVfdmlydHVhbF9iYXNlIHByb2JsZW0KKwkgKiA8L3A+CisJICovCisJcDRtZXJnZSgicDRtZXJnZSIsICJcIiRCQVNFXCIgXCIkUkVNT1RFXCIgXCIkTE9DQUxcIiBcIiRNRVJHRURcIiIsCisJCQkiXCIkUkVNT1RFXCIgXCIkTE9DQUxcIiBcIiRNRVJHRURcIiIsIGZhbHNlKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly9saW51eC5tYXRoLnRpZnIucmVzLmluL21hbnVhbHMvbWFuL3RrZGlmZi5odG1sIj5odHRwOi8vbGludXgubWF0aC50aWZyLnJlcy5pbi9tYW51YWxzL21hbi90a2RpZmYuaHRtbDwvYT4KKwkgKi8KKwl0a2RpZmYoInRrZGlmZiIsICItYSBcIiRCQVNFXCIgLW8gXCIkTUVSR0VEXCIgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIsCisJCQkiLW8gXCIkTUVSR0VEXCIgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIsCisJCQl0cnVlKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vdG9ydG9pc2VnaXQub3JnL2RvY3MvdG9ydG9pc2VnaXRtZXJnZS90bWUtYXV0b21hdGlvbi5odG1sI3RtZS1hdXRvbWF0aW9uLWJhc2ljcyI+aHR0cHM6Ly90b3J0b2lzZWdpdC5vcmcvZG9jcy90b3J0b2lzZWdpdG1lcmdlL3RtZS1hdXRvbWF0aW9uLmh0bWwjdG1lLWF1dG9tYXRpb24tYmFzaWNzPC9hPgorCSAqIDxwPgorCSAqIEhpbnQ6IG1lcmdlIHdpdGhvdXQgYmFzZSBpcyBub3Qgc3VwcG9ydGVkCisJICogPC9wPgorCSAqIDxwPgorCSAqIEhpbnQ6IGNhbm5vdCBkaWZmCisJICogPC9wPgorCSAqLworCXRvcnRvaXNlZ2l0bWVyZ2UoInRvcnRvaXNlZ2l0bWVyZ2UiLAorCQkJIi1iYXNlIFwiJEJBU0VcIiAtbWluZSBcIiRMT0NBTFwiIC10aGVpcnMgXCIkUkVNT1RFXCIgLW1lcmdlZCBcIiRNRVJHRURcIiIsCisJCQludWxsLCBmYWxzZSksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3RvcnRvaXNlZ2l0Lm9yZy9kb2NzL3RvcnRvaXNlZ2l0bWVyZ2UvdG1lLWF1dG9tYXRpb24uaHRtbCN0bWUtYXV0b21hdGlvbi1iYXNpY3MiPmh0dHBzOi8vdG9ydG9pc2VnaXQub3JnL2RvY3MvdG9ydG9pc2VnaXRtZXJnZS90bWUtYXV0b21hdGlvbi5odG1sI3RtZS1hdXRvbWF0aW9uLWJhc2ljczwvYT4KKwkgKiA8cD4KKwkgKiBIaW50OiBtZXJnZSB3aXRob3V0IGJhc2UgaXMgbm90IHN1cHBvcnRlZAorCSAqIDwvcD4KKwkgKiA8cD4KKwkgKiBIaW50OiBjYW5ub3QgZGlmZgorCSAqIDwvcD4KKwkgKi8KKwl0b3J0b2lzZW1lcmdlKCJ0b3J0b2lzZW1lcmdlIiwKKwkJCSItYmFzZTpcIiRCQVNFXCIgLW1pbmU6XCIkTE9DQUxcIiAtdGhlaXJzOlwiJFJFTU9URVwiIC1tZXJnZWQ6XCIkTUVSR0VEXCIiLAorCQkJbnVsbCwgZmFsc2UpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWwiPmh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sPC9hPgorCSAqLworCXZpbWRpZmYoInZpbSIsIGd2aW1kaWZmKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KKwkgKi8KKwl2aW1kaWZmMigidmltIiwgZ3ZpbWRpZmYyKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KKwkgKi8KKwl2aW1kaWZmMygidmltIiwgZ3ZpbWRpZmYzKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly9tYW51YWwud2lubWVyZ2Uub3JnL0NvbW1hbmRfbGluZS5odG1sIj5odHRwOi8vbWFudWFsLndpbm1lcmdlLm9yZy9Db21tYW5kX2xpbmUuaHRtbDwvYT4KKwkgKiA8cD4KKwkgKiBIaW50OiBjaGVjayBob3cgJ21lcmdldG9vbF9maW5kX3dpbjMyX2NtZCAiV2luTWVyZ2VVLmV4ZSIgIldpbk1lcmdlIicKKwkgKiB3b3JrcworCSAqIDwvcD4KKwkgKi8KKwl3aW5tZXJnZSgiV2luTWVyZ2VVIiwKKwkJCSItdSAtZSAtZGwgTG9jYWwgLWRyIFJlbW90ZSBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIFwiJE1FUkdFRFwiIiwKKwkJCSItdSAtZSAtZGwgTG9jYWwgLWRyIFJlbW90ZSBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIFwiJE1FUkdFRFwiIiwKKwkJCWZhbHNlKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly9mdXJpdXMuY2EveHhkaWZmL2RvYy94eGRpZmYtZG9jLmh0bWwiPmh0dHA6Ly9mdXJpdXMuY2EveHhkaWZmL2RvYy94eGRpZmYtZG9jLmh0bWw8L2E+CisJICovCisJeHhkaWZmKCJ4eGRpZmYiLAorCQkJIi1YIC0tc2hvdy1tZXJnZWQtcGFuZSAtUiAnQWNjZWwuU2F2ZUFzTWVyZ2VkOiBcIkN0cmwrU1wiJyAtUiAnQWNjZWwuU2VhcmNoOiBcIkN0cmwrRlwiJyAtUiAnQWNjZWwuU2VhcmNoRm9yd2FyZDogXCJDdHJsK0dcIicgLS1tZXJnZWQtZmlsZSBcIiRNRVJHRURcIiBcIiRMT0NBTFwiIFwiJEJBU0VcIiBcIiRSRU1PVEVcIiIsCisJCQkiLVggLVIgJ0FjY2VsLlNhdmVBc01lcmdlZDogXCJDdHJsK1NcIicgLVIgJ0FjY2VsLlNlYXJjaDogXCJDdHJsK0ZcIicgLVIgJ0FjY2VsLlNlYXJjaEZvcndhcmQ6IFwiQ3RybCtHXCInIC0tbWVyZ2VkLWZpbGUgXCIkTUVSR0VEXCIgXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIsCisJCQlmYWxzZSk7CisKKwlDb21tYW5kTGluZU1lcmdlVG9vbChTdHJpbmcgcGF0aCwgU3RyaW5nIHBhcmFtZXRlcnNXaXRoQmFzZSwKKwkJCVN0cmluZyBwYXJhbWV0ZXJzV2l0aG91dEJhc2UsCisJCQlib29sZWFuIGV4aXRDb2RlVHJ1c3RhYmxlKSB7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJCXRoaXMucGFyYW1ldGVyc1dpdGhCYXNlID0gcGFyYW1ldGVyc1dpdGhCYXNlOworCQl0aGlzLnBhcmFtZXRlcnNXaXRob3V0QmFzZSA9IHBhcmFtZXRlcnNXaXRob3V0QmFzZTsKKwkJdGhpcy5leGl0Q29kZVRydXN0YWJsZSA9IGV4aXRDb2RlVHJ1c3RhYmxlOworICAgIH0KKworCUNvbW1hbmRMaW5lTWVyZ2VUb29sKENvbW1hbmRMaW5lTWVyZ2VUb29sIGZyb20pIHsKKwkJdGhpcyhmcm9tLmdldFBhdGgoKSwgZnJvbS5nZXRQYXJhbWV0ZXJzKHRydWUpLAorCQkJCWZyb20uZ2V0UGFyYW1ldGVycyhmYWxzZSksIGZyb20uaXNFeGl0Q29kZVRydXN0YWJsZSgpKTsKKwl9CisKKwlDb21tYW5kTGluZU1lcmdlVG9vbChTdHJpbmcgcGF0aCwgQ29tbWFuZExpbmVNZXJnZVRvb2wgZnJvbSkgeworCQl0aGlzKHBhdGgsIGZyb20uZ2V0UGFyYW1ldGVycyh0cnVlKSwgZnJvbS5nZXRQYXJhbWV0ZXJzKGZhbHNlKSwKKwkJCQlmcm9tLmlzRXhpdENvZGVUcnVzdGFibGUoKSk7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0aDsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmFtZXRlcnNXaXRoQmFzZTsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmFtZXRlcnNXaXRob3V0QmFzZTsKKworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBleGl0Q29kZVRydXN0YWJsZTsKKworCS8qKgorCSAqIEByZXR1cm4gcGF0aAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJLyoqCisJICogQHBhcmFtIHdpdGhCYXNlCisJICogICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVycyB3aXRoIGJhc2UgcHJlc2VudD8KKwkgKiBAcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBvciB3aXRob3V0IGJhc2UgcHJlc2VudAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVycyhib29sZWFuIHdpdGhCYXNlKSB7CisJCWlmICh3aXRoQmFzZSkgeworCQkJcmV0dXJuIHBhcmFtZXRlcnNXaXRoQmFzZTsKKwkJfQorCQlyZXR1cm4gcGFyYW1ldGVyc1dpdGhvdXRCYXNlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gcGFyYW1ldGVycworCSAqLworCXB1YmxpYyBib29sZWFuIGlzRXhpdENvZGVUcnVzdGFibGUoKSB7CisJCXJldHVybiBleGl0Q29kZVRydXN0YWJsZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgY29tbWFuZCB3aXRoIGJhc2UgcHJlc2VudCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJcHVibGljIGJvb2xlYW4gY2FuTWVyZ2VXaXRob3V0QmFzZVByZXNlbnQoKSB7CisJCXJldHVybiBwYXJhbWV0ZXJzV2l0aG91dEJhc2UgIT0gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9EaWZmVG9vbENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29sQ29uZmlnLmphdmEKaW5kZXggNTUxZjYzNC4uYzhiMDRmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29sQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29sQ29uZmlnLmphdmEKQEAgLTQ5LDkgKzQ5LDEwIEBAIHByaXZhdGUgRGlmZlRvb2xDb25maWcoQ29uZmlnIHJjKSB7CiAJCXRvb2xOYW1lID0gcmMuZ2V0U3RyaW5nKENPTkZJR19ESUZGX1NFQ1RJT04sIG51bGwsIENPTkZJR19LRVlfVE9PTCk7CiAJCWd1aVRvb2xOYW1lID0gcmMuZ2V0U3RyaW5nKENPTkZJR19ESUZGX1NFQ1RJT04sIG51bGwsCiAJCQkJQ09ORklHX0tFWV9HVUlUT09MKTsKLQkJcHJvbXB0ID0gcmMuZ2V0Qm9vbGVhbihDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgQ09ORklHX0tFWV9QUk9NUFQsCisJCXByb21wdCA9IHJjLmdldEJvb2xlYW4oQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIHRvb2xOYW1lLAorCQkJCUNPTkZJR19LRVlfUFJPTVBULAogCQkJCXRydWUpOwotCQlTdHJpbmcgdHJ1c3RTdHIgPSByYy5nZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIG51bGwsCisJCVN0cmluZyB0cnVzdFN0ciA9IHJjLmdldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgdG9vbE5hbWUsCiAJCQkJQ09ORklHX0tFWV9UUlVTVF9FWElUX0NPREUpOwogCQlpZiAodHJ1c3RTdHIgIT0gbnVsbCkgewogCQkJdHJ1c3RFeGl0Q29kZSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHRydXN0U3RyKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29scy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29scy5qYXZhCmluZGV4IDM5NzI5YTQuLmQwMDM0ZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9EaWZmVG9vbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRGlmZlRvb2xzLmphdmEKQEAgLTEsNSArMSw2IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMiwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxOSwgVGltIE5ldW1hbm4gPHRpbS5uZXVtYW5uQGFkdmFudGVzdC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwyNCArMTEsNDMgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CiAKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbC5Cb29sZWFuVHJpU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTLkV4ZWN1dGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgogICogTWFuYWdlcyBkaWZmIHRvb2xzLgogICovCiBwdWJsaWMgY2xhc3MgRGlmZlRvb2xzIHsKIAorCXByaXZhdGUgZmluYWwgRlMgZnM7CisKKwlwcml2YXRlIGZpbmFsIEZpbGUgZ2l0RGlyOworCisJcHJpdmF0ZSBmaW5hbCBGaWxlIHdvcmtUcmVlOworCiAJcHJpdmF0ZSBmaW5hbCBEaWZmVG9vbENvbmZpZyBjb25maWc7CiAKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHByZWRlZmluZWRUb29sczsKKwlwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnkgcmVwbzsKIAotCXByaXZhdGUgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gdXNlckRlZmluZWRUb29sczsKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHByZWRlZmluZWRUb29sczsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gdXNlckRlZmluZWRUb29sczsKIAogCS8qKgogCSAqIENyZWF0ZXMgdGhlIGV4dGVybmFsIGRpZmYtdG9vbHMgbWFuYWdlciBmb3IgZ2l2ZW4gcmVwb3NpdG9yeS4KQEAgLTM2LDQ2ICs1NiwyMjAgQEAgcHVibGljIGNsYXNzIERpZmZUb29scyB7CiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeQogCSAqLwogCXB1YmxpYyBEaWZmVG9vbHMoUmVwb3NpdG9yeSByZXBvKSB7Ci0JCWNvbmZpZyA9IHJlcG8uZ2V0Q29uZmlnKCkuZ2V0KERpZmZUb29sQ29uZmlnLktFWSk7Ci0JCXNldHVwUHJlZGVmaW5lZFRvb2xzKCk7Ci0JCXNldHVwVXNlckRlZmluZWRUb29scygpOworCQl0aGlzKHJlcG8sIHJlcG8uZ2V0Q29uZmlnKCkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGV4dGVybmFsIG1lcmdlLXRvb2xzIG1hbmFnZXIgZm9yIGdpdmVuIGNvbmZpZ3VyYXRpb24uCisJICoKKwkgKiBAcGFyYW0gY29uZmlnCisJICogICAgICAgICAgICB0aGUgZ2l0IGNvbmZpZ3VyYXRpb24KKwkgKi8KKwlwdWJsaWMgRGlmZlRvb2xzKFN0b3JlZENvbmZpZyBjb25maWcpIHsKKwkJdGhpcyhudWxsLCBjb25maWcpOworCX0KKworCXByaXZhdGUgRGlmZlRvb2xzKFJlcG9zaXRvcnkgcmVwbywgU3RvcmVkQ29uZmlnIGNvbmZpZykgeworCQl0aGlzLnJlcG8gPSByZXBvOworCQl0aGlzLmNvbmZpZyA9IGNvbmZpZy5nZXQoRGlmZlRvb2xDb25maWcuS0VZKTsKKwkJdGhpcy5naXREaXIgPSByZXBvID09IG51bGwgPyBudWxsIDogcmVwby5nZXREaXJlY3RvcnkoKTsKKwkJdGhpcy5mcyA9IHJlcG8gPT0gbnVsbCA/IEZTLkRFVEVDVEVEIDogcmVwby5nZXRGUygpOworCQl0aGlzLndvcmtUcmVlID0gcmVwbyA9PSBudWxsID8gbnVsbCA6IHJlcG8uZ2V0V29ya1RyZWUoKTsKKwkJcHJlZGVmaW5lZFRvb2xzID0gc2V0dXBQcmVkZWZpbmVkVG9vbHMoKTsKKwkJdXNlckRlZmluZWRUb29scyA9IHNldHVwVXNlckRlZmluZWRUb29scyhwcmVkZWZpbmVkVG9vbHMpOwogCX0KIAogCS8qKgogCSAqIENvbXBhcmUgdHdvIHZlcnNpb25zIG9mIGEgZmlsZS4KIAkgKgotCSAqIEBwYXJhbSBuZXdQYXRoCi0JICogICAgICAgICAgICB0aGUgbmV3IGZpbGUgcGF0aAotCSAqIEBwYXJhbSBvbGRQYXRoCi0JICogICAgICAgICAgICB0aGUgb2xkIGZpbGUgcGF0aAotCSAqIEBwYXJhbSBuZXdJZAotCSAqICAgICAgICAgICAgdGhlIG5ldyBvYmplY3QgSUQKLQkgKiBAcGFyYW0gb2xkSWQKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgb2JqZWN0IElECisJICogQHBhcmFtIGxvY2FsRmlsZQorCSAqICAgICAgICAgICAgVGhlIGxvY2FsL2xlZnQgdmVyc2lvbiBvZiB0aGUgZmlsZS4KKwkgKiBAcGFyYW0gcmVtb3RlRmlsZQorCSAqICAgICAgICAgICAgVGhlIHJlbW90ZS9yaWdodCB2ZXJzaW9uIG9mIHRoZSBmaWxlLgogCSAqIEBwYXJhbSB0b29sTmFtZQotCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGVkIHRvb2wgbmFtZSAoY2FuIGJlIG51bGwpCisJICogICAgICAgICAgICBPcHRpb25hbGx5IHRoZSBuYW1lIG9mIHRoZSB0b29sIHRvIHVzZS4gSWYgbm90IGdpdmVuIHRoZQorCSAqICAgICAgICAgICAgZGVmYXVsdCB0b29sIHdpbGwgYmUgdXNlZC4KIAkgKiBAcGFyYW0gcHJvbXB0Ci0JICogICAgICAgICAgICB0aGUgcHJvbXB0IG9wdGlvbgorCSAqICAgICAgICAgICAgT3B0aW9uYWxseSBhIGZsYWcgd2hldGhlciB0byBwcm9tcHQgdGhlIHVzZXIgYmVmb3JlIGNvbXBhcmUuCisJICogICAgICAgICAgICBJZiBub3QgZ2l2ZW4gdGhlIGRlZmF1bHQgd2lsbCBiZSB1c2VkLgogCSAqIEBwYXJhbSBndWkKLQkgKiAgICAgICAgICAgIHRoZSBHVUkgb3B0aW9uCisJICogICAgICAgICAgICBBIGZsYWcgd2hldGhlciB0byBwcmVmZXIgYSBndWkgdG9vbC4KKwkgKiBAcGFyYW0gdHJ1c3RFeGl0Q29kZQorCSAqICAgICAgICAgICAgT3B0aW9uYWxseSBhIGZsYWcgd2hldGhlciB0byB0cnVzdCB0aGUgZXhpdCBjb2RlIG9mIHRoZSB0b29sLgorCSAqICAgICAgICAgICAgSWYgbm90IGdpdmVuIHRoZSBkZWZhdWx0IHdpbGwgYmUgdXNlZC4KKwkgKiBAcGFyYW0gcHJvbXB0SGFuZGxlcgorCSAqICAgICAgICAgICAgVGhlIGhhbmRsZXIgdG8gdXNlIHdoZW4gbmVlZGluZyB0byBwcm9tcHQgdGhlIHVzZXIgaWYgaGUgd2FudHMKKwkgKiAgICAgICAgICAgIHRvIGNvbnRpbnVlLgorCSAqIEBwYXJhbSBub1Rvb2xIYW5kbGVyCisJICogICAgICAgICAgICBUaGUgaGFuZGxlciB0byB1c2Ugd2hlbiBuZWVkaW5nIHRvIGluZm9ybSB0aGUgdXNlciwgdGhhdCBubworCSAqICAgICAgICAgICAgdG9vbCBpcyBjb25maWd1cmVkLgorCSAqIEByZXR1cm4gdGhlIG9wdGlvbmFsIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHRvb2wgaWYgaXQgd2FzIGV4ZWN1dGVkCisJICogQHRocm93cyBUb29sRXhjZXB0aW9uCisJICogICAgICAgICAgICAgd2hlbiB0aGUgdG9vbCBmYWlscworCSAqLworCXB1YmxpYyBPcHRpb25hbDxFeGVjdXRpb25SZXN1bHQ+IGNvbXBhcmUoRmlsZUVsZW1lbnQgbG9jYWxGaWxlLAorCQkJRmlsZUVsZW1lbnQgcmVtb3RlRmlsZSwgT3B0aW9uYWw8U3RyaW5nPiB0b29sTmFtZSwKKwkJCUJvb2xlYW5UcmlTdGF0ZSBwcm9tcHQsIGJvb2xlYW4gZ3VpLCBCb29sZWFuVHJpU3RhdGUgdHJ1c3RFeGl0Q29kZSwKKwkJCVByb21wdENvbnRpbnVlSGFuZGxlciBwcm9tcHRIYW5kbGVyLAorCQkJSW5mb3JtTm9Ub29sSGFuZGxlciBub1Rvb2xIYW5kbGVyKSB0aHJvd3MgVG9vbEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIHRvb2xOYW1lVG9Vc2U7CisKKwkJaWYgKHRvb2xOYW1lID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmRpZmZUb29sTnVsbEVycm9yKTsKKwkJfQorCisJCWlmICh0b29sTmFtZS5pc1ByZXNlbnQoKSkgeworCQkJdG9vbE5hbWVUb1VzZSA9IHRvb2xOYW1lLmdldCgpOworCQl9IGVsc2UgeworCQkJdG9vbE5hbWVUb1VzZSA9IGdldERlZmF1bHRUb29sTmFtZShndWkpOworCQl9CisKKwkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwodG9vbE5hbWVUb1VzZSkpIHsKKwkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmRpZmZUb29sTm90R2l2ZW5FcnJvcik7CisJCX0KKworCQlib29sZWFuIGRvUHJvbXB0OworCQlpZiAocHJvbXB0ICE9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVCkgeworCQkJZG9Qcm9tcHQgPSBwcm9tcHQgPT0gQm9vbGVhblRyaVN0YXRlLlRSVUU7CisJCX0gZWxzZSB7CisJCQlkb1Byb21wdCA9IGlzSW50ZXJhY3RpdmUoKTsKKwkJfQorCisJCWlmIChkb1Byb21wdCkgeworCQkJaWYgKCFwcm9tcHRIYW5kbGVyLnByb21wdCh0b29sTmFtZVRvVXNlKSkgeworCQkJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCQkJfQorCQl9CisKKwkJYm9vbGVhbiB0cnVzdDsKKwkJaWYgKHRydXN0RXhpdENvZGUgIT0gQm9vbGVhblRyaVN0YXRlLlVOU0VUKSB7CisJCQl0cnVzdCA9IHRydXN0RXhpdENvZGUgPT0gQm9vbGVhblRyaVN0YXRlLlRSVUU7CisJCX0gZWxzZSB7CisJCQl0cnVzdCA9IGNvbmZpZy5pc1RydXN0RXhpdENvZGUoKTsKKwkJfQorCisJCUV4dGVybmFsRGlmZlRvb2wgdG9vbCA9IGdldFRvb2wodG9vbE5hbWVUb1VzZSk7CisJCWlmICh0b29sID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKAorCQkJCQkiRXh0ZXJuYWwgZGlmZiB0b29sIGlzIG5vdCBkZWZpbmVkOiAiICsgdG9vbE5hbWVUb1VzZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCXJldHVybiBPcHRpb25hbC5vZigKKwkJCQljb21wYXJlKGxvY2FsRmlsZSwgcmVtb3RlRmlsZSwgdG9vbCwgdHJ1c3QpKTsKKwl9CisKKwkvKioKKwkgKiBDb21wYXJlIHR3byB2ZXJzaW9ucyBvZiBhIGZpbGUuCisJICoKKwkgKiBAcGFyYW0gbG9jYWxGaWxlCisJICogICAgICAgICAgICB0aGUgbG9jYWwgZmlsZSBlbGVtZW50CisJICogQHBhcmFtIHJlbW90ZUZpbGUKKwkgKiAgICAgICAgICAgIHRoZSByZW1vdGUgZmlsZSBlbGVtZW50CisJICogQHBhcmFtIHRvb2wKKwkgKiAgICAgICAgICAgIHRoZSBzZWxlY3RlZCB0b29sCiAJICogQHBhcmFtIHRydXN0RXhpdENvZGUKIAkgKiAgICAgICAgICAgIHRoZSAidHJ1c3QgZXhpdCBjb2RlIiBvcHRpb24KLQkgKiBAcmV0dXJuIHRoZSByZXR1cm4gY29kZSBmcm9tIGV4ZWN1dGVkIHRvb2wKKwkgKiBAcmV0dXJuIHRoZSBleGVjdXRpb24gcmVzdWx0IGZyb20gdG9vbAorCSAqIEB0aHJvd3MgVG9vbEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbmV3UGF0aCwgU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdJZCwKLQkJCVN0cmluZyBvbGRJZCwgU3RyaW5nIHRvb2xOYW1lLCBCb29sZWFuVHJpU3RhdGUgcHJvbXB0LAotCQkJQm9vbGVhblRyaVN0YXRlIGd1aSwgQm9vbGVhblRyaVN0YXRlIHRydXN0RXhpdENvZGUpIHsKLQkJcmV0dXJuIDA7CisJcHVibGljIEV4ZWN1dGlvblJlc3VsdCBjb21wYXJlKEZpbGVFbGVtZW50IGxvY2FsRmlsZSwKKwkJCUZpbGVFbGVtZW50IHJlbW90ZUZpbGUsIEV4dGVybmFsRGlmZlRvb2wgdG9vbCwKKwkJCWJvb2xlYW4gdHJ1c3RFeGl0Q29kZSkgdGhyb3dzIFRvb2xFeGNlcHRpb24geworCQl0cnkgeworCQkJaWYgKHRvb2wgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKEpHaXRUZXh0CisJCQkJCQkuZ2V0KCkuZGlmZlRvb2xOb3RTcGVjaWZpZWRJbkdpdEF0dHJpYnV0ZXNFcnJvcik7CisJCQl9CisJCQkvLyBwcmVwYXJlIHRoZSBjb21tYW5kIChyZXBsYWNlIHRoZSBmaWxlIHBhdGhzKQorCQkJU3RyaW5nIGNvbW1hbmQgPSBFeHRlcm5hbFRvb2xVdGlscy5wcmVwYXJlQ29tbWFuZCh0b29sLmdldENvbW1hbmQoKSwKKwkJCQkJbG9jYWxGaWxlLCByZW1vdGVGaWxlLCBudWxsLCBudWxsKTsKKwkJCS8vIHByZXBhcmUgdGhlIGVudmlyb25tZW50CisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGVudiA9IEV4dGVybmFsVG9vbFV0aWxzLnByZXBhcmVFbnZpcm9ubWVudCgKKwkJCQkJZ2l0RGlyLCBsb2NhbEZpbGUsIHJlbW90ZUZpbGUsIG51bGwsIG51bGwpOworCQkJLy8gZXhlY3V0ZSB0aGUgdG9vbAorCQkJQ29tbWFuZEV4ZWN1dG9yIGNtZEV4ZWMgPSBuZXcgQ29tbWFuZEV4ZWN1dG9yKGZzLCB0cnVzdEV4aXRDb2RlKTsKKwkJCXJldHVybiBjbWRFeGVjLnJ1bihjb21tYW5kLCB3b3JrVHJlZSwgZW52KTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgVG9vbEV4Y2VwdGlvbihlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWxvY2FsRmlsZS5jbGVhblRlbXBvcmFyaWVzKCk7CisJCQlyZW1vdGVGaWxlLmNsZWFuVGVtcG9yYXJpZXMoKTsKKwkJfQogCX0KIAogCS8qKgotCSAqIEByZXR1cm4gdGhlIHRvb2wgbmFtZXMKKwkgKiBHZXQgdXNlciBkZWZpbmVkIHRvb2wgbmFtZXMuCisJICoKKwkgKiBAcmV0dXJuIHRoZSB1c2VyIGRlZmluZWQgdG9vbCBuYW1lcwogCSAqLwotCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRUb29sTmFtZXMoKSB7Ci0JCXJldHVybiBjb25maWcuZ2V0VG9vbE5hbWVzKCk7CisJcHVibGljIFNldDxTdHJpbmc+IGdldFVzZXJEZWZpbmVkVG9vbE5hbWVzKCkgeworCQlyZXR1cm4gdXNlckRlZmluZWRUb29scy5rZXlTZXQoKTsKIAl9CiAKIAkvKioKKwkgKiBHZXQgcHJlZGVmaW5lZCB0b29sIG5hbWVzLgorCSAqCisJICogQHJldHVybiB0aGUgcHJlZGVmaW5lZCB0b29sIG5hbWVzCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldFByZWRlZmluZWRUb29sTmFtZXMoKSB7CisJCXJldHVybiBwcmVkZWZpbmVkVG9vbHMua2V5U2V0KCk7CisJfQorCisJLyoqCisJICogR2V0IGFsbCB0b29sIG5hbWVzLgorCSAqCisJICogQHJldHVybiB0aGUgYWxsIHRvb2wgbmFtZXMgKGRlZmF1bHQgb3IgYXZhaWxhYmxlIHRvb2wgbmFtZSBpcyB0aGUgZmlyc3QKKwkgKiAgICAgICAgIGluIHRoZSBzZXQpCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldEFsbFRvb2xOYW1lcygpIHsKKwkJU3RyaW5nIGRlZmF1bHROYW1lID0gZ2V0RGVmYXVsdFRvb2xOYW1lKGZhbHNlKTsKKwkJaWYgKGRlZmF1bHROYW1lID09IG51bGwpIHsKKwkJCWRlZmF1bHROYW1lID0gZ2V0Rmlyc3RBdmFpbGFibGVUb29sKCk7CisJCX0KKwkJcmV0dXJuIEV4dGVybmFsVG9vbFV0aWxzLmNyZWF0ZVNvcnRlZFRvb2xTZXQoZGVmYXVsdE5hbWUsCisJCQkJZ2V0VXNlckRlZmluZWRUb29sTmFtZXMoKSwgZ2V0UHJlZGVmaW5lZFRvb2xOYW1lcygpKTsKKwl9CisKKwkvKioKKwkgKiBQcm92aWRlcyB7QGxpbmsgT3B0aW9uYWx9IHdpdGggdGhlIG5hbWUgb2YgYW4gZXh0ZXJuYWwgZGlmZiB0b29sIGlmCisJICogc3BlY2lmaWVkIGluIGdpdCBjb25maWd1cmF0aW9uIGZvciBhIHBhdGguCisJICoKKwkgKiBUaGUgZm9ybWVkIGdpdCBjb25maWd1cmF0aW9uIHJlc3VsdHMgZnJvbSBnbG9iYWwgcnVsZXMgYXMgd2VsbCBhcyBtZXJnZWQKKwkgKiBydWxlcyBmcm9tIGluZm8gYW5kIHdvcmt0cmVlIGF0dHJpYnV0ZXMuCisJICoKKwkgKiBUcmlnZ2VycyB7QGxpbmsgVHJlZVdhbGt9IHVudGlsIHNwZWNpZmllZCBwYXRoIGZvdW5kIGluIHRoZSB0cmVlLgorCSAqCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIHBhdGggdG8gdGhlIG5vZGUgaW4gcmVwb3NpdG9yeSB0byBwYXJzZSBnaXQgYXR0cmlidXRlcyBmb3IKKwkgKiBAcmV0dXJuIG5hbWUgb2YgdGhlIGRpZmZ0b29sIGlmIHNldAorCSAqIEB0aHJvd3MgVG9vbEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxTdHJpbmc+IGdldEV4dGVybmFsVG9vbEZyb21BdHRyaWJ1dGVzKGZpbmFsIFN0cmluZyBwYXRoKQorCQkJdGhyb3dzIFRvb2xFeGNlcHRpb24geworCQlyZXR1cm4gRXh0ZXJuYWxUb29sVXRpbHMuZ2V0RXh0ZXJuYWxUb29sRnJvbUF0dHJpYnV0ZXMocmVwbywgcGF0aCwKKwkJCQlFeHRlcm5hbFRvb2xVdGlscy5LRVlfRElGRl9UT09MKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3MgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgcHJlZGVmaW5lZCB0b29scyBpbiB0aGUgc3lzdGVtLgorCSAqCisJICogQHJldHVybiBzZXQgb2YgcHJlZGVmaW5lZCBhdmFpbGFibGUgdG9vbHMKKwkgKi8KKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJlZGVmaW5lZEF2YWlsYWJsZVRvb2xzKCkgeworCQlNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBkZWZUb29scyA9IGdldFByZWRlZmluZWRUb29scyh0cnVlKTsKKwkJU2V0PFN0cmluZz4gYXZhaWxhYmxlVG9vbHMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisJCWZvciAoRW50cnk8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBlbGVtIDogZGVmVG9vbHMuZW50cnlTZXQoKSkgeworCQkJaWYgKGVsZW0uZ2V0VmFsdWUoKS5pc0F2YWlsYWJsZSgpKSB7CisJCQkJYXZhaWxhYmxlVG9vbHMuYWRkKGVsZW0uZ2V0S2V5KCkpOworCQkJfQorCQl9CisJCXJldHVybiBhdmFpbGFibGVUb29sczsKKwl9CisKKwkvKioKKwkgKiBHZXQgdXNlciBkZWZpbmVkIHRvb2xzIG1hcC4KKwkgKgogCSAqIEByZXR1cm4gdGhlIHVzZXIgZGVmaW5lZCB0b29scwogCSAqLwogCXB1YmxpYyBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBnZXRVc2VyRGVmaW5lZFRvb2xzKCkgewpAQCAtODMsNjEgKzI3NywxMDYgQEAgcHVibGljIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IGdldFVzZXJEZWZpbmVkVG9vbHMoKSB7CiAJfQogCiAJLyoqCi0JICogQHJldHVybiB0aGUgYXZhaWxhYmxlIHByZWRlZmluZWQgdG9vbHMKKwkgKiBHZXQgcHJlZGVmaW5lZCB0b29scyBtYXAuCisJICoKKwkgKiBAcGFyYW0gY2hlY2tBdmFpbGFiaWxpdHkKKwkgKiAgICAgICAgICAgIHRydWU6IGZvciBjaGVja2luZyBpZiB0b29scyBjYW4gYmUgZXhlY3V0ZWQ7IEFUVEVOVElPTjogdGhpcworCSAqICAgICAgICAgICAgY2hlY2sgdG9vayBzb21lIHRpbWUsIGRvIG5vdCBleGVjdXRlIG9mdGVuIChzdG9yZSB0aGUgbWFwIGZvcgorCSAqICAgICAgICAgICAgb3RoZXIgYWN0aW9ucyk7IGZhbHNlOiBhdmFpbGFiaWxpdHkgaXMgTk9UIGNoZWNrZWQ6CisJICogICAgICAgICAgICBpc0F2YWlsYWJsZSgpIHJldHVybnMgZGVmYXVsdCBmYWxzZSBpcyB0aGlzIGNhc2UhCisJICogQHJldHVybiB0aGUgcHJlZGVmaW5lZCB0b29scyB3aXRoIG9wdGlvbmFsbHkgY2hlY2tlZCBhdmFpbGFiaWxpdHkgKGxvbmcKKwkgKiAgICAgICAgIHJ1bm5pbmcgb3BlcmF0aW9uKQogCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBnZXRBdmFpbGFibGVUb29scygpIHsKKwlwdWJsaWMgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gZ2V0UHJlZGVmaW5lZFRvb2xzKAorCQkJYm9vbGVhbiBjaGVja0F2YWlsYWJpbGl0eSkgeworCQlpZiAoY2hlY2tBdmFpbGFiaWxpdHkpIHsKKwkJCWZvciAoRXh0ZXJuYWxEaWZmVG9vbCB0b29sIDogcHJlZGVmaW5lZFRvb2xzLnZhbHVlcygpKSB7CisJCQkJUHJlRGVmaW5lZERpZmZUb29sIHByZWRlZlRvb2wgPSAoUHJlRGVmaW5lZERpZmZUb29sKSB0b29sOworCQkJCXByZWRlZlRvb2wuc2V0QXZhaWxhYmxlKEV4dGVybmFsVG9vbFV0aWxzLmlzVG9vbEF2YWlsYWJsZShmcywKKwkJCQkJCWdpdERpciwgd29ya1RyZWUsIHByZWRlZlRvb2wuZ2V0UGF0aCgpKSk7CisJCQl9CisJCX0KIAkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwcmVkZWZpbmVkVG9vbHMpOwogCX0KIAogCS8qKgotCSAqIEByZXR1cm4gdGhlIE5PVCBhdmFpbGFibGUgcHJlZGVmaW5lZCB0b29scworCSAqIEdldCBmaXJzdCBhdmFpbGFibGUgdG9vbCBuYW1lLgorCSAqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiBmaXJzdCBhdmFpbGFibGUgcHJlZGVmaW5lZCB0b29sIG9yIG51bGwKIAkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gZ2V0Tm90QXZhaWxhYmxlVG9vbHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobmV3IFRyZWVNYXA8PigpKTsKKwlwdWJsaWMgU3RyaW5nIGdldEZpcnN0QXZhaWxhYmxlVG9vbCgpIHsKKwkJZm9yIChFeHRlcm5hbERpZmZUb29sIHRvb2wgOiBwcmVkZWZpbmVkVG9vbHMudmFsdWVzKCkpIHsKKwkJCWlmIChFeHRlcm5hbFRvb2xVdGlscy5pc1Rvb2xBdmFpbGFibGUoZnMsIGdpdERpciwgd29ya1RyZWUsCisJCQkJCXRvb2wuZ2V0UGF0aCgpKSkgeworCQkJCXJldHVybiB0b29sLmdldE5hbWUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKKwkgKiBHZXQgZGVmYXVsdCAoZ3VpLSl0b29sIG5hbWUuCisJICoKIAkgKiBAcGFyYW0gZ3VpCiAJICogICAgICAgICAgICB1c2UgdGhlIGRpZmYuZ3VpdG9vbCBzZXR0aW5nID8KIAkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHRvb2wgbmFtZQogCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRvb2xOYW1lKEJvb2xlYW5UcmlTdGF0ZSBndWkpIHsKLQkJcmV0dXJuIGd1aSAhPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQgPyAibXlfZ3VpX3Rvb2wiIC8vJE5PTi1OTFMtMSQKLQkJCQk6ICJteV9kZWZhdWx0X3Rvb2xuYW1lIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRvb2xOYW1lKGJvb2xlYW4gZ3VpKSB7CisJCVN0cmluZyBndWlUb29sTmFtZTsKKwkJaWYgKGd1aSkgeworCQkJZ3VpVG9vbE5hbWUgPSBjb25maWcuZ2V0RGVmYXVsdEd1aVRvb2xOYW1lKCk7CisJCQlpZiAoZ3VpVG9vbE5hbWUgIT0gbnVsbCkgeworCQkJCXJldHVybiBndWlUb29sTmFtZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY29uZmlnLmdldERlZmF1bHRUb29sTmFtZSgpOwogCX0KIAogCS8qKgorCSAqIElzIGludGVyYWN0aXZlIGRpZmYgKHByb21wdCBlbmFibGVkKSA/CisJICoKIAkgKiBAcmV0dXJuIGlzIGludGVyYWN0aXZlIChjb25maWcgcHJvbXB0IGVuYWJsZWQpID8KIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBpc0ludGVyYWN0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBjb25maWcuaXNQcm9tcHQoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2V0dXBQcmVkZWZpbmVkVG9vbHMoKSB7Ci0JCXByZWRlZmluZWRUb29scyA9IG5ldyBUcmVlTWFwPD4oKTsKLQkJZm9yIChDb21tYW5kTGluZURpZmZUb29sIHRvb2wgOiBDb21tYW5kTGluZURpZmZUb29sLnZhbHVlcygpKSB7Ci0JCQlwcmVkZWZpbmVkVG9vbHMucHV0KHRvb2wubmFtZSgpLCBuZXcgUHJlRGVmaW5lZERpZmZUb29sKHRvb2wpKTsKKwlwcml2YXRlIEV4dGVybmFsRGlmZlRvb2wgZ2V0VG9vbChmaW5hbCBTdHJpbmcgbmFtZSkgeworCQlFeHRlcm5hbERpZmZUb29sIHRvb2wgPSB1c2VyRGVmaW5lZFRvb2xzLmdldChuYW1lKTsKKwkJaWYgKHRvb2wgPT0gbnVsbCkgeworCQkJdG9vbCA9IHByZWRlZmluZWRUb29scy5nZXQobmFtZSk7CiAJCX0KKwkJcmV0dXJuIHRvb2w7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNldHVwVXNlckRlZmluZWRUb29scygpIHsKLQkJdXNlckRlZmluZWRUb29scyA9IG5ldyBUcmVlTWFwPD4oKTsKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBzZXR1cFByZWRlZmluZWRUb29scygpIHsKKwkJTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gdG9vbHMgPSBuZXcgVHJlZU1hcDw+KCk7CisJCWZvciAoQ29tbWFuZExpbmVEaWZmVG9vbCB0b29sIDogQ29tbWFuZExpbmVEaWZmVG9vbC52YWx1ZXMoKSkgeworCQkJdG9vbHMucHV0KHRvb2wubmFtZSgpLCBuZXcgUHJlRGVmaW5lZERpZmZUb29sKHRvb2wpKTsKKwkJfQorCQlyZXR1cm4gdG9vbHM7CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBzZXR1cFVzZXJEZWZpbmVkVG9vbHMoCisJCQlNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBwcmVkZWZUb29scykgeworCQlNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiB0b29scyA9IG5ldyBUcmVlTWFwPD4oKTsKIAkJTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gdXNlclRvb2xzID0gY29uZmlnLmdldFRvb2xzKCk7CiAJCWZvciAoU3RyaW5nIG5hbWUgOiB1c2VyVG9vbHMua2V5U2V0KCkpIHsKIAkJCUV4dGVybmFsRGlmZlRvb2wgdXNlclRvb2wgPSB1c2VyVG9vbHMuZ2V0KG5hbWUpOwogCQkJLy8gaWYgZGlmZnRvb2wuPG5hbWU+LmNtZCBpcyBkZWZpbmVkIHdlIGhhdmUgdXNlciBkZWZpbmVkIHRvb2wKIAkJCWlmICh1c2VyVG9vbC5nZXRDb21tYW5kKCkgIT0gbnVsbCkgewotCQkJCXVzZXJEZWZpbmVkVG9vbHMucHV0KG5hbWUsIHVzZXJUb29sKTsKKwkJCQl0b29scy5wdXQobmFtZSwgdXNlclRvb2wpOwogCQkJfSBlbHNlIGlmICh1c2VyVG9vbC5nZXRQYXRoKCkgIT0gbnVsbCkgewogCQkJCS8vIGlmIGRpZmZ0b29sLjxuYW1lPi5wYXRoIGlzIGRlZmluZWQgd2UganVzdCBvdmVybG9hZCB0aGUgcGF0aAogCQkJCS8vIG9mIHByZWRlZmluZWQgdG9vbAotCQkJCVByZURlZmluZWREaWZmVG9vbCBwcmVkZWZUb29sID0gKFByZURlZmluZWREaWZmVG9vbCkgcHJlZGVmaW5lZFRvb2xzCisJCQkJUHJlRGVmaW5lZERpZmZUb29sIHByZWRlZlRvb2wgPSAoUHJlRGVmaW5lZERpZmZUb29sKSBwcmVkZWZUb29scwogCQkJCQkJLmdldChuYW1lKTsKIAkJCQlpZiAocHJlZGVmVG9vbCAhPSBudWxsKSB7CiAJCQkJCXByZWRlZlRvb2wuc2V0UGF0aCh1c2VyVG9vbC5nZXRQYXRoKCkpOwogCQkJCX0KIAkJCX0KIAkJfQorCQlyZXR1cm4gdG9vbHM7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2wuamF2YQppbmRleCBmMmQ3ZTgyLi5lMDFiODkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbERpZmZUb29sLmphdmEKQEAgLTMwLDQgKzMwLDEwIEBAIHB1YmxpYyBpbnRlcmZhY2UgRXh0ZXJuYWxEaWZmVG9vbCB7CiAJICovCiAJU3RyaW5nIGdldENvbW1hbmQoKTsKIAorCS8qKgorCSAqIEByZXR1cm4gYXZhaWxhYmlsaXR5IG9mIHRoZSB0b29sOiB0cnVlIGlmIHRvb2wgY2FuIGJlIGV4ZWN1dGVkIGFuZCBmYWxzZQorCSAqICAgICAgICAgaWYgbm90CisJICovCisJYm9vbGVhbiBpc0F2YWlsYWJsZSgpOworCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxNZXJnZVRvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbE1lcmdlVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjM2RkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxNZXJnZVRvb2wuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjIsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsLkJvb2xlYW5UcmlTdGF0ZTsKKworLyoqCisgKiBUaGUgbWVyZ2UgdG9vbCBpbnRlcmZhY2UuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZXJuYWxNZXJnZVRvb2wgZXh0ZW5kcyBFeHRlcm5hbERpZmZUb29sIHsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2wgInRydXN0IGV4aXQgY29kZSIgb3B0aW9uCisJICovCisJQm9vbGVhblRyaVN0YXRlIGdldFRydXN0RXhpdENvZGUoKTsKKworCS8qKgorCSAqIEBwYXJhbSB3aXRoQmFzZQorCSAqICAgICAgICAgICAgZ2V0IGNvbW1hbmQgd2l0aCBiYXNlIHByZXNlbnQgKHRydWUpIG9yIHdpdGhvdXQgYmFzZSBwcmVzZW50CisJICogICAgICAgICAgICAoZmFsc2UpCisJICogQHJldHVybiB0aGUgdG9vbCBjb21tYW5kCisJICovCisJU3RyaW5nIGdldENvbW1hbmQoYm9vbGVhbiB3aXRoQmFzZSk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsVG9vbFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkZDg0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xVdGlscy5qYXZhCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmV2aXNpb25TeW50YXhFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5Xb3JraW5nVHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLk5vdElnbm9yZWRGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgZGlmZi0gYW5kIG1lcmdlLXRvb2xzLgorICovCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxUb29sVXRpbHMgeworCisJLyoqCisJICogS2V5IGZvciBtZXJnZSB0b29sIGdpdCBjb25maWd1cmF0aW9uIHNlY3Rpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUVSR0VfVE9PTCA9ICJtZXJnZXRvb2wiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBLZXkgZm9yIGRpZmYgdG9vbCBnaXQgY29uZmlndXJhdGlvbiBzZWN0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJRkZfVE9PTCA9ICJkaWZmdG9vbCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFByZXBhcmUgY29tbWFuZCBmb3IgZXhlY3V0aW9uLgorCSAqCisJICogQHBhcmFtIGNvbW1hbmQKKwkgKiAgICAgICAgICAgIHRoZSBpbnB1dCAiY29tbWFuZCIgc3RyaW5nCisJICogQHBhcmFtIGxvY2FsRmlsZQorCSAqICAgICAgICAgICAgdGhlIGxvY2FsIGZpbGUgKG91cnMpCisJICogQHBhcmFtIHJlbW90ZUZpbGUKKwkgKiAgICAgICAgICAgIHRoZSByZW1vdGUgZmlsZSAodGhlaXJzKQorCSAqIEBwYXJhbSBtZXJnZWRGaWxlCisJICogICAgICAgICAgICB0aGUgbWVyZ2VkIGZpbGUgKHdvcmt0cmVlKQorCSAqIEBwYXJhbSBiYXNlRmlsZQorCSAqICAgICAgICAgICAgdGhlIGJhc2UgZmlsZSAoY2FuIGJlIG51bGwpCisJICogQHJldHVybiB0aGUgcHJlcGFyZWQgKHdpdGggcmVwbGFjZWQgdmFyaWFibGVzKSBjb21tYW5kIHN0cmluZworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVwYXJlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgRmlsZUVsZW1lbnQgbG9jYWxGaWxlLAorCQkJRmlsZUVsZW1lbnQgcmVtb3RlRmlsZSwgRmlsZUVsZW1lbnQgbWVyZ2VkRmlsZSwKKwkJCUZpbGVFbGVtZW50IGJhc2VGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAobG9jYWxGaWxlICE9IG51bGwpIHsKKwkJCWNvbW1hbmQgPSBsb2NhbEZpbGUucmVwbGFjZVZhcmlhYmxlKGNvbW1hbmQpOworCQl9CisJCWlmIChyZW1vdGVGaWxlICE9IG51bGwpIHsKKwkJCWNvbW1hbmQgPSByZW1vdGVGaWxlLnJlcGxhY2VWYXJpYWJsZShjb21tYW5kKTsKKwkJfQorCQlpZiAobWVyZ2VkRmlsZSAhPSBudWxsKSB7CisJCQljb21tYW5kID0gbWVyZ2VkRmlsZS5yZXBsYWNlVmFyaWFibGUoY29tbWFuZCk7CisJCX0KKwkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKKwkJCWNvbW1hbmQgPSBiYXNlRmlsZS5yZXBsYWNlVmFyaWFibGUoY29tbWFuZCk7CisJCX0KKwkJcmV0dXJuIGNvbW1hbmQ7CisJfQorCisJLyoqCisJICogUHJlcGFyZSBlbnZpcm9ubWVudCBuZWVkZWQgZm9yIGV4ZWN1dGlvbi4KKwkgKgorCSAqIEBwYXJhbSBnaXREaXIKKwkgKiAgICAgICAgICAgIHRoZSAuZ2l0IGRpcmVjdG9yeQorCSAqIEBwYXJhbSBsb2NhbEZpbGUKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbCBmaWxlIChvdXJzKQorCSAqIEBwYXJhbSByZW1vdGVGaWxlCisJICogICAgICAgICAgICB0aGUgcmVtb3RlIGZpbGUgKHRoZWlycykKKwkgKiBAcGFyYW0gbWVyZ2VkRmlsZQorCSAqICAgICAgICAgICAgdGhlIG1lcmdlZCBmaWxlICh3b3JrdHJlZSkKKwkgKiBAcGFyYW0gYmFzZUZpbGUKKwkgKiAgICAgICAgICAgIHRoZSBiYXNlIGZpbGUgKGNhbiBiZSBudWxsKQorCSAqIEByZXR1cm4gdGhlIGVudmlyb25tZW50IG1hcCB3aXRoIHZhcmlhYmxlcyBhbmQgdmFsdWVzIChmaWxlIHBhdGhzKQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJlcGFyZUVudmlyb25tZW50KEZpbGUgZ2l0RGlyLAorCQkJRmlsZUVsZW1lbnQgbG9jYWxGaWxlLCBGaWxlRWxlbWVudCByZW1vdGVGaWxlLAorCQkJRmlsZUVsZW1lbnQgbWVyZ2VkRmlsZSwgRmlsZUVsZW1lbnQgYmFzZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gZW52ID0gbmV3IFRyZWVNYXA8PigpOworCQlpZiAoZ2l0RGlyICE9IG51bGwpIHsKKwkJCWVudi5wdXQoQ29uc3RhbnRzLkdJVF9ESVJfS0VZLCBnaXREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQl9CisJCWlmIChsb2NhbEZpbGUgIT0gbnVsbCkgeworCQkJbG9jYWxGaWxlLmFkZFRvRW52KGVudik7CisJCX0KKwkJaWYgKHJlbW90ZUZpbGUgIT0gbnVsbCkgeworCQkJcmVtb3RlRmlsZS5hZGRUb0VudihlbnYpOworCQl9CisJCWlmIChtZXJnZWRGaWxlICE9IG51bGwpIHsKKwkJCW1lcmdlZEZpbGUuYWRkVG9FbnYoZW52KTsKKwkJfQorCQlpZiAoYmFzZUZpbGUgIT0gbnVsbCkgeworCQkJYmFzZUZpbGUuYWRkVG9FbnYoZW52KTsKKwkJfQorCQlyZXR1cm4gZW52OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgcGF0aCB0byBiZSBxdW90ZWQKKwkgKiBAcmV0dXJuIHF1b3RlZCBwYXRoIGlmIGl0IGNvbnRhaW5zIHNwYWNlcworCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlUGF0aChTdHJpbmcgcGF0aCkgeworCQkvLyBoYW5kbGluZyBvZiBzcGFjZXMgaW4gcGF0aAorCQlpZiAocGF0aC5jb250YWlucygiICIpKSB7CisJCQkvLyBhZGQgcXVvdGVzIGJlZm9yZSBpZiBuZWVkZWQKKwkJCWlmICghcGF0aC5zdGFydHNXaXRoKCJcIiIpKSB7CisJCQkJcGF0aCA9ICJcIiIgKyBwYXRoOworCQkJfQorCQkJLy8gYWRkIHF1b3RlcyBhZnRlciBpZiBuZWVkZWQKKwkJCWlmICghcGF0aC5lbmRzV2l0aCgiXCIiKSkgeworCQkJCXBhdGggPSBwYXRoICsgIlwiIjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcGF0aDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZnMKKwkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbgorCSAqIEBwYXJhbSBnaXREaXIKKwkgKiAgICAgICAgICAgIHRoZSAuZ2l0IGRpcmVjdG9yeQorCSAqIEBwYXJhbSBkaXJlY3RvcnkKKwkgKiAgICAgICAgICAgIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgdG9vbCBwYXRoCisJICogQHJldHVybiB0cnVlIGlmIHRvb2wgYXZhaWxhYmxlIGFuZCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUb29sQXZhaWxhYmxlKEZTIGZzLCBGaWxlIGdpdERpciwgRmlsZSBkaXJlY3RvcnksCisJCQlTdHJpbmcgcGF0aCkgeworCQlib29sZWFuIGF2YWlsYWJsZSA9IHRydWU7CisJCXRyeSB7CisJCQlDb21tYW5kRXhlY3V0b3IgY21kRXhlYyA9IG5ldyBDb21tYW5kRXhlY3V0b3IoZnMsIGZhbHNlKTsKKwkJCWF2YWlsYWJsZSA9IGNtZEV4ZWMuY2hlY2tFeGVjdXRhYmxlKHBhdGgsIGRpcmVjdG9yeSwKKwkJCQkJcHJlcGFyZUVudmlyb25tZW50KGdpdERpciwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJYXZhaWxhYmxlID0gZmFsc2U7CisJCX0KKwkJcmV0dXJuIGF2YWlsYWJsZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZGVmYXVsdE5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRvb2wgbmFtZQorCSAqIEBwYXJhbSB1c2VyRGVmaW5lZE5hbWVzCisJICogICAgICAgICAgICB0aGUgdXNlciBkZWZpbmVkIHRvb2wgbmFtZXMKKwkgKiBAcGFyYW0gcHJlRGVmaW5lZE5hbWVzCisJICogICAgICAgICAgICB0aGUgcHJlIGRlZmluZWQgdG9vbCBuYW1lcworCSAqIEByZXR1cm4gdGhlIHNvcnRlZCB0b29sIG5hbWVzIHNldDogZmlyc3QgZWxlbWVudCBpcyBkZWZhdWx0IHRvb2wgbmFtZSBpZgorCSAqICAgICAgICAgdmFsaWQsIHRoZW4gdXNlciBkZWZpbmVkIHRvb2wgbmFtZXMgYW5kIHRoZW4gcHJlIGRlZmluZWQgdG9vbAorCSAqICAgICAgICAgbmFtZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGNyZWF0ZVNvcnRlZFRvb2xTZXQoU3RyaW5nIGRlZmF1bHROYW1lLAorCQkJU2V0PFN0cmluZz4gdXNlckRlZmluZWROYW1lcywgU2V0PFN0cmluZz4gcHJlRGVmaW5lZE5hbWVzKSB7CisJCVNldDxTdHJpbmc+IG5hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworCQlpZiAoZGVmYXVsdE5hbWUgIT0gbnVsbCkgeworCQkJLy8gcmVtb3ZlIGRlZmF1bHROYW1lIGZyb20gYm90aCBzZXRzCisJCQlTZXQ8U3RyaW5nPiBuYW1lc1ByZWRlZiA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKwkJCVNldDxTdHJpbmc+IG5hbWVzVXNlciA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKwkJCW5hbWVzVXNlci5hZGRBbGwodXNlckRlZmluZWROYW1lcyk7CisJCQluYW1lc1VzZXIucmVtb3ZlKGRlZmF1bHROYW1lKTsKKwkJCW5hbWVzUHJlZGVmLmFkZEFsbChwcmVEZWZpbmVkTmFtZXMpOworCQkJbmFtZXNQcmVkZWYucmVtb3ZlKGRlZmF1bHROYW1lKTsKKwkJCS8vIGFkZCBkZWZhdWx0TmFtZSBhcyBmaXJzdCBpbiBzZXQKKwkJCW5hbWVzLmFkZChkZWZhdWx0TmFtZSk7CisJCQluYW1lcy5hZGRBbGwobmFtZXNVc2VyKTsKKwkJCW5hbWVzLmFkZEFsbChuYW1lc1ByZWRlZik7CisJCX0gZWxzZSB7CisJCQluYW1lcy5hZGRBbGwodXNlckRlZmluZWROYW1lcyk7CisJCQluYW1lcy5hZGRBbGwocHJlRGVmaW5lZE5hbWVzKTsKKwkJfQorCQlyZXR1cm4gbmFtZXM7CisJfQorCisJLyoqCisJICogUHJvdmlkZXMge0BsaW5rIE9wdGlvbmFsfSB3aXRoIHRoZSBuYW1lIG9mIGFuIGV4dGVybmFsIHRvb2wgaWYgc3BlY2lmaWVkCisJICogaW4gZ2l0IGNvbmZpZ3VyYXRpb24gZm9yIGEgcGF0aC4KKwkgKgorCSAqIFRoZSBmb3JtZWQgZ2l0IGNvbmZpZ3VyYXRpb24gcmVzdWx0cyBmcm9tIGdsb2JhbCBydWxlcyBhcyB3ZWxsIGFzIG1lcmdlZAorCSAqIHJ1bGVzIGZyb20gaW5mbyBhbmQgd29ya3RyZWUgYXR0cmlidXRlcy4KKwkgKgorCSAqIFRyaWdnZXJzIHtAbGluayBUcmVlV2Fsa30gdW50aWwgc3BlY2lmaWVkIHBhdGggZm91bmQgaW4gdGhlIHRyZWUuCisJICoKKwkgKiBAcGFyYW0gcmVwb3NpdG9yeQorCSAqICAgICAgICAgICAgdGFyZ2V0IHJlcG9zaXRvcnkgdG8gdHJhdmVyc2UgaW50bworCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICBwYXRoIHRvIHRoZSBub2RlIGluIHJlcG9zaXRvcnkgdG8gcGFyc2UgZ2l0IGF0dHJpYnV0ZXMgZm9yCisJICogQHBhcmFtIHRvb2xLZXkKKwkgKiAgICAgICAgICAgIGNvbmZpZyBrZXkgbmFtZSBmb3IgdGhlIHRvb2wKKwkgKiBAcmV0dXJuIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHRvb2wga2V5IGlmIHNldAorCSAqIEB0aHJvd3MgVG9vbEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRFeHRlcm5hbFRvb2xGcm9tQXR0cmlidXRlcygKKwkJCWZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIHBhdGgsCisJCQlmaW5hbCBTdHJpbmcgdG9vbEtleSkgdGhyb3dzIFRvb2xFeGNlcHRpb24geworCQl0cnkgeworCQkJV29ya2luZ1RyZWVJdGVyYXRvciB0cmVlSXRlcmF0b3IgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihyZXBvc2l0b3J5KTsKKwkJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhyZXBvc2l0b3J5KSkgeworCQkJCXdhbGsuYWRkVHJlZSh0cmVlSXRlcmF0b3IpOworCQkJCXdhbGsuc2V0RmlsdGVyKG5ldyBOb3RJZ25vcmVkRmlsdGVyKDApKTsKKwkJCQl3aGlsZSAod2Fsay5uZXh0KCkpIHsKKwkJCQkJU3RyaW5nIHRyZWVQYXRoID0gd2Fsay5nZXRQYXRoU3RyaW5nKCk7CisJCQkJCWlmICh0cmVlUGF0aC5lcXVhbHMocGF0aCkpIHsKKwkJCQkJCUF0dHJpYnV0ZXMgYXR0cnMgPSB3YWxrLmdldEF0dHJpYnV0ZXMoKTsKKwkJCQkJCWlmIChhdHRycy5jb250YWluc0tleSh0b29sS2V5KSkgeworCQkJCQkJCXJldHVybiBPcHRpb25hbC5vZihhdHRycy5nZXRWYWx1ZSh0b29sS2V5KSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKHdhbGsuaXNTdWJ0cmVlKCkpIHsKKwkJCQkJCXdhbGsuZW50ZXJTdWJ0cmVlKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gbm8gZXh0ZXJuYWwgdG9vbCBzcGVjaWZpZWQKKwkJCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwkJCX0KKworCQl9IGNhdGNoIChSZXZpc2lvblN5bnRheEV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKGUpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRmlsZUVsZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9GaWxlRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOGNhNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRmlsZUVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKKworLyoqCisgKiBUaGUgZWxlbWVudCB1c2VkIGFzIGxlZnQgb3IgcmlnaHQgZmlsZSBmb3IgY29tcGFyZS4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlRWxlbWVudCB7CisKKwkvKioKKwkgKiBUaGUgZmlsZSBlbGVtZW50IHR5cGUuCisJICoKKwkgKi8KKwlwdWJsaWMgZW51bSBUeXBlIHsKKwkJLyoqCisJCSAqIFRoZSBsb2NhbCBmaWxlIGVsZW1lbnQgKG91cnMpLgorCQkgKi8KKwkJTE9DQUwsCisJCS8qKgorCQkgKiBUaGUgcmVtb3RlIGZpbGUgZWxlbWVudCAodGhlaXJzKS4KKwkJICovCisJCVJFTU9URSwKKwkJLyoqCisJCSAqIFRoZSBtZXJnZWQgZmlsZSBlbGVtZW50IChwYXRoIGluIHdvcmt0cmVlKS4KKwkJICovCisJCU1FUkdFRCwKKwkJLyoqCisJCSAqIFRoZSBiYXNlIGZpbGUgZWxlbWVudCAob2Ygb3VycyBhbmQgdGhlaXJzKS4KKwkJICovCisJCUJBU0UsCisJCS8qKgorCQkgKiBUaGUgYmFja3VwIGZpbGUgZWxlbWVudCAoY29weSBvZiBtZXJnZWQgLyBjb25mbGljdGVkKS4KKwkJICovCisJCUJBQ0tVUAorCX0KKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGg7CisKKwlwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKworCXByaXZhdGUgZmluYWwgRmlsZSB3b3JrRGlyOworCisJcHJpdmF0ZSBJbnB1dFN0cmVhbSBzdHJlYW07CisKKwlwcml2YXRlIEZpbGUgdGVtcEZpbGU7CisKKwkvKioKKwkgKiBDcmVhdGVzIGZpbGUgZWxlbWVudCBmb3IgcGF0aC4KKwkgKgorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgZmlsZSBwYXRoCisJICogQHBhcmFtIHR5cGUKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHR5cGUKKwkgKi8KKwlwdWJsaWMgRmlsZUVsZW1lbnQoU3RyaW5nIHBhdGgsIFR5cGUgdHlwZSkgeworCQl0aGlzKHBhdGgsIHR5cGUsIG51bGwpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgZmlsZSBlbGVtZW50IGZvciBwYXRoLgorCSAqCisJICogQHBhcmFtIHBhdGgKKwkgKiAgICAgICAgICAgIHRoZSBmaWxlIHBhdGgKKwkgKiBAcGFyYW0gdHlwZQorCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdHlwZQorCSAqIEBwYXJhbSB3b3JrRGlyCisJICogICAgICAgICAgICB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHBhdGggKGNhbiBiZSBudWxsLCB0aGVuIGN1cnJlbnQKKwkgKiAgICAgICAgICAgIHdvcmtpbmcgZGlyIGlzIHVzZWQpCisJICovCisJcHVibGljIEZpbGVFbGVtZW50KFN0cmluZyBwYXRoLCBUeXBlIHR5cGUsIEZpbGUgd29ya0RpcikgeworCQl0aGlzKHBhdGgsIHR5cGUsIHdvcmtEaXIsIG51bGwpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgZmlsZSBwYXRoCisJICogQHBhcmFtIHR5cGUKKwkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHR5cGUKKwkgKiBAcGFyYW0gd29ya0RpcgorCSAqICAgICAgICAgICAgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwYXRoIChjYW4gYmUgbnVsbCwgdGhlbiBjdXJyZW50CisJICogICAgICAgICAgICB3b3JraW5nIGRpciBpcyB1c2VkKQorCSAqIEBwYXJhbSBzdHJlYW0KKwkgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgc3RyZWFtIHRvIGxvYWQgYW5kIHdyaXRlIG9uIGRlbWFuZCwgQHNlZSBnZXRGaWxlKCksCisJICogICAgICAgICAgICB0byB0ZW1wRmlsZSBvbmNlIChjYW4gYmUgbnVsbCkKKwkgKi8KKwlwdWJsaWMgRmlsZUVsZW1lbnQoU3RyaW5nIHBhdGgsIFR5cGUgdHlwZSwgRmlsZSB3b3JrRGlyLAorCQkJSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJCXRoaXMud29ya0RpciA9IHdvcmtEaXI7CisJCXRoaXMuc3RyZWFtID0gc3RyZWFtOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGZpbGUgcGF0aAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKwkJcmV0dXJuIHBhdGg7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZWxlbWVudCB0eXBlCisJICovCisJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJuCisJICogPHVsPgorCSAqIDxsaT5hIHRlbXBvcmFyeSBmaWxlIGlmIGFscmVhZHkgY3JlYXRlZCBhbmQgc3RyZWFtIGlzIG5vdCB2YWxpZDwvbGk+CisJICogPGxpPk9SIGEgcmVhbCBmaWxlIGZyb20gd29yayB0cmVlOiBpZiBubyB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgKEBzZWUKKwkgKiBjcmVhdGVUZW1wRmlsZSgpKSBhbmQgaWYgbm8gc3RyZWFtIHdhcyBzZXQ8L2xpPgorCSAqIDxsaT5PUiBhbiBlbXB0eSB0ZW1wb3JhcnkgZmlsZSBpZiBwYXRoIGlzICIvZGV2L251bGwiPC9saT4KKwkgKiA8bGk+T1IgYSB0ZW1wb3JhcnkgZmlsZSB3aXRoIHN0cmVhbSBjb250ZW50IGlmIHN0cmVhbSBpcyB2YWxpZCAobm90CisJICogbnVsbCk7IHN0cmVhbSBpcyBjbG9zZWQgYW5kIGludmFsaWRhdGVkIChzZXQgdG8gbnVsbCkgYWZ0ZXIgd3JpdGUgdG8gdGVtcAorCSAqIGZpbGUsIHNvIHN0cmVhbSBpcyB1c2VkIG9ubHkgb25jZSBkdXJpbmcgZmlyc3QgY2FsbCE8L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBvYmplY3Qgc3RyZWFtCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBpZiB3ZSBoYXZlIGFscmVhZHkgdGVtcCBmaWxlIGFuZCBubyBzdHJlYW0KKwkJLy8gdGhlbiBqdXN0IHJldHVybiB0aGlzIHRlbXAgZmlsZSAoaXQgd2FzIGZpbGxlZCBmcm9tIG91dHNpZGUpCisJCWlmICgodGVtcEZpbGUgIT0gbnVsbCkgJiYgKHN0cmVhbSA9PSBudWxsKSkgeworCQkJcmV0dXJuIHRlbXBGaWxlOworCQl9CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdvcmtEaXIsIHBhdGgpOworCQkvLyBpZiB3ZSBoYXZlIGEgc3RyZWFtIG9yIGZpbGUgaXMgbWlzc2luZyAocGF0aCBpcyAiL2Rldi9udWxsIikKKwkJLy8gdGhlbiBvcHRpb25hbGx5IGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSBhbmQgZmlsbCBpdCB3aXRoIHN0cmVhbSBjb250ZW50CisJCWlmICgoc3RyZWFtICE9IG51bGwpIHx8IGlzTnVsbFBhdGgoKSkgeworCQkJaWYgKHRlbXBGaWxlID09IG51bGwpIHsKKwkJCQl0ZW1wRmlsZSA9IGdldFRlbXBGaWxlKGZpbGUsIHR5cGUubmFtZSgpLCBudWxsKTsKKwkJCX0KKwkJCWlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCWNvcHlGcm9tU3RyZWFtKHRlbXBGaWxlLCBzdHJlYW0pOworCQkJfQorCQkJLy8gaW52YWxpZGF0ZSB0aGUgc3RyZWFtLCBiZWNhdXNlIGl0IGlzIHVzZWQgb25jZQorCQkJc3RyZWFtID0gbnVsbDsKKwkJCXJldHVybiB0ZW1wRmlsZTsKKwkJfQorCQlyZXR1cm4gZmlsZTsKKwl9CisKKwkvKioKKwkgKiBDaGVjayBpZiBwYXRoIGlkICIvZGV2L251bGwiCisJICoKKwkgKiBAcmV0dXJuIHRydWUgaWYgcGF0aCBpcyAiL2Rldi9udWxsIgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTnVsbFBhdGgoKSB7CisJCXJldHVybiBwYXRoLmVxdWFscyhEaWZmRW50cnkuREVWX05VTEwpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0ZW1wb3JhcnkgZmlsZSBpbiBnaXZlbiBvciBzeXN0ZW0gdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKwkgKgorCSAqIEBwYXJhbSBkaXJlY3RvcnkKKwkgKiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIChjYW4gYmUgbnVsbCk7IGlmIG51bGwgc3lzdGVtCisJICogICAgICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5IGlzIHVzZWQKKwkgKiBAcmV0dXJuIHRlbXBvcmFyeSBmaWxlIGluIGRpcmVjdG9yeSBvciBpbiB0aGUgc3lzdGVtIHRlbXBvcmFyeSBkaXJlY3RvcnkKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmICh0ZW1wRmlsZSA9PSBudWxsKSB7CisJCQl0ZW1wRmlsZSA9IGdldFRlbXBGaWxlKG5ldyBGaWxlKHBhdGgpLCB0eXBlLm5hbWUoKSwgZGlyZWN0b3J5KTsKKwkJfQorCQlyZXR1cm4gdGVtcEZpbGU7CisJfQorCisJLyoqCisJICogRGVsZXRlIGFuZCBpbnZhbGlkYXRlIHRlbXBvcmFyeSBmaWxlIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjbGVhblRlbXBvcmFyaWVzKCkgeworCQlpZiAodGVtcEZpbGUgIT0gbnVsbCAmJiB0ZW1wRmlsZS5leGlzdHMoKSkgeworCQkJdGVtcEZpbGUuZGVsZXRlKCk7CisJCX0KKwkJdGVtcEZpbGUgPSBudWxsOworCX0KKworCS8qKgorCSAqIFJlcGxhY2UgdmFyaWFibGUgaW4gaW5wdXQuCisJICoKKwkgKiBAcGFyYW0gaW5wdXQKKwkgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJpbmcKKwkgKiBAcmV0dXJuIHRoZSByZXBsYWNlZCBpbnB1dCBzdHJpbmcKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIFN0cmluZyByZXBsYWNlVmFyaWFibGUoU3RyaW5nIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gaW5wdXQucmVwbGFjZSgiJCIgKyB0eXBlLm5hbWUoKSwgZ2V0RmlsZSgpLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBBZGQgdmFyaWFibGUgdG8gZW52aXJvbm1lbnQgbWFwLgorCSAqCisJICogQHBhcmFtIGVudgorCSAqICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IHdoZXJlIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgYWRkZWQKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgYWRkVG9FbnYoTWFwPFN0cmluZywgU3RyaW5nPiBlbnYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWVudi5wdXQodHlwZS5uYW1lKCksIGdldEZpbGUoKS5nZXRQYXRoKCkpOworCX0KKworCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0VGVtcEZpbGUoZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBTdHJpbmcgbWlkTmFtZSwKKwkJCWZpbmFsIEZpbGUgd29ya2luZ0RpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nW10gZmlsZU5hbWVBbmRFeHRlbnNpb24gPSBzcGxpdEJhc2VGaWxlTmFtZUFuZEV4dGVuc2lvbihmaWxlKTsKKwkJLy8gVE9ETzogYXZvaWQgbG9uZyByYW5kb20gZmlsZSBuYW1lIChudW1iZXIgZ2VuZXJhdGVkIGJ5CisJCS8vIGNyZWF0ZVRlbXBGaWxlKQorCQlyZXR1cm4gRmlsZS5jcmVhdGVUZW1wRmlsZSgKKwkJCQlmaWxlTmFtZUFuZEV4dGVuc2lvblswXSArICJfIiArIG1pZE5hbWUgKyAiXyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWZpbGVOYW1lQW5kRXh0ZW5zaW9uWzFdLCB3b3JraW5nRGlyKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlGcm9tU3RyZWFtKGZpbmFsIEZpbGUgZmlsZSwKKwkJCWZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJdHJ5IChPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpIHsKKwkJCWludCByZWFkID0gMDsKKwkJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzggKiAxMDI0XTsKKwkJCXdoaWxlICgocmVhZCA9IHN0cmVhbS5yZWFkKGJ5dGVzKSkgIT0gLTEpIHsKKwkJCQlvdXRTdHJlYW0ud3JpdGUoYnl0ZXMsIDAsIHJlYWQpOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJLy8gc3RyZWFtIGNhbiBvbmx5IGJlIGNvbnN1bWVkIG9uY2UgLS0+IGNsb3NlIGl0IGFuZCBpbnZhbGlkYXRlCisJCQlzdHJlYW0uY2xvc2UoKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNwbGl0QmFzZUZpbGVOYW1lQW5kRXh0ZW5zaW9uKEZpbGUgZmlsZSkgeworCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nWzJdOworCQlyZXN1bHRbMF0gPSBmaWxlLmdldE5hbWUoKTsKKwkJcmVzdWx0WzFdID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJaW50IGlkeCA9IHJlc3VsdFswXS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCisJCS8vIGlmICIuIiB3YXMgZm91bmQgKD4tMSkgYW5kIGxhc3QtaW5kZXggaXMgbm90IGZpcnN0IGNoYXIgKD4wKSwgdGhlbgorCQkvLyBzcGxpdCAoc2FtZSBiZWhhdmlvciBsaWtlIGNnaXQpCisJCWlmIChpZHggPiAwKSB7CisJCQlyZXN1bHRbMV0gPSByZXN1bHRbMF0uc3Vic3RyaW5nKGlkeCwgcmVzdWx0WzBdLmxlbmd0aCgpKTsKKwkJCXJlc3VsdFswXSA9IHJlc3VsdFswXS5zdWJzdHJpbmcoMCwgaWR4KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0luZm9ybU5vVG9vbEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9JbmZvcm1Ob1Rvb2xIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiMjkwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9JbmZvcm1Ob1Rvb2xIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDE5LCBUaW0gTmV1bWFubiA8VGltLk5ldW1hbm5AYWR2YW50ZXN0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBoYW5kbGVyIGZvciB3aGVuIHRoZSBkaWZmL21lcmdlIHRvb2wgbWFuYWdlciB3YW50cyB0byBpbmZvcm0gdGhlIHVzZXIgdGhhdAorICogbm8gdG9vbCBoYXMgYmVlbiBjb25maWd1cmVkIGFuZCBvbmUgb2YgdGhlIGRlZmF1bHQgdG9vbHMgd2lsbCBiZSB1c2VkLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEluZm9ybU5vVG9vbEhhbmRsZXIgeworCS8qKgorCSAqIEluZm9ybSB0aGUgdXNlciwgdGhhdCBubyB0b29sIGlzIGNvbmZpZ3VyZWQgYW5kIHRoYXQgb25lIG9mIHRoZSBnaXZlbgorCSAqIHRvb2xzIGlzIHVzZWQuCisJICoKKwkgKiBAcGFyYW0gdG9vbE5hbWVzCisJICogICAgICAgICAgICBUaGUgdG9vbHMgd2hpY2ggYXJlIHRyaWVkCisJICovCisJdm9pZCBpbmZvcm0oTGlzdDxTdHJpbmc+IHRvb2xOYW1lcyk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvTWVyZ2VUb29sQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvTWVyZ2VUb29sQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyNWQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9NZXJnZVRvb2xDb25maWcuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIyLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQ01EOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9HVUlUT09MOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9LRUVQX0JBQ0tVUDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfS0VFUF9URU1QT1JBUklFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUEFUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFJPTVBUOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UT09MOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVF9FWElUX0NPREU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1dSSVRFX1RPX1RFTVA7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfTUVSR0VUT09MX1NFQ1RJT047CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfTUVSR0VfU0VDVElPTjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWcuU2VjdGlvblBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbC5Cb29sZWFuVHJpU3RhdGU7CisKKy8qKgorICogS2VlcHMgdHJhY2sgb2YgbWVyZ2UgdG9vbCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIE1lcmdlVG9vbENvbmZpZyB7CisKKwkvKiogS2V5IGZvciB7QGxpbmsgQ29uZmlnI2dldChTZWN0aW9uUGFyc2VyKX0uICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25maWcuU2VjdGlvblBhcnNlcjxNZXJnZVRvb2xDb25maWc+IEtFWSA9IE1lcmdlVG9vbENvbmZpZzo6bmV3OworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdG9vbE5hbWU7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBndWlUb29sTmFtZTsKKworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBwcm9tcHQ7CisKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4ga2VlcEJhY2t1cDsKKworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBrZWVwVGVtcG9yYXJpZXM7CisKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gd3JpdGVUb1RlbXA7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEV4dGVybmFsTWVyZ2VUb29sPiB0b29sczsKKworCXByaXZhdGUgTWVyZ2VUb29sQ29uZmlnKENvbmZpZyByYykgeworCQl0b29sTmFtZSA9IHJjLmdldFN0cmluZyhDT05GSUdfTUVSR0VfU0VDVElPTiwgbnVsbCwgQ09ORklHX0tFWV9UT09MKTsKKwkJZ3VpVG9vbE5hbWUgPSByYy5nZXRTdHJpbmcoQ09ORklHX01FUkdFX1NFQ1RJT04sIG51bGwsCisJCQkJQ09ORklHX0tFWV9HVUlUT09MKTsKKwkJcHJvbXB0ID0gcmMuZ2V0Qm9vbGVhbihDT05GSUdfTUVSR0VUT09MX1NFQ1RJT04sIHRvb2xOYW1lLAorCQkJCUNPTkZJR19LRVlfUFJPTVBULCB0cnVlKTsKKwkJa2VlcEJhY2t1cCA9IHJjLmdldEJvb2xlYW4oQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OLAorCQkJCUNPTkZJR19LRVlfS0VFUF9CQUNLVVAsIHRydWUpOworCQlrZWVwVGVtcG9yYXJpZXMgPSByYy5nZXRCb29sZWFuKENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiwKKwkJCQlDT05GSUdfS0VZX0tFRVBfVEVNUE9SQVJJRVMsIGZhbHNlKTsKKwkJd3JpdGVUb1RlbXAgPSByYy5nZXRCb29sZWFuKENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiwKKwkJCQlDT05GSUdfS0VZX1dSSVRFX1RPX1RFTVAsIGZhbHNlKTsKKwkJdG9vbHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCVNldDxTdHJpbmc+IHN1YnNlY3Rpb25zID0gcmMuZ2V0U3Vic2VjdGlvbnMoQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IHN1YnNlY3Rpb25zKSB7CisJCQlTdHJpbmcgY21kID0gcmMuZ2V0U3RyaW5nKENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiwgbmFtZSwKKwkJCQkJQ09ORklHX0tFWV9DTUQpOworCQkJU3RyaW5nIHBhdGggPSByYy5nZXRTdHJpbmcoQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OLCBuYW1lLAorCQkJCQlDT05GSUdfS0VZX1BBVEgpOworCQkJQm9vbGVhblRyaVN0YXRlIHRydXN0RXhpdENvZGUgPSBCb29sZWFuVHJpU3RhdGUuRkFMU0U7CisJCQlTdHJpbmcgdHJ1c3RTdHIgPSByYy5nZXRTdHJpbmcoQ09ORklHX01FUkdFVE9PTF9TRUNUSU9OLCBuYW1lLAorCQkJCQlDT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERSk7CisJCQlpZiAodHJ1c3RTdHIgIT0gbnVsbCkgeworCQkJCXRydXN0RXhpdENvZGUgPSBCb29sZWFuLnZhbHVlT2YodHJ1c3RTdHIpLmJvb2xlYW5WYWx1ZSgpCisJCQkJCQk/IEJvb2xlYW5UcmlTdGF0ZS5UUlVFCisJCQkJCQk6IEJvb2xlYW5UcmlTdGF0ZS5GQUxTRTsKKwkJCX0gZWxzZSB7CisJCQkJdHJ1c3RFeGl0Q29kZSA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKwkJCX0KKwkJCWlmICgoY21kICE9IG51bGwpIHx8IChwYXRoICE9IG51bGwpKSB7CisJCQkJdG9vbHMucHV0KG5hbWUsIG5ldyBVc2VyRGVmaW5lZE1lcmdlVG9vbChuYW1lLCBwYXRoLCBjbWQsCisJCQkJCQl0cnVzdEV4aXRDb2RlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG1lcmdlIHRvb2wgbmFtZSAobWVyZ2UudG9vbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUb29sTmFtZSgpIHsKKwkJcmV0dXJuIHRvb2xOYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgR1VJIG1lcmdlIHRvb2wgbmFtZSAobWVyZ2UuZ3VpdG9vbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRHdWlUb29sTmFtZSgpIHsKKwkJcmV0dXJuIGd1aVRvb2xOYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG1lcmdlIHRvb2wgInByb21wdCIgb3B0aW9uIChtZXJnZXRvb2wucHJvbXB0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUHJvbXB0KCkgeworCQlyZXR1cm4gcHJvbXB0OworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2wgImtlZXAgYmFja3VwIiBvcHRpb24KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0tlZXBCYWNrdXAoKSB7CisJCXJldHVybiBrZWVwQmFja3VwOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2wgImtlZXBUZW1wb3JhcmllcyIgb3B0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gaXNLZWVwVGVtcG9yYXJpZXMoKSB7CisJCXJldHVybiBrZWVwVGVtcG9yYXJpZXM7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgdG9vbCAid3JpdGUgdG8gdGVtcCIgb3B0aW9uCisJICovCisJcHVibGljIGJvb2xlYW4gaXNXcml0ZVRvVGVtcCgpIHsKKwkJcmV0dXJuIHdyaXRlVG9UZW1wOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2xzIG1hcAorCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBFeHRlcm5hbE1lcmdlVG9vbD4gZ2V0VG9vbHMoKSB7CisJCXJldHVybiB0b29sczsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0b29sIG5hbWVzCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldFRvb2xOYW1lcygpIHsKKwkJcmV0dXJuIHRvb2xzLmtleVNldCgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL01lcmdlVG9vbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9NZXJnZVRvb2xzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwMzIwMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9NZXJnZVRvb2xzLmphdmEKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMiwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxOSwgVGltIE5ldW1hbm4gPHRpbS5uZXVtYW5uQGFkdmFudGVzdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRDb3B5T3B0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sLkZpbGVFbGVtZW50LlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWwuQm9vbGVhblRyaVN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlMuRXhlY3V0aW9uUmVzdWx0OworCisvKioKKyAqIE1hbmFnZXMgbWVyZ2UgdG9vbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXJnZVRvb2xzIHsKKworCXByaXZhdGUgZmluYWwgRlMgZnM7CisKKwlwcml2YXRlIGZpbmFsIEZpbGUgZ2l0RGlyOworCisJcHJpdmF0ZSBmaW5hbCBGaWxlIHdvcmtUcmVlOworCisJcHJpdmF0ZSBmaW5hbCBNZXJnZVRvb2xDb25maWcgY29uZmlnOworCisJcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IHJlcG87CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEV4dGVybmFsTWVyZ2VUb29sPiBwcmVkZWZpbmVkVG9vbHM7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEV4dGVybmFsTWVyZ2VUb29sPiB1c2VyRGVmaW5lZFRvb2xzOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZXh0ZXJuYWwgbWVyZ2UtdG9vbHMgbWFuYWdlciBmb3IgZ2l2ZW4gcmVwb3NpdG9yeS4KKwkgKgorCSAqIEBwYXJhbSByZXBvCisJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeQorCSAqLworCXB1YmxpYyBNZXJnZVRvb2xzKFJlcG9zaXRvcnkgcmVwbykgeworCQl0aGlzKHJlcG8sIHJlcG8uZ2V0Q29uZmlnKCkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGV4dGVybmFsIGRpZmYtdG9vbHMgbWFuYWdlciBmb3IgZ2l2ZW4gY29uZmlndXJhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBjb25maWcKKwkgKiAgICAgICAgICAgIHRoZSBnaXQgY29uZmlndXJhdGlvbgorCSAqLworCXB1YmxpYyBNZXJnZVRvb2xzKFN0b3JlZENvbmZpZyBjb25maWcpIHsKKwkJdGhpcyhudWxsLCBjb25maWcpOworCX0KKworCXByaXZhdGUgTWVyZ2VUb29scyhSZXBvc2l0b3J5IHJlcG8sIFN0b3JlZENvbmZpZyBjb25maWcpIHsKKwkJdGhpcy5yZXBvID0gcmVwbzsKKwkJdGhpcy5jb25maWcgPSBjb25maWcuZ2V0KE1lcmdlVG9vbENvbmZpZy5LRVkpOworCQl0aGlzLmdpdERpciA9IHJlcG8gPT0gbnVsbCA/IG51bGwgOiByZXBvLmdldERpcmVjdG9yeSgpOworCQl0aGlzLmZzID0gcmVwbyA9PSBudWxsID8gRlMuREVURUNURUQgOiByZXBvLmdldEZTKCk7CisJCXRoaXMud29ya1RyZWUgPSByZXBvID09IG51bGwgPyBudWxsIDogcmVwby5nZXRXb3JrVHJlZSgpOworCQlwcmVkZWZpbmVkVG9vbHMgPSBzZXR1cFByZWRlZmluZWRUb29scygpOworCQl1c2VyRGVmaW5lZFRvb2xzID0gc2V0dXBVc2VyRGVmaW5lZFRvb2xzKHByZWRlZmluZWRUb29scyk7CisJfQorCisJLyoqCisJICogTWVyZ2UgdHdvIHZlcnNpb25zIG9mIGEgZmlsZSB3aXRoIG9wdGlvbmFsIGJhc2UgZmlsZS4KKwkgKgorCSAqIEBwYXJhbSBsb2NhbEZpbGUKKwkgKiAgICAgICAgICAgIFRoZSBsb2NhbC9sZWZ0IHZlcnNpb24gb2YgdGhlIGZpbGUuCisJICogQHBhcmFtIHJlbW90ZUZpbGUKKwkgKiAgICAgICAgICAgIFRoZSByZW1vdGUvcmlnaHQgdmVyc2lvbiBvZiB0aGUgZmlsZS4KKwkgKiBAcGFyYW0gbWVyZ2VkRmlsZQorCSAqICAgICAgICAgICAgVGhlIGZpbGUgZm9yIHRoZSByZXN1bHQuCisJICogQHBhcmFtIGJhc2VGaWxlCisJICogICAgICAgICAgICBUaGUgYmFzZSB2ZXJzaW9uIG9mIHRoZSBmaWxlLiBNYXkgYmUgbnVsbC4KKwkgKiBAcGFyYW0gdGVtcERpcgorCSAqICAgICAgICAgICAgVGhlIHRtZXBEaXIgdXNlZCBmb3IgdGhlIGZpbGVzLiBNYXkgYmUgbnVsbC4KKwkgKiBAcGFyYW0gdG9vbE5hbWUKKwkgKiAgICAgICAgICAgIE9wdGlvbmFsbHkgdGhlIG5hbWUgb2YgdGhlIHRvb2wgdG8gdXNlLiBJZiBub3QgZ2l2ZW4gdGhlCisJICogICAgICAgICAgICBkZWZhdWx0IHRvb2wgd2lsbCBiZSB1c2VkLgorCSAqIEBwYXJhbSBwcm9tcHQKKwkgKiAgICAgICAgICAgIE9wdGlvbmFsbHkgYSBmbGFnIHdoZXRoZXIgdG8gcHJvbXB0IHRoZSB1c2VyIGJlZm9yZSBjb21wYXJlLgorCSAqICAgICAgICAgICAgSWYgbm90IGdpdmVuIHRoZSBkZWZhdWx0IHdpbGwgYmUgdXNlZC4KKwkgKiBAcGFyYW0gZ3VpCisJICogICAgICAgICAgICBBIGZsYWcgd2hldGhlciB0byBwcmVmZXIgYSBndWkgdG9vbC4KKwkgKiBAcGFyYW0gcHJvbXB0SGFuZGxlcgorCSAqICAgICAgICAgICAgVGhlIGhhbmRsZXIgdG8gdXNlIHdoZW4gbmVlZGluZyB0byBwcm9tcHQgdGhlIHVzZXIgaWYgaGUgd2FudHMKKwkgKiAgICAgICAgICAgIHRvIGNvbnRpbnVlLgorCSAqIEBwYXJhbSBub1Rvb2xIYW5kbGVyCisJICogICAgICAgICAgICBUaGUgaGFuZGxlciB0byB1c2Ugd2hlbiBuZWVkaW5nIHRvIGluZm9ybSB0aGUgdXNlciwgdGhhdCBubworCSAqICAgICAgICAgICAgdG9vbCBpcyBjb25maWd1cmVkLgorCSAqIEByZXR1cm4gdGhlIG9wdGlvbmFsIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHRvb2wgaWYgaXQgd2FzIGV4ZWN1dGVkCisJICogQHRocm93cyBUb29sRXhjZXB0aW9uCisJICogICAgICAgICAgICAgd2hlbiB0aGUgdG9vbCBmYWlscworCSAqLworCXB1YmxpYyBPcHRpb25hbDxFeGVjdXRpb25SZXN1bHQ+IG1lcmdlKEZpbGVFbGVtZW50IGxvY2FsRmlsZSwKKwkJCUZpbGVFbGVtZW50IHJlbW90ZUZpbGUsIEZpbGVFbGVtZW50IG1lcmdlZEZpbGUsCisJCQlGaWxlRWxlbWVudCBiYXNlRmlsZSwgRmlsZSB0ZW1wRGlyLCBPcHRpb25hbDxTdHJpbmc+IHRvb2xOYW1lLAorCQkJQm9vbGVhblRyaVN0YXRlIHByb21wdCwgYm9vbGVhbiBndWksCisJCQlQcm9tcHRDb250aW51ZUhhbmRsZXIgcHJvbXB0SGFuZGxlciwKKwkJCUluZm9ybU5vVG9vbEhhbmRsZXIgbm9Ub29sSGFuZGxlcikgdGhyb3dzIFRvb2xFeGNlcHRpb24geworCisJCVN0cmluZyB0b29sTmFtZVRvVXNlOworCisJCWlmICh0b29sTmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgVG9vbEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5kaWZmVG9vbE51bGxFcnJvcik7CisJCX0KKworCQlpZiAodG9vbE5hbWUuaXNQcmVzZW50KCkpIHsKKwkJCXRvb2xOYW1lVG9Vc2UgPSB0b29sTmFtZS5nZXQoKTsKKwkJfSBlbHNlIHsKKwkJCXRvb2xOYW1lVG9Vc2UgPSBnZXREZWZhdWx0VG9vbE5hbWUoZ3VpKTsKKworCQkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwodG9vbE5hbWVUb1VzZSkpIHsKKwkJCQlub1Rvb2xIYW5kbGVyLmluZm9ybShuZXcgQXJyYXlMaXN0PD4ocHJlZGVmaW5lZFRvb2xzLmtleVNldCgpKSk7CisJCQkJdG9vbE5hbWVUb1VzZSA9IGdldEZpcnN0QXZhaWxhYmxlVG9vbCgpOworCQkJfQorCQl9CisKKwkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwodG9vbE5hbWVUb1VzZSkpIHsKKwkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmRpZmZUb29sTm90R2l2ZW5FcnJvcik7CisJCX0KKworCQlib29sZWFuIGRvUHJvbXB0OworCQlpZiAocHJvbXB0ICE9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVCkgeworCQkJZG9Qcm9tcHQgPSBwcm9tcHQgPT0gQm9vbGVhblRyaVN0YXRlLlRSVUU7CisJCX0gZWxzZSB7CisJCQlkb1Byb21wdCA9IGlzSW50ZXJhY3RpdmUoKTsKKwkJfQorCisJCWlmIChkb1Byb21wdCkgeworCQkJaWYgKCFwcm9tcHRIYW5kbGVyLnByb21wdCh0b29sTmFtZVRvVXNlKSkgeworCQkJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCQkJfQorCQl9CisKKwkJRXh0ZXJuYWxNZXJnZVRvb2wgdG9vbCA9IGdldFRvb2wodG9vbE5hbWVUb1VzZSk7CisJCWlmICh0b29sID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKAorCQkJCQkiRXh0ZXJuYWwgbWVyZ2UgdG9vbCBpcyBub3QgZGVmaW5lZDogIiArIHRvb2xOYW1lVG9Vc2UpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlyZXR1cm4gT3B0aW9uYWwub2YobWVyZ2UobG9jYWxGaWxlLCByZW1vdGVGaWxlLCBtZXJnZWRGaWxlLCBiYXNlRmlsZSwKKwkJCQl0ZW1wRGlyLCB0b29sKSk7CisJfQorCisJLyoqCisJICogTWVyZ2UgdHdvIHZlcnNpb25zIG9mIGEgZmlsZSB3aXRoIG9wdGlvbmFsIGJhc2UgZmlsZS4KKwkgKgorCSAqIEBwYXJhbSBsb2NhbEZpbGUKKwkgKiAgICAgICAgICAgIHRoZSBsb2NhbCBmaWxlIGVsZW1lbnQKKwkgKiBAcGFyYW0gcmVtb3RlRmlsZQorCSAqICAgICAgICAgICAgdGhlIHJlbW90ZSBmaWxlIGVsZW1lbnQKKwkgKiBAcGFyYW0gbWVyZ2VkRmlsZQorCSAqICAgICAgICAgICAgdGhlIG1lcmdlZCBmaWxlIGVsZW1lbnQKKwkgKiBAcGFyYW0gYmFzZUZpbGUKKwkgKiAgICAgICAgICAgIHRoZSBiYXNlIGZpbGUgZWxlbWVudCAoY2FuIGJlIG51bGwpCisJICogQHBhcmFtIHRlbXBEaXIKKwkgKiAgICAgICAgICAgIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IChuZWVkZWQgZm9yIGJhY2t1cCBhbmQgYXV0by1yZW1vdmUsCisJICogICAgICAgICAgICBjYW4gYmUgbnVsbCkKKwkgKiBAcGFyYW0gdG9vbAorCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGVkIHRvb2wKKwkgKiBAcmV0dXJuIHRoZSBleGVjdXRpb24gcmVzdWx0IGZyb20gdG9vbAorCSAqIEB0aHJvd3MgVG9vbEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBFeGVjdXRpb25SZXN1bHQgbWVyZ2UoRmlsZUVsZW1lbnQgbG9jYWxGaWxlLCBGaWxlRWxlbWVudCByZW1vdGVGaWxlLAorCQkJRmlsZUVsZW1lbnQgbWVyZ2VkRmlsZSwgRmlsZUVsZW1lbnQgYmFzZUZpbGUsIEZpbGUgdGVtcERpciwKKwkJCUV4dGVybmFsTWVyZ2VUb29sIHRvb2wpIHRocm93cyBUb29sRXhjZXB0aW9uIHsKKwkJRmlsZUVsZW1lbnQgYmFja3VwID0gbnVsbDsKKwkJRXhlY3V0aW9uUmVzdWx0IHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQkvLyBjcmVhdGUgYWRkaXRpb25hbCBiYWNrdXAgZmlsZSAoY29weSB3b3JrdHJlZSBmaWxlKQorCQkJYmFja3VwID0gY3JlYXRlQmFja3VwRmlsZShtZXJnZWRGaWxlLAorCQkJCQl0ZW1wRGlyICE9IG51bGwgPyB0ZW1wRGlyIDogd29ya1RyZWUpOworCQkJLy8gcHJlcGFyZSB0aGUgY29tbWFuZCAocmVwbGFjZSB0aGUgZmlsZSBwYXRocykKKwkJCVN0cmluZyBjb21tYW5kID0gRXh0ZXJuYWxUb29sVXRpbHMucHJlcGFyZUNvbW1hbmQoCisJCQkJCXRvb2wuZ2V0Q29tbWFuZChiYXNlRmlsZSAhPSBudWxsKSwgbG9jYWxGaWxlLCByZW1vdGVGaWxlLAorCQkJCQltZXJnZWRGaWxlLCBiYXNlRmlsZSk7CisJCQkvLyBwcmVwYXJlIHRoZSBlbnZpcm9ubWVudAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBlbnYgPSBFeHRlcm5hbFRvb2xVdGlscy5wcmVwYXJlRW52aXJvbm1lbnQoCisJCQkJCWdpdERpciwgbG9jYWxGaWxlLCByZW1vdGVGaWxlLCBtZXJnZWRGaWxlLCBiYXNlRmlsZSk7CisJCQlib29sZWFuIHRydXN0ID0gdG9vbC5nZXRUcnVzdEV4aXRDb2RlKCkgPT0gQm9vbGVhblRyaVN0YXRlLlRSVUU7CisJCQkvLyBleGVjdXRlIHRoZSB0b29sCisJCQlDb21tYW5kRXhlY3V0b3IgY21kRXhlYyA9IG5ldyBDb21tYW5kRXhlY3V0b3IoZnMsIHRydXN0KTsKKwkJCXJlc3VsdCA9IGNtZEV4ZWMucnVuKGNvbW1hbmQsIHdvcmtUcmVlLCBlbnYpOworCQkJLy8ga2VlcCBiYWNrdXAgYXMgLm9yaWcgZmlsZQorCQkJaWYgKGJhY2t1cCAhPSBudWxsKSB7CisJCQkJa2VlcEJhY2t1cEZpbGUobWVyZ2VkRmlsZS5nZXRQYXRoKCksIGJhY2t1cCk7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBUb29sRXhjZXB0aW9uKGUpOworCQl9IGZpbmFsbHkgeworCQkJLy8gYWx3YXlzIGRlbGV0ZSBiYWNrdXAgZmlsZSAoaWdub3JlIHRoYXQgaXQgd2FzIG1heSBiZSBhbHJlYWR5CisJCQkvLyBtb3ZlZCB0byBrZWVwLWJhY2t1cCBmaWxlKQorCQkJaWYgKGJhY2t1cCAhPSBudWxsKSB7CisJCQkJYmFja3VwLmNsZWFuVGVtcG9yYXJpZXMoKTsKKwkJCX0KKwkJCS8vIGlmIHRoZSB0b29sIHJldHVybnMgYW4gZXJyb3IgYW5kIGtlZXBUZW1wb3JhcmllcyBpcyBzZXQgdG8gdHJ1ZSwKKwkJCS8vIHRoZW4gdGhlc2UgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgcHJlc2VydmVkCisJCQlpZiAoISgocmVzdWx0ID09IG51bGwpICYmIGNvbmZpZy5pc0tlZXBUZW1wb3JhcmllcygpKSkgeworCQkJCS8vIGRlbGV0ZSB0aGUgZmlsZXMKKwkJCQlsb2NhbEZpbGUuY2xlYW5UZW1wb3JhcmllcygpOworCQkJCXJlbW90ZUZpbGUuY2xlYW5UZW1wb3JhcmllcygpOworCQkJCWlmIChiYXNlRmlsZSAhPSBudWxsKSB7CisJCQkJCWJhc2VGaWxlLmNsZWFuVGVtcG9yYXJpZXMoKTsKKwkJCQl9CisJCQkJLy8gZGVsZXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgaWYgbmVlZGVkCisJCQkJaWYgKGNvbmZpZy5pc1dyaXRlVG9UZW1wKCkgJiYgKHRlbXBEaXIgIT0gbnVsbCkKKwkJCQkJCSYmIHRlbXBEaXIuZXhpc3RzKCkpIHsKKwkJCQkJdGVtcERpci5kZWxldGUoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEZpbGVFbGVtZW50IGNyZWF0ZUJhY2t1cEZpbGUoRmlsZUVsZW1lbnQgZnJvbSwgRmlsZSB0b1BhcmVudERpcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVFbGVtZW50IGJhY2t1cCA9IG51bGw7CisJCVBhdGggcGF0aCA9IFBhdGhzLmdldChmcm9tLmdldFBhdGgoKSk7CisJCWlmIChGaWxlcy5leGlzdHMocGF0aCkpIHsKKwkJCWJhY2t1cCA9IG5ldyBGaWxlRWxlbWVudChmcm9tLmdldFBhdGgoKSwgVHlwZS5CQUNLVVApOworCQkJRmlsZXMuY29weShwYXRoLCBiYWNrdXAuY3JlYXRlVGVtcEZpbGUodG9QYXJlbnREaXIpLnRvUGF0aCgpLAorCQkJCQlTdGFuZGFyZENvcHlPcHRpb24uUkVQTEFDRV9FWElTVElORyk7CisJCX0KKwkJcmV0dXJuIGJhY2t1cDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpZiAobWVyZ2V0b2wud3JpdGVUb1RlbXAgPT0gdHJ1ZSkKKwkgKiAgICAgICAgIG9yIG51bGwgaWYgbm90IGNvbmZpZ3VyZWQgb3IgZmFsc2UuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBGaWxlIGNyZWF0ZVRlbXBEaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gY29uZmlnLmlzV3JpdGVUb1RlbXAoKQorCQkJCT8gRmlsZXMuY3JlYXRlVGVtcERpcmVjdG9yeSgiamdpdC1tZXJnZXRvb2wtIikudG9GaWxlKCkgLy8kTk9OLU5MUy0xJAorCQkJCTogbnVsbDsKKwl9CisKKwkvKioKKwkgKiBHZXQgdXNlciBkZWZpbmVkIHRvb2wgbmFtZXMuCisJICoKKwkgKiBAcmV0dXJuIHRoZSB1c2VyIGRlZmluZWQgdG9vbCBuYW1lcworCSAqLworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRVc2VyRGVmaW5lZFRvb2xOYW1lcygpIHsKKwkJcmV0dXJuIHVzZXJEZWZpbmVkVG9vbHMua2V5U2V0KCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgcHJlZGVmaW5lZCB0b29sIG5hbWVzCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldFByZWRlZmluZWRUb29sTmFtZXMoKSB7CisJCXJldHVybiBwcmVkZWZpbmVkVG9vbHMua2V5U2V0KCk7CisJfQorCisJLyoqCisJICogR2V0IGFsbCB0b29sIG5hbWVzLgorCSAqCisJICogQHJldHVybiB0aGUgYWxsIHRvb2wgbmFtZXMgKGRlZmF1bHQgb3IgYXZhaWxhYmxlIHRvb2wgbmFtZSBpcyB0aGUgZmlyc3QKKwkgKiAgICAgICAgIGluIHRoZSBzZXQpCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldEFsbFRvb2xOYW1lcygpIHsKKwkJU3RyaW5nIGRlZmF1bHROYW1lID0gZ2V0RGVmYXVsdFRvb2xOYW1lKGZhbHNlKTsKKwkJaWYgKGRlZmF1bHROYW1lID09IG51bGwpIHsKKwkJCWRlZmF1bHROYW1lID0gZ2V0Rmlyc3RBdmFpbGFibGVUb29sKCk7CisJCX0KKwkJcmV0dXJuIEV4dGVybmFsVG9vbFV0aWxzLmNyZWF0ZVNvcnRlZFRvb2xTZXQoZGVmYXVsdE5hbWUsCisJCQkJZ2V0VXNlckRlZmluZWRUb29sTmFtZXMoKSwgZ2V0UHJlZGVmaW5lZFRvb2xOYW1lcygpKTsKKwl9CisKKwkvKioKKwkgKiBQcm92aWRlcyB7QGxpbmsgT3B0aW9uYWx9IHdpdGggdGhlIG5hbWUgb2YgYW4gZXh0ZXJuYWwgbWVyZ2UgdG9vbCBpZgorCSAqIHNwZWNpZmllZCBpbiBnaXQgY29uZmlndXJhdGlvbiBmb3IgYSBwYXRoLgorCSAqCisJICogVGhlIGZvcm1lZCBnaXQgY29uZmlndXJhdGlvbiByZXN1bHRzIGZyb20gZ2xvYmFsIHJ1bGVzIGFzIHdlbGwgYXMgbWVyZ2VkCisJICogcnVsZXMgZnJvbSBpbmZvIGFuZCB3b3JrdHJlZSBhdHRyaWJ1dGVzLgorCSAqCisJICogVHJpZ2dlcnMge0BsaW5rIFRyZWVXYWxrfSB1bnRpbCBzcGVjaWZpZWQgcGF0aCBmb3VuZCBpbiB0aGUgdHJlZS4KKwkgKgorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICBwYXRoIHRvIHRoZSBub2RlIGluIHJlcG9zaXRvcnkgdG8gcGFyc2UgZ2l0IGF0dHJpYnV0ZXMgZm9yCisJICogQHJldHVybiBuYW1lIG9mIHRoZSBkaWZmdG9vbCBpZiBzZXQKKwkgKiBAdGhyb3dzIFRvb2xFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRFeHRlcm5hbFRvb2xGcm9tQXR0cmlidXRlcyhmaW5hbCBTdHJpbmcgcGF0aCkKKwkJCXRocm93cyBUb29sRXhjZXB0aW9uIHsKKwkJcmV0dXJuIEV4dGVybmFsVG9vbFV0aWxzLmdldEV4dGVybmFsVG9vbEZyb21BdHRyaWJ1dGVzKHJlcG8sIHBhdGgsCisJCQkJRXh0ZXJuYWxUb29sVXRpbHMuS0VZX01FUkdFX1RPT0wpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBwcmVkZWZpbmVkIHRvb2xzIGluIHRoZSBzeXN0ZW0uCisJICoKKwkgKiBAcmV0dXJuIHNldCBvZiBwcmVkZWZpbmVkIGF2YWlsYWJsZSB0b29scworCSAqLworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQcmVkZWZpbmVkQXZhaWxhYmxlVG9vbHMoKSB7CisJCU1hcDxTdHJpbmcsIEV4dGVybmFsTWVyZ2VUb29sPiBkZWZUb29scyA9IGdldFByZWRlZmluZWRUb29scyh0cnVlKTsKKwkJU2V0PFN0cmluZz4gYXZhaWxhYmxlVG9vbHMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisJCWZvciAoRW50cnk8U3RyaW5nLCBFeHRlcm5hbE1lcmdlVG9vbD4gZWxlbSA6IGRlZlRvb2xzLmVudHJ5U2V0KCkpIHsKKwkJCWlmIChlbGVtLmdldFZhbHVlKCkuaXNBdmFpbGFibGUoKSkgeworCQkJCWF2YWlsYWJsZVRvb2xzLmFkZChlbGVtLmdldEtleSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYXZhaWxhYmxlVG9vbHM7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgdXNlciBkZWZpbmVkIHRvb2xzCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIEV4dGVybmFsTWVyZ2VUb29sPiBnZXRVc2VyRGVmaW5lZFRvb2xzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHVzZXJEZWZpbmVkVG9vbHMpOworCX0KKworCS8qKgorCSAqIEdldCBwcmVkZWZpbmVkIHRvb2xzIG1hcC4KKwkgKgorCSAqIEBwYXJhbSBjaGVja0F2YWlsYWJpbGl0eQorCSAqICAgICAgICAgICAgdHJ1ZTogZm9yIGNoZWNraW5nIGlmIHRvb2xzIGNhbiBiZSBleGVjdXRlZDsgQVRURU5USU9OOiB0aGlzCisJICogICAgICAgICAgICBjaGVjayB0b29rIHNvbWUgdGltZSwgZG8gbm90IGV4ZWN1dGUgb2Z0ZW4gKHN0b3JlIHRoZSBtYXAgZm9yCisJICogICAgICAgICAgICBvdGhlciBhY3Rpb25zKTsgZmFsc2U6IGF2YWlsYWJpbGl0eSBpcyBOT1QgY2hlY2tlZDoKKwkgKiAgICAgICAgICAgIGlzQXZhaWxhYmxlKCkgcmV0dXJucyBkZWZhdWx0IGZhbHNlIGlzIHRoaXMgY2FzZSEKKwkgKiBAcmV0dXJuIHRoZSBwcmVkZWZpbmVkIHRvb2xzIHdpdGggb3B0aW9uYWxseSBjaGVja2VkIGF2YWlsYWJpbGl0eSAobG9uZworCSAqICAgICAgICAgcnVubmluZyBvcGVyYXRpb24pCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIEV4dGVybmFsTWVyZ2VUb29sPiBnZXRQcmVkZWZpbmVkVG9vbHMoCisJCQlib29sZWFuIGNoZWNrQXZhaWxhYmlsaXR5KSB7CisJCWlmIChjaGVja0F2YWlsYWJpbGl0eSkgeworCQkJZm9yIChFeHRlcm5hbE1lcmdlVG9vbCB0b29sIDogcHJlZGVmaW5lZFRvb2xzLnZhbHVlcygpKSB7CisJCQkJUHJlRGVmaW5lZE1lcmdlVG9vbCBwcmVkZWZUb29sID0gKFByZURlZmluZWRNZXJnZVRvb2wpIHRvb2w7CisJCQkJcHJlZGVmVG9vbC5zZXRBdmFpbGFibGUoRXh0ZXJuYWxUb29sVXRpbHMuaXNUb29sQXZhaWxhYmxlKGZzLAorCQkJCQkJZ2l0RGlyLCB3b3JrVHJlZSwgcHJlZGVmVG9vbC5nZXRQYXRoKCkpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHByZWRlZmluZWRUb29scyk7CisJfQorCisJLyoqCisJICogR2V0IGZpcnN0IGF2YWlsYWJsZSB0b29sIG5hbWUuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIGZpcnN0IGF2YWlsYWJsZSBwcmVkZWZpbmVkIHRvb2wgb3IgbnVsbAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RBdmFpbGFibGVUb29sKCkgeworCQlTdHJpbmcgbmFtZSA9IG51bGw7CisJCWZvciAoRXh0ZXJuYWxNZXJnZVRvb2wgdG9vbCA6IHByZWRlZmluZWRUb29scy52YWx1ZXMoKSkgeworCQkJaWYgKEV4dGVybmFsVG9vbFV0aWxzLmlzVG9vbEF2YWlsYWJsZShmcywgZ2l0RGlyLCB3b3JrVHJlZSwKKwkJCQkJdG9vbC5nZXRQYXRoKCkpKSB7CisJCQkJbmFtZSA9IHRvb2wuZ2V0TmFtZSgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIElzIGludGVyYWN0aXZlIG1lcmdlIChwcm9tcHQgZW5hYmxlZCkgPworCSAqCisJICogQHJldHVybiBpcyBpbnRlcmFjdGl2ZSAoY29uZmlnIHByb21wdCBlbmFibGVkKSA/CisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlcmFjdGl2ZSgpIHsKKwkJcmV0dXJuIGNvbmZpZy5pc1Byb21wdCgpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgZGVmYXVsdCAoZ3VpLSl0b29sIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gZ3VpCisJICogICAgICAgICAgICB1c2UgdGhlIGRpZmYuZ3VpdG9vbCBzZXR0aW5nID8KKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHRvb2wgbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRvb2xOYW1lKGJvb2xlYW4gZ3VpKSB7CisJCXJldHVybiBndWkgPyBjb25maWcuZ2V0RGVmYXVsdEd1aVRvb2xOYW1lKCkKKwkJCQk6IGNvbmZpZy5nZXREZWZhdWx0VG9vbE5hbWUoKTsKKwl9CisKKwlwcml2YXRlIEV4dGVybmFsTWVyZ2VUb29sIGdldFRvb2woZmluYWwgU3RyaW5nIG5hbWUpIHsKKwkJRXh0ZXJuYWxNZXJnZVRvb2wgdG9vbCA9IHVzZXJEZWZpbmVkVG9vbHMuZ2V0KG5hbWUpOworCQlpZiAodG9vbCA9PSBudWxsKSB7CisJCQl0b29sID0gcHJlZGVmaW5lZFRvb2xzLmdldChuYW1lKTsKKwkJfQorCQlyZXR1cm4gdG9vbDsKKwl9CisKKwlwcml2YXRlIHZvaWQga2VlcEJhY2t1cEZpbGUoU3RyaW5nIG1lcmdlZEZpbGVQYXRoLCBGaWxlRWxlbWVudCBiYWNrdXApCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoY29uZmlnLmlzS2VlcEJhY2t1cCgpKSB7CisJCQlQYXRoIGJhY2t1cFBhdGggPSBiYWNrdXAuZ2V0RmlsZSgpLnRvUGF0aCgpOworCQkJRmlsZXMubW92ZShiYWNrdXBQYXRoLAorCQkJCQliYWNrdXBQYXRoLnJlc29sdmVTaWJsaW5nKAorCQkJCQkJCVBhdGhzLmdldChtZXJnZWRGaWxlUGF0aCkuZ2V0RmlsZU5hbWUoKSArICIub3JpZyIpLCAvLyROT04tTkxTLTEkCisJCQkJCVN0YW5kYXJkQ29weU9wdGlvbi5SRVBMQUNFX0VYSVNUSU5HKTsKKwkJfQorCX0KKworCXByaXZhdGUgTWFwPFN0cmluZywgRXh0ZXJuYWxNZXJnZVRvb2w+IHNldHVwUHJlZGVmaW5lZFRvb2xzKCkgeworCQlNYXA8U3RyaW5nLCBFeHRlcm5hbE1lcmdlVG9vbD4gdG9vbHMgPSBuZXcgVHJlZU1hcDw+KCk7CisJCWZvciAoQ29tbWFuZExpbmVNZXJnZVRvb2wgdG9vbCA6IENvbW1hbmRMaW5lTWVyZ2VUb29sLnZhbHVlcygpKSB7CisJCQl0b29scy5wdXQodG9vbC5uYW1lKCksIG5ldyBQcmVEZWZpbmVkTWVyZ2VUb29sKHRvb2wpKTsKKwkJfQorCQlyZXR1cm4gdG9vbHM7CisJfQorCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBFeHRlcm5hbE1lcmdlVG9vbD4gc2V0dXBVc2VyRGVmaW5lZFRvb2xzKAorCQkJTWFwPFN0cmluZywgRXh0ZXJuYWxNZXJnZVRvb2w+IHByZWRlZlRvb2xzKSB7CisJCU1hcDxTdHJpbmcsIEV4dGVybmFsTWVyZ2VUb29sPiB0b29scyA9IG5ldyBUcmVlTWFwPD4oKTsKKwkJTWFwPFN0cmluZywgRXh0ZXJuYWxNZXJnZVRvb2w+IHVzZXJUb29scyA9IGNvbmZpZy5nZXRUb29scygpOworCQlmb3IgKFN0cmluZyBuYW1lIDogdXNlclRvb2xzLmtleVNldCgpKSB7CisJCQlFeHRlcm5hbE1lcmdlVG9vbCB1c2VyVG9vbCA9IHVzZXJUb29scy5nZXQobmFtZSk7CisJCQkvLyBpZiBtZXJnZXRvb2wuPG5hbWU+LmNtZCBpcyBkZWZpbmVkIHdlIGhhdmUgdXNlciBkZWZpbmVkIHRvb2wKKwkJCWlmICh1c2VyVG9vbC5nZXRDb21tYW5kKCkgIT0gbnVsbCkgeworCQkJCXRvb2xzLnB1dChuYW1lLCB1c2VyVG9vbCk7CisJCQl9IGVsc2UgaWYgKHVzZXJUb29sLmdldFBhdGgoKSAhPSBudWxsKSB7CisJCQkJLy8gaWYgbWVyZ2V0b29sLjxuYW1lPi5wYXRoIGlzIGRlZmluZWQgd2UganVzdCBvdmVybG9hZCB0aGUgcGF0aAorCQkJCS8vIG9mIHByZWRlZmluZWQgdG9vbAorCQkJCVByZURlZmluZWRNZXJnZVRvb2wgcHJlZGVmVG9vbCA9IChQcmVEZWZpbmVkTWVyZ2VUb29sKSBwcmVkZWZUb29scworCQkJCQkJLmdldChuYW1lKTsKKwkJCQlpZiAocHJlZGVmVG9vbCAhPSBudWxsKSB7CisJCQkJCXByZWRlZlRvb2wuc2V0UGF0aCh1c2VyVG9vbC5nZXRQYXRoKCkpOworCQkJCQlpZiAodXNlclRvb2wuZ2V0VHJ1c3RFeGl0Q29kZSgpICE9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVCkgeworCQkJCQkJcHJlZGVmVG9vbAorCQkJCQkJCQkuc2V0VHJ1c3RFeGl0Q29kZSh1c2VyVG9vbC5nZXRUcnVzdEV4aXRDb2RlKCkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiB0b29sczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9QcmVEZWZpbmVkRGlmZlRvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9QcmVEZWZpbmVkRGlmZlRvb2wuamF2YQppbmRleCAxYzY5ZmI0Li5lMTE2OWEyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvUHJlRGVmaW5lZERpZmZUb29sLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1ByZURlZmluZWREaWZmVG9vbC5qYXZhCkBAIC00NiwxNyArNDYsNiBAQCBwdWJsaWMgUHJlRGVmaW5lZERpZmZUb29sKENvbW1hbmRMaW5lRGlmZlRvb2wgdG9vbCkgewogCSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJLy8gaGFuZGxpbmcgb2Ygc3BhY2VzIGluIHBhdGgKLQkJaWYgKHBhdGguY29udGFpbnMoIiAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBhZGQgcXVvdGVzIGJlZm9yZSBpZiBuZWVkZWQKLQkJCWlmICghcGF0aC5zdGFydHNXaXRoKCJcIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXRoID0gIlwiIiArIHBhdGg7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIGFkZCBxdW90ZXMgYWZ0ZXIgaWYgbmVlZGVkCi0JCQlpZiAoIXBhdGguZW5kc1dpdGgoIlwiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXBhdGggPSBwYXRoICsgIlwiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9CiAJCXN1cGVyLnNldFBhdGgocGF0aCk7CiAJfQogCkBAIC02Nyw3ICs1Niw3IEBAIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKIAkgKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKSB7Ci0JCXJldHVybiBnZXRQYXRoKCkgKyAiICIgKyBzdXBlci5nZXRDb21tYW5kKCk7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIEV4dGVybmFsVG9vbFV0aWxzLnF1b3RlUGF0aChnZXRQYXRoKCkpICsgIiAiICsgc3VwZXIuZ2V0Q29tbWFuZCgpOyAvLyROT04tTkxTLTEkCiAJfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvUHJlRGVmaW5lZE1lcmdlVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1ByZURlZmluZWRNZXJnZVRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI4ZDMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1ByZURlZmluZWRNZXJnZVRvb2wuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjIsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsLkJvb2xlYW5UcmlTdGF0ZTsKKworLyoqCisgKiBUaGUgcHJlLWRlZmluZWQgbWVyZ2UgdG9vbC4KKyAqLworcHVibGljIGNsYXNzIFByZURlZmluZWRNZXJnZVRvb2wgZXh0ZW5kcyBVc2VyRGVmaW5lZE1lcmdlVG9vbCB7CisKKwkvKioKKwkgKiB0aGUgdG9vbCBwYXJhbWV0ZXJzIHdpdGhvdXQgYmFzZQorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmFtZXRlcnNXaXRob3V0QmFzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIHByZS1kZWZpbmVkIG1lcmdlIHRvb2wKKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZQorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgcGF0aAorCSAqIEBwYXJhbSBwYXJhbWV0ZXJzV2l0aEJhc2UKKwkgKiAgICAgICAgICAgIHRoZSB0b29sIHBhcmFtZXRlcnMgdGhhdCBhcmUgdXNlZCB0b2dldGhlciB3aXRoIHBhdGggYXMKKwkgKiAgICAgICAgICAgIGNvbW1hbmQgYW5kICJiYXNlIGlzIHByZXNlbnQiICgkQkFTRSkKKwkgKiBAcGFyYW0gcGFyYW1ldGVyc1dpdGhvdXRCYXNlCisJICogICAgICAgICAgICB0aGUgdG9vbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHVzZWQgdG9nZXRoZXIgd2l0aCBwYXRoIGFzCisJICogICAgICAgICAgICBjb21tYW5kIGFuZCAiYmFzZSBpcyBwcmVzZW50IiAoJEJBU0UpCisJICogQHBhcmFtIHRydXN0RXhpdENvZGUKKwkgKiAgICAgICAgICAgIHRoZSAidHJ1c3QgZXhpdCBjb2RlIiBvcHRpb24KKwkgKi8KKwlwdWJsaWMgUHJlRGVmaW5lZE1lcmdlVG9vbChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhdGgsCisJCQlTdHJpbmcgcGFyYW1ldGVyc1dpdGhCYXNlLCBTdHJpbmcgcGFyYW1ldGVyc1dpdGhvdXRCYXNlLAorCQkJQm9vbGVhblRyaVN0YXRlIHRydXN0RXhpdENvZGUpIHsKKwkJc3VwZXIobmFtZSwgcGF0aCwgcGFyYW1ldGVyc1dpdGhCYXNlLCB0cnVzdEV4aXRDb2RlKTsKKwkJdGhpcy5wYXJhbWV0ZXJzV2l0aG91dEJhc2UgPSBwYXJhbWV0ZXJzV2l0aG91dEJhc2U7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgcHJlLWRlZmluZWQgbWVyZ2UgdG9vbAorCSAqCisJICogQHBhcmFtIHRvb2wKKwkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIGxpbmUgbWVyZ2UgdG9vbAorCSAqCisJICovCisJcHVibGljIFByZURlZmluZWRNZXJnZVRvb2woQ29tbWFuZExpbmVNZXJnZVRvb2wgdG9vbCkgeworCQl0aGlzKHRvb2wubmFtZSgpLCB0b29sLmdldFBhdGgoKSwgdG9vbC5nZXRQYXJhbWV0ZXJzKHRydWUpLAorCQkJCXRvb2wuZ2V0UGFyYW1ldGVycyhmYWxzZSksCisJCQkJdG9vbC5pc0V4aXRDb2RlVHJ1c3RhYmxlKCkgPyBCb29sZWFuVHJpU3RhdGUuVFJVRQorCQkJCQkJOiBCb29sZWFuVHJpU3RhdGUuRkFMU0UpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0cnVzdEV4aXRDb2RlCisJICogICAgICAgICAgICB0aGUgInRydXN0IGV4aXQgY29kZSIgb3B0aW9uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0VHJ1c3RFeGl0Q29kZShCb29sZWFuVHJpU3RhdGUgdHJ1c3RFeGl0Q29kZSkgeworCQlzdXBlci5zZXRUcnVzdEV4aXRDb2RlKHRydXN0RXhpdENvZGUpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2wgY29tbWFuZCAod2l0aCBiYXNlIHByZXNlbnQpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRDb21tYW5kKCkgeworCQlyZXR1cm4gZ2V0Q29tbWFuZCh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gd2l0aEJhc2UKKwkgKiAgICAgICAgICAgIGdldCBjb21tYW5kIHdpdGggYmFzZSBwcmVzZW50ICh0cnVlKSBvciB3aXRob3V0IGJhc2UgcHJlc2VudAorCSAqICAgICAgICAgICAgKGZhbHNlKQorCSAqIEByZXR1cm4gdGhlIHRvb2wgY29tbWFuZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZChib29sZWFuIHdpdGhCYXNlKSB7CisJCXJldHVybiBFeHRlcm5hbFRvb2xVdGlscy5xdW90ZVBhdGgoZ2V0UGF0aCgpKSArICIgIiAvLyROT04tTkxTLTEkCisJCQkJKyAod2l0aEJhc2UgPyBzdXBlci5nZXRDb21tYW5kKCkgOiBwYXJhbWV0ZXJzV2l0aG91dEJhc2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1Byb21wdENvbnRpbnVlSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1Byb21wdENvbnRpbnVlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZDMzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvUHJvbXB0Q29udGludWVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDE5LCBUaW0gTmV1bWFubiA8VGltLk5ldW1hbm5AYWR2YW50ZXN0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCisvKioKKyAqIEEgaGFuZGxlciBmb3Igd2hlbiB0aGUgZGlmZi9tZXJnZSB0b29sIG1hbmFnZXIgd2FudHMgdG8gcHJvbXB0IHRoZSB1c2VyCisgKiB3aGV0aGVyIHRvIGNvbnRpbnVlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvbXB0Q29udGludWVIYW5kbGVyIHsKKwkvKioKKwkgKiBQcm9tcHQgdGhlIHVzZXIgd2hldGhlciB0byBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGZpbGUgYnkgb3BlbmluZyBhIGdpdmVuCisJICogdG9vbC4KKwkgKgorCSAqIEBwYXJhbSB0b29sTmFtZQorCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHRvb2wgdG8gb3BlbgorCSAqIEByZXR1cm4gV2hldGhlciB0aGUgdXNlciB3YW50cyB0byBjb250aW51ZQorCSAqLworCWJvb2xlYW4gcHJvbXB0KFN0cmluZyB0b29sTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvVG9vbEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1Rvb2xFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2QzNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1Rvb2xFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlMuRXhlY3V0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBUb29sIGV4Y2VwdGlvbiBmb3IgZGlmZmVyZW50aWF0aW9uLgorICoKKyAqLworcHVibGljIGNsYXNzIFRvb2xFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkKKwkJCS5nZXRMb2dnZXIoVG9vbEV4Y2VwdGlvbi5jbGFzcyk7CisKKwlwcml2YXRlIGZpbmFsIEV4ZWN1dGlvblJlc3VsdCByZXN1bHQ7CisKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29tbWFuZEV4ZWN1dGlvbkVycm9yOworCisJLyoqCisJICogdGhlIHNlcmlhbCB2ZXJzaW9uIFVJRAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJLyoqCisJICoKKwkgKi8KKwlwdWJsaWMgVG9vbEV4Y2VwdGlvbigpIHsKKwkJdGhpcyhudWxsLCBudWxsLCBmYWxzZSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gbWVzc2FnZQorCSAqLworCXB1YmxpYyBUb29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXRoaXMobWVzc2FnZSwgbnVsbCwgZmFsc2UpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBtZXNzYWdlCisJICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKKwkgKiBAcGFyYW0gcmVzdWx0CisJICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIHJlc3VsdAorCSAqIEBwYXJhbSBjb21tYW5kRXhlY3V0aW9uRXJyb3IKKwkgKiAgICAgICAgICAgIGlzIGNvbW1hbmQgZXhlY3V0aW9uIGVycm9yIGhhcHBlbmVkID8KKwkgKi8KKwlwdWJsaWMgVG9vbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgRXhlY3V0aW9uUmVzdWx0IHJlc3VsdCwKKwkJCWJvb2xlYW4gY29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCQl0aGlzLnJlc3VsdCA9IHJlc3VsdDsKKwkJdGhpcy5jb21tYW5kRXhlY3V0aW9uRXJyb3IgPSBjb21tYW5kRXhlY3V0aW9uRXJyb3I7CisJfQorCisJLyoqCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gbWVzc2FnZQorCSAqIEBwYXJhbSBjYXVzZQorCSAqICAgICAgICAgICAgdGhlIGNhdXNlIGZvciB0aHJvdworCSAqLworCXB1YmxpYyBUb29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOworCQlyZXN1bHQgPSBudWxsOworCQljb21tYW5kRXhlY3V0aW9uRXJyb3IgPSBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gY2F1c2UKKwkgKiAgICAgICAgICAgIHRoZSBjYXVzZSBmb3IgdGhyb3cKKwkgKi8KKwlwdWJsaWMgVG9vbEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIoY2F1c2UpOworCQlyZXN1bHQgPSBudWxsOworCQljb21tYW5kRXhlY3V0aW9uRXJyb3IgPSBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgcmVzdWx0IGlzIHZhbGlkLCBmYWxzZSBlbHNlCisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZXN1bHQoKSB7CisJCXJldHVybiByZXN1bHQgIT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBleGVjdXRpb24gcmVzdWx0CisJICovCisJcHVibGljIEV4ZWN1dGlvblJlc3VsdCBnZXRSZXN1bHQoKSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIGNvbW1hbmQgZXhlY3V0aW9uIGVycm9yIGFwcGVhcnMsIGZhbHNlIG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29tbWFuZEV4ZWN1dGlvbkVycm9yKCkgeworCQlyZXR1cm4gY29tbWFuZEV4ZWN1dGlvbkVycm9yOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBTdGRlcnIKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFN0ZGVycigpIHsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0cnkgeworCQkJcmV0dXJuIG5ldyBTdHJpbmcocmVzdWx0LmdldFN0ZGVycigpLnRvQnl0ZUFycmF5KCksCisJCQkJCVN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRDaGFyc2V0KCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLndhcm4oIkZhaWxlZCB0byByZXRyaWV2ZSBzdGFuZGFyZCBlcnJvciBvdXRwdXQiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBTdGRvdXQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFN0ZG91dCgpIHsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0cnkgeworCQkJcmV0dXJuIG5ldyBTdHJpbmcocmVzdWx0LmdldFN0ZG91dCgpLnRvQnl0ZUFycmF5KCksCisJCQkJCVN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRDaGFyc2V0KCkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJTE9HLndhcm4oIkZhaWxlZCB0byByZXRyaWV2ZSBzdGFuZGFyZCBvdXRwdXQiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1VzZXJEZWZpbmVkRGlmZlRvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Vc2VyRGVmaW5lZERpZmZUb29sLmphdmEKaW5kZXggMDEyMjk2ZS4uZWI3MmQwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1VzZXJEZWZpbmVkRGlmZlRvb2wuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvVXNlckRlZmluZWREaWZmVG9vbC5qYXZhCkBAIC0xNSw2ICsxNSw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBVc2VyRGVmaW5lZERpZmZUb29sIGltcGxlbWVudHMgRXh0ZXJuYWxEaWZmVG9vbCB7CiAKKwlwcml2YXRlIGJvb2xlYW4gYXZhaWxhYmxlOworCiAJLyoqCiAJICogdGhlIGRpZmYgdG9vbCBuYW1lCiAJICovCkBAIC05OSw2ICsxMDEsMjMgQEAgcHVibGljIFN0cmluZyBnZXRDb21tYW5kKCkgewogCX0KIAogCS8qKgorCSAqIEByZXR1cm4gYXZhaWxhYmlsaXR5IG9mIHRoZSB0b29sOiB0cnVlIGlmIHRvb2wgY2FuIGJlIGV4ZWN1dGVkIGFuZCBmYWxzZQorCSAqICAgICAgICAgaWYgbm90CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisJCXJldHVybiBhdmFpbGFibGU7CisJfQorCisJLyoqCisJICogQHBhcmFtIGF2YWlsYWJsZQorCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0b29sIGNhbiBiZSBmb3VuZCBhbmQgZmFsc2UgaWYgbm90CisJICovCisJcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlKGJvb2xlYW4gYXZhaWxhYmxlKSB7CisJCXRoaXMuYXZhaWxhYmxlID0gYXZhaWxhYmxlOworCX0KKworCS8qKgogCSAqIE92ZXJyaWRlcyB0aGUgcGF0aCBmb3IgdGhlIGdpdmVuIHRvb2wuIEVxdWl2YWxlbnQgdG8gc2V0dGluZwogCSAqIHtAY29kZSBkaWZmdG9vbC48dG9vbD4ucGF0aH0uCiAJICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Vc2VyRGVmaW5lZE1lcmdlVG9vbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1VzZXJEZWZpbmVkTWVyZ2VUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkMmYwZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Vc2VyRGVmaW5lZE1lcmdlVG9vbC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMiwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWwuQm9vbGVhblRyaVN0YXRlOworCisvKioKKyAqIFRoZSB1c2VyLWRlZmluZWQgbWVyZ2UgdG9vbC4KKyAqLworcHVibGljIGNsYXNzIFVzZXJEZWZpbmVkTWVyZ2VUb29sIGV4dGVuZHMgVXNlckRlZmluZWREaWZmVG9vbAorCQlpbXBsZW1lbnRzIEV4dGVybmFsTWVyZ2VUb29sIHsKKworCS8qKgorCSAqIHRoZSBtZXJnZSB0b29sICJ0cnVzdCBleGl0IGNvZGUiIG9wdGlvbgorCSAqLworCXByaXZhdGUgQm9vbGVhblRyaVN0YXRlIHRydXN0RXhpdENvZGU7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXJnZSB0b29sCisJICoKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdGhlIG5hbWUKKwkgKiBAcGFyYW0gcGF0aAorCSAqICAgICAgICAgICAgdGhlIHBhdGgKKwkgKiBAcGFyYW0gY21kCisJICogICAgICAgICAgICB0aGUgY29tbWFuZAorCSAqIEBwYXJhbSB0cnVzdEV4aXRDb2RlCisJICogICAgICAgICAgICB0aGUgInRydXN0IGV4aXQgY29kZSIgb3B0aW9uCisJICovCisJcHVibGljIFVzZXJEZWZpbmVkTWVyZ2VUb29sKFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGNtZCwKKwkJCUJvb2xlYW5UcmlTdGF0ZSB0cnVzdEV4aXRDb2RlKSB7CisJCXN1cGVyKG5hbWUsIHBhdGgsIGNtZCk7CisJCXRoaXMudHJ1c3RFeGl0Q29kZSA9IHRydXN0RXhpdENvZGU7CisJfQorCS8qKgorCSAqIEByZXR1cm4gdGhlICJ0cnVzdCBleGl0IGNvZGUiIGZsYWcKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQm9vbGVhblRyaVN0YXRlIGdldFRydXN0RXhpdENvZGUoKSB7CisJCXJldHVybiB0cnVzdEV4aXRDb2RlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0cnVzdEV4aXRDb2RlCisJICogICAgICAgICAgICB0aGUgbmV3ICJ0cnVzdCBleGl0IGNvZGUiIGZsYWcKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRUcnVzdEV4aXRDb2RlKEJvb2xlYW5UcmlTdGF0ZSB0cnVzdEV4aXRDb2RlKSB7CisJCXRoaXMudHJ1c3RFeGl0Q29kZSA9IHRydXN0RXhpdENvZGU7CisJfQorCisJLyoqCisJICogQHBhcmFtIHdpdGhCYXNlCisJICogICAgICAgICAgICBub3QgdXNlZCwgYmVjYXVzZSB1c2VyLWRlZmluZWQgbWVyZ2UgdG9vbCBjYW4gb25seSBkZWZpbmUgb25lCisJICogICAgICAgICAgICBjbWQgLT4gaXQgbXVzdCBoYW5kbGUgd2l0aCBhbmQgd2l0aG91dCBiYXNlIHByZXNlbnQgKGVtcHR5KQorCSAqIEByZXR1cm4gdGhlIHRvb2wgY29tbWFuZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZChib29sZWFuIHdpdGhCYXNlKSB7CisJCXJldHVybiBnZXRDb21tYW5kKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YQppbmRleCA1NGM1MjdjLi5iMzBkNTA5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YQpAQCAtMTIsNiArMTIsMTAgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50aW1lLkR1cmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlQXJyYXk7CkBAIC0xNjYsNiArMTcwLDEyIEBAIHB1YmxpYyBzdGF0aWMgRGZzQmxvY2tDYWNoZSBnZXRJbnN0YW5jZSgpIHsKIAkvKiogTGltaXRzIG9mIGNhY2hlIGhvdCBjb3VudCBwZXIgcGFjayBmaWxlIGV4dGVuc2lvbi4gKi8KIAlwcml2YXRlIGZpbmFsIGludFtdIGNhY2hlSG90TGltaXRzID0gbmV3IGludFtQYWNrRXh0LnZhbHVlcygpLmxlbmd0aF07CiAKKwkvKiogQ29uc3VtZXIgb2YgbG9hZGluZyBhbmQgZXZpY3Rpb24gZXZlbnRzIG9mIGluZGV4ZXMuICovCisJcHJpdmF0ZSBmaW5hbCBEZnNCbG9ja0NhY2hlQ29uZmlnLkluZGV4RXZlbnRDb25zdW1lciBpbmRleEV2ZW50Q29uc3VtZXI7CisKKwkvKiogU3RvcmVzIHRpbWVzdGFtcHMgb2YgdGhlIGxhc3QgZXZpY3Rpb24gb2YgaW5kZXhlcy4gKi8KKwlwcml2YXRlIGZpbmFsIE1hcDxFdmljdEtleSwgTG9uZz4gaW5kZXhFdmljdGlvbk1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlwcml2YXRlIERmc0Jsb2NrQ2FjaGUoRGZzQmxvY2tDYWNoZUNvbmZpZyBjZmcpIHsKIAkJdGFibGVTaXplID0gdGFibGVTaXplKGNmZyk7CkBAIC0yMTMsNiArMjIzLDcgQEAgcHJpdmF0ZSBEZnNCbG9ja0NhY2hlKERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CiAJCQkJY2FjaGVIb3RMaW1pdHNbaV0gPSBEZnNCbG9ja0NhY2hlQ29uZmlnLkRFRkFVTFRfQ0FDSEVfSE9UX01BWDsKIAkJCX0KIAkJfQorCQlpbmRleEV2ZW50Q29uc3VtZXIgPSBjZmcuZ2V0SW5kZXhFdmVudENvbnN1bWVyKCk7CiAJfQogCiAJYm9vbGVhbiBzaG91bGRDb3B5VGhyb3VnaENhY2hlKGxvbmcgbGVuZ3RoKSB7CkBAIC00NjEsNiArNDcyLDcgQEAgcHJpdmF0ZSB2b2lkIHJlc2VydmVTcGFjZShsb25nIHJlc2VydmUsIERmc1N0cmVhbUtleSBrZXkpIHsKIAkJCQkJbGl2ZSAtPSBkZWFkLnNpemU7CiAJCQkJCWdldFN0YXQobGl2ZUJ5dGVzLCBkZWFkLmtleSkuYWRkQW5kR2V0KC1kZWFkLnNpemUpOwogCQkJCQlnZXRTdGF0KHN0YXRFdmljdCwgZGVhZC5rZXkpLmluY3JlbWVudEFuZEdldCgpOworCQkJCQlyZXBvcnRJbmRleEV2aWN0ZWQoZGVhZCk7CiAJCQkJfSB3aGlsZSAobWF4Qnl0ZXMgPCBsaXZlKTsKIAkJCQljbG9ja0hhbmQgPSBwcmV2OwogCQkJfQpAQCAtNTE1LDExICs1MjcsMTMgQEAgdm9pZCBwdXQoRGZzQmxvY2sgdikgewogCTxUPiBSZWY8VD4gZ2V0T3JMb2FkUmVmKAogCQkJRGZzU3RyZWFtS2V5IGtleSwgbG9uZyBwb3NpdGlvbiwgUmVmTG9hZGVyPFQ+IGxvYWRlcikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKIAkJaW50IHNsb3QgPSBzbG90KGtleSwgcG9zaXRpb24pOwogCQlIYXNoRW50cnkgZTEgPSB0YWJsZS5nZXQoc2xvdCk7CiAJCVJlZjxUPiByZWYgPSBzY2FuUmVmKGUxLCBrZXksIHBvc2l0aW9uKTsKIAkJaWYgKHJlZiAhPSBudWxsKSB7CiAJCQlnZXRTdGF0KHN0YXRIaXQsIGtleSkuaW5jcmVtZW50QW5kR2V0KCk7CisJCQlyZXBvcnRJbmRleFJlcXVlc3RlZChyZWYsIHRydWUgLyogY2FjaGVIaXQgKi8sIHN0YXJ0KTsKIAkJCXJldHVybiByZWY7CiAJCX0KIApAQCAtNTMyLDYgKzU0Niw4IEBAIDxUPiBSZWY8VD4gZ2V0T3JMb2FkUmVmKAogCQkJCXJlZiA9IHNjYW5SZWYoZTIsIGtleSwgcG9zaXRpb24pOwogCQkJCWlmIChyZWYgIT0gbnVsbCkgewogCQkJCQlnZXRTdGF0KHN0YXRIaXQsIGtleSkuaW5jcmVtZW50QW5kR2V0KCk7CisJCQkJCXJlcG9ydEluZGV4UmVxdWVzdGVkKHJlZiwgdHJ1ZSAvKiBjYWNoZUhpdCAqLywKKwkJCQkJCQlzdGFydCk7CiAJCQkJCXJldHVybiByZWY7CiAJCQkJfQogCQkJfQpAQCAtNTU2LDYgKzU3Miw3IEBAIDxUPiBSZWY8VD4gZ2V0T3JMb2FkUmVmKAogCQl9IGZpbmFsbHkgewogCQkJcmVnaW9uTG9jay51bmxvY2soKTsKIAkJfQorCQlyZXBvcnRJbmRleFJlcXVlc3RlZChyZWYsIGZhbHNlIC8qIGNhY2hlSGl0ICovLCBzdGFydCk7CiAJCXJldHVybiByZWY7CiAJfQogCkBAIC02ODIsOCArNjk5LDkgQEAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljTG9uZyBnZXRTdGF0KEF0b21pY1JlZmVyZW5jZTxBdG9taWNMb25nW10+IHN0YXRzLAogCX0KIAogCXByaXZhdGUgc3RhdGljIEhhc2hFbnRyeSBjbGVhbihIYXNoRW50cnkgdG9wKSB7Ci0JCXdoaWxlICh0b3AgIT0gbnVsbCAmJiB0b3AucmVmLm5leHQgPT0gbnVsbCkKKwkJd2hpbGUgKHRvcCAhPSBudWxsICYmIHRvcC5yZWYubmV4dCA9PSBudWxsKSB7CiAJCQl0b3AgPSB0b3AubmV4dDsKKwkJfQogCQlpZiAodG9wID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CkBAIC02OTEsNiArNzA5LDQ0IEBAIHByaXZhdGUgc3RhdGljIEhhc2hFbnRyeSBjbGVhbihIYXNoRW50cnkgdG9wKSB7CiAJCXJldHVybiBuID09IHRvcC5uZXh0ID8gdG9wIDogbmV3IEhhc2hFbnRyeShuLCB0b3AucmVmKTsKIAl9CiAKKwlwcml2YXRlIHZvaWQgcmVwb3J0SW5kZXhSZXF1ZXN0ZWQoUmVmPD8+IHJlZiwgYm9vbGVhbiBjYWNoZUhpdCwKKwkJCWxvbmcgc3RhcnQpIHsKKwkJaWYgKGluZGV4RXZlbnRDb25zdW1lciA9PSBudWxsCisJCQkJfHwgIWlzSW5kZXhPckJpdG1hcEV4dFBvcyhyZWYua2V5LnBhY2tFeHRQb3MpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJRXZpY3RLZXkgZXZpY3RLZXkgPSBuZXcgRXZpY3RLZXkocmVmKTsKKwkJTG9uZyBwcmV2RXZpY3RlZFRpbWUgPSBpbmRleEV2aWN0aW9uTWFwLmdldChldmljdEtleSk7CisJCWxvbmcgbm93ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCWxvbmcgc2luY2VMYXN0RXZpY3Rpb25OYW5vcyA9IHByZXZFdmljdGVkVGltZSA9PSBudWxsID8gMEwKKwkJCQk6IG5vdyAtIHByZXZFdmljdGVkVGltZS5sb25nVmFsdWUoKTsKKwkJaW5kZXhFdmVudENvbnN1bWVyLmFjY2VwdFJlcXVlc3RlZEV2ZW50KHJlZi5rZXkucGFja0V4dFBvcywgY2FjaGVIaXQsCisJCQkJKG5vdyAtIHN0YXJ0KSAvIDEwMDBMIC8qIG1pY3JvcyAqLywgcmVmLnNpemUsCisJCQkJRHVyYXRpb24ub2ZOYW5vcyhzaW5jZUxhc3RFdmljdGlvbk5hbm9zKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlcG9ydEluZGV4RXZpY3RlZChSZWY8Pz4gZGVhZCkgeworCQlpZiAoaW5kZXhFdmVudENvbnN1bWVyID09IG51bGwKKwkJCQl8fCAhaW5kZXhFdmVudENvbnN1bWVyLnNob3VsZFJlcG9ydEV2aWN0ZWRFdmVudCgpCisJCQkJfHwgIWlzSW5kZXhPckJpdG1hcEV4dFBvcyhkZWFkLmtleS5wYWNrRXh0UG9zKSkgeworCQkJcmV0dXJuOworCQl9CisJCUV2aWN0S2V5IGV2aWN0S2V5ID0gbmV3IEV2aWN0S2V5KGRlYWQpOworCQlMb25nIHByZXZFdmljdGVkVGltZSA9IGluZGV4RXZpY3Rpb25NYXAuZ2V0KGV2aWN0S2V5KTsKKwkJbG9uZyBub3cgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJbG9uZyBzaW5jZUxhc3RFdmljdGlvbk5hbm9zID0gcHJldkV2aWN0ZWRUaW1lID09IG51bGwgPyAwTAorCQkJCTogbm93IC0gcHJldkV2aWN0ZWRUaW1lLmxvbmdWYWx1ZSgpOworCQlpbmRleEV2aWN0aW9uTWFwLnB1dChldmljdEtleSwgTG9uZy52YWx1ZU9mKG5vdykpOworCQlpbmRleEV2ZW50Q29uc3VtZXIuYWNjZXB0RXZpY3RlZEV2ZW50KGRlYWQua2V5LnBhY2tFeHRQb3MsIGRlYWQuc2l6ZSwKKwkJCQlkZWFkLnRvdGFsSGl0Q291bnQuZ2V0KCksCisJCQkJRHVyYXRpb24ub2ZOYW5vcyhzaW5jZUxhc3RFdmljdGlvbk5hbm9zKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luZGV4T3JCaXRtYXBFeHRQb3MoaW50IHBhY2tFeHRQb3MpIHsKKwkJcmV0dXJuIHBhY2tFeHRQb3MgPT0gUGFja0V4dC5JTkRFWC5nZXRQb3NpdGlvbigpCisJCQkJfHwgcGFja0V4dFBvcyA9PSBQYWNrRXh0LkJJVE1BUF9JTkRFWC5nZXRQb3NpdGlvbigpOworCX0KKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEhhc2hFbnRyeSB7CiAJCS8qKiBOZXh0IGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlJ3MgY2hhaW4gbGlzdC4gKi8KIAkJZmluYWwgSGFzaEVudHJ5IG5leHQ7CkBAIC03MTIsNiArNzY4LDcgQEAgc3RhdGljIGZpbmFsIGNsYXNzIFJlZjxUPiB7CiAJCVJlZiBuZXh0OwogCiAJCXByaXZhdGUgdm9sYXRpbGUgaW50IGhvdENvdW50OworCQlwcml2YXRlIEF0b21pY0ludGVnZXIgdG90YWxIaXRDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CiAKIAkJUmVmKERmc1N0cmVhbUtleSBrZXksIGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSwgVCB2KSB7CiAJCQl0aGlzLmtleSA9IGtleTsKQEAgLTczNiw2ICs3OTMsNyBAQCB2b2lkIG1hcmtIb3R0ZXIoKSB7CiAJCQlpbnQgY2FwID0gRGZzQmxvY2tDYWNoZQogCQkJCQkuZ2V0SW5zdGFuY2UoKS5jYWNoZUhvdExpbWl0c1trZXkucGFja0V4dFBvc107CiAJCQlob3RDb3VudCA9IE1hdGgubWluKGNhcCwgaG90Q291bnQgKyAxKTsKKwkJCXRvdGFsSGl0Q291bnQuaW5jcmVtZW50QW5kR2V0KCk7CiAJCX0KIAogCQl2b2lkIG1hcmtDb2xkZXIoKSB7CkBAIC03NDcsNiArODA1LDM0IEBAIGJvb2xlYW4gaXNIb3QoKSB7CiAJCX0KIAl9CiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmljdEtleSB7CisJCXByaXZhdGUgZmluYWwgaW50IGtleUhhc2g7CisJCXByaXZhdGUgZmluYWwgaW50IHBhY2tFeHRQb3M7CisJCXByaXZhdGUgZmluYWwgbG9uZyBwb3NpdGlvbjsKKworCQlFdmljdEtleShSZWY8Pz4gcmVmKSB7CisJCQlrZXlIYXNoID0gcmVmLmtleS5oYXNoOworCQkJcGFja0V4dFBvcyA9IHJlZi5rZXkucGFja0V4dFBvczsKKwkJCXBvc2l0aW9uID0gcmVmLnBvc2l0aW9uOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRXZpY3RLZXkpIHsKKwkJCQlFdmljdEtleSBvdGhlciA9IChFdmljdEtleSkgb2JqZWN0OworCQkJCXJldHVybiBrZXlIYXNoID09IG90aGVyLmtleUhhc2gKKwkJCQkJCSYmIHBhY2tFeHRQb3MgPT0gb3RoZXIucGFja0V4dFBvcworCQkJCQkJJiYgcG9zaXRpb24gPT0gb3RoZXIucG9zaXRpb247CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCXJldHVybiBEZnNCbG9ja0NhY2hlLmdldEluc3RhbmNlKCkuaGFzaChrZXlIYXNoLCBwb3NpdGlvbik7CisJCX0KKwl9CisKIAlARnVuY3Rpb25hbEludGVyZmFjZQogCWludGVyZmFjZSBSZWZMb2FkZXI8VD4gewogCQlSZWY8VD4gbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKQEAgLTc2Myw0ICs4NDksNCBAQCBpbnRlcmZhY2UgUmVhZGFibGVDaGFubmVsU3VwcGxpZXIgewogCQkgKi8KIAkJUmVhZGFibGVDaGFubmVsIGdldCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAl9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVDb25maWcuamF2YQppbmRleCAyNzE2Zjc5Li42OWEzNzA1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVDb25maWcuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9TVFJFQU1fUkFUSU87CiAKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRpbWUuRHVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwpAQCAtNDYsOSArNDcsMTAgQEAgcHVibGljIGNsYXNzIERmc0Jsb2NrQ2FjaGVDb25maWcgewogCXByaXZhdGUgaW50IGNvbmN1cnJlbmN5TGV2ZWw7CiAKIAlwcml2YXRlIENvbnN1bWVyPExvbmc+IHJlZkxvY2s7Ci0KIAlwcml2YXRlIE1hcDxQYWNrRXh0LCBJbnRlZ2VyPiBjYWNoZUhvdE1hcDsKIAorCXByaXZhdGUgSW5kZXhFdmVudENvbnN1bWVyIGluZGV4RXZlbnRDb25zdW1lcjsKKwogCS8qKgogCSAqIENyZWF0ZSBhIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KIAkgKi8KQEAgLTIxNiw2ICsyMTgsMjggQEAgcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0Q2FjaGVIb3RNYXAoCiAJfQogCiAJLyoqCisJICogR2V0IHRoZSBjb25zdW1lciBvZiBjYWNoZSBpbmRleCBldmVudHMuCisJICoKKwkgKiBAcmV0dXJuIGNvbnN1bWVyIG9mIGNhY2hlIGluZGV4IGV2ZW50cy4KKwkgKi8KKwlwdWJsaWMgSW5kZXhFdmVudENvbnN1bWVyIGdldEluZGV4RXZlbnRDb25zdW1lcigpIHsKKwkJcmV0dXJuIGluZGV4RXZlbnRDb25zdW1lcjsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIGNvbnN1bWVyIG9mIGNhY2hlIGluZGV4IGV2ZW50cy4KKwkgKgorCSAqIEBwYXJhbSBpbmRleEV2ZW50Q29uc3VtZXIKKwkgKiAgICAgICAgICAgIGNvbnN1bWVyIG9mIGNhY2hlIGluZGV4IGV2ZW50cy4KKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqLworCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEluZGV4RXZlbnRDb25zdW1lcigKKwkJCUluZGV4RXZlbnRDb25zdW1lciBpbmRleEV2ZW50Q29uc3VtZXIpIHsKKwkJdGhpcy5pbmRleEV2ZW50Q29uc3VtZXIgPSBpbmRleEV2ZW50Q29uc3VtZXI7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgogCSAqIFVwZGF0ZSBwcm9wZXJ0aWVzIGJ5IHNldHRpbmcgZmllbGRzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCiAJICogPHA+CiAJICogSWYgYSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiwgdGhlbiBpdCBpcyBsZWZ0CkBAIC0yNzIsNCArMjk2LDUyIEBAIHB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIGZyb21Db25maWcoQ29uZmlnIHJjKSB7CiAJCX0KIAkJcmV0dXJuIHRoaXM7CiAJfQotfQorCisJLyoqIENvbnN1bWVyIG9mIERmc0Jsb2NrQ2FjaGUgbG9hZGluZyBhbmQgZXZpY3Rpb24gZXZlbnRzIGZvciBpbmRleGVzLiAqLworCXB1YmxpYyBpbnRlcmZhY2UgSW5kZXhFdmVudENvbnN1bWVyIHsKKwkJLyoqCisJCSAqIEFjY2VwdCBhbiBldmVudCBvZiBhbiBpbmRleCByZXF1ZXN0ZWQuIEl0IGNvdWxkIGJlIGxvYWRlZCBmcm9tIGVpdGhlcgorCQkgKiBjYWNoZSBvciBzdG9yYWdlLgorCQkgKgorCQkgKiBAcGFyYW0gcGFja0V4dFBvcworCQkgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHtAY29kZSBQYWNrRXh0fSBlbnVtCisJCSAqIEBwYXJhbSBjYWNoZUhpdAorCQkgKiAgICAgICAgICAgIHRydWUgaWYgYW4gaW5kZXggd2FzIGFscmVhZHkgaW4gY2FjaGUuIE90aGVyd2lzZSwgdGhlCisJCSAqICAgICAgICAgICAgaW5kZXggd2FzIGxvYWRlZCBmcm9tIHN0b3JhZ2UgaW50byB0aGUgY2FjaGUgaW4gdGhlCisJCSAqICAgICAgICAgICAgY3VycmVudCByZXF1ZXN0LAorCQkgKiBAcGFyYW0gbG9hZE1pY3JvcworCQkgKiAgICAgICAgICAgIHRpbWUgdG8gbG9hZCBhbiBpbmRleCBmcm9tIGNhY2hlIG9yIHN0b3JhZ2UgaW4KKwkJICogICAgICAgICAgICBtaWNyb3NlY29uZHMKKwkJICogQHBhcmFtIGJ5dGVzCisJCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGxvYWRlZAorCQkgKiBAcGFyYW0gbGFzdEV2aWN0aW9uRHVyYXRpb24KKwkJICogICAgICAgICAgICB0aW1lIHNpbmNlIGxhc3QgZXZpY3Rpb24sIDAgaWYgd2FzIG5vdCBldmljdGVkIHlldAorCQkgKi8KKwkJdm9pZCBhY2NlcHRSZXF1ZXN0ZWRFdmVudChpbnQgcGFja0V4dFBvcywgYm9vbGVhbiBjYWNoZUhpdCwKKwkJCQlsb25nIGxvYWRNaWNyb3MsIGxvbmcgYnl0ZXMsIER1cmF0aW9uIGxhc3RFdmljdGlvbkR1cmF0aW9uKTsKKworCQkvKioKKwkJICogQWNjZXB0IGFuIGV2ZW50IG9mIGFuIGluZGV4IGV2aWN0ZWQgZnJvbSBjYWNoZS4KKwkJICoKKwkJICogQHBhcmFtIHBhY2tFeHRQb3MKKwkJICogICAgICAgICAgICBwb3NpdGlvbiBpbiB7QGNvZGUgUGFja0V4dH0gZW51bQorCQkgKiBAcGFyYW0gYnl0ZXMKKwkJICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgZXZpY3RlZAorCQkgKiBAcGFyYW0gdG90YWxDYWNoZUhpdENvdW50CisJCSAqICAgICAgICAgICAgbnVtYmVyIG9mIHRpbWVzIGFuIGluZGV4IHdhcyBhY2Nlc3NlZCB3aGlsZSBpbiBjYWNoZQorCQkgKiBAcGFyYW0gbGFzdEV2aWN0aW9uRHVyYXRpb24KKwkJICogICAgICAgICAgICB0aW1lIHNpbmNlIGxhc3QgZXZpY3Rpb24sIDAgaWYgd2FzIG5vdCBldmljdGVkIHlldAorCQkgKi8KKwkJZGVmYXVsdCB2b2lkIGFjY2VwdEV2aWN0ZWRFdmVudChpbnQgcGFja0V4dFBvcywgbG9uZyBieXRlcywKKwkJCQlpbnQgdG90YWxDYWNoZUhpdENvdW50LCBEdXJhdGlvbiBsYXN0RXZpY3Rpb25EdXJhdGlvbikgeworCQkJLy8gT2ZmIGJ5IGRlZmF1bHQuCisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0cnVlIGlmIHJlcG9ydGluZyBldmljdGVkIGV2ZW50cyBpcyBlbmFibGVkLgorCQkgKi8KKwkJZGVmYXVsdCBib29sZWFuIHNob3VsZFJlcG9ydEV2aWN0ZWRFdmVudCgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0luTWVtb3J5UmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9Jbk1lbW9yeVJlcG9zaXRvcnkuamF2YQppbmRleCA1YjY4OTRkLi45OWRhMjIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0luTWVtb3J5UmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvSW5NZW1vcnlSZXBvc2l0b3J5LmphdmEKQEAgLTE2NSw2ICsxNjUsMTUgQEAgcHVibGljIHZvaWQgZmx1c2goKSB7CiAJCQkJfQogCQkJfTsKIAkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgbG9uZyBnZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCkgeworCQkJbG9uZyBjb3VudCA9IDA7CisJCQlmb3IgKERmc1BhY2tEZXNjcmlwdGlvbiBwIDogcGFja3MpIHsKKwkJCQljb3VudCArPSBwLmdldE9iamVjdENvdW50KCk7CisJCQl9CisJCQlyZXR1cm4gY291bnQ7CisJCX0KIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBNZW1QYWNrIGV4dGVuZHMgRGZzUGFja0Rlc2NyaXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvTGFyZ2VQYWNrZWRXaG9sZU9iamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEKaW5kZXggYjA2MTJmOS4uY2Q0ZjE2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEKQEAgLTczLDcgKzczLDYgQEAgcHVibGljIGJvb2xlYW4gaXNMYXJnZSgpIHsKIAlwdWJsaWMgT2JqZWN0U3RyZWFtIG9wZW5TdHJlYW0oKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlQYWNrSW5wdXRTdHJlYW0gcGFja0luOwogCQkvLyBjdHggaXMgY2xvc2VkIGJ5IFBhY2tJbnB1dFN0cmVhbSwgb3IgZXhwbGljaXRseSBpbiB0aGUgZmluYWxseSBibG9jawotCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCQlEZnNSZWFkZXIgY3R4ID0gZGIubmV3UmVhZGVyKCk7CiAJCXRyeSB7CiAJCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9DYWNoZWRPYmplY3REaXJlY3RvcnkuamF2YQppbmRleCA3ZGVkZWI1Li4wOTRmZGMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9DYWNoZWRPYmplY3REaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9DYWNoZWRPYmplY3REaXJlY3RvcnkuamF2YQpAQCAtMjYzLDQgKzI2MywxNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBVbnBhY2tlZE9iamVjdElkIGV4dGVuZHMgT2JqZWN0SWRPd25lck1hcC5FbnRyeSB7CiAJcHJpdmF0ZSBBbHRlcm5hdGVIYW5kbGUuSWQgZ2V0QWx0ZXJuYXRlSWQoKSB7CiAJCXJldHVybiB3cmFwcGVkLmdldEFsdGVybmF0ZUlkKCk7CiAJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGxvbmcgZ2V0QXBwcm94aW1hdGVPYmplY3RDb3VudCgpIHsKKwkJbG9uZyBjb3VudCA9IDA7CisJCWZvciAoUGFjayBwIDogZ2V0UGFja3MoKSkgeworCQkJdHJ5IHsKKwkJCQljb3VudCArPSBwLmdldE9iamVjdENvdW50KCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCXJldHVybiBjb3VudDsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2suamF2YQppbmRleCBmMDJjODYxLi41MTUyMzY3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrLmphdmEKQEAgLTQwLDYgKzQwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIAogLyoqCiAgKiBBIG11dGFibGUgc3RhY2sgb2YgcmVmdGFibGVzIG9uIGxvY2FsIGZpbGVzeXN0ZW0gc3RvcmFnZS4gTm90IHRocmVhZC1zYWZlLgpAQCAtNTI3LDExICs1MjgsMTkgQEAgYm9vbGVhbiBjb21wYWN0UmFuZ2UoaW50IGZpcnN0LCBpbnQgbGFzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKKwkJCXJlbG9hZCgpOwogCQkJZm9yIChGaWxlIGYgOiBkZWxldGVPblN1Y2Nlc3MpIHsKLQkJCQlGaWxlcy5kZWxldGUoZi50b1BhdGgoKSk7CisJCQkJdHJ5IHsKKwkJCQkJRmlsZXMuZGVsZXRlKGYudG9QYXRoKCkpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gSWdub3JlOiB0aGlzIGNhbiBoYXBwZW4gb24gV2luZG93cyBpbiBjYXNlIG9mIGNvbmN1cnJlbnQgcHJvY2Vzc2VzLgorCQkJCQkvLyBsZWF2ZSB0aGUgZ2FyYmFnZSBhbmQgY29udGludWUuCisJCQkJCWlmICghU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuaXNXaW5kb3dzKCkpIHsKKwkJCQkJCXRocm93IGU7CisJCQkJCX0KKwkJCQl9CiAJCQl9CiAKLQkJCXJlbG9hZCgpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAodG1wVGFibGUgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEKaW5kZXggOWNkZWE1OS4uM2ViY2U2YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhCkBAIC01OTQsNiArNTk0LDcgQEAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEF1dG9EZXRhY2goKSB7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiRnV0dXJlUmV0dXJuVmFsdWVJZ25vcmVkIikKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBhdXRvR0MoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJR0MgZ2MgPSBuZXcgR0ModGhpcyk7CkBAIC02NjQsMTggKzY2NSwyMCBAQCB2b2lkIGNvbnZlcnRUb1BhY2tlZFJlZnMoYm9vbGVhbiB3cml0ZUxvZ3MsIGJvb2xlYW4gYmFja3VwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJCQlpZiAod3JpdGVMb2dzKSB7CiAJCQkJTGlzdDxSZWZsb2dFbnRyeT4gbG9ncyA9IG9sZERiLmdldFJlZmxvZ1JlYWRlcihyLmdldE5hbWUoKSkKLQkJCQkJLmdldFJldmVyc2VFbnRyaWVzKCk7CisJCQkJCQkuZ2V0UmV2ZXJzZUVudHJpZXMoKTsKIAkJCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGxvZ3MpOwogCQkJCWZvciAoUmVmbG9nRW50cnkgZSA6IGxvZ3MpIHsKIAkJCQkJbG9nV3JpdGVyLmxvZyhyLmdldE5hbWUoKSwgZSk7CiAJCQkJfQotCQl9CisJCQl9CiAJCX0KIAogCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2Fsayh0aGlzKSkgewogCQkJYnJ1LmV4ZWN1dGUocncsIE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UpOwogCQl9CiAKKwkJb2xkRGIuY2xvc2UoKTsKKwogCQlMaXN0PFN0cmluZz4gZmFpbGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogYnJ1LmdldENvbW1hbmRzKCkpIHsKIAkJCWlmIChjbWQuZ2V0UmVzdWx0KCkgIT0gUmVjZWl2ZUNvbW1hbmQuUmVzdWx0Lk9LKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhCmluZGV4IDYyN2ZhY2MuLjA2YzhjYWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhCkBAIC0yMTIsNiArMjEyLDIwIEBAIHB1YmxpYyBDb2xsZWN0aW9uPFBhY2s+IGdldFBhY2tzKCkgewogCQlyZXR1cm4gcGFja2VkLmdldFBhY2tzKCk7CiAJfQogCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgbG9uZyBnZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCkgeworCQlsb25nIGNvdW50ID0gMDsKKwkJZm9yIChQYWNrIHAgOiBnZXRQYWNrcygpKSB7CisJCQl0cnkgeworCQkJCWNvdW50ICs9IHAuZ2V0SW5kZXgoKS5nZXRPYmplY3RDb3VudCgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY291bnQ7CisJfQorCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQogCSAqIDxwPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFjay5qYXZhCmluZGV4IDI4OWM3MzIuLjZlNzQxMzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrLmphdmEKQEAgLTUwLDcgKzUwLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5VbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suQmluYXJ5RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suT2JqZWN0VG9QYWNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrLlBhY2tPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQWJicmV2aWF0ZWRPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKQEAgLTM4NCw3ICszODMsNyBAQCB2b2lkIGNvcHlQYWNrQXNJcyhQYWNrT3V0cHV0U3RyZWFtIG91dCwgV2luZG93Q3Vyc29yIGN1cnMpCiAJZmluYWwgdm9pZCBjb3B5QXNJcyhQYWNrT3V0cHV0U3RyZWFtIG91dCwgTG9jYWxPYmplY3RUb1BhY2sgc3JjLAogCQkJYm9vbGVhbiB2YWxpZGF0ZSwgV2luZG93Q3Vyc29yIGN1cnMpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVN0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLQkJYmVnaW5Db3B5QXNJcyhzcmMpOworCQliZWdpbkNvcHlBc0lzKCk7CiAJCXRyeSB7CiAJCQljb3B5QXNJczIob3V0LCBzcmMsIHZhbGlkYXRlLCBjdXJzKTsKIAkJfSBmaW5hbGx5IHsKQEAgLTYwNCw3ICs2MDMsNyBAQCBwcml2YXRlIHZvaWQgcmVhZEZ1bGx5KGZpbmFsIGxvbmcgcG9zaXRpb24sIGZpbmFsIGJ5dGVbXSBkc3RidWYsCiAJCQl0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CiAJfQogCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBiZWdpbkNvcHlBc0lzKE9iamVjdFRvUGFjayBvdHApCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBiZWdpbkNvcHlBc0lzKCkKIAkJCXRocm93cyBTdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CiAJCWlmICgrK2FjdGl2ZUNvcHlSYXdEYXRhID09IDEgJiYgYWN0aXZlV2luZG93cyA9PSAwKSB7CiAJCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGVTbmFwc2hvdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGVTbmFwc2hvdC5qYXZhCmluZGV4IDE3YmQ4NjMuLmE3ODRhZjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlU25hcHNob3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZVNuYXBzaG90LmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5FcXVhbGl0eTsKIAogY2xhc3MgUGFja0ZpbGVTbmFwc2hvdCBleHRlbmRzIEZpbGVTbmFwc2hvdCB7CiAKQEAgLTYxLDcgKzYyLDggQEAgcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZChGaWxlIHBhY2tGaWxlKSB7CiAJfQogCiAJYm9vbGVhbiBpc0NoZWNrc3VtQ2hhbmdlZChGaWxlIHBhY2tGaWxlKSB7Ci0JCXJldHVybiB3YXNDaGVja3N1bUNoYW5nZWQgPSBjaGVja3N1bSAhPSBNSVNTSU5HX0NIRUNLU1VNCisJCXJldHVybiB3YXNDaGVja3N1bUNoYW5nZWQgPSAhRXF1YWxpdHkuaXNTYW1lSW5zdGFuY2UoY2hlY2tzdW0sCisJCQkJTUlTU0lOR19DSEVDS1NVTSkKIAkJCQkmJiAhY2hlY2tzdW0uZXF1YWxzKHJlYWRDaGVja3N1bShwYWNrRmlsZSkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YQppbmRleCAwN2UzODE0Li40YWEyZWRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CkBAIC04OTIsMzggKzg5MSwyNyBAQCBQYWNrZWRSZWZMaXN0IGdldFBhY2tlZFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCX0KIAogCXByaXZhdGUgUGFja2VkUmVmTGlzdCByZWFkUGFja2VkUmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBtYXhTdGFsZVJldHJpZXMgPSA1OwotCQlpbnQgcmV0cmllcyA9IDA7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlmaW5hbCBGaWxlU25hcHNob3Qgc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShwYWNrZWRSZWZzRmlsZSk7Ci0JCQlmaW5hbCBNZXNzYWdlRGlnZXN0IGRpZ2VzdCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7Ci0JCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLQkJCQkJbmV3IERpZ2VzdElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFja2VkUmVmc0ZpbGUpLAotCQkJCQkJCWRpZ2VzdCksCi0JCQkJCVVURl84KSkpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gbmV3IFBhY2tlZFJlZkxpc3QocGFyc2VQYWNrZWRSZWZzKGJyKSwgc25hcHNob3QsCi0JCQkJCQkJT2JqZWN0SWQuZnJvbVJhdyhkaWdlc3QuZGlnZXN0KCkpKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChGaWxlVXRpbHMuaXNTdGFsZUZpbGVIYW5kbGVJbkNhdXNhbENoYWluKGUpCi0JCQkJCQkJJiYgcmV0cmllcyA8IG1heFN0YWxlUmV0cmllcykgewotCQkJCQkJaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQkJCQkJTE9HLmRlYnVnKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQkJSkdpdFRleHQuZ2V0KCkucGFja2VkUmVmc0hhbmRsZUlzU3RhbGUsCi0JCQkJCQkJCQlJbnRlZ2VyLnZhbHVlT2YocmV0cmllcykpLCBlKTsKKwkJdHJ5IHsKKwkJCVBhY2tlZFJlZkxpc3QgcmVzdWx0ID0gRmlsZVV0aWxzLnJlYWRXaXRoUmV0cmllcyhwYWNrZWRSZWZzRmlsZSwKKwkJCQkJZiAtPiB7CisJCQkJCQlGaWxlU25hcHNob3Qgc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShmKTsKKwkJCQkJCU1lc3NhZ2VEaWdlc3QgZGlnZXN0ID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKKwkJCQkJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKwkJCQkJCQkJCQluZXcgRGlnZXN0SW5wdXRTdHJlYW0oCisJCQkJCQkJCQkJCQluZXcgRmlsZUlucHV0U3RyZWFtKGYpLCBkaWdlc3QpLAorCQkJCQkJCQkJCVVURl84KSkpIHsKKwkJCQkJCQlyZXR1cm4gbmV3IFBhY2tlZFJlZkxpc3QocGFyc2VQYWNrZWRSZWZzKGJyKSwKKwkJCQkJCQkJCXNuYXBzaG90LAorCQkJCQkJCQkJT2JqZWN0SWQuZnJvbVJhdyhkaWdlc3QuZGlnZXN0KCkpKTsKIAkJCQkJCX0KLQkJCQkJCXJldHJpZXMrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG5vUGFja2VkUmVmcykgewotCQkJCWlmIChwYWNrZWRSZWZzRmlsZS5leGlzdHMoKSkgewotCQkJCQl0aHJvdyBub1BhY2tlZFJlZnM7Ci0JCQkJfQotCQkJCS8vIElnbm9yZSBpdCBhbmQgbGVhdmUgdGhlIG5ldyBsaXN0IGVtcHR5LgotCQkJCXJldHVybiBOT19QQUNLRURfUkVGUzsKLQkJCX0KKwkJCQkJfSk7CisJCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBOT19QQUNLRURfUkVGUzsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuY2Fubm90UmVhZEZpbGUsIHBhY2tlZFJlZnNGaWxlKSwgZSk7CiAJCX0KIAl9CiAKQEAgLTEwOTAsNDAgKzEwNzgsNTUgQEAgTG9vc2VSZWYgc2NhblJlZihMb29zZVJlZiByZWYsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJZmluYWwgaW50IGxpbWl0ID0gNDA5NjsKLQkJZmluYWwgYnl0ZVtdIGJ1ZjsKLQkJRmlsZVNuYXBzaG90IG90aGVyU25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShwYXRoKTsKLQkJdHJ5IHsKLQkJCWJ1ZiA9IElPLnJlYWRTb21lKHBhdGgsIGxpbWl0KTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG5vRmlsZSkgewotCQkJaWYgKHBhdGguaXNGaWxlKCkpIHsKLQkJCQl0aHJvdyBub0ZpbGU7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZG9lc24ndCBleGlzdCBvciBubyBmaWxlOyBub3QgYSByZWZlcmVuY2UuCi0JCX0KIAotCQlpbnQgbiA9IGJ1Zi5sZW5ndGg7CisJCWNsYXNzIExvb3NlSXRlbXMgeworCQkJZmluYWwgRmlsZVNuYXBzaG90IHNuYXBzaG90OworCisJCQlmaW5hbCBieXRlW10gYnVmOworCisJCQlMb29zZUl0ZW1zKEZpbGVTbmFwc2hvdCBzbmFwc2hvdCwgYnl0ZVtdIGJ1ZikgeworCQkJCXRoaXMuc25hcHNob3QgPSBzbmFwc2hvdDsKKwkJCQl0aGlzLmJ1ZiA9IGJ1ZjsKKwkJCX0KKwkJfQorCQlMb29zZUl0ZW1zIGxvb3NlID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWxvb3NlID0gRmlsZVV0aWxzLnJlYWRXaXRoUmV0cmllcyhwYXRoLAorCQkJCQlmIC0+IG5ldyBMb29zZUl0ZW1zKEZpbGVTbmFwc2hvdC5zYXZlKGYpLAorCQkJCQkJCUlPLnJlYWRTb21lKGYsIGxpbWl0KSkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5jYW5ub3RSZWFkRmlsZSwgcGF0aCksCisJCQkJCWUpOworCQl9CisJCWlmIChsb29zZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlpbnQgbiA9IGxvb3NlLmJ1Zi5sZW5ndGg7CiAJCWlmIChuID09IDApCiAJCQlyZXR1cm4gbnVsbDsgLy8gZW1wdHkgZmlsZTsgbm90IGEgcmVmZXJlbmNlLgogCi0JCWlmIChpc1N5bVJlZihidWYsIG4pKSB7CisJCWlmIChpc1N5bVJlZihsb29zZS5idWYsIG4pKSB7CiAJCQlpZiAobiA9PSBsaW1pdCkKIAkJCQlyZXR1cm4gbnVsbDsgLy8gcG9zc2libHkgdHJ1bmNhdGVkIHJlZgogCiAJCQkvLyB0cmltIHRyYWlsaW5nIHdoaXRlc3BhY2UKLQkJCXdoaWxlICgwIDwgbiAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGJ1ZltuIC0gMV0pKQorCQkJd2hpbGUgKDAgPCBuICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UobG9vc2UuYnVmW24gLSAxXSkpCiAJCQkJbi0tOwogCQkJaWYgKG4gPCA2KSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShidWYsIDAsIG4pOworCQkJCVN0cmluZyBjb250ZW50ID0gUmF3UGFyc2VVdGlscy5kZWNvZGUobG9vc2UuYnVmLCAwLCBuKTsKIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkubm90QVJlZiwgbmFtZSwgY29udGVudCkpOwogCQkJfQotCQkJZmluYWwgU3RyaW5nIHRhcmdldCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKGJ1ZiwgNSwgbik7CisJCQlmaW5hbCBTdHJpbmcgdGFyZ2V0ID0gUmF3UGFyc2VVdGlscy5kZWNvZGUobG9vc2UuYnVmLCA1LCBuKTsKIAkJCWlmIChyZWYgIT0gbnVsbCAmJiByZWYuaXNTeW1ib2xpYygpCiAJCQkJCSYmIHJlZi5nZXRUYXJnZXQoKS5nZXROYW1lKCkuZXF1YWxzKHRhcmdldCkpIHsKIAkJCQlhc3NlcnQoY3VycmVudFNuYXBzaG90ICE9IG51bGwpOwotCQkJCWN1cnJlbnRTbmFwc2hvdC5zZXRDbGVhbihvdGhlclNuYXBzaG90KTsKKwkJCQljdXJyZW50U25hcHNob3Quc2V0Q2xlYW4obG9vc2Uuc25hcHNob3QpOwogCQkJCXJldHVybiByZWY7CiAJCQl9Ci0JCQlyZXR1cm4gbmV3U3ltYm9saWNSZWYob3RoZXJTbmFwc2hvdCwgbmFtZSwgdGFyZ2V0KTsKKwkJCXJldHVybiBuZXdTeW1ib2xpY1JlZihsb29zZS5zbmFwc2hvdCwgbmFtZSwgdGFyZ2V0KTsKIAkJfQogCiAJCWlmIChuIDwgT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCkBAIC0xMTMxLDIzICsxMTM0LDIzIEBAIExvb3NlUmVmIHNjYW5SZWYoTG9vc2VSZWYgcmVmLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCQlmaW5hbCBPYmplY3RJZCBpZDsKIAkJdHJ5IHsKLQkJCWlkID0gT2JqZWN0SWQuZnJvbVN0cmluZyhidWYsIDApOworCQkJaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKGxvb3NlLmJ1ZiwgMCk7CiAJCQlpZiAocmVmICE9IG51bGwgJiYgIXJlZi5pc1N5bWJvbGljKCkKIAkJCQkJJiYgaWQuZXF1YWxzKHJlZi5nZXRUYXJnZXQoKS5nZXRPYmplY3RJZCgpKSkgewogCQkJCWFzc2VydChjdXJyZW50U25hcHNob3QgIT0gbnVsbCk7Ci0JCQkJY3VycmVudFNuYXBzaG90LnNldENsZWFuKG90aGVyU25hcHNob3QpOworCQkJCWN1cnJlbnRTbmFwc2hvdC5zZXRDbGVhbihsb29zZS5zbmFwc2hvdCk7CiAJCQkJcmV0dXJuIHJlZjsKIAkJCX0KIAogCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90UmVmKSB7Ci0JCQl3aGlsZSAoMCA8IG4gJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShidWZbbiAtIDFdKSkKKwkJCXdoaWxlICgwIDwgbiAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxvb3NlLmJ1ZltuIC0gMV0pKQogCQkJCW4tLTsKLQkJCVN0cmluZyBjb250ZW50ID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoYnVmLCAwLCBuKTsKKwkJCVN0cmluZyBjb250ZW50ID0gUmF3UGFyc2VVdGlscy5kZWNvZGUobG9vc2UuYnVmLCAwLCBuKTsKIAogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLm5vdEFSZWYsCiAJCQkJCW5hbWUsIGNvbnRlbnQpLCBub3RSZWYpOwogCQl9Ci0JCXJldHVybiBuZXcgTG9vc2VVbnBlZWxlZChvdGhlclNuYXBzaG90LCBuYW1lLCBpZCk7CisJCXJldHVybiBuZXcgTG9vc2VVbnBlZWxlZChsb29zZS5zbmFwc2hvdCwgbmFtZSwgaWQpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTeW1SZWYoYnl0ZVtdIGJ1ZiwgaW50IG4pIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9pby9DYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2lvL0NhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyMDk1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9pby9DYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBUZW5jZW50LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworCisvKioKKyAqIEFuIE91dHB1dFN0cmVhbSB0aGF0IGtlZXBzIGEgZGlnZXN0IGFuZCBjaGVja3MgZXZlcnkgTiBieXRlcyBmb3IKKyAqIGNhbmNlbGxhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKworCS8qKiBUaGUgT3V0cHV0U3RyZWFtIGNoZWNrcyBldmVyeSB0aGlzIHZhbHVlIGZvciBjYW5jZWxsYXRpb24gKiovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyA9IDEyOCAqIDEwMjQ7CisKKwlwcml2YXRlIGZpbmFsIFByb2dyZXNzTW9uaXRvciB3cml0ZU1vbml0b3I7CisKKwlwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQ7CisKKwlwcml2YXRlIGZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOworCisJcHJpdmF0ZSBsb25nIGNvdW50OworCisJcHJpdmF0ZSBsb25nIGNoZWNrQ2FuY2VsQXQ7CisKKwkvKioKKwkgKiBJbml0aWFsaXplIGEgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0uCisJICoKKwkgKiBAcGFyYW0gd3JpdGVNb25pdG9yCisJICogICAgICAgICAgICBtb25pdG9yIHRvIHVwZGF0ZSBvbiBvdXRwdXQgcHJvZ3Jlc3MgYW5kIGNoZWNrIGNhbmNlbC4KKwkgKiBAcGFyYW0gb3V0CisJICogICAgICAgICAgICB0YXJnZXQgc3RyZWFtIHRvIHJlY2VpdmUgYWxsIGNvbnRlbnRzLgorCSAqLworCXB1YmxpYyBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbShQcm9ncmVzc01vbml0b3Igd3JpdGVNb25pdG9yLAorCQkJT3V0cHV0U3RyZWFtIG91dCkgeworCQl0aGlzLndyaXRlTW9uaXRvciA9IHdyaXRlTW9uaXRvcjsKKwkJdGhpcy5vdXQgPSBvdXQ7CisJCXRoaXMuY2hlY2tDYW5jZWxBdCA9IEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0s7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBtb25pdG9yIHdoaWNoIGlzIHVzZWQgdG8gdXBkYXRlIG9uIG91dHB1dCBwcm9ncmVzcyBhbmQgY2hlY2sKKwkgKiBjYW5jZWwuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBtb25pdG9yCisJICovCisJcHVibGljIGZpbmFsIFByb2dyZXNzTW9uaXRvciBnZXRXcml0ZU1vbml0b3IoKSB7CisJCXJldHVybiB3cml0ZU1vbml0b3I7CisJfQorCisJLyoqCisJICogT2J0YWluIHRoZSBjdXJyZW50IFNIQS0xIGRpZ2VzdC4KKwkgKgorCSAqIEByZXR1cm4gU0hBLTEgZGlnZXN0CisJICovCisJcHVibGljIGZpbmFsIGJ5dGVbXSBnZXREaWdlc3QoKSB7CisJCXJldHVybiBtZC5kaWdlc3QoKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2Ugc3RyZWFtIHN0YXJ0LgorCSAqCisJICogQHJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzaW5jZSBzdHJlYW0gc3RhcnQuCisJICovCisJcHVibGljIGZpbmFsIGxvbmcgbGVuZ3RoKCkgeworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGNoZWNrQ2FuY2VsQXQgPD0gY291bnQpIHsKKwkJCWlmICh3cml0ZU1vbml0b3IuaXNDYW5jZWxsZWQoKSkgeworCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7CisJCQl9CisJCQljaGVja0NhbmNlbEF0ID0gY291bnQgKyBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLOworCQl9CisKKwkJb3V0LndyaXRlKGIpOworCQltZC51cGRhdGUoKGJ5dGUpIGIpOworCQljb3VudCsrOworCX0KKworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdoaWxlICgwIDwgbGVuKSB7CisJCQlpZiAoY2hlY2tDYW5jZWxBdCA8PSBjb3VudCkgeworCQkJCWlmICh3cml0ZU1vbml0b3IuaXNDYW5jZWxsZWQoKSkgeworCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpOworCQkJCX0KKwkJCQljaGVja0NhbmNlbEF0ID0gY291bnQgKyBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLOworCQkJfQorCisJCQlpbnQgbiA9IE1hdGgubWluKGxlbiwgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyk7CisJCQlvdXQud3JpdGUoYiwgb2ZmLCBuKTsKKwkJCW1kLnVwZGF0ZShiLCBvZmYsIG4pOworCQkJY291bnQgKz0gbjsKKworCQkJb2ZmICs9IG47CisJCQlsZW4gLT0gbjsKKwkJfQorCX0KKworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvdXQuZmx1c2goKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9CYXNlU2VhcmNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9CYXNlU2VhcmNoLmphdmEKaW5kZXggMWMyNGFmZi4uY2RhNDU2YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svQmFzZVNlYXJjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0Jhc2VTZWFyY2guamF2YQpAQCAtMTQyLDYgKzE0Miw3IEBAIHByaXZhdGUgc3RhdGljIGludCBuZXh0U2xhc2goYnl0ZVtdIHBhdGhCdWYsIGludCBwdHIsIGludCBlbmQpIHsKIAkJcmV0dXJuIHB0cjsKIAl9CiAKKwlAU3VwcHJlc3NXYXJuaW5ncygiUmVmZXJlbmNlRXF1YWxpdHkiKQogCXByaXZhdGUgdm9pZCBhZGQoQW55T2JqZWN0SWQgaWQsIGludCBvYmplY3RUeXBlLCBpbnQgcGF0aEhhc2gpIHsKIAkJT2JqZWN0VG9QYWNrIG9iaiA9IG5ldyBPYmplY3RUb1BhY2soaWQsIG9iamVjdFR5cGUpOwogCQlvYmouc2V0RWRnZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja091dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja091dHB1dFN0cmVhbS5qYXZhCmluZGV4IDcxMDRiOTQuLjJkMGZlMjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEKQEAgLTE3LDEwICsxNyw4IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pby5DYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLk5COwogCkBAIC0yOCwyNSArMjYsMTQgQEAKICAqIEN1c3RvbSBvdXRwdXQgc3RyZWFtIHRvIHN1cHBvcnQKICAqIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjay5QYWNrV3JpdGVyfS4KICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBhY2tPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLID0gMTI4ICogMTAyNDsKLQotCXByaXZhdGUgZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHdyaXRlTW9uaXRvcjsKLQotCXByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIG91dDsKK3B1YmxpYyBmaW5hbCBjbGFzcyBQYWNrT3V0cHV0U3RyZWFtIGV4dGVuZHMgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0gewogCiAJcHJpdmF0ZSBmaW5hbCBQYWNrV3JpdGVyIHBhY2tXcml0ZXI7CiAKLQlwcml2YXRlIGZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwotCi0JcHJpdmF0ZSBsb25nIGNvdW50OwotCiAJcHJpdmF0ZSBmaW5hbCBieXRlW10gaGVhZGVyQnVmZmVyID0gbmV3IGJ5dGVbMzJdOwogCiAJcHJpdmF0ZSBmaW5hbCBieXRlW10gY29weUJ1ZmZlciA9IG5ldyBieXRlWzY0IDw8IDEwXTsKIAotCXByaXZhdGUgbG9uZyBjaGVja0NhbmNlbEF0OwotCiAJcHJpdmF0ZSBib29sZWFuIG9mc0RlbHRhOwogCiAJLyoqCkBAIC02Niw0OCArNTMsOCBAQCBwdWJsaWMgZmluYWwgY2xhc3MgUGFja091dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CiAJICovCiAJcHVibGljIFBhY2tPdXRwdXRTdHJlYW0oZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHdyaXRlTW9uaXRvciwKIAkJCWZpbmFsIE91dHB1dFN0cmVhbSBvdXQsIGZpbmFsIFBhY2tXcml0ZXIgcHcpIHsKLQkJdGhpcy53cml0ZU1vbml0b3IgPSB3cml0ZU1vbml0b3I7Ci0JCXRoaXMub3V0ID0gb3V0OworCQlzdXBlcih3cml0ZU1vbml0b3IsIG91dCk7CiAJCXRoaXMucGFja1dyaXRlciA9IHB3OwotCQl0aGlzLmNoZWNrQ2FuY2VsQXQgPSBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNvdW50Kys7Ci0JCW91dC53cml0ZShiKTsKLQkJbWQudXBkYXRlKChieXRlKSBiKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd2hpbGUgKDAgPCBsZW4pIHsKLQkJCWZpbmFsIGludCBuID0gTWF0aC5taW4obGVuLCBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLKTsKLQkJCWNvdW50ICs9IG47Ci0KLQkJCWlmIChjaGVja0NhbmNlbEF0IDw9IGNvdW50KSB7Ci0JCQkJaWYgKHdyaXRlTW9uaXRvci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKLQkJCQkJCQlKR2l0VGV4dC5nZXQoKS5wYWNraW5nQ2FuY2VsbGVkRHVyaW5nT2JqZWN0c1dyaXRpbmcpOwotCQkJCX0KLQkJCQljaGVja0NhbmNlbEF0ID0gY291bnQgKyBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLOwotCQkJfQotCi0JCQlvdXQud3JpdGUoYiwgb2ZmLCBuKTsKLQkJCW1kLnVwZGF0ZShiLCBvZmYsIG4pOwotCi0JCQlvZmYgKz0gbjsKLQkJCWxlbiAtPSBuOwotCQl9Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dC5mbHVzaCgpOwogCX0KIAogCWZpbmFsIHZvaWQgd3JpdGVGaWxlSGVhZGVyKGludCB2ZXJzaW9uLCBsb25nIG9iamVjdENvdW50KQpAQCAtMTYwLDcgKzEwNyw3IEBAIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlSGVhZGVyKE9iamVjdFRvUGFjayBvdHAsIGxvbmcgcmF3TGVuZ3RoKQogCQlPYmplY3RUb1BhY2sgYiA9IG90cC5nZXREZWx0YUJhc2UoKTsKIAkJaWYgKGIgIT0gbnVsbCAmJiAoYi5pc1dyaXR0ZW4oKSAmIG9mc0RlbHRhKSkgeyAvLyBOb24tc2hvcnQtY2lyY3VpdCBsb2dpYyBpcyBpbnRlbnRpb25hbAogCQkJaW50IG4gPSBvYmplY3RIZWFkZXIocmF3TGVuZ3RoLCBPQkpfT0ZTX0RFTFRBLCBoZWFkZXJCdWZmZXIpOwotCQkJbiA9IG9mc0RlbHRhKGNvdW50IC0gYi5nZXRPZmZzZXQoKSwgaGVhZGVyQnVmZmVyLCBuKTsKKwkJCW4gPSBvZnNEZWx0YShsZW5ndGgoKSAtIGIuZ2V0T2Zmc2V0KCksIGhlYWRlckJ1ZmZlciwgbik7CiAJCQl3cml0ZShoZWFkZXJCdWZmZXIsIDAsIG4pOwogCQl9IGVsc2UgaWYgKG90cC5pc0RlbHRhUmVwcmVzZW50YXRpb24oKSkgewogCQkJaW50IG4gPSBvYmplY3RIZWFkZXIocmF3TGVuZ3RoLCBPQkpfUkVGX0RFTFRBLCBoZWFkZXJCdWZmZXIpOwpAQCAtMjA5LDIwICsxNTYsNiBAQCBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgb2ZzRGVsdGFWYXJJbnRMZW5ndGgobG9uZyB2KSB7CiAJfQogCiAJdm9pZCBlbmRPYmplY3QoKSB7Ci0JCXdyaXRlTW9uaXRvci51cGRhdGUoMSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHNpbmNlIHN0cmVhbSBzdGFydC4KLQkgKgotCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2Ugc3RyZWFtIHN0YXJ0LgotCSAqLwotCXB1YmxpYyBmaW5hbCBsb25nIGxlbmd0aCgpIHsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKiBAcmV0dXJuIG9idGFpbiB0aGUgY3VycmVudCBTSEEtMSBkaWdlc3QuICovCi0JZmluYWwgYnl0ZVtdIGdldERpZ2VzdCgpIHsKLQkJcmV0dXJuIG1kLmRpZ2VzdCgpOworCQlnZXRXcml0ZU1vbml0b3IoKS51cGRhdGUoMSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2gvT3BlblNzaENvbmZpZ0ZpbGUuamF2YQppbmRleCA2NDhkNGExLi42NTljY2I4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2gvT3BlblNzaENvbmZpZ0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2gvT3BlblNzaENvbmZpZ0ZpbGUuamF2YQpAQCAtNTAyLDYgKzUwMiw5OCBAQCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmxhZyhTdHJpbmcgdmFsdWUpIHsKIAl9CiAKIAkvKioKKwkgKiBDb252ZXJ0cyBhbiBPcGVuU1NIIHRpbWUgdmFsdWUgaW50byBhIG51bWJlciBvZiBzZWNvbmRzLiBUaGUgZm9ybWF0IGlzCisJICogZGVmaW5lZCBieSBPcGVuU1NIIGFzIGEgc2VxdWVuY2Ugb2YgKHBvc2l0aXZlKSBpbnRlZ2VycyB3aXRoIHN1ZmZpeGVzIGZvcgorCSAqIHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBhbmQgd2Vla3MuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKiAgICAgICAgICAgIHRvIGNvbnZlcnQKKwkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgdmFsdWUgYXMgYSBudW1iZXIgb2Ygc2Vjb25kcywgb3IgLTEgaWYgdGhlIHZhbHVlIGlzCisJICogICAgICAgICBub3QgYSB2YWxpZCBPcGVuU1NIIHRpbWUgdmFsdWUKKwkgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vbWFuLm9wZW5ic2Qub3JnL3NzaGRfY29uZmlnLjUjVElNRV9GT1JNQVRTIj5PcGVuQlNECisJICogICAgICBtYW4gNSBzc2hkX2NvbmZpZywgc2VjdGlvbiBUSU1FIEZPUk1BVFM8L2E+CisJICovCisJcHVibGljIHN0YXRpYyBpbnQgdGltZVNwZWMoU3RyaW5nIHZhbHVlKSB7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdHJ5IHsKKwkJCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKKwkJCWludCBpID0gMDsKKwkJCWludCBzZWNvbmRzID0gMDsKKwkJCWJvb2xlYW4gdmFsdWVTZWVuID0gZmFsc2U7CisJCQl3aGlsZSAoaSA8IGxlbmd0aCkgeworCQkJCS8vIFNraXAgd2hpdGVzcGFjZQorCQkJCWNoYXIgY2ggPSB2YWx1ZS5jaGFyQXQoaSk7CisJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKSB7CisJCQkJCWkrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChjaCA9PSAnKycpIHsKKwkJCQkJLy8gT3BlblNTSCB1c2VzIHN0cnRvbCB3aXRoIGJhc2UgMTA6IGEgbGVhZGluZyBwbHVzIHNpZ24gaXMKKwkJCQkJLy8gYWxsb3dlZC4KKwkJCQkJaSsrOworCQkJCX0KKwkJCQlpbnQgdmFsID0gMDsKKwkJCQlpbnQgaiA9IGk7CisJCQkJd2hpbGUgKGogPCBsZW5ndGgpIHsKKwkJCQkJY2ggPSB2YWx1ZS5jaGFyQXQoaisrKTsKKwkJCQkJaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKwkJCQkJCXZhbCA9IE1hdGguYWRkRXhhY3QoTWF0aC5tdWx0aXBseUV4YWN0KHZhbCwgMTApLAorCQkJCQkJCQljaCAtICcwJyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlqLS07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoaSA9PSBqKSB7CisJCQkJCS8vIE5vIGRpZ2l0cyBzZWVuCisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJaSA9IGo7CisJCQkJaW50IG11bHRpcGxpZXIgPSAxOworCQkJCWlmIChpIDwgbGVuZ3RoKSB7CisJCQkJCWNoID0gdmFsdWUuY2hhckF0KGkrKyk7CisJCQkJCXN3aXRjaCAoY2gpIHsKKwkJCQkJY2FzZSAncyc6CisJCQkJCWNhc2UgJ1MnOgorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ20nOgorCQkJCQljYXNlICdNJzoKKwkJCQkJCW11bHRpcGxpZXIgPSA2MDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdoJzoKKwkJCQkJY2FzZSAnSCc6CisJCQkJCQltdWx0aXBsaWVyID0gMzYwMDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdkJzoKKwkJCQkJY2FzZSAnRCc6CisJCQkJCQltdWx0aXBsaWVyID0gMjQgKiAzNjAwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ3cnOgorCQkJCQljYXNlICdXJzoKKwkJCQkJCW11bHRpcGxpZXIgPSA3ICogMjQgKiAzNjAwOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCS8vIEludmFsaWQgdGltZSBzcGVjCisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQl9CisJCQkJc2Vjb25kcyA9IE1hdGguYWRkRXhhY3Qoc2Vjb25kcywKKwkJCQkJCU1hdGgubXVsdGlwbHlFeGFjdCh2YWwsIG11bHRpcGxpZXIpKTsKKwkJCQl2YWx1ZVNlZW4gPSB0cnVlOworCQkJfQorCQkJcmV0dXJuIHZhbHVlU2VlbiA/IHNlY29uZHMgOiAtMTsKKwkJfSBjYXRjaCAoQXJpdGhtZXRpY0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBPdmVyZmxvdworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyoqCiAJICogUmV0cmlldmVzIHRoZSBsb2NhbCB1c2VyIG5hbWUgYXMgZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yLgogCSAqCiAJICogQHJldHVybiB0aGUgdXNlciBuYW1lCkBAIC01NDksNiArNjQxLDcgQEAgcHVibGljIHN0YXRpYyBjbGFzcyBIb3N0RW50cnkgaW1wbGVtZW50cyBTc2hDb25maWdTdG9yZS5Ib3N0Q29uZmlnIHsKIAkJCUxJU1RfS0VZUy5hZGQoU3NoQ29uc3RhbnRzLkdMT0JBTF9LTk9XTl9IT1NUU19GSUxFKTsKIAkJCUxJU1RfS0VZUy5hZGQoU3NoQ29uc3RhbnRzLlNFTkRfRU5WKTsKIAkJCUxJU1RfS0VZUy5hZGQoU3NoQ29uc3RhbnRzLlVTRVJfS05PV05fSE9TVFNfRklMRSk7CisJCQlMSVNUX0tFWVMuYWRkKFNzaENvbnN0YW50cy5BRERfS0VZU19UT19BR0VOVCk7IC8vIGNvbmZpcm0gdGltZVNwZWMKIAkJfQogCiAJCS8qKgpAQCAtODcxLDcgKzk2NCw4IEBAIHZvaWQgc3Vic3RpdHV0ZShTdHJpbmcgb3JpZ2luYWxIb3N0TmFtZSwgaW50IHBvcnQsIFN0cmluZyB1c2VyTmFtZSwKIAkJCWlmIChvcHRpb25zICE9IG51bGwpIHsKIAkJCQkvLyBIT1NUTkFNRSBhbHJlYWR5IGRvbmUgYWJvdmUKIAkJCQlTdHJpbmcgdmFsdWUgPSBvcHRpb25zLmdldChTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgIVNzaENvbnN0YW50cy5OT05FLmVxdWFscyh2YWx1ZSkKKwkJCQkJCSYmICFTc2hDb25zdGFudHMuRU5WX1NTSF9BVVRIX1NPQ0tFVC5lcXVhbHModmFsdWUpKSB7CiAJCQkJCXZhbHVlID0gci5zdWJzdGl0dXRlKHZhbHVlLCBSZXBsYWNlci5ERUZBVUxUX1RPS0VOUywgdHJ1ZSk7CiAJCQkJCXZhbHVlID0gdG9GaWxlKHZhbHVlLCBob21lKS5nZXRQYXRoKCk7CiAJCQkJCW9wdGlvbnMucHV0KFNzaENvbnN0YW50cy5JREVOVElUWV9BR0VOVCwgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTA5Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsICBNYXR0aGlhcyBTb2huIDxtYXR0aGlhcy5zb2huQHNhcC5jb20+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlR5cGVkQ29uZmlnR2V0dGVyLlVOU0VUX0lOVDsKKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CisKKy8qKgorICogR2l0IGNvbmZpZ3VyYXRpb24gb3B0aW9uIDxhCisgKiBocmVmPWh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtY29uZmlnI0RvY3VtZW50YXRpb24vZ2l0LWNvbmZpZy50eHQtY29yZWFiYnJldiI+CisgKiBjb3JlLmFiYnJldjwvYT4KKyAqCisgKiBAc2luY2UgNi4xCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBYmJyZXZDb25maWcgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OTyA9ICJubyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9BVVRPID0gImF1dG8iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgbWluaW11bSB2YWx1ZSBvZiBhYmJyZXYKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fQUJCUkVWID0gNDsKKworCS8qKgorCSAqIENhcCBjb25maWd1cmVkIGNvcmUuYWJicmV2IHRvIHJhbmdlIGJldHdlZW4gbWluaW11bSBvZiA0IGFuZCBudW1iZXIgb2YKKwkgKiBoZXgtZGlnaXRzIG9mIGEgZnVsbCBvYmplY3QgaWQuCisJICoKKwkgKiBAcGFyYW0gbGVuCisJICogICAgICAgICAgICBjb25maWd1cmVkIG51bWJlciBvZiBoZXgtZGlnaXRzIHRvIGFiYnJldmlhdGUgb2JqZWN0IGlkcyB0bworCSAqIEByZXR1cm4gY29yZS5hYmJyZXYgY2FwcGVkIHRvIHJhbmdlIGJldHdlZW4gbWluaW11bSBvZiA0IGFuZCBudW1iZXIgb2YKKwkgKiAgICAgICAgIGhleC1kaWdpdHMgb2YgYSBmdWxsIG9iamVjdCBpZAorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IGNhcEFiYnJldihpbnQgbGVuKSB7CisJCXJldHVybiBNYXRoLm1pbihNYXRoLm1heChNSU5fQUJCUkVWLCBsZW4pLAorCQkJCUNvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CisJfQorCisJLyoqCisJICogTm8gYWJicmV2aWF0aW9uCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBBYmJyZXZDb25maWcgTk8gPSBuZXcgQWJicmV2Q29uZmlnKAorCQkJQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKTsKKworCS8qKgorCSAqIFBhcnNlIHN0cmluZyB2YWx1ZSBvZiBjb3JlLmFiYnJldiBnaXQgb3B0aW9uIGZvciBhIGdpdmVuIHJlcG9zaXRvcnkKKwkgKgorCSAqIEBwYXJhbSByZXBvCisJICogICAgICAgICAgICByZXBvc2l0b3J5CisJICogQHJldHVybiB0aGUgcGFyc2VkIEFiYnJldkNvbmZpZworCSAqIEB0aHJvd3MgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB2YWx1ZSBvZiBjb3JlLmFiYnJldiBpcyBpbnZhbGlkCisJICovCisJcHVibGljIHN0YXRpYyBBYmJyZXZDb25maWcgcGFyc2VGcm9tQ29uZmlnKFJlcG9zaXRvcnkgcmVwbykKKwkJCXRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisJCUNvbmZpZyBjb25maWcgPSByZXBvLmdldENvbmZpZygpOworCQlTdHJpbmcgdmFsdWUgPSBjb25maWcuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLAorCQkJCW51bGwsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FCQlJFVik7CisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoVkFMVUVfQVVUTykpIHsKKwkJCXJldHVybiBhdXRvKHJlcG8pOworCQl9CisJCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFZBTFVFX05PKSkgeworCQkJcmV0dXJuIE5POworCQl9CisJCXRyeSB7CisJCQlpbnQgbGVuID0gY29uZmlnLmdldEludEluUmFuZ2UoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sCisJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0FCQlJFViwgTUlOX0FCQlJFViwKKwkJCQkJQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RILCBVTlNFVF9JTlQpOworCQkJaWYgKGxlbiA9PSBVTlNFVF9JTlQpIHsKKwkJCQkvLyBVbnNldCB3YXMgY2hlY2tlZCBhYm92ZS4gSWYgd2UgZ2V0IFVOU0VUX0lOVCBoZXJlLCB0aGVuCisJCQkJLy8gZWl0aGVyIHRoZSB2YWx1ZSB3YXMgVU5TRVRfSU5ULCBvciBpdCB3YXMgYW4gaW52YWxpZCB2YWx1ZQorCQkJCS8vIChub3QgYW4gaW50ZWdlciwgb3Igb3V0IG9mIHJhbmdlKSwgYW5kIEVHaXQncworCQkJCS8vIFJlcG9ydGluZ1R5cGVkR2V0dGVyIGNhdWdodCB0aGUgZXhjZXB0aW9uIGFuZCBoYXMgbG9nZ2VkIGEKKwkJCQkvLyB3YXJuaW5nLiBJbiBlaXRoZXIgY2FzZSB3ZSBzaG91bGQgZmFsbCBiYWNrIHRvIHNvbWUgc2FuZQorCQkJCS8vIGRlZmF1bHQuCisJCQkJbGVuID0gT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCQkJfQorCQkJcmV0dXJuIG5ldyBBYmJyZXZDb25maWcobGVuKTsKKwkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZENvcmVBYmJyZXYsIHZhbHVlKSwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBbiBhcHByb3ByaWF0ZSB2YWx1ZSBpcyBjb21wdXRlZCBiYXNlZCBvbiB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mCisJICogcGFja2VkIG9iamVjdHMgaW4gYSByZXBvc2l0b3J5LCB3aGljaCBob3BlZnVsbHkgaXMgZW5vdWdoIGZvciBhYmJyZXZpYXRlZAorCSAqIG9iamVjdCBuYW1lcyB0byBzdGF5IHVuaXF1ZSBmb3Igc29tZSB0aW1lLgorCSAqCisJICogQHBhcmFtIHJlcG8KKwkgKiBAcmV0dXJuIGFwcHJvcHJpYXRlIHZhbHVlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBhcHByb3hpbWF0ZSBudW1iZXIgb2YKKwkgKiAgICAgICAgIHBhY2tlZCBvYmplY3RzIGluIGEgcmVwb3NpdG9yeQorCSAqLworCXByaXZhdGUgc3RhdGljIEFiYnJldkNvbmZpZyBhdXRvKFJlcG9zaXRvcnkgcmVwbykgeworCQlsb25nIGNvdW50ID0gcmVwby5nZXRPYmplY3REYXRhYmFzZSgpLmdldEFwcHJveGltYXRlT2JqZWN0Q291bnQoKTsKKwkJaWYgKGNvdW50ID09IC0xKSB7CisJCQlyZXR1cm4gbmV3IEFiYnJldkNvbmZpZyhPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpOworCQl9CisJCS8vIGZpbmQgbXNiLCByb3VuZCB0byBuZXh0IHBvd2VyIG9mIDIKKwkJaW50IGxlbiA9IDYzIC0gTG9uZy5udW1iZXJPZkxlYWRpbmdaZXJvcyhjb3VudCkgKyAxOworCQkvLyBXaXRoIHRoZSBvcmRlciBvZiAyXmxlbiBvYmplY3RzLCB3ZSBleHBlY3QgYSBjb2xsaXNpb24gYXQKKwkJLy8gMl4obGVuLzIpLiBCdXQgd2UgYWxzbyBjYXJlIGFib3V0IGhleCBjaGFycywgbm90IGJpdHMsIGFuZAorCQkvLyB0aGVyZSBhcmUgNCBiaXRzIHBlciBoZXguIFNvIGFsbCB0b2dldGhlciB3ZSBuZWVkIHRvIGRpdmlkZQorCQkvLyBieSAyOyBidXQgd2UgYWxzbyB3YW50IHRvIHJvdW5kIG9kZCBudW1iZXJzIHVwLCBoZW5jZSBhZGRpbmcKKwkJLy8gb25lIGJlZm9yZSBkaXZpZGluZy4KKwkJbGVuID0gKGxlbiArIDEpIC8gMjsKKwkJLy8gZm9yIHNtYWxsIHJlcG9zIHVzZSBhdCBsZWFzdCBmYWxsYmFjayBsZW5ndGgKKwkJcmV0dXJuIG5ldyBBYmJyZXZDb25maWcoTWF0aC5tYXgobGVuLCBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpKTsKKwl9CisKKwkvKioKKwkgKiBBbGwgb3RoZXIgcG9zc2libGUgYWJicmV2aWF0aW9uIGxlbmd0aHMuIFZhbGlkIHJhbmdlIDQgdG8gbnVtYmVyIG9mCisJICogaGV4LWRpZ2l0cyBvZiBhbiB1bmFiYnJldmlhdGVkIG9iamVjdCBpZCAoNDAgZm9yIFNIQTEgb2JqZWN0IGlkcywgamdpdAorCSAqIGRvZXNuJ3Qgc3VwcG9ydCBTSEEyNTYgeWV0KS4KKwkgKi8KKwlwcml2YXRlIGludCBhYmJyZXY7CisKKwkvKioKKwkgKiBAcGFyYW0gYWJicmV2CisJICovCisJcHJpdmF0ZSBBYmJyZXZDb25maWcoaW50IGFiYnJldikgeworCQl0aGlzLmFiYnJldiA9IGNhcEFiYnJldihhYmJyZXYpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgY29uZmlndXJlZCBhYmJyZXZpYXRpb24gbGVuZ3RoIGZvciBvYmplY3QgaWRzLgorCSAqCisJICogQHJldHVybiB0aGUgY29uZmlndXJlZCBhYmJyZXZpYXRpb24gbGVuZ3RoIGZvciBvYmplY3QgaWRzCisJICovCisJcHVibGljIGludCBnZXQoKSB7CisJCXJldHVybiBhYmJyZXY7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcoYWJicmV2KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWcuamF2YQppbmRleCA2ZGE2ZjEyLi5hYTYxM2QwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWcuamF2YQpAQCAtMTM4LDYgKzEzOCwxOCBAQCBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZSgpIHsKIAl9CiAKIAkvKioKKwkgKiBHZXQgdGhlIHJlbW90ZSB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIHB1c2ggdG8uCisJICoKKwkgKiBAcmV0dXJuIHRoZSByZW1vdGUgdGhpcyBicmFuY2ggaXMgY29uZmlndXJlZCB0byBwdXNoIHRvLCBvciB7QGNvZGUgbnVsbH0KKwkgKiAgICAgICAgIGlmIG5vdCBkZWZpbmVkCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHVzaFJlbW90ZSgpIHsKKwkJcmV0dXJuIGNvbmZpZy5nZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19CUkFOQ0hfU0VDVElPTiwKKwkJCQlicmFuY2hOYW1lLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9QVVNIX1JFTU9URSk7CisJfQorCisJLyoqCiAJICogR2V0IHRoZSBuYW1lIG9mIHRoZSB1cHN0cmVhbSBicmFuY2ggYXMgaXQgaXMgY2FsbGVkIG9uIHRoZSByZW1vdGUKIAkgKgogCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHVwc3RyZWFtIGJyYW5jaCBhcyBpdCBpcyBjYWxsZWQgb24gdGhlIHJlbW90ZSwgb3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnLmphdmEKaW5kZXggMjJlMWY5OC4uNmE5YjQ1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDIwIEp1bGlhbiBSdXBwZWwgPGp1bGlhbi5ydXBwZWxAc2FwLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAyMCwgMjAyMiBKdWxpYW4gUnVwcGVsIDxqdWxpYW4ucnVwcGVsQHNhcC5jb20+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDE1ICsxOCwxOCBAQAogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZy5Db25maWdFbnVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZy5TZWN0aW9uUGFyc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSU87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJhd1BhcnNlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIFRoZSBzdGFuZGFyZCAiY29tbWl0IiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCkBAIC0zNCwyMiArMzcsOTUgQEAKICAqIEBzaW5jZSA1LjEzCiAgKi8KIHB1YmxpYyBjbGFzcyBDb21taXRDb25maWcgeworCiAJLyoqCiAJICogS2V5IGZvciB7QGxpbmsgQ29uZmlnI2dldChTZWN0aW9uUGFyc2VyKX0uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDb25maWcuU2VjdGlvblBhcnNlcjxDb21taXRDb25maWc+IEtFWSA9IENvbW1pdENvbmZpZzo6bmV3OwogCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVVCA9ICIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIENPTU1FTlRfQ0hBUlMgPSB7ICcjJywgJzsnLCAnQCcsICchJywgJyQnLCAnJScsCisJCQknXicsICcmJywgJ3wnLCAnOicgfTsKKworCS8qKgorCSAqIEhvdyB0byBjbGVhbiB1cCBjb21taXQgbWVzc2FnZXMgd2hlbiBjb21taXR0aW5nLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBlbnVtIENsZWFudXBNb2RlIGltcGxlbWVudHMgQ29uZmlnRW51bSB7CisKKwkJLyoqCisJCSAqIHtAbGluayAjV0hJVEVTUEFDRX0sIGFkZGl0aW9uYWxseSByZW1vdmUgY29tbWVudCBsaW5lcy4KKwkJICovCisJCVNUUklQLAorCisJCS8qKgorCQkgKiBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgbGVhZGluZyBhbmQgdHJhaWxpbmcgZW1wdHkgbGluZXM7CisJCSAqIGNvbGxhcHNlIG11bHRpcGxlIGVtcHR5IGxpbmVzIHRvIGEgc2luZ2xlIG9uZS4KKwkJICovCisJCVdISVRFU1BBQ0UsCisKKwkJLyoqCisJCSAqIE1ha2Ugbm8gY2hhbmdlcy4KKwkJICovCisJCVZFUkJBVElNLAorCisJCS8qKgorCQkgKiBPbWl0IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgZmlyc3QgInNjaXNzb3IiIGxpbmUgb24sIHRoZW4gYXBwbHkKKwkJICoge0BsaW5rICNXSElURVNQQUNFfS4KKwkJICovCisJCVNDSVNTT1JTLAorCisJCS8qKgorCQkgKiBVc2Uge0BsaW5rICNTVFJJUH0gZm9yIHVzZXItZWRpdGVkIG1lc3NhZ2VzLCBvdGhlcndpc2UKKwkJICoge0BsaW5rICNXSElURVNQQUNFfSwgdW5sZXNzIG92ZXJyaWRkZW4gYnkgYSBnaXQgY29uZmlnIHNldHRpbmcgb3RoZXIKKwkJICogdGhhbiBERUZBVUxULgorCQkgKi8KKwkJREVGQVVMVDsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b0NvbmZpZ1ZhbHVlKCkgeworCQkJcmV0dXJuIG5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gbWF0Y2hDb25maWdWYWx1ZShTdHJpbmcgaW4pIHsKKwkJCXJldHVybiB0b0NvbmZpZ1ZhbHVlKCkuZXF1YWxzKGluKTsKKwkJfQorCX0KKwogCXByaXZhdGUgZmluYWwgc3RhdGljIENoYXJzZXQgREVGQVVMVF9DT01NSVRfTUVTU0FHRV9FTkNPRElORyA9IFN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CiAKIAlwcml2YXRlIFN0cmluZyBpMThuQ29tbWl0RW5jb2Rpbmc7CiAKIAlwcml2YXRlIFN0cmluZyBjb21taXRUZW1wbGF0ZVBhdGg7CiAKKwlwcml2YXRlIENsZWFudXBNb2RlIGNsZWFudXBNb2RlOworCisJcHJpdmF0ZSBjaGFyIGNvbW1lbnRDaGFyYWN0ZXIgPSAnIyc7CisKKwlwcml2YXRlIGJvb2xlYW4gYXV0b0NvbW1lbnRDaGFyID0gZmFsc2U7CisKIAlwcml2YXRlIENvbW1pdENvbmZpZyhDb25maWcgcmMpIHsKIAkJY29tbWl0VGVtcGxhdGVQYXRoID0gcmMuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09NTUlUX1NFQ1RJT04sCiAJCQkJbnVsbCwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQ09NTUlUX1RFTVBMQVRFKTsKIAkJaTE4bkNvbW1pdEVuY29kaW5nID0gcmMuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfU0VDVElPTl9JMThOLAogCQkJCW51bGwsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NPTU1JVF9FTkNPRElORyk7CisJCWNsZWFudXBNb2RlID0gcmMuZ2V0RW51bShDb25maWdDb25zdGFudHMuQ09ORklHX0NPTU1JVF9TRUNUSU9OLCBudWxsLAorCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NMRUFOVVAsIENsZWFudXBNb2RlLkRFRkFVTFQpOworCQlTdHJpbmcgY29tbWVudCA9IHJjLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DT01NRU5UX0NIQVIpOworCQlpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoY29tbWVudCkpIHsKKwkJCWlmICgiYXV0byIuZXF1YWxzSWdub3JlQ2FzZShjb21tZW50KSkgeyAvLyROT04tTkxTLTEkCisJCQkJYXV0b0NvbW1lbnRDaGFyID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJY2hhciBmaXJzdCA9IGNvbW1lbnQuY2hhckF0KDApOworCQkJCWlmIChmaXJzdCA+ICcgJyAmJiBmaXJzdCA8IDEyNykgeworCQkJCQljb21tZW50Q2hhcmFjdGVyID0gZmlyc3Q7CisJCQkJfQorCQkJfQorCQl9CiAJfQogCiAJLyoqCkBAIC03NSw2ICsxNTEsOTMgQEAgcHVibGljIFN0cmluZyBnZXRDb21taXRFbmNvZGluZygpIHsKIAl9CiAKIAkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIHNldCBieSBnaXQgY29uZmlnCisJICoge0Bjb2RlIGNvcmUuY29tbWVudENoYXJ9LgorCSAqCisJICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHRvIHVzZSBmb3IgY29tbWVudHMgaW4gY29tbWl0IG1lc3NhZ2VzCisJICogQHNpbmNlIDYuMgorCSAqLworCXB1YmxpYyBjaGFyIGdldENvbW1lbnRDaGFyKCkgeworCQlyZXR1cm4gY29tbWVudENoYXJhY3RlcjsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHRoZSBjb21tZW50IGNoYXJhY3RlciB0byB1c2UgZm9yIGEgcGFydGljdWxhciB0ZXh0LiBJZgorCSAqIHtAY29kZSBjb3JlLmNvbW1lbnRDaGFyfSBpcyAiYXV0byIsIHRyaWVzIHRvIGRldGVybWluZSBhbiB1bnVzZWQKKwkgKiBjaGFyYWN0ZXI7IGlmIG5vbmUgaXMgZm91bmQsIGZhbGxzIGJhY2sgdG8gJyMnLiBPdGhlcndpc2UgcmV0dXJucyB0aGUKKwkgKiBjaGFyYWN0ZXIgZ2l2ZW4gYnkge0Bjb2RlIGNvcmUuY29tbWVudENoYXJ9LgorCSAqCisJICogQHBhcmFtIHRleHQKKwkgKiAgICAgICAgICAgIGV4aXN0aW5nIHRleHQKKwkgKgorCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciB0byB1c2UKKwkgKiBAc2luY2UgNi4yCisJICovCisJcHVibGljIGNoYXIgZ2V0Q29tbWVudENoYXIoU3RyaW5nIHRleHQpIHsKKwkJaWYgKGlzQXV0b0NvbW1lbnRDaGFyKCkpIHsKKwkJCWNoYXIgdG9Vc2UgPSBkZXRlcm1pbmVDb21tZW50Q2hhcih0ZXh0KTsKKwkJCWlmICh0b1VzZSA+IDApIHsKKwkJCQlyZXR1cm4gdG9Vc2U7CisJCQl9CisJCQlyZXR1cm4gJyMnOworCQl9CisJCXJldHVybiBnZXRDb21tZW50Q2hhcigpOworCX0KKworCS8qKgorCSAqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIHNob3VsZCBiZSBkZXRlcm1pbmVkIGJ5IGNob29zaW5nIGEKKwkgKiBjaGFyYWN0ZXIgbm90IG9jY3VycmluZyBpbiBhIGNvbW1pdCBtZXNzYWdlLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l0IGNvbmZpZyB7QGNvZGUgY29yZS5jb21tZW50Q2hhcn0gaXMgImF1dG8iCisJICogQHNpbmNlIDYuMgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQXV0b0NvbW1lbnRDaGFyKCkgeworCQlyZXR1cm4gYXV0b0NvbW1lbnRDaGFyOworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUge0BsaW5rIENsZWFudXBNb2RlfSBhcyBnaXZlbiBieSBnaXQgY29uZmlnCisJICoge0Bjb2RlIGNvbW1pdC5jbGVhbnVwfS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBDbGVhbnVwTW9kZX07IHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfSBpZiB0aGUgZ2l0CisJICogICAgICAgICBjb25maWcgaXMgbm90IHNldAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlATm9uTnVsbAorCXB1YmxpYyBDbGVhbnVwTW9kZSBnZXRDbGVhbnVwTW9kZSgpIHsKKwkJcmV0dXJuIGNsZWFudXBNb2RlOworCX0KKworCS8qKgorCSAqIENvbXB1dGVzIGEgbm9uLWRlZmF1bHQge0BsaW5rIENsZWFudXBNb2RlfSBmcm9tIHRoZSBnaXZlbiBtb2RlIGFuZCB0aGUKKwkgKiBnaXQgY29uZmlnLgorCSAqCisJICogQHBhcmFtIG1vZGUKKwkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZX0gdG8gcmVzb2x2ZQorCSAqIEBwYXJhbSBkZWZhdWx0U3RyaXAKKwkgKiAgICAgICAgICAgIGlmIHtAY29kZSB0cnVlfSByZXR1cm4ge0BsaW5rIENsZWFudXBNb2RlI1NUUklQfSBpZiB0aGUgZ2l0CisJICogICAgICAgICAgICBjb25maWcgaXMgYWxzbyAiZGVmYXVsdCIsIG90aGVyd2lzZSByZXR1cm4KKwkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZSNXSElURVNQQUNFfQorCSAqIEByZXR1cm4gdGhlIHtAY29kZSBtb2RlfSwgaWYgaXQgaXMgbm90IHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfSwKKwkgKiAgICAgICAgIG90aGVyd2lzZSB0aGUgcmVzb2x2ZWQgbW9kZSwgd2hpY2ggaXMgbmV2ZXIKKwkgKiAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlATm9uTnVsbAorCXB1YmxpYyBDbGVhbnVwTW9kZSByZXNvbHZlKEBOb25OdWxsIENsZWFudXBNb2RlIG1vZGUsCisJCQlib29sZWFuIGRlZmF1bHRTdHJpcCkgeworCQlpZiAoQ2xlYW51cE1vZGUuREVGQVVMVCA9PSBtb2RlKSB7CisJCQlDbGVhbnVwTW9kZSBkZWZhdWx0TW9kZSA9IGdldENsZWFudXBNb2RlKCk7CisJCQlpZiAoQ2xlYW51cE1vZGUuREVGQVVMVCA9PSBkZWZhdWx0TW9kZSkgeworCQkJCXJldHVybiBkZWZhdWx0U3RyaXAgPyBDbGVhbnVwTW9kZS5TVFJJUAorCQkJCQkJOiBDbGVhbnVwTW9kZS5XSElURVNQQUNFOworCQkJfQorCQkJcmV0dXJuIGRlZmF1bHRNb2RlOworCQl9CisJCXJldHVybiBtb2RlOworCX0KKworCS8qKgogCSAqIEdldCB0aGUgY29udGVudCB0byB0aGUgY29tbWl0IHRlbXBsYXRlIGFzIGRlZmluZWQgaW4KIAkgKiB7QGNvZGUgY29tbWl0LnRlbXBsYXRlfS4gSWYgbm8ge0Bjb2RlIGkxOG4uY29tbWl0RW5jb2Rpbmd9IGlzIHNwZWNpZmllZCwKIAkgKiBVVEYtOCBmYWxsYmFjayBpcyB1c2VkLgpAQCAtMTM1LDQgKzI5OCwxMjMgQEAgcHJpdmF0ZSBDaGFyc2V0IGdldEVuY29kaW5nKCkgdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCiAJCXJldHVybiBjb21taXRNZXNzYWdlRW5jb2Rpbmc7CiAJfQorCisJLyoqCisJICogUHJvY2Vzc2VzIGEgdGV4dCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBDbGVhbnVwTW9kZX0uCisJICoKKwkgKiBAcGFyYW0gdGV4dAorCSAqICAgICAgICAgICAgdGV4dCB0byBwcm9jZXNzCisJICogQHBhcmFtIG1vZGUKKwkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZX0gdG8gdXNlCisJICogQHBhcmFtIGNvbW1lbnRDaGFyCisJICogICAgICAgICAgICBjb21tZW50IGNoYXJhY3RlciAobm9ybWFsbHkge0Bjb2RlICN9KSB0byB1c2UgaWYge0Bjb2RlIG1vZGV9CisJICogICAgICAgICAgICBpcyB7QGxpbmsgQ2xlYW51cE1vZGUjU1RSSVB9IG9yIHtAbGluayBDbGVhbnVwTW9kZSNTQ0lTU09SU30KKwkgKiBAcmV0dXJuIHRoZSBwcm9jZXNzZWQgdGV4dAorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIG1vZGV9IGlzIHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfSAodXNlCisJICogICAgICAgICAgICAge0BsaW5rICNyZXNvbHZlKENsZWFudXBNb2RlLCBib29sZWFuKX0gZmlyc3QpCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuVGV4dChATm9uTnVsbCBTdHJpbmcgdGV4dCwKKwkJCUBOb25OdWxsIENsZWFudXBNb2RlIG1vZGUsIGNoYXIgY29tbWVudENoYXIpIHsKKwkJU3RyaW5nIHRvUHJvY2VzcyA9IHRleHQ7CisJCWJvb2xlYW4gc3RyaXAgPSBmYWxzZTsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgVkVSQkFUSU06CisJCQlyZXR1cm4gdGV4dDsKKwkJY2FzZSBTQ0lTU09SUzoKKwkJCVN0cmluZyBjdXQgPSBjb21tZW50Q2hhciArIENVVDsKKwkJCWlmICh0ZXh0LnN0YXJ0c1dpdGgoY3V0KSkgeworCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaW50IGN1dFBvcyA9IHRleHQuaW5kZXhPZignXG4nICsgY3V0KTsKKwkJCWlmIChjdXRQb3MgPj0gMCkgeworCQkJCXRvUHJvY2VzcyA9IHRleHQuc3Vic3RyaW5nKDAsIGN1dFBvcyArIDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RSSVA6CisJCQlzdHJpcCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBXSElURVNQQUNFOgorCQkJYnJlYWs7CisJCWNhc2UgREVGQVVMVDoKKwkJZGVmYXVsdDoKKwkJCS8vIEludGVybmFsIGVycm9yOyBubyB0cmFuc2xhdGlvbgorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjbGVhbi11cCBtb2RlICIgKyBtb2RlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCS8vIFdISVRFU1BBQ0UKKwkJU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlib29sZWFuIGxhc3RXYXNFbXB0eSA9IHRydWU7CisJCWZvciAoU3RyaW5nIGxpbmUgOiB0b1Byb2Nlc3Muc3BsaXQoIlxuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJbGluZSA9IGxpbmUuc3RyaXBUcmFpbGluZygpOworCQkJaWYgKGxpbmUuaXNFbXB0eSgpKSB7CisJCQkJaWYgKCFsYXN0V2FzRW1wdHkpIHsKKwkJCQkJcmVzdWx0LmFwcGVuZCgnXG4nKTsKKwkJCQkJbGFzdFdhc0VtcHR5ID0gdHJ1ZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCFzdHJpcCB8fCAhaXNDb21tZW50KGxpbmUsIGNvbW1lbnRDaGFyKSkgeworCQkJCWxhc3RXYXNFbXB0eSA9IGZhbHNlOworCQkJCXJlc3VsdC5hcHBlbmQobGluZSkuYXBwZW5kKCdcbicpOworCQkJfQorCQl9CisJCWludCBidWZmZXJTaXplID0gcmVzdWx0Lmxlbmd0aCgpOworCQlpZiAobGFzdFdhc0VtcHR5ICYmIGJ1ZmZlclNpemUgPiAwKSB7CisJCQlidWZmZXJTaXplLS07CisJCQlyZXN1bHQuc2V0TGVuZ3RoKGJ1ZmZlclNpemUpOworCQl9CisJCWlmIChidWZmZXJTaXplID4gMCAmJiAhdG9Qcm9jZXNzLmVuZHNXaXRoKCJcbiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChyZXN1bHQuY2hhckF0KGJ1ZmZlclNpemUgLSAxKSA9PSAnXG4nKSB7CisJCQkJcmVzdWx0LnNldExlbmd0aChidWZmZXJTaXplIC0gMSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb21tZW50KFN0cmluZyB0ZXh0LCBjaGFyIGNvbW1lbnRDaGFyKSB7CisJCWludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQljaGFyIGNoID0gdGV4dC5jaGFyQXQoaSk7CisJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKSB7CisJCQkJcmV0dXJuIGNoID09IGNvbW1lbnRDaGFyOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBEZXRlcm1pbmVzIGEgY29tbWVudCBjaGFyYWN0ZXIgYnkgY2hvb3Npbmcgb25lIGZyb20gYSBsaW1pdGVkIHNldCBvZgorCSAqIDctYml0IEFTQ0lJIGNoYXJhY3RlcnMgdGhhdCBkbyBub3Qgb2NjdXIgaW4gdGhlIGdpdmVuIHRleHQgYXQgdGhlCisJICogYmVnaW5uaW5nIG9mIGFueSBsaW5lLiBJZiBub25lIGNhbiBiZSBkZXRlcm1pbmVkLCB7QGNvZGUgKGNoYXIpIDB9IGlzCisJICogcmV0dXJuZWQuCisJICoKKwkgKiBAcGFyYW0gdGV4dAorCSAqICAgICAgICAgICAgdG8gZ2V0IGEgY29tbWVudCBjaGFyYWN0ZXIgZm9yCisJICogQHJldHVybiB0aGUgY29tbWVudCBjaGFyYWN0ZXIsIG9yIHtAY29kZSAoY2hhcikgMH0gaWYgbm9uZSBjb3VsZCBiZQorCSAqICAgICAgICAgZGV0ZXJtaW5lZAorCSAqIEBzaW5jZSA2LjIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNoYXIgZGV0ZXJtaW5lQ29tbWVudENoYXIoU3RyaW5nIHRleHQpIHsKKwkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwodGV4dCkpIHsKKwkJCXJldHVybiAnIyc7CisJCX0KKwkJZmluYWwgYm9vbGVhbltdIGluVXNlID0gbmV3IGJvb2xlYW5bMTI3XTsKKwkJZm9yIChTdHJpbmcgbGluZSA6IHRleHQuc3BsaXQoIlxuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJaW50IGxlbiA9IGxpbmUubGVuZ3RoKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjaCA9IGxpbmUuY2hhckF0KGkpOworCQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKKwkJCQkJaWYgKGNoID49IDAgJiYgY2ggPCBpblVzZS5sZW5ndGgpIHsKKwkJCQkJCWluVXNlW2NoXSA9IHRydWU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWZvciAoY2hhciBjYW5kaWRhdGUgOiBDT01NRU5UX0NIQVJTKSB7CisJCQlpZiAoIWluVXNlW2NhbmRpZGF0ZV0pIHsKKwkJCQlyZXR1cm4gY2FuZGlkYXRlOworCQkJfQorCQl9CisJCXJldHVybiAoY2hhcikgMDsKKwl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQppbmRleCAxY2UzZTMxLi5kMWQ2NmQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQpAQCAtMjc4LDYgKzI3OCw1NCBAQCBwdWJsaWMgaW50IGdldEludChmaW5hbCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCiAJfQogCiAJLyoqCisJICogT2J0YWluIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiB3aGljaCBtdXN0IGJlIGluc2lkZSBnaXZlbgorCSAqIHJhbmdlLgorCSAqCisJICogQHBhcmFtIHNlY3Rpb24KKwkgKiAgICAgICAgICAgIHNlY3Rpb24gdGhlIGtleSBpcyBncm91cGVkIHdpdGhpbi4KKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUga2V5IHRvIGdldC4KKwkgKiBAcGFyYW0gbWluVmFsdWUKKwkgKiAgICAgICAgICAgIG1pbmltdW0gdmFsdWUKKwkgKiBAcGFyYW0gbWF4VmFsdWUKKwkgKiAgICAgICAgICAgIG1heGltdW0gdmFsdWUKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisJICogICAgICAgICAgICBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBubyB2YWx1ZSB3YXMgcHJlc2VudC4KKwkgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgb3IgZGVmYXVsdFZhbHVlLgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgaW50IGdldEludEluUmFuZ2UoU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBuYW1lLCBpbnQgbWluVmFsdWUsCisJCQlpbnQgbWF4VmFsdWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKwkJcmV0dXJuIHR5cGVkR2V0dGVyLmdldEludEluUmFuZ2UodGhpcywgc2VjdGlvbiwgbnVsbCwgbmFtZSwgbWluVmFsdWUsCisJCQkJbWF4VmFsdWUsIGRlZmF1bHRWYWx1ZSk7CisJfQorCisJLyoqCisJICogT2J0YWluIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiB3aGljaCBtdXN0IGJlIGluc2lkZSBnaXZlbgorCSAqIHJhbmdlLgorCSAqCisJICogQHBhcmFtIHNlY3Rpb24KKwkgKiAgICAgICAgICAgIHNlY3Rpb24gdGhlIGtleSBpcyBncm91cGVkIHdpdGhpbi4KKwkgKiBAcGFyYW0gc3Vic2VjdGlvbgorCSAqICAgICAgICAgICAgc3Vic2VjdGlvbiBuYW1lLCBzdWNoIGEgcmVtb3RlIG9yIGJyYW5jaCBuYW1lLgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBrZXkgdG8gZ2V0LgorCSAqIEBwYXJhbSBtaW5WYWx1ZQorCSAqICAgICAgICAgICAgbWluaW11bSB2YWx1ZQorCSAqIEBwYXJhbSBtYXhWYWx1ZQorCSAqICAgICAgICAgICAgbWF4aW11bSB2YWx1ZQorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKwkgKiAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG5vIHZhbHVlIHdhcyBwcmVzZW50LgorCSAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLCBvciBkZWZhdWx0VmFsdWUuCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW50SW5SYW5nZShTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sIFN0cmluZyBuYW1lLAorCQkJaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKwkJcmV0dXJuIHR5cGVkR2V0dGVyLmdldEludEluUmFuZ2UodGhpcywgc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSwKKwkJCQltaW5WYWx1ZSwgbWF4VmFsdWUsIGRlZmF1bHRWYWx1ZSk7CisJfQorCisJLyoqCiAJICogT2J0YWluIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KIAkgKgogCSAqIEBwYXJhbSBzZWN0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhCmluZGV4IDRiMjFlNGIuLjIzNDJjYWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhCkBAIC0yLDcgKzIsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXRoaWFzIEtpbnpsZXIgPG1hdGhpYXMua2luemxlckBzYXAuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDEwLCBDaHJpcyBBbmlzemN6eWsgPGNhbmlzemN6eWtAZ21haWwuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMsIFJvYmluIFJvc2VuYmVyZwotICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIyLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw2ICsxMCw3IEBACiAgKgogICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQogICovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CiAKIC8qKgpAQCAtMzEsMTQgKzMyLDE0IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19ESUZGX1NFQ1RJT04gPSAiZGlmZiI7CiAKIAkvKioKLQkgKiBUaGUgInRvb2wiIGtleSB3aXRoaW4gImRpZmYiIHNlY3Rpb24KKwkgKiBUaGUgInRvb2wiIGtleSB3aXRoaW4gImRpZmYiIG9yICJtZXJnZSIgc2VjdGlvbgogCSAqCiAJICogQHNpbmNlIDYuMQogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfVE9PTCA9ICJ0b29sIjsKIAogCS8qKgotCSAqIFRoZSAiZ3VpdG9vbCIga2V5IHdpdGhpbiAiZGlmZiIgc2VjdGlvbgorCSAqIFRoZSAiZ3VpdG9vbCIga2V5IHdpdGhpbiAiZGlmZiIgb3IgIm1lcmdlIiBzZWN0aW9uCiAJICoKIAkgKiBAc2luY2UgNi4xCiAJICovCkBAIC01MiwyMSArNTMsMjEgQEAgcHVibGljIGZpbmFsIGNsYXNzIENvbmZpZ0NvbnN0YW50cyB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0RJRkZUT09MX1NFQ1RJT04gPSAiZGlmZnRvb2wiOwogCiAJLyoqCi0JICogVGhlICJwcm9tcHQiIGtleSB3aXRoaW4gImRpZmZ0b29sIiBzZWN0aW9uCisJICogVGhlICJwcm9tcHQiIGtleSB3aXRoaW4gImRpZmZ0b29sIiBvciAibWVyZ2V0b29sIiBzZWN0aW9uCiAJICoKIAkgKiBAc2luY2UgNi4xCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9QUk9NUFQgPSAicHJvbXB0IjsKIAogCS8qKgotCSAqIFRoZSAidHJ1c3RFeGl0Q29kZSIga2V5IHdpdGhpbiAiZGlmZnRvb2wiIHNlY3Rpb24KKwkgKiBUaGUgInRydXN0RXhpdENvZGUiIGtleSB3aXRoaW4gImRpZmZ0b29sIiBvciAibWVyZ2V0b29sLjxuYW1lPi4iIHNlY3Rpb24KIAkgKgogCSAqIEBzaW5jZSA2LjEKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERSA9ICJ0cnVzdEV4aXRDb2RlIjsKIAogCS8qKgotCSAqIFRoZSAiY21kIiBrZXkgd2l0aGluICJkaWZmdG9vbC4qLiIgc2VjdGlvbgorCSAqIFRoZSAiY21kIiBrZXkgd2l0aGluICJkaWZmdG9vbC4qLiIgb3IgIm1lcmdldG9vbC4qLiIgc2VjdGlvbgogCSAqCiAJICogQHNpbmNlIDYuMQogCSAqLwpAQCAtMTI0LDYgKzEyNSwzNCBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlnQ29uc3RhbnRzIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfTUVSR0VfU0VDVElPTiA9ICJtZXJnZSI7CiAKIAkvKioKKwkgKiBUaGUgIm1lcmdldG9vbCIgc2VjdGlvbgorCSAqCisJICogQHNpbmNlIDYuMgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19NRVJHRVRPT0xfU0VDVElPTiA9ICJtZXJnZXRvb2wiOworCisJLyoqCisJICogVGhlICJrZWVwQmFja3VwIiBrZXkgd2l0aGluICJtZXJnZXRvb2wiIHNlY3Rpb24KKwkgKgorCSAqIEBzaW5jZSA2LjIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0tFRVBfQkFDS1VQID0gImtlZXBCYWNrdXAiOworCisJLyoqCisJICogVGhlICJrZWVwVGVtcG9yYXJpZXMiIGtleSB3aXRoaW4gIm1lcmdldG9vbCIgc2VjdGlvbgorCSAqCisJICogQHNpbmNlIDYuMgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfS0VFUF9URU1QT1JBUklFUyA9ICJrZWVwVGVtcG9yYXJpZXMiOworCisJLyoqCisJICogVGhlICJ3cml0ZVRvVGVtcCIga2V5IHdpdGhpbiAibWVyZ2V0b29sIiBzZWN0aW9uCisJICoKKwkgKiBAc2luY2UgNi4yCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9XUklURV9UT19URU1QID0gIndyaXRlVG9UZW1wIjsKKworCS8qKgogCSAqIFRoZSAiZmlsdGVyIiBzZWN0aW9uCiAJICogQHNpbmNlIDQuNgogCSAqLwpAQCAtMTgyLDYgKzIxMSwxMyBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlnQ29uc3RhbnRzIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfVEFHX1NFQ1RJT04gPSAidGFnIjsKIAogCS8qKgorCSAqIFRoZSAiY2xlYW51cCIga2V5CisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9DTEVBTlVQID0gImNsZWFudXAiOworCisJLyoqCiAJICogVGhlICJncGdTaWduIiBrZXkKIAkgKgogCSAqIEBzaW5jZSA1LjIKQEAgLTE5Niw2ICsyMzIsMTMgQEAgcHVibGljIGZpbmFsIGNsYXNzIENvbmZpZ0NvbnN0YW50cyB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9GT1JDRV9TSUdOX0FOTk9UQVRFRCA9ICJmb3JjZVNpZ25Bbm5vdGF0ZWQiOwogCiAJLyoqCisJICogVGhlICJjb21tZW50Q2hhciIga2V5LgorCSAqCisJICogQHNpbmNlIDYuMgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfQ09NTUVOVF9DSEFSID0gImNvbW1lbnRDaGFyIjsKKworCS8qKgogCSAqIFRoZSAiaG9va3NQYXRoIiBrZXkuCiAJICoKIAkgKiBAc2luY2UgNS42CkBAIC0zMjIsNiArMzY1LDIwIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCS8qKiBUaGUgInJlbW90ZSIga2V5ICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9SRU1PVEUgPSAicmVtb3RlIjsKIAorCS8qKgorCSAqIFRoZSAicHVzaFJlbW90ZSIga2V5LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfUFVTSF9SRU1PVEUgPSAicHVzaFJlbW90ZSI7CisKKwkvKioKKwkgKiBUaGUgInB1c2hEZWZhdWx0IiBrZXkuCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9QVVNIX0RFRkFVTFQgPSAicHVzaERlZmF1bHQiOworCiAJLyoqIFRoZSAibWVyZ2UiIGtleSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfTUVSR0UgPSAibWVyZ2UiOwogCkBAIC04MDEsNCArODU4LDI1IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfU0VBUkNIX0ZPUl9SRVVTRV9USU1FT1VUID0gInNlYXJjaGZvcnJldXNldGltZW91dCI7CiAKKwkvKioKKwkgKiBUaGUgInB1c2giIHNlY3Rpb24uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1BVU0hfU0VDVElPTiA9ICJwdXNoIjsKKworCS8qKgorCSAqIFRoZSAiZGVmYXVsdCIga2V5LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfREVGQVVMVCA9ICJkZWZhdWx0IjsKKworCS8qKgorCSAqIFRoZSAiYWJicmV2IiBrZXkKKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0FCQlJFViA9ICJhYmJyZXYiOworCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCmluZGV4IDkyMzY3ZWIuLmNmMmU2OWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhCkBAIC00OCw2ICs0OCwxNSBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCA9IE9CSkVDVF9JRF9MRU5HVEggKiAyOwogCisJLyoqCisJICogVGhlIGhpc3RvcmljIGxlbmd0aCBvZiBhbiBhYmJyZXZpYXRlZCBHaXQgb2JqZWN0IGhhc2ggc3RyaW5nLiBHaXQgMi4xMQorCSAqIGNoYW5nZWQgdGhpcyBzdGF0aWMgbnVtYmVyIHRvIGEgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBvbmUgdGhhdCBzY2FsZXMKKwkgKiBhcyB0aGUgcmVwb3NpdG9yeSBncm93cy4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEggPSA3OworCiAJLyoqIFNwZWNpYWwgbmFtZSBmb3IgdGhlICJIRUFEIiBzeW1ib2xpYy1yZWYuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9ICJIRUFEIjsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRGVmYXVsdFR5cGVkQ29uZmlnR2V0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YQppbmRleCA5Zjk2YmNlLi44NjQwOTQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YQpAQCAtMTIwLDYgKzEyMCwyNiBAQCBwdWJsaWMgaW50IGdldEludChDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgZ2V0SW50SW5SYW5nZShDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCisJCQlTdHJpbmcgbmFtZSwgaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKwkJaW50IHZhbCA9IGdldEludChjb25maWcsIHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUsIGRlZmF1bHRWYWx1ZSk7CisJCWlmICgodmFsID49IG1pblZhbHVlICYmIHZhbCA8PSBtYXhWYWx1ZSkgfHwgdmFsID09IFVOU0VUX0lOVCkgeworCQkJcmV0dXJuIHZhbDsKKwkJfQorCQlpZiAoc3Vic2VjdGlvbiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnRlZ2VyVmFsdWVOb3RJblJhbmdlLCBzZWN0aW9uLCBuYW1lLAorCQkJCQlJbnRlZ2VyLnZhbHVlT2YodmFsKSwgSW50ZWdlci52YWx1ZU9mKG1pblZhbHVlKSwKKwkJCQkJSW50ZWdlci52YWx1ZU9mKG1heFZhbHVlKSkpOworCQl9CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJSkdpdFRleHQuZ2V0KCkuaW50ZWdlclZhbHVlTm90SW5SYW5nZVN1YlNlY3Rpb24sIHNlY3Rpb24sCisJCQkJc3Vic2VjdGlvbiwgbmFtZSwgSW50ZWdlci52YWx1ZU9mKHZhbCksCisJCQkJSW50ZWdlci52YWx1ZU9mKG1pblZhbHVlKSwgSW50ZWdlci52YWx1ZU9mKG1heFZhbHVlKSkpOworCX0KKworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCiAJcHVibGljIGxvbmcgZ2V0TG9uZyhDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCiAJCQlTdHJpbmcgbmFtZSwgbG9uZyBkZWZhdWx0VmFsdWUpIHsKIAkJZmluYWwgU3RyaW5nIHN0ciA9IGNvbmZpZy5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9HcGdTaWduYXR1cmVWZXJpZmllckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0dwZ1NpZ25hdHVyZVZlcmlmaWVyRmFjdG9yeS5qYXZhCmluZGV4IDRiMWRiZWQuLjU5Nzc1YzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0dwZ1NpZ25hdHVyZVZlcmlmaWVyRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0dwZ1NpZ25hdHVyZVZlcmlmaWVyRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgMjAyMiBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMjYsMjAgKzI2LDQxIEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcGdTaWduYXR1cmVWZXJpZmllckZhY3RvcnkgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5CiAJCQkuZ2V0TG9nZ2VyKEdwZ1NpZ25hdHVyZVZlcmlmaWVyRmFjdG9yeS5jbGFzcyk7CiAKLQlwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBHcGdTaWduYXR1cmVWZXJpZmllckZhY3RvcnkgZGVmYXVsdEZhY3RvcnkgPSBsb2FkRGVmYXVsdCgpOworCXByaXZhdGUgc3RhdGljIGNsYXNzIERlZmF1bHRGYWN0b3J5IHsKIAotCXByaXZhdGUgc3RhdGljIEdwZ1NpZ25hdHVyZVZlcmlmaWVyRmFjdG9yeSBsb2FkRGVmYXVsdCgpIHsKLQkJdHJ5IHsKLQkJCVNlcnZpY2VMb2FkZXI8R3BnU2lnbmF0dXJlVmVyaWZpZXJGYWN0b3J5PiBsb2FkZXIgPSBTZXJ2aWNlTG9hZGVyCi0JCQkJCS5sb2FkKEdwZ1NpZ25hdHVyZVZlcmlmaWVyRmFjdG9yeS5jbGFzcyk7Ci0JCQlJdGVyYXRvcjxHcGdTaWduYXR1cmVWZXJpZmllckZhY3Rvcnk+IGl0ZXIgPSBsb2FkZXIuaXRlcmF0b3IoKTsKLQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCXJldHVybiBpdGVyLm5leHQoKTsKKwkJcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgR3BnU2lnbmF0dXJlVmVyaWZpZXJGYWN0b3J5IGRlZmF1bHRGYWN0b3J5ID0gbG9hZERlZmF1bHQoKTsKKworCQlwcml2YXRlIHN0YXRpYyBHcGdTaWduYXR1cmVWZXJpZmllckZhY3RvcnkgbG9hZERlZmF1bHQoKSB7CisJCQl0cnkgeworCQkJCVNlcnZpY2VMb2FkZXI8R3BnU2lnbmF0dXJlVmVyaWZpZXJGYWN0b3J5PiBsb2FkZXIgPSBTZXJ2aWNlTG9hZGVyCisJCQkJCQkubG9hZChHcGdTaWduYXR1cmVWZXJpZmllckZhY3RvcnkuY2xhc3MpOworCQkJCUl0ZXJhdG9yPEdwZ1NpZ25hdHVyZVZlcmlmaWVyRmFjdG9yeT4gaXRlciA9IGxvYWRlci5pdGVyYXRvcigpOworCQkJCWlmIChpdGVyLmhhc05leHQoKSkgeworCQkJCQlyZXR1cm4gaXRlci5uZXh0KCk7CisJCQkJfQorCQkJfSBjYXRjaCAoU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7CisJCQkJTE9HLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKIAkJCX0KLQkJfSBjYXRjaCAoU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMT0cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJcmV0dXJuIG51bGw7CisKKwkJcHJpdmF0ZSBEZWZhdWx0RmFjdG9yeSgpIHsKKwkJCS8vIE5vIGluc3RhbnRpYXRpb24KKwkJfQorCisJCXB1YmxpYyBzdGF0aWMgR3BnU2lnbmF0dXJlVmVyaWZpZXJGYWN0b3J5IGdldERlZmF1bHQoKSB7CisJCQlyZXR1cm4gZGVmYXVsdEZhY3Rvcnk7CisJCX0KKworCQkvKioKKwkJICogU2V0cyB0aGUgZGVmYXVsdCBmYWN0b3J5LgorCQkgKgorCQkgKiBAcGFyYW0gZmFjdG9yeQorCQkgKiAgICAgICAgICAgIHRoZSBuZXcgZGVmYXVsdCBmYWN0b3J5CisJCSAqLworCQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdChHcGdTaWduYXR1cmVWZXJpZmllckZhY3RvcnkgZmFjdG9yeSkgeworCQkJZGVmYXVsdEZhY3RvcnkgPSBmYWN0b3J5OworCQl9CiAJfQogCiAJLyoqCkBAIC00OCw3ICs2OSw3IEBAIHByaXZhdGUgc3RhdGljIEdwZ1NpZ25hdHVyZVZlcmlmaWVyRmFjdG9yeSBsb2FkRGVmYXVsdCgpIHsKIAkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGZhY3Rvcnkgb3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUgc2V0CiAJICovCiAJcHVibGljIHN0YXRpYyBHcGdTaWduYXR1cmVWZXJpZmllckZhY3RvcnkgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRGYWN0b3J5OworCQlyZXR1cm4gRGVmYXVsdEZhY3RvcnkuZ2V0RGVmYXVsdCgpOwogCX0KIAogCS8qKgpAQCAtNTgsNyArNzksNyBAQCBwdWJsaWMgc3RhdGljIEdwZ1NpZ25hdHVyZVZlcmlmaWVyRmFjdG9yeSBnZXREZWZhdWx0KCkgewogCSAqICAgICAgICAgICAgdGhlIG5ldyBkZWZhdWx0IGZhY3RvcnkKIAkgKi8KIAlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdChHcGdTaWduYXR1cmVWZXJpZmllckZhY3RvcnkgZmFjdG9yeSkgewotCQlkZWZhdWx0RmFjdG9yeSA9IGZhY3Rvcnk7CisJCURlZmF1bHRGYWN0b3J5LnNldERlZmF1bHQoZmFjdG9yeSk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9HcGdTaWduZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0dwZ1NpZ25lci5qYXZhCmluZGV4IDViMzJjZjAuLmIyNWE2MWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0dwZ1NpZ25lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0dwZ1NpZ25lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCwgU2FsZXNmb3JjZS4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIyIFNhbGVzZm9yY2UgYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMjYsMjIgKzI2LDM4IEBACiAgKiBAc2luY2UgNS4zCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcGdTaWduZXIgeworCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdwZ1NpZ25lci5jbGFzcyk7CiAKLQlwcml2YXRlIHN0YXRpYyBHcGdTaWduZXIgZGVmYXVsdFNpZ25lciA9IGxvYWRHcGdTaWduZXIoKTsKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZhdWx0U2lnbmVyIHsKIAotCXByaXZhdGUgc3RhdGljIEdwZ1NpZ25lciBsb2FkR3BnU2lnbmVyKCkgewotCQl0cnkgewotCQkJU2VydmljZUxvYWRlcjxHcGdTaWduZXI+IGxvYWRlciA9IFNlcnZpY2VMb2FkZXIKLQkJCQkJLmxvYWQoR3BnU2lnbmVyLmNsYXNzKTsKLQkJCUl0ZXJhdG9yPEdwZ1NpZ25lcj4gaXRlciA9IGxvYWRlci5pdGVyYXRvcigpOwotCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJcmV0dXJuIGl0ZXIubmV4dCgpOworCQlwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBHcGdTaWduZXIgZGVmYXVsdFNpZ25lciA9IGxvYWRHcGdTaWduZXIoKTsKKworCQlwcml2YXRlIHN0YXRpYyBHcGdTaWduZXIgbG9hZEdwZ1NpZ25lcigpIHsKKwkJCXRyeSB7CisJCQkJU2VydmljZUxvYWRlcjxHcGdTaWduZXI+IGxvYWRlciA9IFNlcnZpY2VMb2FkZXIKKwkJCQkJCS5sb2FkKEdwZ1NpZ25lci5jbGFzcyk7CisJCQkJSXRlcmF0b3I8R3BnU2lnbmVyPiBpdGVyID0gbG9hZGVyLml0ZXJhdG9yKCk7CisJCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJCXJldHVybiBpdGVyLm5leHQoKTsKKwkJCQl9CisJCQl9IGNhdGNoIChTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIGUpIHsKKwkJCQlMT0cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwogCQkJfQotCQl9IGNhdGNoIChTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCUxPRy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gbnVsbDsKKworCQlwcml2YXRlIERlZmF1bHRTaWduZXIoKSB7CisJCQkvLyBObyBpbnN0YW50aWF0aW9uCisJCX0KKworCQlwdWJsaWMgc3RhdGljIEdwZ1NpZ25lciBnZXREZWZhdWx0KCkgeworCQkJcmV0dXJuIGRlZmF1bHRTaWduZXI7CisJCX0KKworCQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdChHcGdTaWduZXIgc2lnbmVyKSB7CisJCQlkZWZhdWx0U2lnbmVyID0gc2lnbmVyOworCQl9CiAJfQogCiAJLyoqCkBAIC01MCw3ICs2Niw3IEBAIHByaXZhdGUgc3RhdGljIEdwZ1NpZ25lciBsb2FkR3BnU2lnbmVyKCkgewogCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc2lnbmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIEdwZ1NpZ25lciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmYXVsdFNpZ25lcjsKKwkJcmV0dXJuIERlZmF1bHRTaWduZXIuZ2V0RGVmYXVsdCgpOwogCX0KIAogCS8qKgpAQCAtNjEsNyArNzcsNyBAQCBwdWJsaWMgc3RhdGljIEdwZ1NpZ25lciBnZXREZWZhdWx0KCkgewogCSAqICAgICAgICAgICAgZGVmYXVsdC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdChHcGdTaWduZXIgc2lnbmVyKSB7Ci0JCUdwZ1NpZ25lci5kZWZhdWx0U2lnbmVyID0gc2lnbmVyOworCQlEZWZhdWx0U2lnbmVyLnNldERlZmF1bHQoc2lnbmVyKTsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKaW5kZXggMjhlYTkyNy4uZGY5ZmQ0NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKQEAgLTU2OCw2ICs1NjgsOSBAQCBwdWJsaWMgYm9vbGVhbiBkaWZmKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgZXN0V29ya1RyZWVTaXplLAogCQlpZiAoaWdub3JlU3VibW9kdWxlTW9kZSAhPSBJZ25vcmVTdWJtb2R1bGVNb2RlLkFMTCkgewogCQkJdHJ5IChTdWJtb2R1bGVXYWxrIHNtdyA9IG5ldyBTdWJtb2R1bGVXYWxrKHJlcG9zaXRvcnkpKSB7CiAJCQkJc213LnNldFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IoZGlyQ2FjaGUpKTsKKwkJCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKKwkJCQkJc213LnNldEZpbHRlcihmaWx0ZXIpOworCQkJCX0KIAkJCQlzbXcuc2V0QnVpbGRlckZhY3RvcnkoZmFjdG9yeSk7CiAJCQkJd2hpbGUgKHNtdy5uZXh0KCkpIHsKIAkJCQkJSWdub3JlU3VibW9kdWxlTW9kZSBsb2NhbElnbm9yZVN1Ym1vZHVsZU1vZGUgPSBpZ25vcmVTdWJtb2R1bGVNb2RlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEKaW5kZXggMDQyNjJjMC4uNzAwMDljYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhCkBAIC0xNTUsNCArMTU1LDE0IEBAIHB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihBbnlPYmplY3RJZCBvYmplY3RJZCwgaW50IHR5cGVIaW50KQogCXB1YmxpYyBPYmplY3REYXRhYmFzZSBuZXdDYWNoZWREYXRhYmFzZSgpIHsKIAkJcmV0dXJuIHRoaXM7CiAJfQorCisJLyoqCisJICogR2V0IGEgcXVpY2ssIHJvdWdoIGNvdW50IG9mIG9iamVjdHMgaW4gdGhpcyByZXBvc2l0b3J5LiBJZ25vcmVzIGxvb3NlCisJICogb2JqZWN0cy4gUmV0dXJucyB7QGNvZGUgLTF9IGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCisJICoKKwkgKiBAcmV0dXJuIHF1aWNrLCByb3VnaCBjb3VudCBvZiBvYmplY3RzIGluIHRoaXMgcmVwb3NpdG9yeSwge0Bjb2RlIC0xfSBpZgorCSAqICAgICAgICAgYW4gZXhjZXB0aW9uIG9jY3VycworCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdFJlYWRlci5qYXZhCmluZGV4IGEyYzczODEuLjI2YzNmZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdFJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdFJlYWRlci5qYXZhCkBAIC0xMCw2ICsxMCw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTc2LDcgKzc4LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIE9iamVjdFJlYWRlciBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgewogCSAqLwogCXB1YmxpYyBBYmJyZXZpYXRlZE9iamVjdElkIGFiYnJldmlhdGUoQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gYWJicmV2aWF0ZShvYmplY3RJZCwgNyk7CisJCXJldHVybiBhYmJyZXZpYXRlKG9iamVjdElkLCBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEKaW5kZXggNDI4YTZiOS4uOTM3MTAyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhCkBAIC0xNCw2ICsxNCw4IEBACiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnRpbWUuWm9uZUlkOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwpAQCAtMjA2LDYgKzIwOCwyMCBAQCBwdWJsaWMgUGVyc29uSWRlbnQoUGVyc29uSWRlbnQgcGksIERhdGUgYVdoZW4pIHsKIAl9CiAKIAkvKioKKwkgKiBDb3B5IGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50fSwgYnV0IGFsdGVyIHRoZSBjbG9uZSdzCisJICogdGltZSBzdGFtcAorCSAqCisJICogQHBhcmFtIHBpCisJICogICAgICAgICAgICBvcmlnaW5hbCB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnR9CisJICogQHBhcmFtIGFXaGVuCisJICogICAgICAgICAgICBsb2NhbCB0aW1lIGFzIEluc3RhbnQKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFBlcnNvbklkZW50KFBlcnNvbklkZW50IHBpLCBJbnN0YW50IGFXaGVuKSB7CisJCXRoaXMocGkuZ2V0TmFtZSgpLCBwaS5nZXRFbWFpbEFkZHJlc3MoKSwgYVdoZW4udG9FcG9jaE1pbGxpKCksIHBpLnR6T2Zmc2V0KTsKKwl9CisKKwkvKioKIAkgKiBDb25zdHJ1Y3QgYSBQZXJzb25JZGVudCBmcm9tIHNpbXBsZSBkYXRhCiAJICoKIAkgKiBAcGFyYW0gYU5hbWUgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgpAQCAtMjIyLDYgKzIzOCwyNyBAQCBwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgU3RyaW5nIGFOYW1lLCBmaW5hbCBTdHJpbmcgYUVtYWlsQWRkcmVzcywKIAl9CiAKIAkvKioKKwkgKiBDb25zdHJ1Y3QgYSBQZXJzb25JZGVudCBmcm9tIHNpbXBsZSBkYXRhCisJICoKKwkgKiBAcGFyYW0gYU5hbWUKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KKwkgKiBAcGFyYW0gYUVtYWlsQWRkcmVzcworCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgorCSAqIEBwYXJhbSBhV2hlbgorCSAqICAgICAgICAgICAgbG9jYWwgdGltZSBzdGFtcAorCSAqIEBwYXJhbSB6b25lSWQKKwkgKiAgICAgICAgICAgIHRpbWUgem9uZSBpZAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgYUVtYWlsQWRkcmVzcywgSW5zdGFudCBhV2hlbiwKKwkJCVpvbmVJZCB6b25lSWQpIHsKKwkJdGhpcyhhTmFtZSwgYUVtYWlsQWRkcmVzcywgYVdoZW4udG9FcG9jaE1pbGxpKCksCisJCQkJVGltZVpvbmUuZ2V0VGltZVpvbmUoem9uZUlkKQorCQkJCQkJLmdldE9mZnNldChhV2hlbgorCQkJCS50b0Vwb2NoTWlsbGkoKSkgLyAoNjAgKiAxMDAwKSk7CisJfQorCisJLyoqCiAJICogQ29weSBhIFBlcnNvbklkZW50LCBidXQgYWx0ZXIgdGhlIGNsb25lJ3MgdGltZSBzdGFtcAogCSAqCiAJICogQHBhcmFtIHBpCkBAIC0zMDQsNiArMzQxLDE2IEBAIHB1YmxpYyBEYXRlIGdldFdoZW4oKSB7CiAJfQogCiAJLyoqCisJICogR2V0IHdoZW4gYXR0cmlidXRlIGFzIGluc3RhbnQKKwkgKgorCSAqIEByZXR1cm4gdGltZXN0YW1wCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBJbnN0YW50IGdldFdoZW5Bc0luc3RhbnQoKSB7CisJCXJldHVybiBJbnN0YW50Lm9mRXBvY2hNaWxsaSh3aGVuKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhpcyBwZXJzb24ncyBkZWNsYXJlZCB0aW1lIHpvbmUKIAkgKgogCSAqIEByZXR1cm4gdGhpcyBwZXJzb24ncyBkZWNsYXJlZCB0aW1lIHpvbmU7IG51bGwgaWYgdGltZSB6b25lIGlzIHVua25vd24uCkBAIC0zMTMsNiArMzYwLDE2IEBAIHB1YmxpYyBUaW1lWm9uZSBnZXRUaW1lWm9uZSgpIHsKIAl9CiAKIAkvKioKKwkgKiBHZXQgdGhlIHRpbWUgem9uZSBpZAorCSAqCisJICogQHJldHVybiB0aGUgdGltZSB6b25lIGlkCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBab25lSWQgZ2V0Wm9uZUlkKCkgeworCQlyZXR1cm4gZ2V0VGltZVpvbmUoKS50b1pvbmVJZCgpOworCX0KKworCS8qKgogCSAqIEdldCB0aGlzIHBlcnNvbidzIGRlY2xhcmVkIHRpbWUgem9uZSBhcyBtaW51dGVzIGVhc3Qgb2YgVVRDLgogCSAqCiAJICogQHJldHVybiB0aGlzIHBlcnNvbidzIGRlY2xhcmVkIHRpbWUgem9uZSBhcyBtaW51dGVzIGVhc3Qgb2YgVVRDLiBJZiB0aGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1R5cGVkQ29uZmlnR2V0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UeXBlZENvbmZpZ0dldHRlci5qYXZhCmluZGV4IDBmMmY2Y2YuLmM0ZWI4ZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1R5cGVkQ29uZmlnR2V0dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVHlwZWRDb25maWdHZXR0ZXIuamF2YQpAQCAtMjksNiArMjksMTMgQEAKIHB1YmxpYyBpbnRlcmZhY2UgVHlwZWRDb25maWdHZXR0ZXIgewogCiAJLyoqCisJICogVXNlIHtAY29kZSBJbnRlZ2VyI01JTl9WQUxVRX0gYXMgdW5zZXQgaW50IHZhbHVlCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRVRfSU5UID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKwkvKioKIAkgKiBHZXQgYSBib29sZWFuIHZhbHVlIGZyb20gYSBnaXQge0BsaW5rIENvbmZpZ30uCiAJICoKIAkgKiBAcGFyYW0gY29uZmlnCkBAIC04Nyw2ICs5NCwzMiBAQCBpbnQgZ2V0SW50KENvbmZpZyBjb25maWcsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwgU3RyaW5nIG5hbWUsCiAJCQlpbnQgZGVmYXVsdFZhbHVlKTsKIAogCS8qKgorCSAqIE9idGFpbiBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXQge0BsaW5rIENvbmZpZ30gd2hpY2ggbXVzdCBiZSBpbiBnaXZlbgorCSAqIHJhbmdlLgorCSAqCisJICogQHBhcmFtIGNvbmZpZworCSAqICAgICAgICAgICAgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tCisJICogQHBhcmFtIHNlY3Rpb24KKwkgKiAgICAgICAgICAgIHNlY3Rpb24gdGhlIGtleSBpcyBncm91cGVkIHdpdGhpbi4KKwkgKiBAcGFyYW0gc3Vic2VjdGlvbgorCSAqICAgICAgICAgICAgc3Vic2VjdGlvbiBuYW1lLCBzdWNoIGEgcmVtb3RlIG9yIGJyYW5jaCBuYW1lLgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBrZXkgdG8gZ2V0LgorCSAqIEBwYXJhbSBtaW5WYWx1ZQorCSAqICAgICAgICAgICAgbWluaW1hbCB2YWx1ZQorCSAqIEBwYXJhbSBtYXhWYWx1ZQorCSAqICAgICAgICAgICAgbWF4aW11bSB2YWx1ZQorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKwkgKiAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG5vIHZhbHVlIHdhcyBwcmVzZW50LiBVc2UKKwkgKiAgICAgICAgICAgIHtAY29kZSAjVU5TRVRfSU5UfSB0byBzZXQgdGhlIGRlZmF1bHQgdG8gdW5zZXQuCisJICogQHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIG9yIGRlZmF1bHRWYWx1ZS4KKwkgKiAgICAgICAgIHtAY29kZSAjVU5TRVRfSU5UfSBpZiB1bnNldC4KKwkgKiBAc2luY2UgNi4xCisJICovCisJaW50IGdldEludEluUmFuZ2UoQ29uZmlnIGNvbmZpZywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBzdWJzZWN0aW9uLAorCQkJU3RyaW5nIG5hbWUsIGludCBtaW5WYWx1ZSwgaW50IG1heFZhbHVlLCBpbnQgZGVmYXVsdFZhbHVlKTsKKworCS8qKgogCSAqIE9idGFpbiBhIGxvbmcgdmFsdWUgZnJvbSBhIGdpdCB7QGxpbmsgQ29uZmlnfS4KIAkgKgogCSAqIEBwYXJhbSBjb25maWcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlTWVzc2FnZUZvcm1hdHRlci5qYXZhCmluZGV4IGY3OTY2YTIuLmUwYzA4M2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZU1lc3NhZ2VGb3JtYXR0ZXIuamF2YQpAQCAtOTIsMzYgKzkyLDYyIEBAIHB1YmxpYyBTdHJpbmcgZm9ybWF0KExpc3Q8UmVmPiByZWZzVG9NZXJnZSwgUmVmIHRhcmdldCkgewogCX0KIAogCS8qKgotCSAqIEFkZCBzZWN0aW9uIHdpdGggY29uZmxpY3RpbmcgcGF0aHMgdG8gbWVyZ2UgbWVzc2FnZS4KKwkgKiBBZGQgc2VjdGlvbiB3aXRoIGNvbmZsaWN0aW5nIHBhdGhzIHRvIG1lcmdlIG1lc3NhZ2UuIExpbmVzIGFyZSBwcmVmaXhlZAorCSAqIHdpdGggYSBoYXNoLgogCSAqCiAJICogQHBhcmFtIG1lc3NhZ2UKIAkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBtZXJnZSBtZXNzYWdlCiAJICogQHBhcmFtIGNvbmZsaWN0aW5nUGF0aHMKIAkgKiAgICAgICAgICAgIHRoZSBwYXRocyB3aXRoIGNvbmZsaWN0cwogCSAqIEByZXR1cm4gbWVyZ2UgbWVzc2FnZSB3aXRoIGNvbmZsaWN0aW5nIHBhdGhzIGFkZGVkCisJICogQGRlcHJlY2F0ZWQgc2luY2UgNi4xOyB1c2UKKwkgKiAgICAgICAgICAgICB7QGxpbmsgI2Zvcm1hdFdpdGhDb25mbGljdHMoU3RyaW5nLCBJdGVyYWJsZSwgY2hhcil9IGluc3RlYWQKIAkgKi8KKwlARGVwcmVjYXRlZAogCXB1YmxpYyBTdHJpbmcgZm9ybWF0V2l0aENvbmZsaWN0cyhTdHJpbmcgbWVzc2FnZSwKIAkJCUxpc3Q8U3RyaW5nPiBjb25mbGljdGluZ1BhdGhzKSB7CisJCXJldHVybiBmb3JtYXRXaXRoQ29uZmxpY3RzKG1lc3NhZ2UsIGNvbmZsaWN0aW5nUGF0aHMsICcjJyk7CisJfQorCisJLyoqCisJICogQWRkIHNlY3Rpb24gd2l0aCBjb25mbGljdGluZyBwYXRocyB0byBtZXJnZSBtZXNzYWdlLgorCSAqCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBtZXJnZSBtZXNzYWdlCisJICogQHBhcmFtIGNvbmZsaWN0aW5nUGF0aHMKKwkgKiAgICAgICAgICAgIHRoZSBwYXRocyB3aXRoIGNvbmZsaWN0cworCSAqIEBwYXJhbSBjb21tZW50Q2hhcgorCSAqICAgICAgICAgICAgY29tbWVudCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBwcmVmaXhpbmcgdGhlIGNvbmZsaWN0IGxpbmVzCisJICogQHJldHVybiBtZXJnZSBtZXNzYWdlIHdpdGggY29uZmxpY3RpbmcgcGF0aHMgYWRkZWQKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFN0cmluZyBmb3JtYXRXaXRoQ29uZmxpY3RzKFN0cmluZyBtZXNzYWdlLAorCQkJSXRlcmFibGU8U3RyaW5nPiBjb25mbGljdGluZ1BhdGhzLCBjaGFyIGNvbW1lbnRDaGFyKSB7CiAJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlTdHJpbmdbXSBsaW5lcyA9IG1lc3NhZ2Uuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKIAkJaW50IGZpcnN0Rm9vdGVyTGluZSA9IENoYW5nZUlkVXRpbC5pbmRleE9mRmlyc3RGb290ZXJMaW5lKGxpbmVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJzdEZvb3RlckxpbmU7IGkrKykKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJzdEZvb3RlckxpbmU7IGkrKykgewogCQkJc2IuYXBwZW5kKGxpbmVzW2ldKS5hcHBlbmQoJ1xuJyk7Ci0JCWlmIChmaXJzdEZvb3RlckxpbmUgPT0gbGluZXMubGVuZ3RoICYmIG1lc3NhZ2UubGVuZ3RoKCkgIT0gMCkKKwkJfQorCQlpZiAoZmlyc3RGb290ZXJMaW5lID09IGxpbmVzLmxlbmd0aCAmJiBtZXNzYWdlLmxlbmd0aCgpICE9IDApIHsKIAkJCXNiLmFwcGVuZCgnXG4nKTsKLQkJYWRkQ29uZmxpY3RzTWVzc2FnZShjb25mbGljdGluZ1BhdGhzLCBzYik7Ci0JCWlmIChmaXJzdEZvb3RlckxpbmUgPCBsaW5lcy5sZW5ndGgpCisJCX0KKwkJYWRkQ29uZmxpY3RzTWVzc2FnZShjb25mbGljdGluZ1BhdGhzLCBzYiwgY29tbWVudENoYXIpOworCQlpZiAoZmlyc3RGb290ZXJMaW5lIDwgbGluZXMubGVuZ3RoKSB7CiAJCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCWZvciAoaW50IGkgPSBmaXJzdEZvb3RlckxpbmU7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykKKwkJfQorCQlmb3IgKGludCBpID0gZmlyc3RGb290ZXJMaW5lOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKIAkJCXNiLmFwcGVuZChsaW5lc1tpXSkuYXBwZW5kKCdcbicpOworCQl9CiAJCXJldHVybiBzYi50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ29uZmxpY3RzTWVzc2FnZShMaXN0PFN0cmluZz4gY29uZmxpY3RpbmdQYXRocywKLQkJCVN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCJDb25mbGljdHM6XG4iKTsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ29uZmxpY3RzTWVzc2FnZShJdGVyYWJsZTxTdHJpbmc+IGNvbmZsaWN0aW5nUGF0aHMsCisJCQlTdHJpbmdCdWlsZGVyIHNiLCBjaGFyIGNvbW1lbnRDaGFyKSB7CisJCXNiLmFwcGVuZChjb21tZW50Q2hhcikuYXBwZW5kKCIgQ29uZmxpY3RzOlxuIik7IC8vJE5PTi1OTFMtMSQKIAkJZm9yIChTdHJpbmcgY29uZmxpY3RpbmdQYXRoIDogY29uZmxpY3RpbmdQYXRocykgewotCQkJc2IuYXBwZW5kKCdcdCcpLmFwcGVuZChjb25mbGljdGluZ1BhdGgpLmFwcGVuZCgnXG4nKTsKKwkJCXNiLmFwcGVuZChjb21tZW50Q2hhcikuYXBwZW5kKCdcdCcpLmFwcGVuZChjb25mbGljdGluZ1BhdGgpCisJCQkJCS5hcHBlbmQoJ1xuJyk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEKaW5kZXggNzc2NzY2Mi4uYjlhYjFkMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEKQEAgLTMsNyArMyw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMiwgTWF0dGhpYXMgU29obiA8bWF0dGhpYXMuc29obkBzYXAuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDEyLCBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZAogICogQ29weXJpZ2h0IChDKSAyMDE3LCBPYmVvIChtYXRoaWV1LmNhcnRhdWRAb2Jlby5mcikKLSAqIENvcHlyaWdodCAoQykgMjAxOCwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMiBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMjc2LDExICsyNzYsMTUgQEAgcHVibGljIGVudW0gTWVyZ2VGYWlsdXJlUmVhc29uIHsKIAlwcml2YXRlIENvbnRlbnRNZXJnZVN0cmF0ZWd5IGNvbnRlbnRTdHJhdGVneSA9IENvbnRlbnRNZXJnZVN0cmF0ZWd5LkNPTkZMSUNUOwogCiAJLyoqCi0JICogS2VlcHMge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGZvciB7QGxpbmsgI2NoZWNrb3V0KCl9IGFuZAotCSAqIHtAbGluayAjY2xlYW5VcCgpfS4KKwkgKiBLZWVwcyB7QGxpbmsgQ2hlY2tvdXRNZXRhZGF0YX0gZm9yIHtAbGluayAjY2hlY2tvdXQoKX0uCiAJICovCiAJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDaGVja291dE1ldGFkYXRhPiBjaGVja291dE1ldGFkYXRhOwogCisJLyoqCisJICogS2VlcHMge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGZvciB7QGxpbmsgI2NsZWFuVXAoKX0uCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDaGVja291dE1ldGFkYXRhPiBjbGVhbnVwTWV0YWRhdGE7CisKIAlwcml2YXRlIHN0YXRpYyBNZXJnZUFsZ29yaXRobSBnZXRNZXJnZUFsZ29yaXRobShDb25maWcgY29uZmlnKSB7CiAJCVN1cHBvcnRlZEFsZ29yaXRobSBkaWZmQWxnID0gY29uZmlnLmdldEVudW0oCiAJCQkJQ09ORklHX0RJRkZfU0VDVElPTiwgbnVsbCwgQ09ORklHX0tFWV9BTEdPUklUSE0sCkBAIC0zODMsMTIgKzM4NywxNCBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZUltcGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJCWlmICghaW5Db3JlKSB7CiAJCQljaGVja291dE1ldGFkYXRhID0gbmV3IEhhc2hNYXA8PigpOworCQkJY2xlYW51cE1ldGFkYXRhID0gbmV3IEhhc2hNYXA8PigpOwogCQl9CiAJCXRyeSB7CiAJCQlyZXR1cm4gbWVyZ2VUcmVlcyhtZXJnZUJhc2UoKSwgc291cmNlVHJlZXNbMF0sIHNvdXJjZVRyZWVzWzFdLAogCQkJCQlmYWxzZSk7CiAJCX0gZmluYWxseSB7CiAJCQljaGVja291dE1ldGFkYXRhID0gbnVsbDsKKwkJCWNsZWFudXBNZXRhZGF0YSA9IG51bGw7CiAJCQlpZiAoaW1wbGljaXREaXJDYWNoZSkgewogCQkJCWRpcmNhY2hlLnVubG9jaygpOwogCQkJfQpAQCAtNDQ3LDcgKzQ1Myw3IEBAIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgTm9Xb3JrVHJlZUV4Y2VwdGlvbiwKIAkJCURpckNhY2hlRW50cnkgZW50cnkgPSBkYy5nZXRFbnRyeShtcGF0aCk7CiAJCQlpZiAoZW50cnkgIT0gbnVsbCkgewogCQkJCURpckNhY2hlQ2hlY2tvdXQuY2hlY2tvdXRFbnRyeShkYiwgZW50cnksIHJlYWRlciwgZmFsc2UsCi0JCQkJCQljaGVja291dE1ldGFkYXRhLmdldChtcGF0aCkpOworCQkJCQkJY2xlYW51cE1ldGFkYXRhLmdldChtcGF0aCkpOwogCQkJfQogCQkJbXBhdGhzSXQucmVtb3ZlKCk7CiAJCX0KQEAgLTUwMSwyMiArNTA3LDI2IEBAIHByaXZhdGUgRGlyQ2FjaGVFbnRyeSBrZWVwKERpckNhY2hlRW50cnkgZSkgewogCSAqIFJlbWVtYmVycyB0aGUge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGZvciB0aGUgZ2l2ZW4gcGF0aDsgaXQgbWF5IGJlCiAJICogbmVlZGVkIGluIHtAbGluayAjY2hlY2tvdXQoKX0gb3IgaW4ge0BsaW5rICNjbGVhblVwKCl9LgogCSAqCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgdG8gYWRkIHRoZSBtZXRhZGF0YSB0bwogCSAqIEBwYXJhbSBwYXRoCiAJICogICAgICAgICAgICBvZiB0aGUgY3VycmVudCBub2RlCiAJICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIGZvciB0aGUgY3VycmVudCBub2RlCisJICogICAgICAgICAgICB0byB1c2UgZm9yIGRldGVybWluaW5nIHRoZSBtZXRhZGF0YQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiB0aGUgc211ZGdlIGZpbHRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZAotCSAqIEBzaW5jZSA1LjEKKwkgKiBAc2luY2UgNi4xCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tvdXRNZXRhZGF0YShTdHJpbmcgcGF0aCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorCXByb3RlY3RlZCB2b2lkIGFkZENoZWNrb3V0TWV0YWRhdGEoTWFwPFN0cmluZywgQ2hlY2tvdXRNZXRhZGF0YT4gbWFwLAorCQkJU3RyaW5nIHBhdGgsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChjaGVja291dE1ldGFkYXRhICE9IG51bGwpIHsKKwkJaWYgKG1hcCAhPSBudWxsKSB7CiAJCQlFb2xTdHJlYW1UeXBlIGVvbCA9IEVvbFN0cmVhbVR5cGVVdGlsLmRldGVjdFN0cmVhbVR5cGUoCi0JCQkJCU9wZXJhdGlvblR5cGUuQ0hFQ0tPVVRfT1AsIHdvcmtpbmdUcmVlT3B0aW9ucywgYXR0cmlidXRlcyk7CisJCQkJCU9wZXJhdGlvblR5cGUuQ0hFQ0tPVVRfT1AsIHdvcmtpbmdUcmVlT3B0aW9ucywKKwkJCQkJYXR0cmlidXRlcyk7CiAJCQlDaGVja291dE1ldGFkYXRhIGRhdGEgPSBuZXcgQ2hlY2tvdXRNZXRhZGF0YShlb2wsCi0JCQkJCXR3LmdldEZpbHRlckNvbW1hbmQoQ29uc3RhbnRzLkFUVFJfRklMVEVSX1RZUEVfU01VREdFKSk7Ci0JCQljaGVja291dE1ldGFkYXRhLnB1dChwYXRoLCBkYXRhKTsKKwkJCQkJdHcuZ2V0U211ZGdlQ29tbWFuZChhdHRyaWJ1dGVzKSk7CisJCQltYXAucHV0KHBhdGgsIGRhdGEpOwogCQl9CiAJfQogCkBAIC01MjksMTUgKzUzOSwxNyBAQCBwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja291dE1ldGFkYXRhKFN0cmluZyBwYXRoLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCiAJICogQHBhcmFtIGVudHJ5CiAJICogICAgICAgICAgICB0byBhZGQKIAkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgZm9yIHRoZSBjdXJyZW50IGVudHJ5CisJICogICAgICAgICAgICB0aGUge0BsaW5rIEF0dHJpYnV0ZXN9IG9mIHRoZSB0cmVlcwogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiB0aGUge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGNhbm5vdCBiZSBkZXRlcm1pbmVkCi0JICogQHNpbmNlIDUuMQorCSAqIEBzaW5jZSA2LjEKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBhZGRUb0NoZWNrb3V0KFN0cmluZyBwYXRoLCBEaXJDYWNoZUVudHJ5IGVudHJ5LAotCQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJQXR0cmlidXRlc1tdIGF0dHJpYnV0ZXMpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0b0JlQ2hlY2tlZE91dC5wdXQocGF0aCwgZW50cnkpOwotCQlhZGRDaGVja291dE1ldGFkYXRhKHBhdGgsIGF0dHJpYnV0ZXMpOworCQlhZGRDaGVja291dE1ldGFkYXRhKGNsZWFudXBNZXRhZGF0YSwgcGF0aCwgYXR0cmlidXRlc1tUX09VUlNdKTsKKwkJYWRkQ2hlY2tvdXRNZXRhZGF0YShjaGVja291dE1ldGFkYXRhLCBwYXRoLCBhdHRyaWJ1dGVzW1RfVEhFSVJTXSk7CiAJfQogCiAJLyoqCkBAIC01NDksNyArNTYxLDcgQEAgcHJvdGVjdGVkIHZvaWQgYWRkVG9DaGVja291dChTdHJpbmcgcGF0aCwgRGlyQ2FjaGVFbnRyeSBlbnRyeSwKIAkgKiBAcGFyYW0gaXNGaWxlCiAJICogICAgICAgICAgICB3aGV0aGVyIGl0IGlzIGEgZmlsZQogCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogICAgICAgICAgICBmb3IgdGhlIGVudHJ5CisJICogICAgICAgICAgICB0byB1c2UgZm9yIGRldGVybWluaW5nIHRoZSB7QGxpbmsgQ2hlY2tvdXRNZXRhZGF0YX0KIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgdGhlIHtAbGluayBDaGVja291dE1ldGFkYXRhfSBjYW5ub3QgYmUgZGV0ZXJtaW5lZAogCSAqIEBzaW5jZSA1LjEKQEAgLTU1OCw3ICs1NzAsNyBAQCBwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGlvbihTdHJpbmcgcGF0aCwgYm9vbGVhbiBpc0ZpbGUsCiAJCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRvQmVEZWxldGVkLmFkZChwYXRoKTsKIAkJaWYgKGlzRmlsZSkgewotCQkJYWRkQ2hlY2tvdXRNZXRhZGF0YShwYXRoLCBhdHRyaWJ1dGVzKTsKKwkJCWFkZENoZWNrb3V0TWV0YWRhdGEoY2xlYW51cE1ldGFkYXRhLCBwYXRoLCBhdHRyaWJ1dGVzKTsKIAkJfQogCX0KIApAQCAtNTk5LDcgKzYxMSw3IEBAIHByb3RlY3RlZCB2b2lkIGFkZERlbGV0aW9uKFN0cmluZyBwYXRoLCBib29sZWFuIGlzRmlsZSwKIAkgKiAgICAgICAgICAgIHNlZQogCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciNtZXJnZVRyZWVzKEFic3RyYWN0VHJlZUl0ZXJhdG9yLCBSZXZUcmVlLCBSZXZUcmVlLCBib29sZWFuKX0KIAkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbnRyeQorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBBdHRyaWJ1dGVzfSBmb3IgdGhlIHRocmVlIHRyZWVzCiAJICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIG1lcmdlIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBpbmRleCBlbnRyeQogCSAqICAgICAgICAgZGlkbid0IG1hdGNoIG91cnMgb3IgdGhlIHdvcmtpbmctZGlyIGZpbGUgd2FzIGRpcnR5IGFuZCBhCiAJICogICAgICAgICBjb25mbGljdCBvY2N1cnJlZApAQCAtNjA3LDEyICs2MTksMTIgQEAgcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRpb24oU3RyaW5nIHBhdGgsIGJvb2xlYW4gaXNGaWxlLAogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbgogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSA0LjkKKwkgKiBAc2luY2UgNi4xCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKIAkJCUNhbm9uaWNhbFRyZWVQYXJzZXIgb3VycywgQ2Fub25pY2FsVHJlZVBhcnNlciB0aGVpcnMsCiAJCQlEaXJDYWNoZUJ1aWxkSXRlcmF0b3IgaW5kZXgsIFdvcmtpbmdUcmVlSXRlcmF0b3Igd29yaywKLQkJCWJvb2xlYW4gaWdub3JlQ29uZmxpY3RzLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisJCQlib29sZWFuIGlnbm9yZUNvbmZsaWN0cywgQXR0cmlidXRlc1tdIGF0dHJpYnV0ZXMpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUNvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZW50ZXJTdWJ0cmVlID0gdHJ1ZTsKQEAgLTcyOSw3ICs3NDEsNyBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJCS8vIEJhc2UsIG91cnMsIGFuZCB0aGVpcnMgYWxsIGNvbnRhaW4gYSBmb2xkZXI6IGRvbid0IGRlbGV0ZQogCQkJCXJldHVybiB0cnVlOwogCQkJfQotCQkJYWRkRGVsZXRpb24odHcuZ2V0UGF0aFN0cmluZygpLCBub25UcmVlKG1vZGVPKSwgYXR0cmlidXRlcyk7CisJCQlhZGREZWxldGlvbih0dy5nZXRQYXRoU3RyaW5nKCksIG5vblRyZWUobW9kZU8pLCBhdHRyaWJ1dGVzW1RfT1VSU10pOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KIApAQCAtNzcyLDcgKzc4NCw3IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCWlmIChub25UcmVlKG1vZGVPKSAmJiBub25UcmVlKG1vZGVUKSkgewogCQkJLy8gQ2hlY2sgd29ya3RyZWUgYmVmb3JlIG1vZGlmeWluZyBmaWxlcwogCQkJYm9vbGVhbiB3b3JrdHJlZURpcnR5ID0gaXNXb3JrdHJlZURpcnR5KHdvcmssIG91ckRjZSk7Ci0JCQlpZiAoIWF0dHJpYnV0ZXMuY2FuQmVDb250ZW50TWVyZ2VkKCkgJiYgd29ya3RyZWVEaXJ0eSkgeworCQkJaWYgKCFhdHRyaWJ1dGVzW1RfT1VSU10uY2FuQmVDb250ZW50TWVyZ2VkKCkgJiYgd29ya3RyZWVEaXJ0eSkgewogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIApAQCAtNzkxLDcgKzgwMyw3IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQkJbWVyZ2VSZXN1bHRzLnB1dCh0dy5nZXRQYXRoU3RyaW5nKCksIHJlc3VsdCk7CiAJCQkJdW5tZXJnZWRQYXRocy5hZGQodHcuZ2V0UGF0aFN0cmluZygpKTsKIAkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoIWF0dHJpYnV0ZXMuY2FuQmVDb250ZW50TWVyZ2VkKCkpIHsKKwkJCX0gZWxzZSBpZiAoIWF0dHJpYnV0ZXNbVF9PVVJTXS5jYW5CZUNvbnRlbnRNZXJnZWQoKSkgewogCQkJCS8vIEZpbGUgbWFya2VkIGFzIGJpbmFyeQogCQkJCXN3aXRjaCAoZ2V0Q29udGVudE1lcmdlU3RyYXRlZ3koKSkgewogCQkJCWNhc2UgT1VSUzoKQEAgLTg0MiwxMyArODU0LDE2IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQlpZiAoaWdub3JlQ29uZmxpY3RzKSB7CiAJCQkJcmVzdWx0LnNldENvbnRhaW5zQ29uZmxpY3RzKGZhbHNlKTsKIAkJCX0KLQkJCXVwZGF0ZUluZGV4KGJhc2UsIG91cnMsIHRoZWlycywgcmVzdWx0LCBhdHRyaWJ1dGVzKTsKKwkJCXVwZGF0ZUluZGV4KGJhc2UsIG91cnMsIHRoZWlycywgcmVzdWx0LCBhdHRyaWJ1dGVzW1RfT1VSU10pOwogCQkJU3RyaW5nIGN1cnJlbnRQYXRoID0gdHcuZ2V0UGF0aFN0cmluZygpOwogCQkJaWYgKHJlc3VsdC5jb250YWluc0NvbmZsaWN0cygpICYmICFpZ25vcmVDb25mbGljdHMpIHsKIAkJCQl1bm1lcmdlZFBhdGhzLmFkZChjdXJyZW50UGF0aCk7CiAJCQl9CiAJCQltb2RpZmllZEZpbGVzLmFkZChjdXJyZW50UGF0aCk7Ci0JCQlhZGRDaGVja291dE1ldGFkYXRhKGN1cnJlbnRQYXRoLCBhdHRyaWJ1dGVzKTsKKwkJCWFkZENoZWNrb3V0TWV0YWRhdGEoY2xlYW51cE1ldGFkYXRhLCBjdXJyZW50UGF0aCwKKwkJCQkJYXR0cmlidXRlc1tUX09VUlNdKTsKKwkJCWFkZENoZWNrb3V0TWV0YWRhdGEoY2hlY2tvdXRNZXRhZGF0YSwgY3VycmVudFBhdGgsCisJCQkJCWF0dHJpYnV0ZXNbVF9USEVJUlNdKTsKIAkJfSBlbHNlIGlmIChtb2RlTyAhPSBtb2RlVCkgewogCQkJLy8gT1VSUyBvciBUSEVJUlMgaGFzIGJlZW4gZGVsZXRlZAogCQkJaWYgKCgobW9kZU8gIT0gMCAmJiAhdHcuaWRFcXVhbChUX0JBU0UsIFRfT1VSUykpIHx8IChtb2RlVCAhPSAwICYmICF0dwpAQCAtODgxLDcgKzg5Niw4IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQkJCQkvLyBtYXJrZXJzKS4gQnV0IGFsc28gc3RhZ2UgMCBvZiB0aGUgaW5kZXggaXMgZmlsbGVkCiAJCQkJCQkvLyB3aXRoIHRoYXQgY29udGVudC4KIAkJCQkJCXJlc3VsdC5zZXRDb250YWluc0NvbmZsaWN0cyhmYWxzZSk7Ci0JCQkJCQl1cGRhdGVJbmRleChiYXNlLCBvdXJzLCB0aGVpcnMsIHJlc3VsdCwgYXR0cmlidXRlcyk7CisJCQkJCQl1cGRhdGVJbmRleChiYXNlLCBvdXJzLCB0aGVpcnMsIHJlc3VsdCwKKwkJCQkJCQkJYXR0cmlidXRlc1tUX09VUlNdKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWFkZCh0dy5nZXRSYXdQYXRoKCksIGJhc2UsIERpckNhY2hlRW50cnkuU1RBR0VfMSwgRVBPQ0gsCiAJCQkJCQkJCTApOwpAQCAtODk2LDExICs5MTIsOSBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJCQkJCWlmIChpc1dvcmt0cmVlRGlydHkod29yaywgb3VyRGNlKSkgewogCQkJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCQkJfQotCQkJCQkJCWlmIChub25UcmVlKG1vZGVUKSkgewotCQkJCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlhZGRUb0NoZWNrb3V0KHR3LmdldFBhdGhTdHJpbmcoKSwgZSwKLQkJCQkJCQkJCQkJYXR0cmlidXRlcyk7Ci0JCQkJCQkJCX0KKwkJCQkJCQlpZiAobm9uVHJlZShtb2RlVCkgJiYgZSAhPSBudWxsKSB7CisJCQkJCQkJCWFkZFRvQ2hlY2tvdXQodHcuZ2V0UGF0aFN0cmluZygpLCBlLAorCQkJCQkJCQkJCWF0dHJpYnV0ZXMpOwogCQkJCQkJCX0KIAkJCQkJCX0KIApAQCAtOTQ1LDE0ICs5NTksMTYgQEAgcHJpdmF0ZSBzdGF0aWMgTWVyZ2VSZXN1bHQ8U3VibW9kdWxlQ29uZmxpY3Q+IGNyZWF0ZUdpdExpbmtzTWVyZ2VSZXN1bHQoCiAJICovCiAJcHJpdmF0ZSBNZXJnZVJlc3VsdDxSYXdUZXh0PiBjb250ZW50TWVyZ2UoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJQ2Fub25pY2FsVHJlZVBhcnNlciBvdXJzLCBDYW5vbmljYWxUcmVlUGFyc2VyIHRoZWlycywKLQkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcywgQ29udGVudE1lcmdlU3RyYXRlZ3kgc3RyYXRlZ3kpCisJCQlBdHRyaWJ1dGVzW10gYXR0cmlidXRlcywgQ29udGVudE1lcmdlU3RyYXRlZ3kgc3RyYXRlZ3kpCiAJCQl0aHJvd3MgQmluYXJ5QmxvYkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQkvLyBUVzogVGhlIGF0dHJpYnV0ZXMgaGVyZSBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIExGUyBzbXVkZ2UgZmlsdGVyLgorCQkvLyBJcyBkb2luZyBhIGNvbnRlbnQgbWVyZ2Ugb24gTEZTIGl0ZW1zIHJlYWxseSBhIGdvb2QgaWRlYT8/CiAJCVJhd1RleHQgYmFzZVRleHQgPSBiYXNlID09IG51bGwgPyBSYXdUZXh0LkVNUFRZX1RFWFQKLQkJCQk6IGdldFJhd1RleHQoYmFzZS5nZXRFbnRyeU9iamVjdElkKCksIGF0dHJpYnV0ZXMpOworCQkJCTogZ2V0UmF3VGV4dChiYXNlLmdldEVudHJ5T2JqZWN0SWQoKSwgYXR0cmlidXRlc1tUX0JBU0VdKTsKIAkJUmF3VGV4dCBvdXJUZXh0ID0gb3VycyA9PSBudWxsID8gUmF3VGV4dC5FTVBUWV9URVhUCi0JCQkJOiBnZXRSYXdUZXh0KG91cnMuZ2V0RW50cnlPYmplY3RJZCgpLCBhdHRyaWJ1dGVzKTsKKwkJCQk6IGdldFJhd1RleHQob3Vycy5nZXRFbnRyeU9iamVjdElkKCksIGF0dHJpYnV0ZXNbVF9PVVJTXSk7CiAJCVJhd1RleHQgdGhlaXJzVGV4dCA9IHRoZWlycyA9PSBudWxsID8gUmF3VGV4dC5FTVBUWV9URVhUCi0JCQkJOiBnZXRSYXdUZXh0KHRoZWlycy5nZXRFbnRyeU9iamVjdElkKCksIGF0dHJpYnV0ZXMpOworCQkJCTogZ2V0UmF3VGV4dCh0aGVpcnMuZ2V0RW50cnlPYmplY3RJZCgpLCBhdHRyaWJ1dGVzW1RfVEhFSVJTXSk7CiAJCW1lcmdlQWxnb3JpdGhtLnNldENvbnRlbnRNZXJnZVN0cmF0ZWd5KHN0cmF0ZWd5KTsKIAkJcmV0dXJuIG1lcmdlQWxnb3JpdGhtLm1lcmdlKFJhd1RleHRDb21wYXJhdG9yLkRFRkFVTFQsIGJhc2VUZXh0LAogCQkJCW91clRleHQsIHRoZWlyc1RleHQpOwpAQCAtMTM0Miw3ICsxMzU4LDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gbWVyZ2VUcmVlcyhBYnN0cmFjdFRyZWVJdGVyYXRvciBiYXNlVHJlZSwKIAogCQl0dyA9IG5ldyBOYW1lQ29uZmxpY3RUcmVlV2FsayhkYiwgcmVhZGVyKTsKIAkJdHcuYWRkVHJlZShiYXNlVHJlZSk7Ci0JCXR3LmFkZFRyZWUoaGVhZFRyZWUpOworCQl0dy5zZXRIZWFkKHR3LmFkZFRyZWUoaGVhZFRyZWUpKTsKIAkJdHcuYWRkVHJlZShtZXJnZVRyZWUpOwogCQlpbnQgZGNpUG9zID0gdHcuYWRkVHJlZShidWlsZEl0KTsKIAkJaWYgKHdvcmtpbmdUcmVlSXRlcmF0b3IgIT0gbnVsbCkgewpAQCAtMTQwMyw2ICsxNDE5LDEzIEBAIHByb3RlY3RlZCBib29sZWFuIG1lcmdlVHJlZVdhbGsoVHJlZVdhbGsgdHJlZVdhbGssIGJvb2xlYW4gaWdub3JlQ29uZmxpY3RzKQogCQlib29sZWFuIGhhc0F0dHJpYnV0ZU5vZGVQcm92aWRlciA9IHRyZWVXYWxrCiAJCQkJLmdldEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIoKSAhPSBudWxsOwogCQl3aGlsZSAodHJlZVdhbGsubmV4dCgpKSB7CisJCQlBdHRyaWJ1dGVzW10gYXR0cmlidXRlcyA9IHsgTk9fQVRUUklCVVRFUywgTk9fQVRUUklCVVRFUywKKwkJCQkJTk9fQVRUUklCVVRFUyB9OworCQkJaWYgKGhhc0F0dHJpYnV0ZU5vZGVQcm92aWRlcikgeworCQkJCWF0dHJpYnV0ZXNbVF9CQVNFXSA9IHRyZWVXYWxrLmdldEF0dHJpYnV0ZXMoVF9CQVNFKTsKKwkJCQlhdHRyaWJ1dGVzW1RfT1VSU10gPSB0cmVlV2Fsay5nZXRBdHRyaWJ1dGVzKFRfT1VSUyk7CisJCQkJYXR0cmlidXRlc1tUX1RIRUlSU10gPSB0cmVlV2Fsay5nZXRBdHRyaWJ1dGVzKFRfVEhFSVJTKTsKKwkJCX0KIAkJCWlmICghcHJvY2Vzc0VudHJ5KAogCQkJCQl0cmVlV2Fsay5nZXRUcmVlKFRfQkFTRSwgQ2Fub25pY2FsVHJlZVBhcnNlci5jbGFzcyksCiAJCQkJCXRyZWVXYWxrLmdldFRyZWUoVF9PVVJTLCBDYW5vbmljYWxUcmVlUGFyc2VyLmNsYXNzKSwKQEAgLTE0MTAsOSArMTQzMyw3IEBAIHByb3RlY3RlZCBib29sZWFuIG1lcmdlVHJlZVdhbGsoVHJlZVdhbGsgdHJlZVdhbGssIGJvb2xlYW4gaWdub3JlQ29uZmxpY3RzKQogCQkJCQl0cmVlV2Fsay5nZXRUcmVlKFRfSU5ERVgsIERpckNhY2hlQnVpbGRJdGVyYXRvci5jbGFzcyksCiAJCQkJCWhhc1dvcmtpbmdUcmVlSXRlcmF0b3IgPyB0cmVlV2Fsay5nZXRUcmVlKFRfRklMRSwKIAkJCQkJCQlXb3JraW5nVHJlZUl0ZXJhdG9yLmNsYXNzKSA6IG51bGwsCi0JCQkJCWlnbm9yZUNvbmZsaWN0cywgaGFzQXR0cmlidXRlTm9kZVByb3ZpZGVyCi0JCQkJCQkJPyB0cmVlV2Fsay5nZXRBdHRyaWJ1dGVzKCkKLQkJCQkJCQk6IE5PX0FUVFJJQlVURVMpKSB7CisJCQkJCWlnbm9yZUNvbmZsaWN0cywgYXR0cmlidXRlcykpIHsKIAkJCQljbGVhblVwKCk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0LmphdmEKaW5kZXggOTRlN2M1My4uYzExZmNhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdC5qYXZhCkBAIC0xMzgsNiArMTM4LDcgQEAgcHVibGljIGZpbmFsIFBsb3RDb21taXQgZ2V0Q2hpbGQoaW50IG50aCkgewogCSAqICAgICAgICAgICAgdGhlIGNvbW1pdCB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29tbWl0IGJ1aWx0IG9uIHRvcCBvZiB0aGlzIGNvbW1pdC4KIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiUmVmZXJlbmNlRXF1YWxpdHkiKQogCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2hpbGQoUGxvdENvbW1pdCBjKSB7CiAJCWZvciAoUGxvdENvbW1pdCBhIDogY2hpbGRyZW4pCiAJCQlpZiAoYSA9PSBjKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXRMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdExpc3QuamF2YQppbmRleCAxOGVhNzU2Li40NThmMjQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdExpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdExpc3QuamF2YQpAQCAtOTIsNiArOTIsNyBAQCBwdWJsaWMgdm9pZCBmaW5kUGFzc2luZ1Rocm91Z2goZmluYWwgUGxvdENvbW1pdDxMPiBjdXJyQ29tbWl0LAogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCisJQFN1cHByZXNzV2FybmluZ3MoIlJlZmVyZW5jZUVxdWFsaXR5IikKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBlbnRlcihpbnQgaW5kZXgsIFBsb3RDb21taXQ8TD4gY3VyckNvbW1pdCkgewogCQlzZXR1cENoaWxkcmVuKGN1cnJDb21taXQpOwpAQCAtMTg4LDYgKzE4OSw3IEBAIHByaXZhdGUgdm9pZCBjb250aW51ZUFjdGl2ZUxhbmVzKFBsb3RDb21taXQgY3VyckNvbW1pdCkgewogCSAqICAgICAgICAgICAgbWF5IGJlIG51bGwgaWYgPGNvZGU+Y3VyckNvbW1pdDwvY29kZT4gaXMgdGhlIGZpcnN0IGNvbW1pdCBvbgogCSAqICAgICAgICAgICAgdGhlIGxhbmUKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygiUmVmZXJlbmNlRXF1YWxpdHkiKQogCXByaXZhdGUgdm9pZCBoYW5kbGVCbG9ja2VkTGFuZXMoZmluYWwgaW50IGluZGV4LCBmaW5hbCBQbG90Q29tbWl0IGN1cnJDb21taXQsCiAJCQlmaW5hbCBQbG90Q29tbWl0IGNoaWxkT25MYW5lKSB7CiAJCWZvciAoUGxvdENvbW1pdCBjaGlsZCA6IGN1cnJDb21taXQuY2hpbGRyZW4pIHsKQEAgLTIxNCw2ICsyMTYsNyBAQCBwcml2YXRlIHZvaWQgaGFuZGxlQmxvY2tlZExhbmVzKGZpbmFsIGludCBpbmRleCwgZmluYWwgUGxvdENvbW1pdCBjdXJyQ29tbWl0LAogCX0KIAogCS8vIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgY3VyckNvbW1pdCBpcyBhIG5vbi1maXJzdCBwYXJlbnQgb2YgdGhlIGNoaWxkCisJQFN1cHByZXNzV2FybmluZ3MoIlJlZmVyZW5jZUVxdWFsaXR5IikKIAlwcml2YXRlIFBsb3RMYW5lIGhhbmRsZU1lcmdlKGZpbmFsIGludCBpbmRleCwgZmluYWwgUGxvdENvbW1pdCBjdXJyQ29tbWl0LAogCQkJZmluYWwgUGxvdENvbW1pdCBjaGlsZE9uTGFuZSwgUGxvdENvbW1pdCBjaGlsZCwgUGxvdExhbmUgbGFuZVRvVXNlKSB7CiAKQEAgLTI4Nyw2ICsyOTAsNyBAQCBwcml2YXRlIFBsb3RMYW5lIGhhbmRsZU1lcmdlKGZpbmFsIGludCBpbmRleCwgZmluYWwgUGxvdENvbW1pdCBjdXJyQ29tbWl0LAogCSAqIEBwYXJhbSBjaGlsZAogCSAqIEBwYXJhbSBsYW5lVG9Db250aW51ZQogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJSZWZlcmVuY2VFcXVhbGl0eSIpCiAJcHJpdmF0ZSB2b2lkIGRyYXdMYW5lVG9DaGlsZChmaW5hbCBpbnQgY29tbWl0SW5kZXgsIFBsb3RDb21taXQgY2hpbGQsCiAJCQlQbG90TGFuZSBsYW5lVG9Db250aW51ZSkgewogCQlmb3IgKGludCByID0gY29tbWl0SW5kZXggLSAxOyByID49IDA7IHItLSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEKaW5kZXggZTZmOTU4MC4uNGU0OGE1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMjIgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xMzksNyArMTM5LDcgQEAgcHVibGljIHZvaWQgdmlzaXRlZChSZXZPYmplY3QgbykgewogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgdGhlIHdhbGtlciB3aWxsIG9idGFpbiBkYXRhIGZyb20uCiAJICovCiAJcHVibGljIE9iamVjdFdhbGsoUmVwb3NpdG9yeSByZXBvKSB7Ci0JCXRoaXMocmVwby5uZXdPYmplY3RSZWFkZXIoKSk7CisJCXRoaXMocmVwby5uZXdPYmplY3RSZWFkZXIoKSwgdHJ1ZSk7CiAJfQogCiAJLyoqCkBAIC0xNTEsNyArMTUxLDExIEBAIHB1YmxpYyBPYmplY3RXYWxrKFJlcG9zaXRvcnkgcmVwbykgewogCSAqICAgICAgICAgICAgcmVxdWlyZWQuCiAJICovCiAJcHVibGljIE9iamVjdFdhbGsoT2JqZWN0UmVhZGVyIG9yKSB7Ci0JCXN1cGVyKG9yKTsKKwkJdGhpcyhvciwgZmFsc2UpOworCX0KKworCXByaXZhdGUgT2JqZWN0V2FsayhPYmplY3RSZWFkZXIgb3IsIGJvb2xlYW4gY2xvc2VSZWFkZXIpIHsKKwkJc3VwZXIob3IsIGNsb3NlUmVhZGVyKTsKIAkJc2V0UmV0YWluQm9keShmYWxzZSk7CiAJCXJvb3RPYmplY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXBlbmRpbmdPYmplY3RzID0gbmV3IEJsb2NrT2JqUXVldWUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsay5qYXZhCmluZGV4IDhkNTcxZjUuLmEyNTk0OGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YQpAQCAtMTQzLDggKzE0MywxOSBAQCBwdWJsaWMgY2xhc3MgUmV2V2FsayBpbXBsZW1lbnRzIEl0ZXJhYmxlPFJldkNvbW1pdD4sIEF1dG9DbG9zZWFibGUgewogCSAqLwogCXN0YXRpYyBmaW5hbCBpbnQgVE9QT19RVUVVRUQgPSAxIDw8IDY7CiAKKwkvKioKKwkgKiBTZXQgb24gYSBSZXZDb21taXQgd2hlbiBhIHtAbGluayBUcmVlUmV2RmlsdGVyfSBoYXMgYmVlbiBhcHBsaWVkLgorCSAqIDxwPgorCSAqIFRoaXMgZmxhZyBpcyBwcm9jZXNzZWQgYnkgdGhlIHtAbGluayBSZXdyaXRlR2VuZXJhdG9yfSB0byBjaGVjayBpZiBhCisJICoge0BsaW5rIFRyZWVSZXZGaWx0ZXJ9IGhhcyBiZWVuIGFwcGxpZWQuCisJICoKKwkgKiBAc2VlIFRyZWVSZXZGaWx0ZXIKKwkgKiBAc2VlIFJld3JpdGVHZW5lcmF0b3IKKwkgKi8KKwlzdGF0aWMgZmluYWwgaW50IFRSRUVfUkVWX0ZJTFRFUl9BUFBMSUVEID0gMSA8PCA3OworCiAJLyoqIE51bWJlciBvZiBmbGFnIGJpdHMgd2Uga2VlcCBpbnRlcm5hbCBmb3Igb3VyIG93biB1c2UuIFNlZSBhYm92ZSBmbGFncy4gKi8KLQlzdGF0aWMgZmluYWwgaW50IFJFU0VSVkVEX0ZMQUdTID0gNzsKKwlzdGF0aWMgZmluYWwgaW50IFJFU0VSVkVEX0ZMQUdTID0gODsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFBfRkxBR1MgPSAtMSAmIH4oKDEgPDwgUkVTRVJWRURfRkxBR1MpIC0gMSk7CiAKQEAgLTIxNSw3ICsyMjYsNyBAQCBwdWJsaWMgUmV2V2FsayhPYmplY3RSZWFkZXIgb3IpIHsKIAkJdGhpcyhvciwgZmFsc2UpOwogCX0KIAotCXByaXZhdGUgUmV2V2FsayhPYmplY3RSZWFkZXIgb3IsIGJvb2xlYW4gY2xvc2VSZWFkZXIpIHsKKwlSZXZXYWxrKE9iamVjdFJlYWRlciBvciwgYm9vbGVhbiBjbG9zZVJlYWRlcikgewogCQlyZWFkZXIgPSBvcjsKIAkJaWRCdWZmZXIgPSBuZXcgTXV0YWJsZU9iamVjdElkKCk7CiAJCW9iamVjdHMgPSBuZXcgT2JqZWN0SWRPd25lck1hcDw+KCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV3cml0ZUdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jld3JpdGVHZW5lcmF0b3IuamF2YQppbmRleCBhOTI4YzJlLi4xYWRlZjA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV3cml0ZUdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXdyaXRlR2VuZXJhdG9yLmphdmEKQEAgLTI0LDE0ICsyNCw3IEBACiAgKiBjb21taXQgdGhhdCBtYXRjaGVkIHRoZSByZXZpc2lvbiB3YWxrZXIncyBmaWx0ZXJzLgogICogPHA+CiAgKiBUaGlzIGdlbmVyYXRvciBpcyB0aGUgc2Vjb25kIHBoYXNlIG9mIGEgcGF0aCBsaW1pdGVkIHJldmlzaW9uIHdhbGsgYW5kCi0gKiBhc3N1bWVzIGl0IGlzIHJlY2VpdmluZyBSZXZDb21taXRzIGZyb20ge0BsaW5rIFRyZWVSZXZGaWx0ZXJ9LAotICogYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZnVsbHkgYnVmZmVyZWQgYnkge0BsaW5rIEFic3RyYWN0UmV2UXVldWV9LiBUaGUgZnVsbAotICogYnVmZmVyaW5nIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyB0aGUgc2ltcGxlIGxvb3AgdXNlZCB3aXRoaW4gb3VyIG93bgotICoge0BsaW5rICNyZXdyaXRlKFJldkNvbW1pdCl9IHRvIHB1bGwgY29tcGxldGVseSB0aHJvdWdoIGEgc3RyYW5kIG9mCi0gKiB7QGxpbmsgUmV2V2FsayNSRVdSSVRFfSBjb2xvcmVkIGNvbW1pdHMgYW5kIGNvbWUgdXAgd2l0aCBhIHNpbXBsaWZpY2F0aW9uCi0gKiB0aGF0IG1ha2VzIHRoZSBEQUcgZGVuc2UuIE5vdCBmdWxseSBidWZmZXJpbmcgdGhlIGNvbW1pdHMgZmlyc3Qgd291bGQgY2F1c2UKLSAqIHRoaXMgbG9vcCB0byBhYm9ydCBlYXJseSwgZHVlIHRvIGNvbW1pdHMgbm90IGJlaW5nIHBhcnNlZCBhbmQgY29sb3JlZAotICogY29ycmVjdGx5LgorICogYXNzdW1lcyBpdCBpcyByZWNlaXZpbmcgUmV2Q29tbWl0cyBmcm9tIHtAbGluayBUcmVlUmV2RmlsdGVyfS4KICAqCiAgKiBAc2VlIFRyZWVSZXZGaWx0ZXIKICAqLwpAQCAtNDMsOSArMzYsMTIgQEAgY2xhc3MgUmV3cml0ZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAKIAlwcml2YXRlIGZpbmFsIEdlbmVyYXRvciBzb3VyY2U7CiAKKwlwcml2YXRlIGZpbmFsIEZJRk9SZXZRdWV1ZSBwZW5kaW5nOworCiAJUmV3cml0ZUdlbmVyYXRvcihHZW5lcmF0b3IgcykgewogCQlzdXBlcihzLmZpcnN0UGFyZW50KTsKIAkJc291cmNlID0gczsKKwkJcGVuZGluZyA9IG5ldyBGSUZPUmV2UXVldWUocy5maXJzdFBhcmVudCk7CiAJfQogCiAJQE92ZXJyaWRlCkBAIC01OCwxMyArNTQsMjMgQEAgaW50IG91dHB1dFR5cGUoKSB7CiAJCXJldHVybiBzb3VyY2Uub3V0cHV0VHlwZSgpICYgfk5FRURTX1JFV1JJVEU7CiAJfQogCisJQFN1cHByZXNzV2FybmluZ3MoIlJlZmVyZW5jZUVxdWFsaXR5IikKIAlAT3ZlcnJpZGUKIAlSZXZDb21taXQgbmV4dCgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlmaW5hbCBSZXZDb21taXQgYyA9IHNvdXJjZS5uZXh0KCk7CisJCVJldkNvbW1pdCBjID0gcGVuZGluZy5uZXh0KCk7CisKIAkJaWYgKGMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7CisJCQljID0gc291cmNlLm5leHQoKTsKKwkJCWlmIChjID09IG51bGwpIHsKKwkJCQkvLyBXZSBhcmUgZG9uZTogQm90aCB0aGUgc291cmNlIGdlbmVyYXRvciBhbmQgb3VyIGludGVybmFsIGxpc3QKKwkJCQkvLyBhcmUgY29tcGxldGVseSBleGhhdXN0ZWQuCisJCQkJcmV0dXJuIG51bGw7CisJCQl9CiAJCX0KKworCQlhcHBseUZpbHRlclRvUGFyZW50cyhjKTsKKwogCQlib29sZWFuIHJld3JvdGUgPSBmYWxzZTsKIAkJZmluYWwgUmV2Q29tbWl0W10gcExpc3QgPSBjLnBhcmVudHM7CiAJCWZpbmFsIGludCBuUGFyZW50cyA9IHBMaXN0Lmxlbmd0aDsKQEAgLTkwLDEwICs5Niw0MSBAQCBSZXZDb21taXQgbmV4dCgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQlyZXR1cm4gYzsKIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCByZXdyaXRlKFJldkNvbW1pdCBwKSB7CisJLyoqCisJICogTWFrZXMgc3VyZSB0aGF0IHRoZSB7QGxpbmsgVHJlZVJldkZpbHRlcn0gaGFzIGJlZW4gYXBwbGllZCB0byBhbGwgcGFyZW50cworCSAqIG9mIHRoaXMgY29tbWl0IGJ5IHRoZSBwcmV2aW91cyB7QGxpbmsgUGVuZGluZ0dlbmVyYXRvcn0uCisJICoKKwkgKiBAcGFyYW0gYworCSAqIEB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgYXBwbHlGaWx0ZXJUb1BhcmVudHMoUmV2Q29tbWl0IGMpCisJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKKwkJCUlPRXhjZXB0aW9uIHsKKwkJZm9yIChSZXZDb21taXQgcGFyZW50IDogYy5wYXJlbnRzKSB7CisJCQl3aGlsZSAoKHBhcmVudC5mbGFncyAmIFJldldhbGsuVFJFRV9SRVZfRklMVEVSX0FQUExJRUQpID09IDApIHsKKworCQkJCVJldkNvbW1pdCBuID0gc291cmNlLm5leHQoKTsKKworCQkJCWlmIChuICE9IG51bGwpIHsKKwkJCQkJcGVuZGluZy5hZGQobik7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gU291cmNlIGdlbmVyYXRvciBpcyBleGhhdXN0ZWQ7IGZpbHRlciBoYXMgYmVlbiBhcHBsaWVkIHRvCisJCQkJCS8vIGFsbCBjb21taXRzCisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCX0KKworCQl9CisJfQorCisJcHJpdmF0ZSBSZXZDb21taXQgcmV3cml0ZShSZXZDb21taXQgcCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZvciAoOzspIHsKLQkJCWZpbmFsIFJldkNvbW1pdFtdIHBMaXN0ID0gcC5wYXJlbnRzOwotCQkJaWYgKHBMaXN0Lmxlbmd0aCA+IDEpIHsKKworCQkJaWYgKHAucGFyZW50cy5sZW5ndGggPiAxKSB7CiAJCQkJLy8gVGhpcyBwYXJlbnQgaXMgYSBtZXJnZSwgc28ga2VlcCBpdC4KIAkJCQkvLwogCQkJCXJldHVybiBwOwpAQCAtMTEzLDE0ICsxNTAsMTYgQEAgcHJpdmF0ZSBSZXZDb21taXQgcmV3cml0ZShSZXZDb21taXQgcCkgewogCQkJCXJldHVybiBwOwogCQkJfQogCi0JCQlpZiAocExpc3QubGVuZ3RoID09IDApIHsKKwkJCWlmIChwLnBhcmVudHMubGVuZ3RoID09IDApIHsKIAkJCQkvLyBXZSBjYW4ndCBnbyBiYWNrIGFueSBmdXJ0aGVyLCBvdGhlciB0aGFuIHRvCiAJCQkJLy8ganVzdCBkZWxldGUgdGhlIHBhcmVudCBlbnRpcmVseS4KIAkJCQkvLwogCQkJCXJldHVybiBudWxsOwogCQkJfQogCi0JCQlwID0gcExpc3RbMF07CisJCQlhcHBseUZpbHRlclRvUGFyZW50cyhwLnBhcmVudHNbMF0pOworCQkJcCA9IHAucGFyZW50c1swXTsKKwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvU3RhcnRHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhCmluZGV4IGJmY2VhNmUuLmE3OTkwMWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhCkBAIC0xMjUsMTIgKzEyNSw2IEBAIFJldkNvbW1pdCBuZXh0KCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCX0KIAogCQlpZiAoKGcub3V0cHV0VHlwZSgpICYgTkVFRFNfUkVXUklURSkgIT0gMCkgewotCQkJLy8gQ29ycmVjdGlvbiBmb3IgYW4gdXBzdHJlYW0gTkVFRFNfUkVXUklURSBpcyB0byBidWZmZXIKLQkJCS8vIGZ1bGx5IGFuZCB0aGVuIGFwcGx5IGEgcmV3cml0ZSBnZW5lcmF0b3IgdGhhdCBjYW4KLQkJCS8vIHB1bGwgdGhyb3VnaCB0aGUgcmV3cml0ZSBjaGFpbiBhbmQgcHJvZHVjZSBhIGRlbnNlCi0JCQkvLyBvdXRwdXQgZ3JhcGguCi0JCQkvLwotCQkJZyA9IG5ldyBGSUZPUmV2UXVldWUoZyk7CiAJCQlnID0gbmV3IFJld3JpdGVHZW5lcmF0b3IoZyk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RyZWVSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9UcmVlUmV2RmlsdGVyLmphdmEKaW5kZXggODIyZmM1My4uOTJkNzIyNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RyZWVSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVHJlZVJldkZpbHRlci5qYXZhCkBAIC00MSw2ICs0MSw4IEBAIHB1YmxpYyBjbGFzcyBUcmVlUmV2RmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTklOVEVSRVNUSU5HID0gUmV2V2Fsay5VTklOVEVSRVNUSU5HOwogCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9BUFBMSUVEID0gUmV2V2Fsay5UUkVFX1JFVl9GSUxURVJfQVBQTElFRDsKKwogCXByaXZhdGUgZmluYWwgaW50IHJld3JpdGVGbGFnOwogCXByaXZhdGUgZmluYWwgVHJlZVdhbGsgcGF0aEZpbHRlcjsKIApAQCAtMTAxLDYgKzEwMyw3IEBAIHB1YmxpYyBSZXZGaWx0ZXIgY2xvbmUoKSB7CiAJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQl0aHJvd3MgU3RvcFdhbGtFeGNlcHRpb24sIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWMuZmxhZ3MgfD0gRklMVEVSX0FQUExJRUQ7CiAJCS8vIFJlc2V0IHRoZSB0cmVlIGZpbHRlciB0byBzY2FuIHRoaXMgY29tbWl0IGFuZCBwYXJlbnRzLgogCQkvLwogCQlSZXZDb21taXRbXSBwTGlzdCA9IGMucGFyZW50czsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnLmphdmEKaW5kZXggN2I1ZjAwZS4uY2JhNWUxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogCkBAIC0zNywxNSArMzYsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3UGFyc2VVdGlsczsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiAvKioKICAqIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCBpcyBzdG9yZWQgaW4gdGhlIGZpbGUgb2YgdGhlIGZpbGUgc3lzdGVtLgogICovCiBwdWJsaWMgY2xhc3MgRmlsZUJhc2VkQ29uZmlnIGV4dGVuZHMgU3RvcmVkQ29uZmlnIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQotCQkJLmdldExvZ2dlcihGaWxlQmFzZWRDb25maWcuY2xhc3MpOwogCiAJcHJpdmF0ZSBmaW5hbCBGaWxlIGNvbmZpZ0ZpbGU7CiAKQEAgLTExNSwxNiArMTEwLDE1IEBAIHB1YmxpYyBmaW5hbCBGaWxlIGdldEZpbGUoKSB7CiAJICovCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIGludCBtYXhSZXRyaWVzID0gNTsKLQkJaW50IHJldHJ5RGVsYXlNaWxsaXMgPSAyMDsKLQkJaW50IHJldHJpZXMgPSAwOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJZmluYWwgRmlsZVNuYXBzaG90IG9sZFNuYXBzaG90ID0gc25hcHNob3Q7Ci0JCQlmaW5hbCBGaWxlU25hcHNob3QgbmV3U25hcHNob3Q7Ci0JCQkvLyBkb24ndCB1c2UgY29uZmlnIGluIHRoaXMgc25hcHNob3QgdG8gYXZvaWQgZW5kbGVzcyByZWN1cnNpb24KLQkJCW5ld1NuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmVOb0NvbmZpZyhnZXRGaWxlKCkpOwotCQkJdHJ5IHsKLQkJCQlmaW5hbCBieXRlW10gaW4gPSBJTy5yZWFkRnVsbHkoZ2V0RmlsZSgpKTsKKwkJdHJ5IHsKKwkJCUZpbGVTbmFwc2hvdFtdIGxhc3RTbmFwc2hvdCA9IHsgbnVsbCB9OworCQkJQm9vbGVhbiB3YXNSZWFkID0gRmlsZVV0aWxzLnJlYWRXaXRoUmV0cmllcyhnZXRGaWxlKCksIGYgLT4geworCQkJCWZpbmFsIEZpbGVTbmFwc2hvdCBvbGRTbmFwc2hvdCA9IHNuYXBzaG90OworCQkJCWZpbmFsIEZpbGVTbmFwc2hvdCBuZXdTbmFwc2hvdDsKKwkJCQkvLyBkb24ndCB1c2UgY29uZmlnIGluIHRoaXMgc25hcHNob3QgdG8gYXZvaWQgZW5kbGVzcyByZWN1cnNpb24KKwkJCQluZXdTbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlTm9Db25maWcoZik7CisJCQkJbGFzdFNuYXBzaG90WzBdID0gbmV3U25hcHNob3Q7CisJCQkJZmluYWwgYnl0ZVtdIGluID0gSU8ucmVhZEZ1bGx5KGYpOwogCQkJCWZpbmFsIE9iamVjdElkIG5ld0hhc2ggPSBoYXNoKGluKTsKIAkJCQlpZiAoaGFzaC5lcXVhbHMobmV3SGFzaCkpIHsKIAkJCQkJaWYgKG9sZFNuYXBzaG90LmVxdWFscyhuZXdTbmFwc2hvdCkpIHsKQEAgLTE0NSw0NyArMTM5LDE3IEBAIHB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQkJCQlzbmFwc2hvdCA9IG5ld1NuYXBzaG90OwogCQkJCQloYXNoID0gbmV3SGFzaDsKIAkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG5vRmlsZSkgewotCQkJCS8vIG1pZ2h0IGJlIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MgKHNlZSBleGNlcHRpb24gSmF2YWRvYykKLQkJCQlpZiAocmV0cmllcyA8IG1heFJldHJpZXMgJiYgY29uZmlnRmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQkJCUxPRy5kZWJ1ZyhNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuY29uZmlnSGFuZGxlTWF5QmVMb2NrZWQsCi0JCQkJCQkJCUludGVnZXIudmFsdWVPZihyZXRyaWVzKSksIG5vRmlsZSk7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcChyZXRyeURlbGF5TWlsbGlzKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKLQkJCQkJfQotCQkJCQlyZXRyaWVzKys7Ci0JCQkJCXJldHJ5RGVsYXlNaWxsaXMgKj0gMjsgLy8gbWF4IHdhaXQgMTI2MCBtcwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJdGhyb3cgbm9GaWxlOwotCQkJCX0KKwkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOworCQkJfSk7CisJCQlpZiAod2FzUmVhZCA9PSBudWxsKSB7CiAJCQkJY2xlYXIoKTsKLQkJCQlzbmFwc2hvdCA9IG5ld1NuYXBzaG90OwotCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoRmlsZVV0aWxzLmlzU3RhbGVGaWxlSGFuZGxlKGUpCi0JCQkJCQkmJiByZXRyaWVzIDwgbWF4UmV0cmllcykgewotCQkJCQlpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQkJCUxPRy5kZWJ1ZyhNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuY29uZmlnSGFuZGxlSXNTdGFsZSwKLQkJCQkJCQkJSW50ZWdlci52YWx1ZU9mKHJldHJpZXMpKSwgZSk7Ci0JCQkJCX0KLQkJCQkJcmV0cmllcysrOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuY2Fubm90UmVhZEZpbGUsIGdldEZpbGUoKSksIGUpOwotCQkJfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvbmZpZ0ludmFsaWRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAotCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5jYW5ub3RSZWFkRmlsZSwgZ2V0RmlsZSgpKSwgZSk7CisJCQkJc25hcHNob3QgPSBsYXN0U25hcHNob3RbMF07CiAJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IGU7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuY2Fubm90UmVhZEZpbGUsIGdldEZpbGUoKSksIGUpOwogCQl9CiAJfQogCkBAIC0yMTYsOSArMTgwLDEwIEBAIHB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJZmluYWwgTG9ja0ZpbGUgbGYgPSBuZXcgTG9ja0ZpbGUoZ2V0RmlsZSgpKTsKLQkJaWYgKCFsZi5sb2NrKCkpCi0JCQl0aHJvdyBuZXcgTG9ja0ZhaWxlZEV4Y2VwdGlvbihnZXRGaWxlKCkpOwogCQl0cnkgeworCQkJaWYgKCFsZi5sb2NrKCkpIHsKKwkJCQl0aHJvdyBuZXcgTG9ja0ZhaWxlZEV4Y2VwdGlvbihnZXRGaWxlKCkpOworCQkJfQogCQkJbGYuc2V0TmVlZFNuYXBzaG90Tm9Db25maWcodHJ1ZSk7CiAJCQlsZi53cml0ZShvdXQpOwogCQkJaWYgKCFsZi5jb21taXQoKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0FtYXpvblMzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9BbWF6b25TMy5qYXZhCmluZGV4IGQ1NmI1YjMuLjgxYTcwYWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0FtYXpvblMzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQW1hem9uUzMuamF2YQpAQCAtODYsNiArODYsMTIgQEAKIHB1YmxpYyBjbGFzcyBBbWF6b25TMyB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gU0lHTkVEX0hFQURFUlM7CiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVdTX0FQSV9WMiA9ICIyIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFXU19BUElfVjQgPSAiNCI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBV1NfUzNfU0VSVklDRV9OQU1FID0gInMzIjsgLy8kTk9OLU5MUy0xJAorCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhNQUMgPSAiSG1hY1NIQTEiOyAvLyROT04tTkxTLTEkCiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9BTVpfQUNMID0gIngtYW16LWFjbCI7IC8vJE5PTi1OTFMtMSQKQEAgLTEzNSwxMSArMTQxLDE3IEBAIHByaXZhdGUgc3RhdGljIE1lc3NhZ2VEaWdlc3QgbmV3TUQ1KCkgewogCQl9CiAJfQogCisJLyoqIEFXUyBBUEkgU2lnbmF0dXJlIFZlcnNpb24uICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXdzQXBpU2lnbmF0dXJlVmVyc2lvbjsKKwogCS8qKiBBV1NBY2Nlc3NLZXlJZCwgcHVibGljIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIHVzZXIncyBhY2NvdW50LiAqLwogCXByaXZhdGUgZmluYWwgU3RyaW5nIHB1YmxpY0tleTsKIAogCS8qKiBEZWNvZGVkIGZvcm0gb2YgdGhlIHByaXZhdGUgQVdTU2VjcmV0QWNjZXNzS2V5LCB0byBzaWduIHJlcXVlc3RzLiAqLwotCXByaXZhdGUgZmluYWwgU2VjcmV0S2V5U3BlYyBwcml2YXRlS2V5OworCXByaXZhdGUgZmluYWwgU2VjcmV0S2V5U3BlYyBzZWNyZXRLZXlTcGVjOworCisJLyoqIEFXU1NlY3JldEFjY2Vzc0tleSwgcHJpdmF0ZSBzdHJpbmcgdXNlZCB0byBhY2Nlc3MgYSB1c2VyJ3MgYWNjb3VudC4gKi8KKwlwcml2YXRlIGZpbmFsIGNoYXJbXSBzZWNyZXRLZXk7IC8vIHN0b3JlIGFzIGNoYXJbXSBmb3Igc2VjdXJpdHkKIAogCS8qKiBPdXIgSFRUUCBwcm94eSBzdXBwb3J0LCBpbiBjYXNlIHdlIGFyZSBiZWhpbmQgYSBmaXJld2FsbC4gKi8KIAlwcml2YXRlIGZpbmFsIFByb3h5U2VsZWN0b3IgcHJveHlTZWxlY3RvcjsKQEAgLTE1OSw4ICsxNzEsMTIgQEAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZURpZ2VzdCBuZXdNRDUoKSB7CiAJLyoqIFMzIEJ1Y2tldCBEb21haW4uICovCiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9tYWluOwogCisJLyoqIFMzIFJlZ2lvbi4gKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyByZWdpb247CisKIAkvKiogUHJvcGVydHkgbmFtZXMgdXNlZCBpbiBhbWF6b24gY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIGZpbGUuICovCiAJaW50ZXJmYWNlIEtleXMgeworCQlTdHJpbmcgQVdTX0FQSV9TSUdOQVRVUkVfVkVSU0lPTiA9ICJhd3MuYXBpLnNpZ25hdHVyZS52ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAogCQlTdHJpbmcgQUNDRVNTX0tFWSA9ICJhY2Nlc3NrZXkiOyAvLyROT04tTkxTLTEkCiAJCVN0cmluZyBTRUNSRVRfS0VZID0gInNlY3JldGtleSI7IC8vJE5PTi1OTFMtMSQKIAkJU3RyaW5nIFBBU1NXT1JEID0gInBhc3N3b3JkIjsgLy8kTk9OLU5MUy0xJApAQCAtMTY4LDYgKzE4NCw3IEBAIGludGVyZmFjZSBLZXlzIHsKIAkJU3RyaW5nIENSWVBUT19WRVIgPSAiY3J5cHRvLnZlcnNpb24iOyAvLyROT04tTkxTLTEkCiAJCVN0cmluZyBBQ0wgPSAiYWNsIjsgLy8kTk9OLU5MUy0xJAogCQlTdHJpbmcgRE9NQUlOID0gImRvbWFpbiI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIFJFR0lPTiA9ICJyZWdpb24iOyAvLyROT04tTkxTLTEkCiAJCVN0cmluZyBIVFRQX1JFVFJZID0gImh0dHBjbGllbnQucmV0cnktbWF4IjsgLy8kTk9OLU5MUy0xJAogCQlTdHJpbmcgVE1QX0RJUiA9ICJ0bXBkaXIiOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTgwLDYgKzE5NywxMiBAQCBpbnRlcmZhY2UgS2V5cyB7CiAJICogRm9yIGV4YW1wbGU6CiAJICoKIAkgKiA8cHJlPgorCSAqICMgQVdTIEFQSSBzaWduYXR1cmUgdmVyc2lvbiwgbXVzdCBiZSBvbmUgb2Y6CisJICogIyAgIDIgLSBkZXByZWNhdGVkIChub3Qgc3VwcG9ydGVkIGluIGFsbCBBV1MgcmVnaW9ucykKKwkgKiAjICAgNCAtIGxhdGVzdCAoc3VwcG9ydGVkIGluIGFsbCBBV1MgcmVnaW9ucykKKwkgKiAjIERlZmF1bHRzIHRvIDIuCisJICogYXdzLmFwaS5zaWduYXR1cmUudmVyc2lvbjogNAorCSAqCiAJICogIyBBV1MgQWNjZXNzIGFuZCBTZWNyZXQgS2V5cyAocmVxdWlyZWQpCiAJICogYWNjZXNza2V5OiAmbHQ7WW91ckFXU0FjY2Vzc0tleSZndDsKIAkgKiBzZWNyZXRrZXk6ICZsdDtZb3VyQVdTU2VjcmV0S2V5Jmd0OwpAQCAtMTkyLDYgKzIxNSw5IEBAIGludGVyZmFjZSBLZXlzIHsKIAkgKiAjIEFXUyBTMyBSZWdpb24gRG9tYWluIChkZWZhdWx0cyB0byBzMy5hbWF6b25hd3MuY29tKQogCSAqIGRvbWFpbjogczMuYW1hem9uYXdzLmNvbQogCSAqCisJICogIyBBV1MgUzMgUmVnaW9uIChyZXF1aXJlZCBpZiBhd3MuYXBpLnNpZ25hdHVyZS52ZXJzaW9uID0gNCkKKwkgKiByZWdpb246IHVzLXdlc3QtMgorCSAqCiAJICogIyBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgYWZ0ZXIgaW50ZXJuYWwgZXJyb3IgZnJvbSBTMy4KIAkgKiBodHRwY2xpZW50LnJldHJ5LW1heDogMwogCSAqCkBAIC0yMDQsMTYgKzIzMCwzNCBAQCBpbnRlcmZhY2UgS2V5cyB7CiAJICogICAgICAgICAgICBjb25uZWN0aW9uIHByb3BlcnRpZXMuCiAJICovCiAJcHVibGljIEFtYXpvblMzKGZpbmFsIFByb3BlcnRpZXMgcHJvcHMpIHsKKwkJYXdzQXBpU2lnbmF0dXJlVmVyc2lvbiA9IHByb3BzCisJCQkJLmdldFByb3BlcnR5KEtleXMuQVdTX0FQSV9TSUdOQVRVUkVfVkVSU0lPTiwgQVdTX0FQSV9WMik7CisJCWlmIChhd3NBcGlTaWduYXR1cmVWZXJzaW9uLmVxdWFscyhBV1NfQVBJX1Y0KSkgeworCQkJcmVnaW9uID0gcHJvcHMuZ2V0UHJvcGVydHkoS2V5cy5SRUdJT04pOworCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCUpHaXRUZXh0LmdldCgpLm1pc3NpbmdBd3NSZWdpb24pOworCQkJfQorCQl9IGVsc2UgaWYgKGF3c0FwaVNpZ25hdHVyZVZlcnNpb24uZXF1YWxzKEFXU19BUElfVjIpKSB7CisJCQlyZWdpb24gPSBudWxsOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZEF3c0FwaVNpZ25hdHVyZVZlcnNpb24sCisJCQkJCWF3c0FwaVNpZ25hdHVyZVZlcnNpb24pKTsKKwkJfQorCiAJCWRvbWFpbiA9IHByb3BzLmdldFByb3BlcnR5KEtleXMuRE9NQUlOLCAiczMuYW1hem9uYXdzLmNvbSIpOyAvLyROT04tTkxTLTEkCiAKIAkJcHVibGljS2V5ID0gcHJvcHMuZ2V0UHJvcGVydHkoS2V5cy5BQ0NFU1NfS0VZKTsKIAkJaWYgKHB1YmxpY0tleSA9PSBudWxsKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5taXNzaW5nQWNjZXNza2V5KTsKIAotCQlmaW5hbCBTdHJpbmcgc2VjcmV0ID0gcHJvcHMuZ2V0UHJvcGVydHkoS2V5cy5TRUNSRVRfS0VZKTsKLQkJaWYgKHNlY3JldCA9PSBudWxsKQorCQlmaW5hbCBTdHJpbmcgc2VjcmV0S2V5U3RyID0gcHJvcHMuZ2V0UHJvcGVydHkoS2V5cy5TRUNSRVRfS0VZKTsKKwkJaWYgKHNlY3JldEtleVN0ciA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLm1pc3NpbmdTZWNyZXRrZXkpOwotCQlwcml2YXRlS2V5ID0gbmV3IFNlY3JldEtleVNwZWMoQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHNlY3JldCksIEhNQUMpOworCQl9CisJCXNlY3JldEtleVNwZWMgPSBuZXcgU2VjcmV0S2V5U3BlYyhDb25zdGFudHMuZW5jb2RlQVNDSUkoc2VjcmV0S2V5U3RyKSwgSE1BQyk7CisJCXNlY3JldEtleSA9IHNlY3JldEtleVN0ci50b0NoYXJBcnJheSgpOwogCiAJCWZpbmFsIFN0cmluZyBwYWNsID0gcHJvcHMuZ2V0UHJvcGVydHkoS2V5cy5BQ0wsICJQUklWQVRFIik7IC8vJE5PTi1OTFMtMSQKIAkJaWYgKFN0cmluZ1V0aWxzLmVxdWFsc0lnbm9yZUNhc2UoIlBSSVZBVEUiLCBwYWNsKSkgLy8kTk9OLU5MUy0xJApAQCAtMjU4LDcgKzMwMiw3IEBAIHB1YmxpYyBVUkxDb25uZWN0aW9uIGdldChTdHJpbmcgYnVja2V0LCBTdHJpbmcga2V5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZm9yIChpbnQgY3VyQXR0ZW1wdCA9IDA7IGN1ckF0dGVtcHQgPCBtYXhBdHRlbXB0czsgY3VyQXR0ZW1wdCsrKSB7CiAJCQlmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjID0gb3BlbigiR0VUIiwgYnVja2V0LCBrZXkpOyAvLyROT04tTkxTLTEkCi0JCQlhdXRob3JpemUoYyk7CisJCQlhdXRob3JpemUoYywgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgMCwgbnVsbCk7CiAJCQlzd2l0Y2ggKEh0dHBTdXBwb3J0LnJlc3BvbnNlKGMpKSB7CiAJCQljYXNlIEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfT0s6CiAJCQkJZW5jcnlwdGlvbi52YWxpZGF0ZShjLCBYX0FNWl9NRVRBKTsKQEAgLTMzOSw3ICszODMsNyBAQCBwdWJsaWMgdm9pZCBkZWxldGUoU3RyaW5nIGJ1Y2tldCwgU3RyaW5nIGtleSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZvciAoaW50IGN1ckF0dGVtcHQgPSAwOyBjdXJBdHRlbXB0IDwgbWF4QXR0ZW1wdHM7IGN1ckF0dGVtcHQrKykgewogCQkJZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gYyA9IG9wZW4oIkRFTEVURSIsIGJ1Y2tldCwga2V5KTsgLy8kTk9OLU5MUy0xJAotCQkJYXV0aG9yaXplKGMpOworCQkJYXV0aG9yaXplKGMsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCksIDAsIG51bGwpOwogCQkJc3dpdGNoIChIdHRwU3VwcG9ydC5yZXNwb25zZShjKSkgewogCQkJY2FzZSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX05PX0NPTlRFTlQ6CiAJCQkJcmV0dXJuOwpAQCAtMzg1LDEzICs0MjksMTYgQEAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBidWNrZXQsIFN0cmluZyBrZXksIGJ5dGVbXSBkYXRhKQogCQl9CiAKIAkJZmluYWwgU3RyaW5nIG1kNXN0ciA9IEJhc2U2NC5lbmNvZGVCeXRlcyhuZXdNRDUoKS5kaWdlc3QoZGF0YSkpOworCQlmaW5hbCBTdHJpbmcgYm9keUhhc2ggPSBhd3NBcGlTaWduYXR1cmVWZXJzaW9uLmVxdWFscyhBV1NfQVBJX1Y0KQorCQkJCT8gQXdzUmVxdWVzdFNpZ25lclY0LmNhbGN1bGF0ZUJvZHlIYXNoKGRhdGEpCisJCQkJOiBudWxsOwogCQlmaW5hbCBTdHJpbmcgbGVuc3RyID0gU3RyaW5nLnZhbHVlT2YoZGF0YS5sZW5ndGgpOwogCQlmb3IgKGludCBjdXJBdHRlbXB0ID0gMDsgY3VyQXR0ZW1wdCA8IG1heEF0dGVtcHRzOyBjdXJBdHRlbXB0KyspIHsKIAkJCWZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGMgPSBvcGVuKCJQVVQiLCBidWNrZXQsIGtleSk7IC8vJE5PTi1OTFMtMSQKIAkJCWMuc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LUxlbmd0aCIsIGxlbnN0cik7IC8vJE5PTi1OTFMtMSQKIAkJCWMuc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LU1ENSIsIG1kNXN0cik7IC8vJE5PTi1OTFMtMSQKIAkJCWMuc2V0UmVxdWVzdFByb3BlcnR5KFhfQU1aX0FDTCwgYWNsKTsKLQkJCWF1dGhvcml6ZShjKTsKKwkJCWF1dGhvcml6ZShjLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLCBkYXRhLmxlbmd0aCwgYm9keUhhc2gpOwogCQkJYy5zZXREb091dHB1dCh0cnVlKTsKIAkJCWMuc2V0Rml4ZWRMZW5ndGhTdHJlYW1pbmdNb2RlKGRhdGEubGVuZ3RoKTsKIAkJCXRyeSAoT3V0cHV0U3RyZWFtIG9zID0gYy5nZXRPdXRwdXRTdHJlYW0oKSkgewpAQCAtNDY2LDYgKzUxMyw5IEBAIHZvaWQgcHV0SW1wbChmaW5hbCBTdHJpbmcgYnVja2V0LCBmaW5hbCBTdHJpbmcga2V5LAogCQkJbW9uaXRvclRhc2sgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5wcm9ncmVzc01vblVwbG9hZGluZywga2V5KTsKIAogCQlmaW5hbCBTdHJpbmcgbWQ1c3RyID0gQmFzZTY0LmVuY29kZUJ5dGVzKGNzdW0pOworCQlmaW5hbCBTdHJpbmcgYm9keUhhc2ggPSBhd3NBcGlTaWduYXR1cmVWZXJzaW9uLmVxdWFscyhBV1NfQVBJX1Y0KQorCQkJCT8gQXdzUmVxdWVzdFNpZ25lclY0LmNhbGN1bGF0ZUJvZHlIYXNoKGJ1Zi50b0J5dGVBcnJheSgpKQorCQkJCTogbnVsbDsKIAkJZmluYWwgbG9uZyBsZW4gPSBidWYubGVuZ3RoKCk7CiAJCWZvciAoaW50IGN1ckF0dGVtcHQgPSAwOyBjdXJBdHRlbXB0IDwgbWF4QXR0ZW1wdHM7IGN1ckF0dGVtcHQrKykgewogCQkJZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gYyA9IG9wZW4oIlBVVCIsIGJ1Y2tldCwga2V5KTsgLy8kTk9OLU5MUy0xJApAQCAtNDczLDcgKzUyMyw3IEBAIHZvaWQgcHV0SW1wbChmaW5hbCBTdHJpbmcgYnVja2V0LCBmaW5hbCBTdHJpbmcga2V5LAogCQkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtTUQ1IiwgbWQ1c3RyKTsgLy8kTk9OLU5MUy0xJAogCQkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoWF9BTVpfQUNMLCBhY2wpOwogCQkJZW5jcnlwdGlvbi5yZXF1ZXN0KGMsIFhfQU1aX01FVEEpOwotCQkJYXV0aG9yaXplKGMpOworCQkJYXV0aG9yaXplKGMsIENvbGxlY3Rpb25zLmVtcHR5TWFwKCksIGxlbiwgYm9keUhhc2gpOwogCQkJYy5zZXREb091dHB1dCh0cnVlKTsKIAkJCW1vbml0b3IuYmVnaW5UYXNrKG1vbml0b3JUYXNrLCAoaW50KSAobGVuIC8gMTAyNCkpOwogCQkJdHJ5IChPdXRwdXRTdHJlYW0gb3MgPSBjLmdldE91dHB1dFN0cmVhbSgpKSB7CkBAIC01NDUsOCArNTk1LDEzIEBAIEh0dHBVUkxDb25uZWN0aW9uIG9wZW4oZmluYWwgU3RyaW5nIG1ldGhvZCwgZmluYWwgU3RyaW5nIGJ1Y2tldCwKIAkJdXJsc3RyLmFwcGVuZCgnLicpOwogCQl1cmxzdHIuYXBwZW5kKGRvbWFpbik7CiAJCXVybHN0ci5hcHBlbmQoJy8nKTsKLQkJaWYgKGtleS5sZW5ndGgoKSA+IDApCi0JCQlIdHRwU3VwcG9ydC5lbmNvZGUodXJsc3RyLCBrZXkpOworCQlpZiAoa2V5Lmxlbmd0aCgpID4gMCkgeworCQkJaWYgKGF3c0FwaVNpZ25hdHVyZVZlcnNpb24uZXF1YWxzKEFXU19BUElfVjIpKSB7CisJCQkJSHR0cFN1cHBvcnQuZW5jb2RlKHVybHN0ciwga2V5KTsKKwkJCX0gZWxzZSBpZiAoYXdzQXBpU2lnbmF0dXJlVmVyc2lvbi5lcXVhbHMoQVdTX0FQSV9WNCkpIHsKKwkJCQl1cmxzdHIuYXBwZW5kKGtleSk7CisJCQl9CisJCX0KIAkJaWYgKCFhcmdzLmlzRW1wdHkoKSkgewogCQkJZmluYWwgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gaTsKIApAQCAtNTczLDcgKzYyOCwxOCBAQCBIdHRwVVJMQ29ubmVjdGlvbiBvcGVuKGZpbmFsIFN0cmluZyBtZXRob2QsIGZpbmFsIFN0cmluZyBidWNrZXQsCiAJCXJldHVybiBjOwogCX0KIAotCXZvaWQgYXV0aG9yaXplKEh0dHBVUkxDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBhdXRob3JpemUoSHR0cFVSTENvbm5lY3Rpb24gaHR0cFVSTENvbm5lY3Rpb24sCisJCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHF1ZXJ5UGFyYW1zLCBsb25nIGNvbnRlbnRMZW5ndGgsCisJCQlmaW5hbCBTdHJpbmcgYm9keUhhc2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChhd3NBcGlTaWduYXR1cmVWZXJzaW9uLmVxdWFscyhBV1NfQVBJX1YyKSkgeworCQkJYXV0aG9yaXplVjIoaHR0cFVSTENvbm5lY3Rpb24pOworCQl9IGVsc2UgaWYgKGF3c0FwaVNpZ25hdHVyZVZlcnNpb24uZXF1YWxzKEFXU19BUElfVjQpKSB7CisJCQlBd3NSZXF1ZXN0U2lnbmVyVjQuc2lnbihodHRwVVJMQ29ubmVjdGlvbiwgcXVlcnlQYXJhbXMsIGNvbnRlbnRMZW5ndGgsIGJvZHlIYXNoLCBBV1NfUzNfU0VSVklDRV9OQU1FLAorCQkJCQlyZWdpb24sIHB1YmxpY0tleSwgc2VjcmV0S2V5KTsKKwkJfQorCX0KKworCXZvaWQgYXV0aG9yaXplVjIoSHR0cFVSTENvbm5lY3Rpb24gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXFIZHIgPSBjLmdldFJlcXVlc3RQcm9wZXJ0aWVzKCk7CiAJCWZpbmFsIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gc2lnSGRyID0gbmV3IFRyZWVNYXA8PigpOwogCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiByZXFIZHIuZW50cnlTZXQoKSkgewpAQCAtNjEwLDcgKzY3Niw3IEBAIHZvaWQgYXV0aG9yaXplKEh0dHBVUkxDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBzZWM7CiAJCXRyeSB7CiAJCQlmaW5hbCBNYWMgbSA9IE1hYy5nZXRJbnN0YW5jZShITUFDKTsKLQkJCW0uaW5pdChwcml2YXRlS2V5KTsKKwkJCW0uaW5pdChzZWNyZXRLZXlTcGVjKTsKIAkJCXNlYyA9IEJhc2U2NC5lbmNvZGVCeXRlcyhtLmRvRmluYWwocy50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSkpOwogCQl9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLm5vSE1BQ3N1cHBvcnQsIEhNQUMsIGUuZ2V0TWVzc2FnZSgpKSk7CkBAIC02NzQsNyArNzQwLDcgQEAgdm9pZCBsaXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCQkJZm9yIChpbnQgY3VyQXR0ZW1wdCA9IDA7IGN1ckF0dGVtcHQgPCBtYXhBdHRlbXB0czsgY3VyQXR0ZW1wdCsrKSB7CiAJCQkJZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gYyA9IG9wZW4oIkdFVCIsIGJ1Y2tldCwgIiIsIGFyZ3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlhdXRob3JpemUoYyk7CisJCQkJYXV0aG9yaXplKGMsIGFyZ3MsIDAsIG51bGwpOwogCQkJCXN3aXRjaCAoSHR0cFN1cHBvcnQucmVzcG9uc2UoYykpIHsKIAkJCQljYXNlIEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfT0s6CiAJCQkJCXRydW5jYXRlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQXdzUmVxdWVzdFNpZ25lclY0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Bd3NSZXF1ZXN0U2lnbmVyVjQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNkMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQXdzUmVxdWVzdFNpZ25lclY0LmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFdvcmtkYXkgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudGltZS5PZmZzZXREYXRlVGltZTsKK2ltcG9ydCBqYXZhLnRpbWUuWm9uZU9mZnNldDsKK2ltcG9ydCBqYXZhLnRpbWUuZm9ybWF0LkRhdGVUaW1lRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguY3J5cHRvLk1hYzsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydDsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzaWduaW5nIHJlcXVlc3RzIHRvIEFXUyBzZXJ2aWNlIGVuZHBvaW50cyB1c2luZyB0aGUgVjQKKyAqIHNpZ25pbmcgcHJvdG9jb2wuCisgKgorICogUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uOiA8YSBocmVmPQorICogImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL3NhbXBsZXMvQVdTUzNTaWdWNEphdmFTYW1wbGVzLnppcCI+QVdTUzNTaWdWNEphdmFTYW1wbGVzLnppcDwvYT4KKyAqCisgKiBAc2VlIDxhIGhyZWY9CisgKiAgICAgICJodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2VuZXJhbC9sYXRlc3QvZ3Ivc2lnbmF0dXJlLXZlcnNpb24tNC5odG1sIj5BV1MKKyAqICAgICAgU2lnbmF0dXJlIFZlcnNpb24gNDwvYT4KKyAqCisgKiBAc2luY2UgNS4xMworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXdzUmVxdWVzdFNpZ25lclY0IHsKKworCS8qKiBBV1MgdmVyc2lvbiA0IHNpZ25pbmcgYWxnb3JpdGhtIChmb3IgYXV0aG9yaXphdGlvbiBoZWFkZXIpLiAqKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxHT1JJVEhNID0gIkhNQUMtU0hBMjU2IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqIEphdmEgTWVzc2FnZSBBdXRoZW50aWNhdGlvbiBDb2RlIChNQUMpIGFsZ29yaXRobSBuYW1lLiAqKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFDX0FMR09SSVRITSA9ICJIbWFjU0hBMjU2IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqIEFXUyB2ZXJzaW9uIDQgc2lnbmluZyBzY2hlbWUuICoqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUUgPSAiQVdTNCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKiBBV1MgdmVyc2lvbiA0IHRlcm1pbmF0b3Igc3RyaW5nLiAqKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTUlOQVRPUiA9ICJhd3M0X3JlcXVlc3QiOyAvLyROT04tTkxTLTEkCisKKwkvKiogU0hBLTI1NiBoYXNoIG9mIGFuIGVtcHR5IHJlcXVlc3QgYm9keS4gKiovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX0JPRFlfU0hBMjU2ID0gImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiOyAvLyROT04tTkxTLTEkCisKKwkvKiogRGF0ZSBmb3JtYXQgZm9yIHRoZSAneC1hbXotZGF0ZScgaGVhZGVyLiAqKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlVGltZUZvcm1hdHRlciBBTVpfREFURV9GT1JNQVQgPSBEYXRlVGltZUZvcm1hdHRlcgorCQkJLm9mUGF0dGVybigieXl5eU1NZGQnVCdISG1tc3MnWiciKTsgLy8kTk9OLU5MUy0xJAorCisJLyoqIERhdGUgZm9ybWF0IGZvciB0aGUgc3RyaW5nLXRvLXNpZ24ncyBzY29wZS4gKiovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZVRpbWVGb3JtYXR0ZXIgU0NPUEVfREFURV9GT1JNQVQgPSBEYXRlVGltZUZvcm1hdHRlcgorCQkJLm9mUGF0dGVybigieXl5eU1NZGQiKTsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBBd3NSZXF1ZXN0U2lnbmVyVjQoKSB7CisJCS8vIERvbid0IGluc3RhbnRpYXRlIHV0aWxpdHkgY2xhc3MKKwl9CisKKwkvKioKKwkgKiBTaWduIHRoZSBwcm92aWRlZCByZXF1ZXN0IHdpdGggYW4gQVdTNCBzaWduYXR1cmUgYXMgdGhlICdBdXRob3JpemF0aW9uJworCSAqIGhlYWRlci4KKwkgKgorCSAqIEBwYXJhbSBodHRwVVJMQ29ubmVjdGlvbgorCSAqICAgICAgICAgICAgVGhlIHJlcXVlc3QgdG8gc2lnbi4KKwkgKiBAcGFyYW0gcXVlcnlQYXJhbWV0ZXJzCisJICogICAgICAgICAgICBUaGUgcXVlcnkgcGFyYW1ldGVycyBiZWluZyBzZW50IGluIHRoZSByZXF1ZXN0LgorCSAqIEBwYXJhbSBjb250ZW50TGVuZ3RoCisJICogICAgICAgICAgICBUaGUgY29udGVudCBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgc2VudCBpbiB0aGUgcmVxdWVzdAorCSAqIEBwYXJhbSBib2R5SGFzaAorCSAqICAgICAgICAgICAgSGV4LWVuY29kZWQgU0hBLTI1NiBoYXNoIG9mIHRoZSBkYXRhIGJlaW5nIHNlbnQgaW4gdGhlIHJlcXVlc3QKKwkgKiBAcGFyYW0gc2VydmljZU5hbWUKKwkgKiAgICAgICAgICAgIFRoZSBzaWduaW5nIG5hbWUgb2YgdGhlIEFXUyBzZXJ2aWNlIChlLmcuICJzMyIpLgorCSAqIEBwYXJhbSByZWdpb25OYW1lCisJICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQVdTIHJlZ2lvbiB0aGF0IHdpbGwgaGFuZGxlIHRoZSByZXF1ZXN0IChlLmcuCisJICogICAgICAgICAgICAidXMtZWFzdC0xIikuCisJICogQHBhcmFtIGF3c0FjY2Vzc0tleQorCSAqICAgICAgICAgICAgVGhlIHVzZXIncyBBV1MgQWNjZXNzIEtleS4KKwkgKiBAcGFyYW0gYXdzU2VjcmV0S2V5CisJICogICAgICAgICAgICBUaGUgdXNlcidzIEFXUyBTZWNyZXQgS2V5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzaWduKEh0dHBVUkxDb25uZWN0aW9uIGh0dHBVUkxDb25uZWN0aW9uLAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBxdWVyeVBhcmFtZXRlcnMsIGxvbmcgY29udGVudExlbmd0aCwKKwkJCVN0cmluZyBib2R5SGFzaCwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgcmVnaW9uTmFtZSwKKwkJCVN0cmluZyBhd3NBY2Nlc3NLZXksIGNoYXJbXSBhd3NTZWNyZXRLZXkpIHsKKwkJLy8gZ2V0IHJlcXVlc3QgaGVhZGVycworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWh0dHBVUkxDb25uZWN0aW9uLmdldFJlcXVlc3RQcm9wZXJ0aWVzKCkKKwkJCQkuZm9yRWFjaCgoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVzKSAtPiBoZWFkZXJzLnB1dChoZWFkZXJOYW1lLAorCQkJCQkJU3RyaW5nLmpvaW4oIiwiLCBoZWFkZXJWYWx1ZXMpKSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBhZGQgcmVxdWlyZWQgY29udGVudCBoZWFkZXJzCisJCWlmIChjb250ZW50TGVuZ3RoID4gMCkgeworCQkJaGVhZGVycy5wdXQoSHR0cFN1cHBvcnQuSERSX0NPTlRFTlRfTEVOR1RILAorCQkJCQlTdHJpbmcudmFsdWVPZihjb250ZW50TGVuZ3RoKSk7CisJCX0gZWxzZSB7CisJCQlib2R5SGFzaCA9IEVNUFRZX0JPRFlfU0hBMjU2OworCQl9CisJCWhlYWRlcnMucHV0KCJ4LWFtei1jb250ZW50LXNoYTI1NiIsIGJvZHlIYXNoKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIGFkZCB0aGUgJ3gtYW16LWRhdGUnIGhlYWRlcgorCQlPZmZzZXREYXRlVGltZSBub3cgPSBJbnN0YW50Lm5vdygpLmF0T2Zmc2V0KFpvbmVPZmZzZXQuVVRDKTsKKwkJU3RyaW5nIGFtekRhdGUgPSBub3cuZm9ybWF0KEFNWl9EQVRFX0ZPUk1BVCk7CisJCWhlYWRlcnMucHV0KCJ4LWFtei1kYXRlIiwgYW16RGF0ZSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBhZGQgdGhlICdob3N0JyBoZWFkZXIKKwkJVVJMIGVuZHBvaW50VXJsID0gaHR0cFVSTENvbm5lY3Rpb24uZ2V0VVJMKCk7CisJCWludCBwb3J0ID0gZW5kcG9pbnRVcmwuZ2V0UG9ydCgpOworCQlTdHJpbmcgaG9zdEhlYWRlciA9IChwb3J0ID4gLTEpCisJCQkJPyBlbmRwb2ludFVybC5nZXRIb3N0KCkuY29uY2F0KCI6IiArIHBvcnQpIC8vJE5PTi1OTFMtMSQKKwkJCQk6IGVuZHBvaW50VXJsLmdldEhvc3QoKTsKKwkJaGVhZGVycy5wdXQoIkhvc3QiLCBob3N0SGVhZGVyKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIGNvbnN0cnVjdCB0aGUgY2Fub25pY2FsaXplZCByZXF1ZXN0CisJCVN0cmluZyBjYW5vbmljYWxpemVkSGVhZGVyTmFtZXMgPSBnZXRDYW5vbmljYWxpemVIZWFkZXJOYW1lcyhoZWFkZXJzKTsKKwkJU3RyaW5nIGNhbm9uaWNhbGl6ZWRIZWFkZXJzID0gZ2V0Q2Fub25pY2FsaXplZEhlYWRlclN0cmluZyhoZWFkZXJzKTsKKwkJU3RyaW5nIGNhbm9uaWNhbGl6ZWRRdWVyeVBhcmFtZXRlcnMgPSBnZXRDYW5vbmljYWxpemVkUXVlcnlTdHJpbmcoCisJCQkJcXVlcnlQYXJhbWV0ZXJzKTsKKwkJU3RyaW5nIGh0dHBNZXRob2QgPSBodHRwVVJMQ29ubmVjdGlvbi5nZXRSZXF1ZXN0TWV0aG9kKCk7CisJCVN0cmluZyBjYW5vbmljYWxSZXF1ZXN0ID0gaHR0cE1ldGhvZCArICdcbicKKwkJCQkrIGdldENhbm9uaWNhbGl6ZWRSZXNvdXJjZVBhdGgoZW5kcG9pbnRVcmwpICsgJ1xuJworCQkJCSsgY2Fub25pY2FsaXplZFF1ZXJ5UGFyYW1ldGVycyArICdcbicgKyBjYW5vbmljYWxpemVkSGVhZGVycworCQkJCSsgJ1xuJyArIGNhbm9uaWNhbGl6ZWRIZWFkZXJOYW1lcyArICdcbicgKyBib2R5SGFzaDsKKworCQkvLyBjb25zdHJ1Y3QgdGhlIHN0cmluZy10by1zaWduCisJCVN0cmluZyBzY29wZURhdGUgPSBub3cuZm9ybWF0KFNDT1BFX0RBVEVfRk9STUFUKTsKKwkJU3RyaW5nIHNjb3BlID0gc2NvcGVEYXRlICsgJy8nICsgcmVnaW9uTmFtZSArICcvJyArIHNlcnZpY2VOYW1lICsgJy8nCisJCQkJKyBURVJNSU5BVE9SOworCQlTdHJpbmcgc3RyaW5nVG9TaWduID0gU0NIRU1FICsgJy0nICsgQUxHT1JJVEhNICsgJ1xuJyArIGFtekRhdGUgKyAnXG4nCisJCQkJKyBzY29wZSArICdcbicgKyBIZXgudG9IZXhTdHJpbmcoaGFzaCgKKwkJCQkJCWNhbm9uaWNhbFJlcXVlc3QuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpKTsKKworCQkvLyBjb21wdXRlIHRoZSBzaWduaW5nIGtleQorCQlieXRlW10gc2VjcmV0S2V5ID0gKFNDSEVNRSArIG5ldyBTdHJpbmcoYXdzU2VjcmV0S2V5KSkuZ2V0Qnl0ZXMoKTsKKwkJYnl0ZVtdIGRhdGVLZXkgPSBzaWduU3RyaW5nV2l0aEtleShzY29wZURhdGUsIHNlY3JldEtleSk7CisJCWJ5dGVbXSByZWdpb25LZXkgPSBzaWduU3RyaW5nV2l0aEtleShyZWdpb25OYW1lLCBkYXRlS2V5KTsKKwkJYnl0ZVtdIHNlcnZpY2VLZXkgPSBzaWduU3RyaW5nV2l0aEtleShzZXJ2aWNlTmFtZSwgcmVnaW9uS2V5KTsKKwkJYnl0ZVtdIHNpZ25pbmdLZXkgPSBzaWduU3RyaW5nV2l0aEtleShURVJNSU5BVE9SLCBzZXJ2aWNlS2V5KTsKKwkJYnl0ZVtdIHNpZ25hdHVyZSA9IHNpZ25TdHJpbmdXaXRoS2V5KHN0cmluZ1RvU2lnbiwgc2lnbmluZ0tleSk7CisKKwkJLy8gY29uc3RydWN0IHRoZSBhdXRob3JpemF0aW9uIGhlYWRlcgorCQlTdHJpbmcgY3JlZGVudGlhbHNBdXRob3JpemF0aW9uSGVhZGVyID0gIkNyZWRlbnRpYWw9IiArIGF3c0FjY2Vzc0tleSAvLyROT04tTkxTLTEkCisJCQkJKyAnLycgKyBzY29wZTsKKwkJU3RyaW5nIHNpZ25lZEhlYWRlcnNBdXRob3JpemF0aW9uSGVhZGVyID0gIlNpZ25lZEhlYWRlcnM9IiAvLyROT04tTkxTLTEkCisJCQkJKyBjYW5vbmljYWxpemVkSGVhZGVyTmFtZXM7CisJCVN0cmluZyBzaWduYXR1cmVBdXRob3JpemF0aW9uSGVhZGVyID0gIlNpZ25hdHVyZT0iIC8vJE5PTi1OTFMtMSQKKwkJCQkrIEhleC50b0hleFN0cmluZyhzaWduYXR1cmUpOworCQlTdHJpbmcgYXV0aG9yaXphdGlvbkhlYWRlciA9IFNDSEVNRSArICctJyArIEFMR09SSVRITSArICcgJworCQkJCSsgY3JlZGVudGlhbHNBdXRob3JpemF0aW9uSGVhZGVyICsgIiwgIiAvLyROT04tTkxTLTEkCisJCQkJKyBzaWduZWRIZWFkZXJzQXV0aG9yaXphdGlvbkhlYWRlciArICIsICIgLy8kTk9OLU5MUy0xJAorCQkJCSsgc2lnbmF0dXJlQXV0aG9yaXphdGlvbkhlYWRlcjsKKworCQkvLyBDb3B5IGJhY2sgdGhlIHVwZGF0ZWQgcmVxdWVzdCBoZWFkZXJzCisJCWhlYWRlcnMuZm9yRWFjaChodHRwVVJMQ29ubmVjdGlvbjo6c2V0UmVxdWVzdFByb3BlcnR5KTsKKworCQkvLyBBZGQgdGhlICdhdXRob3JpemF0aW9uJyBoZWFkZXIKKwkJaHR0cFVSTENvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KEh0dHBTdXBwb3J0LkhEUl9BVVRIT1JJWkFUSU9OLAorCQkJCWF1dGhvcml6YXRpb25IZWFkZXIpOworCX0KKworCS8qKgorCSAqIENhbGN1bGF0ZXMgdGhlIGhleC1lbmNvZGVkIFNIQS0yNTYgaGFzaCBvZiB0aGUgcHJvdmlkZWQgYnl0ZSBhcnJheS4KKwkgKgorCSAqIEBwYXJhbSBkYXRhCisJICogICAgICAgICAgICBCeXRlIGFycmF5IHRvIGhhc2gKKwkgKgorCSAqIEByZXR1cm4gSGV4LWVuY29kZWQgU0hBLTI1NiBoYXNoIG9mIHRoZSBwcm92aWRlZCBieXRlIGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZUJvZHlIYXNoKGZpbmFsIGJ5dGVbXSBkYXRhKSB7CisJCXJldHVybiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoIDwgMSkgPyBFTVBUWV9CT0RZX1NIQTI1NgorCQkJCTogSGV4LnRvSGV4U3RyaW5nKGhhc2goZGF0YSkpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdCBhIHN0cmluZyBsaXN0aW5nIGFsbCByZXF1ZXN0IGhlYWRlcnMgaW4gc29ydGVkIGNhc2UtaW5zZW5zaXRpdmUKKwkgKiBvcmRlciwgc2VwYXJhdGVkIGJ5IGEgJzsnLgorCSAqCisJICogQHBhcmFtIGhlYWRlcnMKKwkgKiAgICAgICAgICAgIE1hcCBjb250YWluaW5nIGFsbCByZXF1ZXN0IGhlYWRlcnMuCisJICoKKwkgKiBAcmV0dXJuIFN0cmluZyB0aGF0IGxpc3RzIGFsbCByZXF1ZXN0IGhlYWRlcnMgaW4gc29ydGVkIGNhc2UtaW5zZW5zaXRpdmUKKwkgKiAgICAgICAgIG9yZGVyLCBzZXBhcmF0ZWQgYnkgYSAnOycuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhbm9uaWNhbGl6ZUhlYWRlck5hbWVzKAorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7CisJCXJldHVybiBoZWFkZXJzLmtleVNldCgpLnN0cmVhbSgpLm1hcChTdHJpbmc6OnRvTG93ZXJDYXNlKS5zb3J0ZWQoKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiOyIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgdGhlIGNhbm9uaWNhbCBoZWFkZXIgc3RyaW5nIGZvciBhIHJlcXVlc3QuCisJICoKKwkgKiBAcGFyYW0gaGVhZGVycworCSAqICAgICAgICAgICAgTWFwIGNvbnRhaW5pbmcgYWxsIHJlcXVlc3QgaGVhZGVycy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGNhbm9uaWNhbCBoZWFkZXJzIHdpdGggdmFsdWVzIGZvciB0aGUgcmVxdWVzdC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2Fub25pY2FsaXplZEhlYWRlclN0cmluZygKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgeworCQlpZiAoaGVhZGVycyA9PSBudWxsIHx8IGhlYWRlcnMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJaGVhZGVycy5rZXlTZXQoKS5zdHJlYW0oKS5zb3J0ZWQoU3RyaW5nLkNBU0VfSU5TRU5TSVRJVkVfT1JERVIpCisJCQkJLmZvckVhY2goa2V5IC0+IHsKKwkJCQkJU3RyaW5nIGhlYWRlciA9IGtleS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIlxccysiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJU3RyaW5nIHZhbHVlID0gaGVhZGVycy5nZXQoa2V5KS5yZXBsYWNlQWxsKCJcXHMrIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCXNiLmFwcGVuZChoZWFkZXIpLmFwcGVuZCgnOicpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCdcbicpOworCQkJCX0pOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIHRoZSBjYW5vbmljYWxpemVkIHJlc291cmNlIHBhdGggZm9yIGFuIEFXUyBzZXJ2aWNlIGVuZHBvaW50LgorCSAqCisJICogQHBhcmFtIHVybAorCSAqICAgICAgICAgICAgVGhlIEFXUyBzZXJ2aWNlIGVuZHBvaW50IFVSTCwgaW5jbHVkaW5nIHRoZSBwYXRoIHRvIGFueQorCSAqICAgICAgICAgICAgcmVzb3VyY2UuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjYW5vbmljYWxpemVkIHJlc291cmNlIHBhdGggZm9yIHRoZSBBV1Mgc2VydmljZSBlbmRwb2ludC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2Fub25pY2FsaXplZFJlc291cmNlUGF0aChVUkwgdXJsKSB7CisJCWlmICh1cmwgPT0gbnVsbCkgeworCQkJcmV0dXJuICIvIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJCVN0cmluZyBwYXRoID0gdXJsLmdldFBhdGgoKTsKKwkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuICIvIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJCVN0cmluZyBlbmNvZGVkUGF0aCA9IEh0dHBTdXBwb3J0LnVybEVuY29kZShwYXRoLCB0cnVlKTsKKwkJaWYgKGVuY29kZWRQYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZW5jb2RlZFBhdGg7CisJCX0KKwkJcmV0dXJuICIvIi5jb25jYXQoZW5jb2RlZFBhdGgpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgY2Fub25pY2FsaXplZCBxdWVyeSBzdHJpbmcgZm9yIGEgcmVxdWVzdC4KKwkgKgorCSAqIEBwYXJhbSBxdWVyeVBhcmFtZXRlcnMKKwkgKiAgICAgICAgICAgIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGluIHRoZSByZXF1ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUgY2Fub25pY2FsaXplZCBxdWVyeSBzdHJpbmcgZm9yIHRoZSByZXF1ZXN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENhbm9uaWNhbGl6ZWRRdWVyeVN0cmluZygKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcXVlcnlQYXJhbWV0ZXJzKSB7CisJCWlmIChxdWVyeVBhcmFtZXRlcnMgPT0gbnVsbCB8fCBxdWVyeVBhcmFtZXRlcnMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gcXVlcnlQYXJhbWV0ZXJzCisJCQkJLmtleVNldCgpLnN0cmVhbSgpLnNvcnRlZCgpLm1hcCgKKwkJCQkJCWtleSAtPiBIdHRwU3VwcG9ydC51cmxFbmNvZGUoa2V5LCBmYWxzZSkgKyAnPScKKwkJCQkJCQkJKyBIdHRwU3VwcG9ydC51cmxFbmNvZGUoCisJCQkJCQkJCQkJcXVlcnlQYXJhbWV0ZXJzLmdldChrZXkpLCBmYWxzZSkpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCImIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogSGFzaGVzIHRoZSBwcm92aWRlZCBieXRlIGFycmF5IHVzaW5nIHRoZSBTSEEtMjU2IGFsZ29yaXRobS4KKwkgKgorCSAqIEBwYXJhbSBkYXRhCisJICogICAgICAgICAgICBUaGUgYnl0ZSBhcnJheSB0byBoYXNoLgorCSAqCisJICogQHJldHVybiBIYXNoZWQgc3RyaW5nIGNvbnRlbnRzIG9mIHRoZSBwcm92aWRlZCBieXRlIGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGhhc2goYnl0ZVtdIGRhdGEpIHsKKwkJdHJ5IHsKKwkJCU1lc3NhZ2VEaWdlc3QgbWQgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEtMjU2Iik7IC8vJE5PTi1OTFMtMSQKKwkJCW1kLnVwZGF0ZShkYXRhKTsKKwkJCXJldHVybiBtZC5kaWdlc3QoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorCQkJCQlKR2l0VGV4dC5nZXQoKS5jb3VsZE5vdEhhc2hCeXRlQXJyYXlXaXRoU2hhMjU2LCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNpZ25zIHRoZSBwcm92aWRlZCBzdHJpbmcgZGF0YSB1c2luZyB0aGUgc3BlY2lmaWVkIGtleS4KKwkgKgorCSAqIEBwYXJhbSBzdHJpbmdUb1NpZ24KKwkgKiAgICAgICAgICAgIFRoZSBzdHJpbmcgZGF0YSB0byBzaWduLgorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIFRoZSBrZXkgbWF0ZXJpYWwgb2YgdGhlIHNlY3JldCBrZXkuCisJICoKKwkgKiBAcmV0dXJuIFNpZ25lZCBzdHJpbmcgZGF0YS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBieXRlW10gc2lnblN0cmluZ1dpdGhLZXkoU3RyaW5nIHN0cmluZ1RvU2lnbiwgYnl0ZVtdIGtleSkgeworCQl0cnkgeworCQkJYnl0ZVtdIGRhdGEgPSBzdHJpbmdUb1NpZ24uZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQlNYWMgbWFjID0gTWFjLmdldEluc3RhbmNlKE1BQ19BTEdPUklUSE0pOworCQkJbWFjLmluaXQobmV3IFNlY3JldEtleVNwZWMoa2V5LCBNQUNfQUxHT1JJVEhNKSk7CisJCQlyZXR1cm4gbWFjLmRvRmluYWwoZGF0YSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5jb3VsZE5vdFNpZ25TdHJpbmdXaXRoS2V5LAorCQkJCQllKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0Nvbm5lY3Rpb24uamF2YQppbmRleCAzODI2YmY3Li4wOWM1NTlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0Nvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0Nvbm5lY3Rpb24uamF2YQpAQCAtMjEwLDkgKzIxMCw3IEBAIHByaXZhdGUgYm9vbGVhbiByZWFkQWR2ZXJ0aXNlZFJlZnNJbXBsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQl0cnkgewogCQkJCQlsaW5lID0gcmVhZExpbmUoKTsKIAkJCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewotCQkJCQlUcmFuc3BvcnRFeGNlcHRpb24gbm9SZXBvID0gbm9SZXBvc2l0b3J5KCk7Ci0JCQkJCW5vUmVwby5pbml0Q2F1c2UoZSk7Ci0JCQkJCXRocm93IG5vUmVwbzsKKwkJCQkJdGhyb3cgbm9SZXBvc2l0b3J5KGUpOwogCQkJCX0KIAkJCQlpZiAobGluZSAhPSBudWxsICYmIFZFUlNJT05fMS5lcXVhbHMobGluZSkpIHsKIAkJCQkJLy8gU2FtZSBhcyBWMCwgZXhjZXB0IGZvciB0aGlzIGV4dHJhIGxpbmUuIFdlIHNob3VsZG4ndCBnZXQKQEAgLTU2NywxMSArNTY1LDE0IEBAIHN0YXRpYyB2b2lkIHVwZGF0ZVdpdGhTeW1SZWZzKE1hcDxTdHJpbmcsIFJlZj4gcmVmTWFwLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHN5bVJlCiAJICoKIAkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGJldHRlciBkaWFnbm9zdGljcy4KIAkgKgorCSAqIEBwYXJhbSBjYXVzZQorCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKiBAcmV0dXJuIGEgVHJhbnNwb3J0RXhjZXB0aW9uIHNheWluZyBhIHJlcG9zaXRvcnkgY2Fubm90IGJlIGZvdW5kIGFuZAogCSAqICAgICAgICAgcG9zc2libHkgd2h5LgogCSAqLwotCXByb3RlY3RlZCBUcmFuc3BvcnRFeGNlcHRpb24gbm9SZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gbmV3IE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbih1cmksIEpHaXRUZXh0LmdldCgpLm5vdEZvdW5kKTsKKwlwcm90ZWN0ZWQgVHJhbnNwb3J0RXhjZXB0aW9uIG5vUmVwb3NpdG9yeShUaHJvd2FibGUgY2F1c2UpIHsKKwkJcmV0dXJuIG5ldyBOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24odXJpLCBKR2l0VGV4dC5nZXQoKS5ub3RGb3VuZCwKKwkJCQljYXVzZSk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0ZldGNoQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24uamF2YQppbmRleCBmNDhlMWU2Li4zZjE2N2NjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0ZldGNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrRmV0Y2hDb25uZWN0aW9uLmphdmEKQEAgLTEsNyArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDEwIEdvb2dsZSBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFJvYmluIFJvc2VuYmVyZyA8cm9iaW4ucm9zZW5iZXJnQGRld2lyZS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMjAgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMjIgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xMDA0LDkgKzEwMDQsMTIgQEAgcHJpdmF0ZSB2b2lkIHJlY2VpdmVQYWNrKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQkJT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb25SZWNlaXZlUGFjaygpOwogCQlJbnB1dFN0cmVhbSBpbnB1dCA9IGluOwotCQlpZiAoc2lkZWJhbmQpCi0JCQlpbnB1dCA9IG5ldyBTaWRlQmFuZElucHV0U3RyZWFtKGlucHV0LCBtb25pdG9yLCBnZXRNZXNzYWdlV3JpdGVyKCksCi0JCQkJCW91dHB1dFN0cmVhbSk7CisJCVNpZGVCYW5kSW5wdXRTdHJlYW0gc2lkZWJhbmRJbiA9IG51bGw7CisJCWlmIChzaWRlYmFuZCkgeworCQkJc2lkZWJhbmRJbiA9IG5ldyBTaWRlQmFuZElucHV0U3RyZWFtKGlucHV0LCBtb25pdG9yLAorCQkJCQlnZXRNZXNzYWdlV3JpdGVyKCksIG91dHB1dFN0cmVhbSk7CisJCQlpbnB1dCA9IHNpZGViYW5kSW47CisJCX0KIAogCQl0cnkgKE9iamVjdEluc2VydGVyIGlucyA9IGxvY2FsLm5ld09iamVjdEluc2VydGVyKCkpIHsKIAkJCVBhY2tQYXJzZXIgcGFyc2VyID0gaW5zLm5ld1BhY2tQYXJzZXIoaW5wdXQpOwpAQCAtMTAxNSw2ICsxMDE4LDEwIEBAIHByaXZhdGUgdm9pZCByZWNlaXZlUGFjayhmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCXBhcnNlci5zZXRMb2NrTWVzc2FnZShsb2NrTWVzc2FnZSk7CiAJCQlwYWNrTG9jayA9IHBhcnNlci5wYXJzZShtb25pdG9yKTsKIAkJCWlucy5mbHVzaCgpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKHNpZGViYW5kSW4gIT0gbnVsbCkgeworCQkJCXNpZGViYW5kSW4uZHJhaW5NZXNzYWdlcygpOworCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uLmphdmEKaW5kZXggZWIxZDJhYy4uYjdiZTU5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tQdXNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24uamF2YQpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIE1hcmVrIFphd2lyc2tpIDxtYXJlay56YXdpcnNraUBnbWFpbC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIyIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTM5LDcgKzEzOSw3IEBAIHB1YmxpYyB2b2lkIHB1c2goZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBUcmFuc3BvcnRFeGNlcHRpb24gbm9SZXBvc2l0b3J5KCkgeworCXByb3RlY3RlZCBUcmFuc3BvcnRFeGNlcHRpb24gbm9SZXBvc2l0b3J5KFRocm93YWJsZSBjYXVzZSkgewogCQkvLyBTYWRseSB3ZSBjYW5ub3QgdGVsbCB0aGUgImludmFsaWQgVVJJIiBjYXNlIGZyb20gInB1c2ggbm90IGFsbG93ZWQiLgogCQkvLyBPcGVuaW5nIGEgZmV0Y2ggY29ubmVjdGlvbiBjYW4gaGVscCB1cyB0ZWxsIHRoZSBkaWZmZXJlbmNlLCBhcyBhbnkKIAkJLy8gdXNlZnVsIHJlcG9zaXRvcnkgaXMgZ29pbmcgdG8gc3VwcG9ydCBmZXRjaCBpZiBpdCBhbHNvIHdvdWxkIGFsbG93CkBAIC0xNDcsMTggKzE0NywxOCBAQCBwcm90ZWN0ZWQgVHJhbnNwb3J0RXhjZXB0aW9uIG5vUmVwb3NpdG9yeSgpIHsKIAkJLy8gVVJJIGlzIHdyb25nLiBPdGhlcndpc2Ugd2UgY2FuIGNvcnJlY3RseSBzdGF0ZSBwdXNoIGlzbid0IGFsbG93ZWQKIAkJLy8gYXMgdGhlIGZldGNoIGNvbm5lY3Rpb24gb3BlbmVkIHN1Y2Nlc3NmdWxseS4KIAkJLy8KKwkJVHJhbnNwb3J0RXhjZXB0aW9uIHRlOwogCQl0cnkgewogCQkJdHJhbnNwb3J0Lm9wZW5GZXRjaCgpLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBGYWxsIHRocm91Z2guCisJCQl0ZSA9IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odXJpLCBKR2l0VGV4dC5nZXQoKS5wdXNoTm90UGVybWl0dGVkKTsKIAkJfSBjYXRjaCAoTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKIAkJCS8vIEZldGNoIGNvbmNsdWRlZCB0aGUgcmVwb3NpdG9yeSBkb2Vzbid0IGV4aXN0LgotCQkJLy8KLQkJCXJldHVybiBlOwotCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkgewotCQkJLy8gRmFsbCB0aHJvdWdoLgorCQkJdGUgPSBlOworCQl9IGNhdGNoIChOb3RTdXBwb3J0ZWRFeGNlcHRpb24gfCBUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworCQkJdGUgPSBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHVyaSwgSkdpdFRleHQuZ2V0KCkucHVzaE5vdFBlcm1pdHRlZCwgZSk7CiAJCX0KLQkJcmV0dXJuIG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odXJpLCBKR2l0VGV4dC5nZXQoKS5wdXNoTm90UGVybWl0dGVkKTsKKwkJdGUuYWRkU3VwcHJlc3NlZChjYXVzZSk7CisJCXJldHVybiB0ZTsKIAl9CiAKIAkvKioKQEAgLTE5NCwxMCArMTk0LDExIEBAIHByb3RlY3RlZCB2b2lkIGRvUHVzaChmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCQkJLy8gdGhlIG90aGVyIGRhdGEgY2hhbm5lbHMuCiAJCQkJCS8vCiAJCQkJCWludCBiID0gaW4ucmVhZCgpOwotCQkJCQlpZiAoMCA8PSBiKQorCQkJCQlpZiAoMCA8PSBiKSB7CiAJCQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHVyaSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQkJCUpHaXRUZXh0LmdldCgpLmV4cGVjdGVkRU9GUmVjZWl2ZWQsCiAJCQkJCQkJCUNoYXJhY3Rlci52YWx1ZU9mKChjaGFyKSBiKSkpOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkgewpAQCAtMjA1LDYgKzIwNiw5IEBAIHByb3RlY3RlZCB2b2lkIGRvUHVzaChmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odXJpLCBlLmdldE1lc3NhZ2UoKSwgZSk7CiAJCX0gZmluYWxseSB7CisJCQlpZiAoaW4gaW5zdGFuY2VvZiBTaWRlQmFuZElucHV0U3RyZWFtKSB7CisJCQkJKChTaWRlQmFuZElucHV0U3RyZWFtKSBpbikuZHJhaW5NZXNzYWdlcygpOworCQkJfQogCQkJY2xvc2UoKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoUHJvY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEKaW5kZXggN2Q3YjNlZS4uN2JmYWNlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CkBAIC01Niw2ICs1NywxMiBAQCBjbGFzcyBGZXRjaFByb2Nlc3MgewogCS8qKiBMaXN0IG9mIHRoaW5ncyB3ZSB3YW50IHRvIGZldGNoIGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5LiAqLwogCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiB0b0ZldGNoOwogCisJLyoqCisJICogTGlzdCBvZiB0aGluZ3Mgd2UgZG9uJ3Qgd2FudCB0byBmZXRjaCBmcm9tIHRoZSByZW1vdGUgcmVwb3NpdG9yeSBvciB0bworCSAqIHRoZSBsb2NhbCByZXBvc2l0b3J5LgorCSAqLworCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBuZWdhdGl2ZVJlZlNwZWNzOworCiAJLyoqIFNldCBvZiByZWZzIHdlIHdpbGwgYWN0dWFsbHkgd2luZCB1cCBhc2tpbmcgdG8gb2J0YWluLiAqLwogCXByaXZhdGUgZmluYWwgSGFzaE1hcDxPYmplY3RJZCwgUmVmPiBhc2tGb3IgPSBuZXcgSGFzaE1hcDw+KCk7CiAKQEAgLTc0LDkgKzgxLDEyIEBAIGNsYXNzIEZldGNoUHJvY2VzcyB7CiAKIAlwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gbG9jYWxSZWZzOwogCi0JRmV0Y2hQcm9jZXNzKFRyYW5zcG9ydCB0LCBDb2xsZWN0aW9uPFJlZlNwZWM+IGYpIHsKKwlGZXRjaFByb2Nlc3MoVHJhbnNwb3J0IHQsIENvbGxlY3Rpb248UmVmU3BlYz4gcmVmU3BlY3MpIHsKIAkJdHJhbnNwb3J0ID0gdDsKLQkJdG9GZXRjaCA9IGY7CisJCXRvRmV0Y2ggPSByZWZTcGVjcy5zdHJlYW0oKS5maWx0ZXIocmVmU3BlYyAtPiAhcmVmU3BlYy5pc05lZ2F0aXZlKCkpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCW5lZ2F0aXZlUmVmU3BlY3MgPSByZWZTcGVjcy5zdHJlYW0oKS5maWx0ZXIoUmVmU3BlYzo6aXNOZWdhdGl2ZSkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKIAl9CiAKIAl2b2lkIGV4ZWN1dGUoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEZldGNoUmVzdWx0IHJlc3VsdCwKQEAgLTIwNCw4ICsyMTQsMTMgQEAgZWxzZSBpZiAodGFnb3B0ID09IFRhZ09wdC5GRVRDSF9UQUdTKQogCiAJCUJhdGNoUmVmVXBkYXRlIGJhdGNoID0gdHJhbnNwb3J0LmxvY2FsLmdldFJlZkRhdGFiYXNlKCkKIAkJCQkubmV3QmF0Y2hVcGRhdGUoKQotCQkJCS5zZXRBbGxvd05vbkZhc3RGb3J3YXJkcyh0cnVlKQotCQkJCS5zZXRSZWZMb2dNZXNzYWdlKCJmZXRjaCIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCQkJLnNldEFsbG93Tm9uRmFzdEZvcndhcmRzKHRydWUpOworCisJCS8vIEdlbmVyYXRlIHJlZmxvZyBvbmx5IHdoZW4gZmV0Y2hpbmcgdXBkYXRlcyBhbmQgbm90IGF0IHRoZSBmaXJzdCBjbG9uZQorCQlpZiAoaW5pdGlhbEJyYW5jaCA9PSBudWxsKSB7CisJCQliYXRjaC5zZXRSZWZMb2dNZXNzYWdlKCJmZXRjaCIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCX0KKwogCQl0cnkgKFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKIAkJCXdhbGsuc2V0UmV0YWluQm9keShmYWxzZSk7CiAJCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIEJhdGNoaW5nUHJvZ3Jlc3NNb25pdG9yKSB7CkBAIC0zODksOCArNDA0LDEzIEBAIHByaXZhdGUgYm9vbGVhbiBhc2tGb3JJc0NvbXBsZXRlKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSB2b2lkIGV4cGFuZFdpbGRjYXJkKFJlZlNwZWMgc3BlYywgU2V0PFJlZj4gbWF0Y2hlZCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmb3IgKFJlZiBzcmMgOiBjb25uLmdldFJlZnMoKSkgewotCQkJaWYgKHNwZWMubWF0Y2hTb3VyY2Uoc3JjKSAmJiBtYXRjaGVkLmFkZChzcmMpKQotCQkJCXdhbnQoc3JjLCBzcGVjLmV4cGFuZEZyb21Tb3VyY2Uoc3JjKSk7CisJCQlpZiAoc3BlYy5tYXRjaFNvdXJjZShzcmMpKSB7CisJCQkJUmVmU3BlYyBleHBhbmRlZFJlZlNwZWMgPSBzcGVjLmV4cGFuZEZyb21Tb3VyY2Uoc3JjKTsKKwkJCQlpZiAoIW1hdGNoTmVnYXRpdmVSZWZTcGVjKGV4cGFuZGVkUmVmU3BlYykKKwkJCQkJCSYmIG1hdGNoZWQuYWRkKHNyYykpIHsKKwkJCQkJd2FudChzcmMsIGV4cGFuZGVkUmVmU3BlYyk7CisJCQkJfQorCQkJfQogCQl9CiAJfQogCkBAIC00MDYsMTEgKzQyNiwyNyBAQCBwcml2YXRlIHZvaWQgZXhwYW5kU2luZ2xlKFJlZlNwZWMgc3BlYywgU2V0PFJlZj4gbWF0Y2hlZCkKIAkJaWYgKHNyYyA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnJlbW90ZURvZXNOb3RIYXZlU3BlYywgd2FudCkpOwogCQl9Ci0JCWlmIChtYXRjaGVkLmFkZChzcmMpKSB7CisJCWlmICghbWF0Y2hOZWdhdGl2ZVJlZlNwZWMoc3BlYykgJiYgbWF0Y2hlZC5hZGQoc3JjKSkgewogCQkJd2FudChzcmMsIHNwZWMpOwogCQl9CiAJfQogCisJcHJpdmF0ZSBib29sZWFuIG1hdGNoTmVnYXRpdmVSZWZTcGVjKFJlZlNwZWMgc3BlYykgeworCQlmb3IgKFJlZlNwZWMgbmVnYXRpdmVSZWZTcGVjIDogbmVnYXRpdmVSZWZTcGVjcykgeworCQkJaWYgKG5lZ2F0aXZlUmVmU3BlYy5nZXRTb3VyY2UoKSAhPSBudWxsICYmIHNwZWMuZ2V0U291cmNlKCkgIT0gbnVsbAorCQkJCQkmJiBuZWdhdGl2ZVJlZlNwZWMubWF0Y2hTb3VyY2Uoc3BlYy5nZXRTb3VyY2UoKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKworCQkJaWYgKG5lZ2F0aXZlUmVmU3BlYy5nZXREZXN0aW5hdGlvbigpICE9IG51bGwKKwkJCQkJJiYgc3BlYy5nZXREZXN0aW5hdGlvbigpICE9IG51bGwgJiYgbmVnYXRpdmVSZWZTcGVjCisJCQkJCQkJLm1hdGNoRGVzdGluYXRpb24oc3BlYy5nZXREZXN0aW5hdGlvbigpKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKIAlwcml2YXRlIGJvb2xlYW4gbG9jYWxIYXNPYmplY3QoT2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIHRyYW5zcG9ydC5sb2NhbC5nZXRPYmplY3REYXRhYmFzZSgpLmhhcyhpZCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnLmphdmEKaW5kZXggZmRhN2E4MS4uYzg3NzRkNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcsIERhdmlkIFB1cnNlaG91c2UgPGRhdmlkLnB1cnNlaG91c2VAZ21haWwuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcsIDIwMjIgRGF2aWQgUHVyc2Vob3VzZSA8ZGF2aWQucHVyc2Vob3VzZUBnbWFpbC5jb20+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTEwLDcgKzEwLDEwIEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgpAQCAtMTksOCArMjIsOSBAQAogICogQHNpbmNlIDQuOQogICovCiBwdWJsaWMgY2xhc3MgUHVzaENvbmZpZyB7CisKIAkvKioKLQkgKiBDb25maWcgdmFsdWVzIGZvciBwdXNoLnJlY3Vyc2VTdWJtb2R1bGVzLgorCSAqIEdpdCBjb25maWcgdmFsdWVzIGZvciB7QGNvZGUgcHVzaC5yZWN1cnNlU3VibW9kdWxlc30uCiAJICovCiAJcHVibGljIGVudW0gUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZSBpbXBsZW1lbnRzIENvbmZpZy5Db25maWdFbnVtIHsKIAkJLyoqCkBAIC01OSw0ICs2MywxMDAgQEAgcHVibGljIGJvb2xlYW4gbWF0Y2hDb25maWdWYWx1ZShTdHJpbmcgcykgewogCQkJCQl8fCBjb25maWdWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKHMpOwogCQl9CiAJfQorCisJLyoqCisJICogR2l0IGNvbmZpZyB2YWx1ZXMgZm9yIHtAY29kZSBwdXNoLmRlZmF1bHR9LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBlbnVtIFB1c2hEZWZhdWx0IGltcGxlbWVudHMgQ29uZmlnLkNvbmZpZ0VudW0geworCisJCS8qKgorCQkgKiBEbyBub3QgcHVzaCBpZiB0aGVyZSBhcmUgbm8gZXhwbGljaXQgcmVmc3BlY3MuCisJCSAqLworCQlOT1RISU5HLAorCisJCS8qKgorCQkgKiBQdXNoIHRoZSBjdXJyZW50IGJyYW5jaCB0byBhbiB1cHN0cmVhbSBicmFuY2ggb2YgdGhlIHNhbWUgbmFtZS4KKwkJICovCisJCUNVUlJFTlQsCisKKwkJLyoqCisJCSAqIFB1c2ggdGhlIGN1cnJlbnQgYnJhbmNoIHRvIGFuIHVwc3RyZWFtIGJyYW5jaCBkZXRlcm1pbmVkIGJ5IGdpdAorCQkgKiBjb25maWcge0Bjb2RlIGJyYW5jaC48Y3VycmVudEJyYW5jaD4ubWVyZ2V9LgorCQkgKi8KKwkJVVBTVFJFQU0oInRyYWNraW5nIiksIC8vJE5PTi1OTFMtMSQKKworCQkvKioKKwkJICogTGlrZSB7QGxpbmsgI1VQU1RSRUFNfSwgYnV0IG9ubHkgaWYgdGhlIHVwc3RyZWFtIG5hbWUgaXMgdGhlIHNhbWUgYXMKKwkJICogdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbG9jYWwgYnJhbmNoLgorCQkgKi8KKwkJU0lNUExFLAorCisJCS8qKgorCQkgKiBQdXNoIGFsbCBjdXJyZW50IGxvY2FsIGJyYW5jaGVzIHRoYXQgbWF0Y2ggYSBjb25maWd1cmVkIHB1c2ggcmVmc3BlYworCQkgKiBvZiB0aGUgcmVtb3RlIGNvbmZpZ3VyYXRpb24uCisJCSAqLworCQlNQVRDSElORzsKKworCQlwcml2YXRlIGZpbmFsIFN0cmluZyBhbGlhczsKKworCQlwcml2YXRlIFB1c2hEZWZhdWx0KCkgeworCQkJYWxpYXMgPSBudWxsOworCQl9CisKKwkJcHJpdmF0ZSBQdXNoRGVmYXVsdChTdHJpbmcgYWxpYXMpIHsKKwkJCXRoaXMuYWxpYXMgPSBhbGlhczsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgU3RyaW5nIHRvQ29uZmlnVmFsdWUoKSB7CisJCQlyZXR1cm4gbmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBtYXRjaENvbmZpZ1ZhbHVlKFN0cmluZyBpbikgeworCQkJcmV0dXJuIHRvQ29uZmlnVmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKGluKQorCQkJCQl8fCAoYWxpYXMgIT0gbnVsbCAmJiBhbGlhcy5lcXVhbHNJZ25vcmVDYXNlKGluKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIFB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUgcmVjdXJzZVN1Ym1vZHVsZXM7CisKKwlwcml2YXRlIGZpbmFsIFB1c2hEZWZhdWx0IHB1c2hEZWZhdWx0OworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKwkgKgorCSAqIEBwYXJhbSBjb25maWcKKwkgKiAgICAgICAgICAgIHtAbGluayBDb25maWd9IHRvIGZpbGwgdGhlIHtAbGluayBQdXNoQ29uZmlnfSBmcm9tCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBQdXNoQ29uZmlnKENvbmZpZyBjb25maWcpIHsKKwkJcmVjdXJzZVN1Ym1vZHVsZXMgPSBjb25maWcuZ2V0RW51bShDb25maWdDb25zdGFudHMuQ09ORklHX1BVU0hfU0VDVElPTiwKKwkJCQludWxsLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9SRUNVUlNFX1NVQk1PRFVMRVMsCisJCQkJUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5OTyk7CisJCXB1c2hEZWZhdWx0ID0gY29uZmlnLmdldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19QVVNIX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfREVGQVVMVCwgUHVzaERlZmF1bHQuU0lNUExFKTsKKwl9CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGdpdCBjb25maWcge0Bjb2RlIHB1c2gucmVjdXJzZVN1Ym1vZHVsZXN9LgorCSAqCisJICogQHJldHVybiB0aGUgdmFsdWUKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUgZ2V0UmVjdXJzZVN1Ym1vZHVsZXMoKSB7CisJCXJldHVybiByZWN1cnNlU3VibW9kdWxlczsKKwl9CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGdpdCBjb25maWcge0Bjb2RlIHB1c2guZGVmYXVsdH0uCisJICoKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUHVzaERlZmF1bHQgZ2V0UHVzaERlZmF1bHQoKSB7CisJCXJldHVybiBwdXNoRGVmYXVsdDsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YQppbmRleCBhMjQ0YzU1Li5iNTlhZTBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4LCBNYXJlayBaYXdpcnNraSA8bWFyZWsuemF3aXJza2lAZ21haWwuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMjIgTWFyZWsgWmF3aXJza2kgPG1hcmVrLnphd2lyc2tpQGdtYWlsLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsMTEgKzE4LDE1IEBACiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ob29rcy5QcmVQdXNoSG9vazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwpAQCAtNTgsNiArNjIsOCBAQCBjbGFzcyBQdXNoUHJvY2VzcyB7CiAJLyoqIEEgbGlzdCBvZiBvcHRpb24gc3RyaW5ncyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwdXNoICovCiAJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHVzaE9wdGlvbnM7CiAKKwlwcml2YXRlIGZpbmFsIFByZVB1c2hIb29rIHByZVB1c2g7CisKIAkvKioKIAkgKiBDcmVhdGUgcHJvY2VzcyBmb3Igc3BlY2lmaWVkIHRyYW5zcG9ydCBhbmQgcmVmcyB1cGRhdGVzIHNwZWNpZmljYXRpb24uCiAJICoKQEAgLTY2LDEyICs3MiwxNCBAQCBjbGFzcyBQdXNoUHJvY2VzcyB7CiAJICogICAgICAgICAgICBjb25uZWN0aW9uLgogCSAqIEBwYXJhbSB0b1B1c2gKIAkgKiAgICAgICAgICAgIHNwZWNpZmljYXRpb24gb2YgcmVmcyB1cGRhdGVzIChhbmQgbG9jYWwgdHJhY2tpbmcgYnJhbmNoZXMpLgotCSAqCisJICogQHBhcmFtIHByZVB1c2gKKwkgKiAgICAgICAgICAgIHtAbGluayBQcmVQdXNoSG9va30gdG8gcnVuIGFmdGVyIHRoZSByZW1vdGUgYWR2ZXJ0aXNlbWVudCBoYXMKKwkgKiAgICAgICAgICAgIGJlZW4gZ290dGVuCiAJICogQHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24KIAkgKi8KLQlQdXNoUHJvY2VzcyhmaW5hbCBUcmFuc3BvcnQgdHJhbnNwb3J0LAotCQkJZmluYWwgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IHRvUHVzaCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCXRoaXModHJhbnNwb3J0LCB0b1B1c2gsIG51bGwpOworCVB1c2hQcm9jZXNzKFRyYW5zcG9ydCB0cmFuc3BvcnQsIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiB0b1B1c2gsCisJCQlQcmVQdXNoSG9vayBwcmVQdXNoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJdGhpcyh0cmFuc3BvcnQsIHRvUHVzaCwgcHJlUHVzaCwgbnVsbCk7CiAJfQogCiAJLyoqCkBAIC04MiwxNiArOTAsMTkgQEAgY2xhc3MgUHVzaFByb2Nlc3MgewogCSAqICAgICAgICAgICAgY29ubmVjdGlvbi4KIAkgKiBAcGFyYW0gdG9QdXNoCiAJICogICAgICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHJlZnMgdXBkYXRlcyAoYW5kIGxvY2FsIHRyYWNraW5nIGJyYW5jaGVzKS4KKwkgKiBAcGFyYW0gcHJlUHVzaAorCSAqICAgICAgICAgICAge0BsaW5rIFByZVB1c2hIb29rfSB0byBydW4gYWZ0ZXIgdGhlIHJlbW90ZSBhZHZlcnRpc2VtZW50IGhhcworCSAqICAgICAgICAgICAgYmVlbiBnb3R0ZW4KIAkgKiBAcGFyYW0gb3V0CiAJICogICAgICAgICAgICBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgbWVzc2FnZXMgdG8KIAkgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqLwotCVB1c2hQcm9jZXNzKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQsCi0JCQlmaW5hbCBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gdG9QdXNoLCBPdXRwdXRTdHJlYW0gb3V0KQotCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJUHVzaFByb2Nlc3MoVHJhbnNwb3J0IHRyYW5zcG9ydCwgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IHRvUHVzaCwKKwkJCVByZVB1c2hIb29rIHByZVB1c2gsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0aGlzLndhbGtlciA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCk7CiAJCXRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwogCQl0aGlzLnRvUHVzaCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKwkJdGhpcy5wcmVQdXNoID0gcHJlUHVzaDsKIAkJdGhpcy5vdXQgPSBvdXQ7CiAJCXRoaXMucHVzaE9wdGlvbnMgPSB0cmFuc3BvcnQuZ2V0UHVzaE9wdGlvbnMoKTsKIAkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoKSB7CkBAIC0xMjksMTAgKzE0MCwzOSBAQCBQdXNoUmVzdWx0IGV4ZWN1dGUoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJCQkJcmVzLnNldEFkdmVydGlzZWRSZWZzKHRyYW5zcG9ydC5nZXRVUkkoKSwgY29ubmVjdGlvbgogCQkJCQkJLmdldFJlZnNNYXAoKSk7CiAJCQkJcmVzLnBlZXJVc2VyQWdlbnQgPSBjb25uZWN0aW9uLmdldFBlZXJVc2VyQWdlbnQoKTsKLQkJCQlyZXMuc2V0UmVtb3RlVXBkYXRlcyh0b1B1c2gpOwogCQkJCW1vbml0b3IuZW5kVGFzaygpOwogCisJCQkJTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiBleHBhbmRlZCA9IGV4cGFuZE1hdGNoaW5nKCk7CisJCQkJdG9QdXNoLmNsZWFyKCk7CisJCQkJdG9QdXNoLnB1dEFsbChleHBhbmRlZCk7CisKKwkJCQlyZXMuc2V0UmVtb3RlVXBkYXRlcyh0b1B1c2gpOwogCQkJCWZpbmFsIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcHJlcHJvY2Vzc2VkID0gcHJlcGFyZVJlbW90ZVVwZGF0ZXMoKTsKKwkJCQlMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gd2lsbEJlQXR0ZW1wdGVkID0gcHJlcHJvY2Vzc2VkLnZhbHVlcygpCisJCQkJCQkuc3RyZWFtKCkuZmlsdGVyKHUgLT4geworCQkJCQkJCXN3aXRjaCAodS5nZXRTdGF0dXMoKSkgeworCQkJCQkJCWNhc2UgTk9OX0VYSVNUSU5HOgorCQkJCQkJCWNhc2UgUkVKRUNURURfTk9ERUxFVEU6CisJCQkJCQkJY2FzZSBSRUpFQ1RFRF9OT05GQVNURk9SV0FSRDoKKwkJCQkJCQljYXNlIFJFSkVDVEVEX09USEVSX1JFQVNPTjoKKwkJCQkJCQljYXNlIFJFSkVDVEVEX1JFTU9URV9DSEFOR0VEOgorCQkJCQkJCWNhc2UgVVBfVE9fREFURToKKwkJCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkJaWYgKCF3aWxsQmVBdHRlbXB0ZWQuaXNFbXB0eSgpKSB7CisJCQkJCWlmIChwcmVQdXNoICE9IG51bGwpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJcHJlUHVzaC5zZXRSZWZzKHdpbGxCZUF0dGVtcHRlZCk7CisJCQkJCQkJcHJlUHVzaC5zZXREcnlSdW4odHJhbnNwb3J0LmlzRHJ5UnVuKCkpOworCQkJCQkJCXByZVB1c2guY2FsbCgpOworCQkJCQkJfSBjYXRjaCAoQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KIAkJCQlpZiAodHJhbnNwb3J0LmlzRHJ5UnVuKCkpCiAJCQkJCW1vZGlmeVVwZGF0ZXNGb3JEcnlSdW4oKTsKIAkJCQllbHNlIGlmICghcHJlcHJvY2Vzc2VkLmlzRW1wdHkoKSkKQEAgLTIwMSwyNSArMjQxLDggQEAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHByZXBhcmVSZW1vdGVVcGRhdGVzKCkKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJLy8gY2hlY2sgZm9yIGZhc3QtZm9yd2FyZDoKLQkJCS8vIC0gYm90aCBvbGQgYW5kIG5ldyByZWYgbXVzdCBwb2ludCB0byBjb21taXRzLCBBTkQKLQkJCS8vIC0gYm90aCBvZiB0aGVtIG11c3QgYmUga25vd24gZm9yIHVzLCBleGlzdCBpbiByZXBvc2l0b3J5LCBBTkQKLQkJCS8vIC0gb2xkIGNvbW1pdCBtdXN0IGJlIGFuY2VzdG9yIG9mIG5ldyBjb21taXQKLQkJCWJvb2xlYW4gZmFzdEZvcndhcmQgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQlSZXZPYmplY3Qgb2xkUmV2ID0gd2Fsa2VyLnBhcnNlQW55KGFkdmVydGlzZWRPbGQpOwotCQkJCWZpbmFsIFJldk9iamVjdCBuZXdSZXYgPSB3YWxrZXIucGFyc2VBbnkocnJ1LmdldE5ld09iamVjdElkKCkpOwotCQkJCWlmICghKG9sZFJldiBpbnN0YW5jZW9mIFJldkNvbW1pdCkKLQkJCQkJCXx8ICEobmV3UmV2IGluc3RhbmNlb2YgUmV2Q29tbWl0KQotCQkJCQkJfHwgIXdhbGtlci5pc01lcmdlZEludG8oKFJldkNvbW1pdCkgb2xkUmV2LAotCQkJCQkJCQkoUmV2Q29tbWl0KSBuZXdSZXYpKQotCQkJCQlmYXN0Rm9yd2FyZCA9IGZhbHNlOwotCQkJfSBjYXRjaCAoTWlzc2luZ09iamVjdEV4Y2VwdGlvbiB4KSB7Ci0JCQkJZmFzdEZvcndhcmQgPSBmYWxzZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0JCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbih0cmFuc3BvcnQuZ2V0VVJJKCksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJSkdpdFRleHQuZ2V0KCkucmVhZGluZ09iamVjdHNGcm9tTG9jYWxSZXBvc2l0b3J5RmFpbGVkLCB4LmdldE1lc3NhZ2UoKSksIHgpOwotCQkJfQorCQkJYm9vbGVhbiBmYXN0Rm9yd2FyZCA9IGlzRmFzdEZvcndhcmQoYWR2ZXJ0aXNlZE9sZCwKKwkJCQkJcnJ1LmdldE5ld09iamVjdElkKCkpOwogCQkJcnJ1LnNldEZhc3RGb3J3YXJkKGZhc3RGb3J3YXJkKTsKIAkJCWlmICghZmFzdEZvcndhcmQgJiYgIXJydS5pc0ZvcmNlVXBkYXRlKCkpIHsKIAkJCQlycnUuc2V0U3RhdHVzKFN0YXR1cy5SRUpFQ1RFRF9OT05GQVNURk9SV0FSRCk7CkBAIC0yMzMsNiArMjU2LDEzNCBAQCBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcHJlcGFyZVJlbW90ZVVwZGF0ZXMoKQogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciBhbiB1cGRhdGUgZnJvbSB7QGNvZGUgb2xkT2lkfSB0byB7QGNvZGUgbmV3T2lkfSBpcyBhCisJICogZmFzdC1mb3J3YXJkIHVwZGF0ZToKKwkgKiA8dWw+CisJICogPGxpPmJvdGggb2xkIGFuZCBuZXcgbXVzdCBiZSBjb21taXRzLCBBTkQ8L2xpPgorCSAqIDxsaT5ib3RoIG9mIHRoZW0gbXVzdCBiZSBrbm93biB0byB1cyBhbmQgZXhpc3QgaW4gdGhlIHJlcG9zaXRvcnksCisJICogQU5EPC9saT4KKwkgKiA8bGk+dGhlIG9sZCBjb21taXQgbXVzdCBiZSBhbiBhbmNlc3RvciBvZiB0aGUgbmV3IGNvbW1pdC48L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcGFyYW0gb2xkT2lkCisJICogICAgICAgICAgICB7QGxpbmsgT2JqZWN0SWR9wqBvZiB0aGUgb2xkIGNvbW1pdAorCSAqIEBwYXJhbSBuZXdPaWQKKwkgKiAgICAgICAgICAgIHtAbGluayBPYmplY3RJZH3CoG9mIHRoZSBuZXcgY29tbWl0CisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHVwZGF0ZSBmYXN0LWZvcndhcmRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorCSAqIEB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzRmFzdEZvcndhcmQoT2JqZWN0SWQgb2xkT2lkLCBPYmplY3RJZCBuZXdPaWQpCisJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCVJldk9iamVjdCBvbGRSZXYgPSB3YWxrZXIucGFyc2VBbnkob2xkT2lkKTsKKwkJCVJldk9iamVjdCBuZXdSZXYgPSB3YWxrZXIucGFyc2VBbnkobmV3T2lkKTsKKwkJCWlmICghKG9sZFJldiBpbnN0YW5jZW9mIFJldkNvbW1pdCkgfHwgIShuZXdSZXYgaW5zdGFuY2VvZiBSZXZDb21taXQpCisJCQkJCXx8ICF3YWxrZXIuaXNNZXJnZWRJbnRvKChSZXZDb21taXQpIG9sZFJldiwKKwkJCQkJCQkoUmV2Q29tbWl0KSBuZXdSZXYpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9IGNhdGNoIChNaXNzaW5nT2JqZWN0RXhjZXB0aW9uIHgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKwkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odHJhbnNwb3J0LmdldFVSSSgpLAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dAorCQkJCQkJCS5nZXQoKS5yZWFkaW5nT2JqZWN0c0Zyb21Mb2NhbFJlcG9zaXRvcnlGYWlsZWQsCisJCQkJCQkJeC5nZXRNZXNzYWdlKCkpLAorCQkJCQl4KTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBFeHBhbmRzIGFsbCBwbGFjZWhvbGRlciB7QGxpbmsgUmVtb3RlUmVmVXBkYXRlfXMgZm9yICJtYXRjaGluZyIKKwkgKiB7QGxpbmsgUmVmU3BlY31zICI6IiBpbiB7QGxpbmsgI3RvUHVzaH0gYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBtYXAgaW4KKwkgKiB3aGljaCB0aGUgcGxhY2Vob2xkZXJzIGhhdmUgYmVlbiByZXBsYWNlZCBieSB0aGVpciBleHBhbnNpb24uCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IG1hcCBvZiB7QGxpbmsgUmVtb3RlUmVmVXBkYXRlfXMga2V5ZWQgYnkgcmVtb3RlIG5hbWUKKwkgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBleHBhbnNpb24gcmVzdWx0cyBpbiBkdXBsaWNhdGUgdXBkYXRlcworCSAqLworCXByaXZhdGUgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiBleHBhbmRNYXRjaGluZygpCisJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisJCWJvb2xlYW4gaGFkTWF0Y2ggPSBmYWxzZTsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdXBkYXRlIDogdG9QdXNoLnZhbHVlcygpKSB7CisJCQlpZiAodXBkYXRlLmlzTWF0Y2hpbmcoKSkgeworCQkJCWlmIChoYWRNYXRjaCkgeworCQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZVJlbW90ZVJlZlVwZGF0ZUlzSWxsZWdhbCwKKwkJCQkJCQkiOiIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlleHBhbmRNYXRjaGluZyhyZXN1bHQsIHVwZGF0ZSk7CisJCQkJaGFkTWF0Y2ggPSB0cnVlOworCQkJfSBlbHNlIGlmIChyZXN1bHQucHV0KHVwZGF0ZS5nZXRSZW1vdGVOYW1lKCksIHVwZGF0ZSkgIT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlKR2l0VGV4dC5nZXQoKS5kdXBsaWNhdGVSZW1vdGVSZWZVcGRhdGVJc0lsbGVnYWwsCisJCQkJCQl1cGRhdGUuZ2V0UmVtb3RlTmFtZSgpKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBFeHBhbmRzIHRoZSBwbGFjZWhvbGRlciB7QGxpbmsgUmVtb3RlUmVmVXBkYXRlfSB7QGNvZGUgbWF0Y2h9IGZvciBhCisJICogIm1hdGNoaW5nIiB7QGxpbmsgUmVmU3BlY30gIjoiIG9yICIrOiIgYW5kIHB1dHMgdGhlIGV4cGFuc2lvbiBpbnRvIHRoZQorCSAqIGdpdmVuIG1hcCB7QGNvZGUgdXBkYXRlc30uCisJICoKKwkgKiBAcGFyYW0gdXBkYXRlcworCSAqICAgICAgICAgICAgbWFwIHRvIHB1dCB0aGUgZXhwYW5zaW9uIGluCisJICogQHBhcmFtIG1hdGNoCisJICogICAgICAgICAgICB0aGUgcGxhY2Vob2xkZXIge0BsaW5rIFJlbW90ZVJlZlVwZGF0ZX0gdG8gZXhwYW5kCisJICoKKwkgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBleHBhbnNpb24gcmVzdWx0cyBpbiBkdXBsaWNhdGUgdXBkYXRlcywgb3IgdGhlIGxvY2FsCisJICogICAgICAgICAgICAgYnJhbmNoZXMgY2Fubm90IGJlIGRldGVybWluZWQKKwkgKi8KKwlwcml2YXRlIHZvaWQgZXhwYW5kTWF0Y2hpbmcoTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzLAorCQkJUmVtb3RlUmVmVXBkYXRlIG1hdGNoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCU1hcDxTdHJpbmcsIFJlZj4gYWR2ZXJ0aXNlbWVudCA9IGNvbm5lY3Rpb24uZ2V0UmVmc01hcCgpOworCQkJQ29sbGVjdGlvbjxSZWZTcGVjPiBmZXRjaFNwZWNzID0gbWF0Y2guZ2V0RmV0Y2hTcGVjcygpOworCQkJYm9vbGVhbiBmb3JjZVVwZGF0ZSA9IG1hdGNoLmlzRm9yY2VVcGRhdGUoKTsKKwkJCWZvciAoUmVmIGxvY2FsIDogdHJhbnNwb3J0LmxvY2FsLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkJLmdldFJlZnNCeVByZWZpeChDb25zdGFudHMuUl9IRUFEUykpIHsKKwkJCQlpZiAobG9jYWwuaXNTeW1ib2xpYygpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlTdHJpbmcgbmFtZSA9IGxvY2FsLmdldE5hbWUoKTsKKwkJCQlSZWYgYWR2ZXJ0aXNlZCA9IGFkdmVydGlzZW1lbnQuZ2V0KG5hbWUpOworCQkJCWlmIChhZHZlcnRpc2VkID09IG51bGwgfHwgYWR2ZXJ0aXNlZC5pc1N5bWJvbGljKCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCU9iamVjdElkIG9sZE9pZCA9IGFkdmVydGlzZWQuZ2V0T2JqZWN0SWQoKTsKKwkJCQlpZiAob2xkT2lkID09IG51bGwgfHwgT2JqZWN0SWQuemVyb0lkKCkuZXF1YWxzKG9sZE9pZCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCU9iamVjdElkIG5ld09pZCA9IGxvY2FsLmdldE9iamVjdElkKCk7CisJCQkJaWYgKG5ld09pZCA9PSBudWxsIHx8IE9iamVjdElkLnplcm9JZCgpLmVxdWFscyhuZXdPaWQpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCVJlbW90ZVJlZlVwZGF0ZSBycnUgPSBuZXcgUmVtb3RlUmVmVXBkYXRlKHRyYW5zcG9ydC5sb2NhbCwgbmFtZSwKKwkJCQkJCW5ld09pZCwgbmFtZSwgZm9yY2VVcGRhdGUsCisJCQkJCQlUcmFuc3BvcnQuZmluZFRyYWNraW5nUmVmTmFtZShuYW1lLCBmZXRjaFNwZWNzKSwKKwkJCQkJCW9sZE9pZCk7CisJCQkJaWYgKHVwZGF0ZXMucHV0KHJydS5nZXRSZW1vdGVOYW1lKCksIHJydSkgIT0gbnVsbCkgeworCQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZVJlbW90ZVJlZlVwZGF0ZUlzSWxsZWdhbCwKKwkJCQkJCQlycnUuZ2V0UmVtb3RlTmFtZSgpKSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7CisJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydC5nZXRVUkkoKSwKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQKKwkJCQkJCQkuZ2V0KCkucmVhZGluZ09iamVjdHNGcm9tTG9jYWxSZXBvc2l0b3J5RmFpbGVkLAorCQkJCQkJCXguZ2V0TWVzc2FnZSgpKSwKKwkJCQkJeCk7CisJCX0KKwl9CisKIAlwcml2YXRlIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVqZWN0QWxsKCkgewogCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpIHsKIAkJCWlmIChycnUuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLk5PVF9BVFRFTVBURUQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YQppbmRleCBhYzM1N2FmLi42MWQxOTM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAxMyBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAyMiBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTEyLDExICsxMiwxMSBAQAogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJlZmVyZW5jZXM7CiAKIC8qKgogICogRGVzY3JpYmVzIGhvdyByZWZzIGluIG9uZSByZXBvc2l0b3J5IGNvcHkgaW50byBhbm90aGVyIHJlcG9zaXRvcnkuCkBAIC01MCw2ICs1MCwxMiBAQCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaWxkY2FyZChTdHJpbmcgcykgewogCS8qKiBJcyB0aGlzIHNwZWNpZmljYXRpb24gYWN0dWFsbHkgYSB3aWxkY2FyZCBtYXRjaD8gKi8KIAlwcml2YXRlIGJvb2xlYW4gd2lsZGNhcmQ7CiAKKwkvKiogSXMgdGhpcyB0aGUgc3BlY2lhbCAiOiIgUmVmU3BlYz8gKi8KKwlwcml2YXRlIGJvb2xlYW4gbWF0Y2hpbmc7CisKKwkvKiogSXMgdGhpcyBhIG5lZ2F0aXZlIHJlZnNwZWMuICovCisJcHJpdmF0ZSBib29sZWFuIG5lZ2F0aXZlOworCiAJLyoqCiAJICogSG93IHN0cmljdCB0byBiZSBhYm91dCB3aWxkY2FyZHMuCiAJICoKQEAgLTcxLDYgKzc3LDcgQEAgcHVibGljIGVudW0gV2lsZGNhcmRNb2RlIHsKIAkJICovCiAJCUFMTE9XX01JU01BVENICiAJfQorCiAJLyoqIFdoZXRoZXIgYSB3aWxkY2FyZCBpcyBhbGxvd2VkIG9uIG9uZSBzaWRlIGJ1dCBub3QgdGhlIG90aGVyLiAqLwogCXByaXZhdGUgV2lsZGNhcmRNb2RlIGFsbG93TWlzbWF0Y2hlZFdpbGRjYXJkczsKIApAQCAtODcsMTYgKzk0LDI4IEBAIHB1YmxpYyBlbnVtIFdpbGRjYXJkTW9kZSB7CiAJICogYXBwbGljYXRpb25zLCBhcyBhdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBzZXQgdG8gbWF0Y2ggYSBzb3VyY2UgbmFtZS4KIAkgKi8KIAlwdWJsaWMgUmVmU3BlYygpIHsKKwkJbWF0Y2hpbmcgPSBmYWxzZTsKIAkJZm9yY2UgPSBmYWxzZTsKIAkJd2lsZGNhcmQgPSBmYWxzZTsKIAkJc3JjTmFtZSA9IENvbnN0YW50cy5IRUFEOwogCQlkc3ROYW1lID0gbnVsbDsKKwkJbmVnYXRpdmUgPWZhbHNlOwogCQlhbGxvd01pc21hdGNoZWRXaWxkY2FyZHMgPSBXaWxkY2FyZE1vZGUuUkVRVUlSRV9NQVRDSDsKIAl9CiAKIAkvKioKIAkgKiBQYXJzZSBhIHJlZiBzcGVjaWZpY2F0aW9uIGZvciB1c2UgZHVyaW5nIHRyYW5zcG9ydCBvcGVyYXRpb25zLgogCSAqIDxwPgorCSAqIHtAbGluayBSZWZTcGVjfXMgY2FuIGJlIHJlZ3VsYXIgb3IgbmVnYXRpdmUsIHJlZ3VsYXIgUmVmU3BlY3MgaW5kaWNhdGUKKwkgKiB3aGF0IHRvIGluY2x1ZGUgaW4gdHJhbnNwb3J0IG9wZXJhdGlvbnMgd2hpbGUgbmVnYXRpdmUgUmVmU3BlY3MgaW5kaWNhdGUKKwkgKiB3aGF0IHRvIGV4Y2x1ZGUgaW4gZmV0Y2guCisJICogPHA+CisJICogTmVnYXRpdmUge0BsaW5rIFJlZlNwZWN9cyBjYW4ndCBiZSBmb3JjZSwgbXVzdCBoYXZlIG9ubHkgc291cmNlIG9yCisJICogZGVzdGluYXRpb24uIFdpbGRjYXJkIHBhdHRlcm5zIGFyZSBhbHNvIHN1cHBvcnRlZCBpbiBuZWdhdGl2ZSBSZWZTcGVjcworCSAqIGJ1dCB0aGV5IGNhbiBub3QgZ28gd2l0aCB7QGNvZGUgV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0h9IGJlY2F1c2UgdGhleQorCSAqIGFyZSBuYXR1YWxseSBvbmUgdG8gbWFueSBtYXBwaW5ncy4KKwkgKgorCSAqIDxwPgogCSAqIFNwZWNpZmljYXRpb25zIGFyZSB0eXBpY2FsbHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6CiAJICogPHVsPgogCSAqIDxsaT48Y29kZT5yZWZzL2hlYWRzL21hc3RlcjwvY29kZT48L2xpPgpAQCAtMTE2LDYgKzEzNSwxMiBAQCBwdWJsaWMgUmVmU3BlYygpIHsKIAkgKiA8bGk+PGNvZGU+cmVmcy9oZWFkcy8qOnJlZnMvaGVhZHMvbWFzdGVyPC9jb2RlPjwvbGk+CiAJICogPC91bD4KIAkgKgorCSAqIE5lZ2F0aXZlIHNwZWNpZmljYXRpb25zIGFyZSB1c3VhbGx5IGxpa2U6CisJICogPHVsPgorCSAqIDxsaT48Y29kZT5eOnJlZnMvaGVhZHMvbWFzdGVyPC9jb2RlPjwvbGk+CisJICogPGxpPjxjb2RlPl5yZWZzL2hlYWRzLyo8L2NvZGU+PC9saT4KKwkgKiA8L3VsPgorCSAqCiAJICogQHBhcmFtIHNwZWMKIAkgKiAgICAgICAgICAgIHN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVjaWZpY2F0aW9uLgogCSAqIEBwYXJhbSBtb2RlCkBAIC0xMjgsMjIgKzE1Myw0MSBAQCBwdWJsaWMgUmVmU3BlYygpIHsKIAlwdWJsaWMgUmVmU3BlYyhTdHJpbmcgc3BlYywgV2lsZGNhcmRNb2RlIG1vZGUpIHsKIAkJdGhpcy5hbGxvd01pc21hdGNoZWRXaWxkY2FyZHMgPSBtb2RlOwogCQlTdHJpbmcgcyA9IHNwZWM7CisKKwkJaWYgKHMuc3RhcnRzV2l0aCgiXisiKSB8fCBzLnN0YXJ0c1dpdGgoIiteIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkTmVnYXRpdmVBbmRGb3JjZSk7CisJCX0KKwogCQlpZiAocy5zdGFydHNXaXRoKCIrIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJZm9yY2UgPSB0cnVlOwogCQkJcyA9IHMuc3Vic3RyaW5nKDEpOwogCQl9CiAKKwkJaWYgKHMuc3RhcnRzV2l0aCgiXiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCW5lZ2F0aXZlID0gdHJ1ZTsKKwkJCXMgPSBzLnN1YnN0cmluZygxKTsKKwkJfQorCisJCWJvb2xlYW4gbWF0Y2hQdXNoU3BlYyA9IGZhbHNlOwogCQlmaW5hbCBpbnQgYyA9IHMubGFzdEluZGV4T2YoJzonKTsKIAkJaWYgKGMgPT0gMCkgewogCQkJcyA9IHMuc3Vic3RyaW5nKDEpOwotCQkJaWYgKGlzV2lsZGNhcmQocykpIHsKKwkJCWlmIChzLmlzRW1wdHkoKSkgeworCQkJCW1hdGNoUHVzaFNwZWMgPSB0cnVlOwogCQkJCXdpbGRjYXJkID0gdHJ1ZTsKLQkJCQlpZiAobW9kZSA9PSBXaWxkY2FyZE1vZGUuUkVRVUlSRV9NQVRDSCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRXaWxkY2FyZHMsIHNwZWMpKTsKKwkJCQlzcmNOYW1lID0gQ29uc3RhbnRzLlJfSEVBRFMgKyAnKic7CisJCQkJZHN0TmFtZSA9IHNyY05hbWU7CisJCQl9IGVsc2UgeworCQkJCWlmIChpc1dpbGRjYXJkKHMpKSB7CisJCQkJCXdpbGRjYXJkID0gdHJ1ZTsKKwkJCQkJaWYgKG1vZGUgPT0gV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0gpIHsKKwkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRXaWxkY2FyZHMsIHNwZWMpKTsKKwkJCQkJfQogCQkJCX0KKwkJCQlkc3ROYW1lID0gY2hlY2tWYWxpZChzKTsKIAkJCX0KLQkJCWRzdE5hbWUgPSBjaGVja1ZhbGlkKHMpOwogCQl9IGVsc2UgaWYgKGMgPiAwKSB7CiAJCQlTdHJpbmcgc3JjID0gcy5zdWJzdHJpbmcoMCwgYyk7CiAJCQlTdHJpbmcgZHN0ID0gcy5zdWJzdHJpbmcoYyArIDEpOwpAQCAtMTY4LDYgKzIxMiwyMiBAQCBwdWJsaWMgUmVmU3BlYyhTdHJpbmcgc3BlYywgV2lsZGNhcmRNb2RlIG1vZGUpIHsKIAkJCX0KIAkJCXNyY05hbWUgPSBjaGVja1ZhbGlkKHMpOwogCQl9CisKKwkJLy8gTmVnYXRpdmUgcmVmc3BlY3MgbXVzdCBvbmx5IGhhdmUgZHN0TmFtZSBvciBzcmNOYW1lLgorCQlpZiAoaXNOZWdhdGl2ZSgpKSB7CisJCQlpZiAoaXNOdWxsT3JFbXB0eShzcmNOYW1lKSAmJiBpc051bGxPckVtcHR5KGRzdE5hbWUpKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRSZWZTcGVjLCBzcGVjKSk7CisJCQl9CisJCQlpZiAoIWlzTnVsbE9yRW1wdHkoc3JjTmFtZSkgJiYgIWlzTnVsbE9yRW1wdHkoZHN0TmFtZSkpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFJlZlNwZWMsIHNwZWMpKTsKKwkJCX0KKwkJCWlmKHdpbGRjYXJkICYmIG1vZGUgPT0gV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0gpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFJlZlNwZWMsIHNwZWMpKTt9CisJCX0KKwkJbWF0Y2hpbmcgPSBtYXRjaFB1c2hTcGVjOwogCX0KIAogCS8qKgpAQCAtMTkxLDE4ICsyNTEsMzIgQEAgcHVibGljIFJlZlNwZWMoU3RyaW5nIHNwZWMsIFdpbGRjYXJkTW9kZSBtb2RlKSB7CiAJICogICAgICAgICAgICAgdGhlIHNwZWNpZmljYXRpb24gaXMgaW52YWxpZC4KIAkgKi8KIAlwdWJsaWMgUmVmU3BlYyhTdHJpbmcgc3BlYykgewotCQl0aGlzKHNwZWMsIFdpbGRjYXJkTW9kZS5SRVFVSVJFX01BVENIKTsKKwkJdGhpcyhzcGVjLCBzcGVjLnN0YXJ0c1dpdGgoIl4iKSA/IFdpbGRjYXJkTW9kZS5BTExPV19NSVNNQVRDSCAvLyROT04tTkxTLTEkCisJCQkJOiBXaWxkY2FyZE1vZGUuUkVRVUlSRV9NQVRDSCk7CiAJfQogCiAJcHJpdmF0ZSBSZWZTcGVjKFJlZlNwZWMgcCkgeworCQltYXRjaGluZyA9IGZhbHNlOwogCQlmb3JjZSA9IHAuaXNGb3JjZVVwZGF0ZSgpOwogCQl3aWxkY2FyZCA9IHAuaXNXaWxkY2FyZCgpOworCQluZWdhdGl2ZSA9IHAuaXNOZWdhdGl2ZSgpOwogCQlzcmNOYW1lID0gcC5nZXRTb3VyY2UoKTsKIAkJZHN0TmFtZSA9IHAuZ2V0RGVzdGluYXRpb24oKTsKIAkJYWxsb3dNaXNtYXRjaGVkV2lsZGNhcmRzID0gcC5hbGxvd01pc21hdGNoZWRXaWxkY2FyZHM7CiAJfQogCiAJLyoqCisJICogVGVsbHMgd2hldGhlciB0aGlzIHtAbGluayBSZWZTcGVjfSBpcyB0aGUgc3BlY2lhbCAibWF0Y2hpbmciIFJlZlNwZWMgIjoiCisJICogZm9yIHB1c2hpbmcuCisJICoKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhICJtYXRjaGluZyIgUmVmU3BlYworCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nKCkgeworCQlyZXR1cm4gbWF0Y2hpbmc7CisJfQorCisJLyoqCiAJICogQ2hlY2sgaWYgdGhpcyBzcGVjaWZpY2F0aW9uIHdhbnRzIHRvIGZvcmNlZnVsbHkgdXBkYXRlIHRoZSBkZXN0aW5hdGlvbi4KIAkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHNwZWNpZmljYXRpb24gYXNrcyBmb3IgdXBkYXRlcyB3aXRob3V0IG1lcmdlIHRlc3RzLgpAQCAtMjIwLDYgKzI5NCwxMSBAQCBwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlKCkgewogCSAqLwogCXB1YmxpYyBSZWZTcGVjIHNldEZvcmNlVXBkYXRlKGJvb2xlYW4gZm9yY2VVcGRhdGUpIHsKIAkJZmluYWwgUmVmU3BlYyByID0gbmV3IFJlZlNwZWModGhpcyk7CisJCWlmIChmb3JjZVVwZGF0ZSAmJiBpc05lZ2F0aXZlKCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWROZWdhdGl2ZUFuZEZvcmNlKTsKKwkJfQorCQlyLm1hdGNoaW5nID0gbWF0Y2hpbmc7CiAJCXIuZm9yY2UgPSBmb3JjZVVwZGF0ZTsKIAkJcmV0dXJuIHI7CiAJfQpAQCAtMjM4LDYgKzMxNywxNiBAQCBwdWJsaWMgYm9vbGVhbiBpc1dpbGRjYXJkKCkgewogCX0KIAogCS8qKgorCSAqIENoZWNrIGlmIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBhIG5lZ2F0aXZlIG9uZS4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHNwZWNpZmljYXRpb24gaXMgbmVnYXRpdmUuCisJICogQHNpbmNlIDYuMgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTmVnYXRpdmUoKSB7CisJCXJldHVybiBuZWdhdGl2ZTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhlIHNvdXJjZSByZWYgZGVzY3JpcHRpb24uCiAJICogPHA+CiAJICogRHVyaW5nIGEgZmV0Y2ggdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcmVmIG9uIHRoZSByZW1vdGUgcmVwb3NpdG9yeSB3ZQpAQCAtMzIyLDggKzQxMSw3IEBAIHB1YmxpYyBSZWZTcGVjIHNldERlc3RpbmF0aW9uKFN0cmluZyBkZXN0aW5hdGlvbikgewogCSAqICAgICAgICAgICAgIFRoZSB3aWxkY2FyZCBzdGF0dXMgb2YgdGhlIG5ldyBzb3VyY2UgZGlzYWdyZWVzIHdpdGggdGhlCiAJICogICAgICAgICAgICAgd2lsZGNhcmQgc3RhdHVzIG9mIHRoZSBuZXcgZGVzdGluYXRpb24uCiAJICovCi0JcHVibGljIFJlZlNwZWMgc2V0U291cmNlRGVzdGluYXRpb24oZmluYWwgU3RyaW5nIHNvdXJjZSwKLQkJCWZpbmFsIFN0cmluZyBkZXN0aW5hdGlvbikgeworCXB1YmxpYyBSZWZTcGVjIHNldFNvdXJjZURlc3RpbmF0aW9uKFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZXN0aW5hdGlvbikgewogCQlpZiAoaXNXaWxkY2FyZChzb3VyY2UpICE9IGlzV2lsZGNhcmQoZGVzdGluYXRpb24pKQogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5zb3VyY2VEZXN0aW5hdGlvbk11c3RNYXRjaCk7CiAJCWZpbmFsIFJlZlNwZWMgciA9IG5ldyBSZWZTcGVjKHRoaXMpOwpAQCAtNDA5LDYgKzQ5NywxMCBAQCBwcml2YXRlIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZUltcChTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gdGhpczsKIAl9CiAKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTnVsbE9yRW1wdHkoU3RyaW5nIHJlZk5hbWUpIHsKKwkJcmV0dXJuIHJlZk5hbWUgPT0gbnVsbCB8fCByZWZOYW1lLmlzRW1wdHkoKTsKKwl9CisKIAkvKioKIAkgKiBFeHBhbmQgdGhpcyBzcGVjaWZpY2F0aW9uIHRvIGV4YWN0bHkgbWF0Y2ggYSByZWYuCiAJICogPHA+CkBAIC01NDEsMzcgKzYzMyw0MiBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCQlpZiAoIShvYmogaW5zdGFuY2VvZiBSZWZTcGVjKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJZmluYWwgUmVmU3BlYyBiID0gKFJlZlNwZWMpIG9iajsKLQkJaWYgKGlzRm9yY2VVcGRhdGUoKSAhPSBiLmlzRm9yY2VVcGRhdGUoKSkKKwkJaWYgKGlzRm9yY2VVcGRhdGUoKSAhPSBiLmlzRm9yY2VVcGRhdGUoKSkgewogCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNXaWxkY2FyZCgpICE9IGIuaXNXaWxkY2FyZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWVxKGdldFNvdXJjZSgpLCBiLmdldFNvdXJjZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFlcShnZXREZXN0aW5hdGlvbigpLCBiLmdldERlc3RpbmF0aW9uKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlpZiAoUmVmZXJlbmNlcy5pc1NhbWVPYmplY3QoYSwgYikpIHsKLQkJCXJldHVybiB0cnVlOwogCQl9Ci0JCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQorCQlpZihpc05lZ2F0aXZlKCkgIT0gYi5pc05lZ2F0aXZlKCkpIHsKIAkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGEuZXF1YWxzKGIpOworCQl9CisJCWlmIChpc01hdGNoaW5nKCkpIHsKKwkJCXJldHVybiBiLmlzTWF0Y2hpbmcoKTsKKwkJfSBlbHNlIGlmIChiLmlzTWF0Y2hpbmcoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiBpc1dpbGRjYXJkKCkgPT0gYi5pc1dpbGRjYXJkKCkKKwkJCQkmJiBPYmplY3RzLmVxdWFscyhnZXRTb3VyY2UoKSwgYi5nZXRTb3VyY2UoKSkKKwkJCQkmJiBPYmplY3RzLmVxdWFscyhnZXREZXN0aW5hdGlvbigpLCBiLmdldERlc3RpbmF0aW9uKCkpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJaWYgKGlzRm9yY2VVcGRhdGUoKSkKKwkJaWYgKGlzRm9yY2VVcGRhdGUoKSkgewogCQkJci5hcHBlbmQoJysnKTsKLQkJaWYgKGdldFNvdXJjZSgpICE9IG51bGwpCi0JCQlyLmFwcGVuZChnZXRTb3VyY2UoKSk7Ci0JCWlmIChnZXREZXN0aW5hdGlvbigpICE9IG51bGwpIHsKKwkJfQorCQlpZihpc05lZ2F0aXZlKCkpIHsKKwkJCXIuYXBwZW5kKCdeJyk7CisJCX0KKwkJaWYgKGlzTWF0Y2hpbmcoKSkgewogCQkJci5hcHBlbmQoJzonKTsKLQkJCXIuYXBwZW5kKGdldERlc3RpbmF0aW9uKCkpOworCQl9IGVsc2UgeworCQkJaWYgKGdldFNvdXJjZSgpICE9IG51bGwpIHsKKwkJCQlyLmFwcGVuZChnZXRTb3VyY2UoKSk7CisJCQl9CisJCQlpZiAoZ2V0RGVzdGluYXRpb24oKSAhPSBudWxsKSB7CisJCQkJci5hcHBlbmQoJzonKTsKKwkJCQlyLmFwcGVuZChnZXREZXN0aW5hdGlvbigpKTsKKwkJCX0KIAkJfQogCQlyZXR1cm4gci50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnLmphdmEKaW5kZXggMmYzMTYwYi4uYzRlMTA1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnLmphdmEKQEAgLTE2LDEwICsxNiw3IEBACiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIApAQCAtNTQsMTAgKzUxLDYgQEAgcHVibGljIGNsYXNzIFJlbW90ZUNvbmZpZyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJTUVPVVQgPSAidGltZW91dCI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSU5TVEVBRE9GID0gImluc3RlYWRvZiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFVTSElOU1RFQURPRiA9ICJwdXNoaW5zdGVhZG9mIjsgLy8kTk9OLU5MUy0xJAotCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX01JUlJPUiA9IGZhbHNlOwogCiAJLyoqIERlZmF1bHQgdmFsdWUgZm9yIHtAbGluayAjZ2V0VXBsb2FkUGFjaygpfSBpZiBub3Qgc3BlY2lmaWVkLiAqLwpAQCAtMTM1LDEwICsxMjgsMTAgQEAgcHVibGljIFJlbW90ZUNvbmZpZyhDb25maWcgcmMsIFN0cmluZyByZW1vdGVOYW1lKQogCQlTdHJpbmcgdmFsOwogCiAJCXZsc3QgPSByYy5nZXRTdHJpbmdMaXN0KFNFQ1RJT04sIG5hbWUsIEtFWV9VUkwpOwotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGluc3RlYWRPZiA9IGdldFJlcGxhY2VtZW50cyhyYywgS0VZX0lOU1RFQURPRik7CisJCVVybENvbmZpZyB1cmxzID0gbmV3IFVybENvbmZpZyhyYyk7CiAJCXVyaXMgPSBuZXcgQXJyYXlMaXN0PD4odmxzdC5sZW5ndGgpOwogCQlmb3IgKFN0cmluZyBzIDogdmxzdCkgewotCQkJdXJpcy5hZGQobmV3IFVSSWlzaChyZXBsYWNlVXJpKHMsIGluc3RlYWRPZikpKTsKKwkJCXVyaXMuYWRkKG5ldyBVUklpc2godXJscy5yZXBsYWNlKHMpKSk7CiAJCX0KIAkJU3RyaW5nW10gcGxzdCA9IHJjLmdldFN0cmluZ0xpc3QoU0VDVElPTiwgbmFtZSwgS0VZX1BVU0hVUkwpOwogCQlwdXNoVVJJcyA9IG5ldyBBcnJheUxpc3Q8PihwbHN0Lmxlbmd0aCk7CkBAIC0xNDgsMTEgKzE0MSw5IEBAIHB1YmxpYyBSZW1vdGVDb25maWcoQ29uZmlnIHJjLCBTdHJpbmcgcmVtb3RlTmFtZSkKIAkJaWYgKHB1c2hVUklzLmlzRW1wdHkoKSkgewogCQkJLy8gV291bGQgZGVmYXVsdCB0byB0aGUgdXJpcy4gSWYgd2UgaGF2ZSBwdXNoaW5zdGVhZG9mLCB3ZSBtdXN0CiAJCQkvLyBzdXBwbHkgcmV3cml0dGVuIHB1c2ggdXJpcy4KLQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcHVzaEluc3RlYWRPZiA9IGdldFJlcGxhY2VtZW50cyhyYywKLQkJCQkJS0VZX1BVU0hJTlNURUFET0YpOwotCQkJaWYgKCFwdXNoSW5zdGVhZE9mLmlzRW1wdHkoKSkgeworCQkJaWYgKHVybHMuaGFzUHVzaFJlcGxhY2VtZW50cygpKSB7CiAJCQkJZm9yIChTdHJpbmcgcyA6IHZsc3QpIHsKLQkJCQkJU3RyaW5nIHJlcGxhY2VkID0gcmVwbGFjZVVyaShzLCBwdXNoSW5zdGVhZE9mKTsKKwkJCQkJU3RyaW5nIHJlcGxhY2VkID0gdXJscy5yZXBsYWNlUHVzaChzKTsKIAkJCQkJaWYgKCFzLmVxdWFscyhyZXBsYWNlZCkpIHsKIAkJCQkJCXB1c2hVUklzLmFkZChuZXcgVVJJaXNoKHJlcGxhY2VkKSk7CiAJCQkJCX0KQEAgLTI0OCwzOSArMjM5LDYgQEAgcHJpdmF0ZSB2b2lkIHVuc2V0KENvbmZpZyByYywgU3RyaW5nIGtleSkgewogCQlyYy51bnNldChTRUNUSU9OLCBnZXROYW1lKCksIGtleSk7CiAJfQogCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFJlcGxhY2VtZW50cyhmaW5hbCBDb25maWcgY29uZmlnLAotCQkJZmluYWwgU3RyaW5nIGtleU5hbWUpIHsKLQkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByZXBsYWNlbWVudHMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCWZvciAoU3RyaW5nIHVybCA6IGNvbmZpZy5nZXRTdWJzZWN0aW9ucyhLRVlfVVJMKSkKLQkJCWZvciAoU3RyaW5nIGluc3RlYWRPZiA6IGNvbmZpZy5nZXRTdHJpbmdMaXN0KEtFWV9VUkwsIHVybCwga2V5TmFtZSkpCi0JCQkJcmVwbGFjZW1lbnRzLnB1dChpbnN0ZWFkT2YsIHVybCk7Ci0JCXJldHVybiByZXBsYWNlbWVudHM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZVVyaShmaW5hbCBTdHJpbmcgdXJpLAotCQkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByZXBsYWNlbWVudHMpIHsKLQkJaWYgKHJlcGxhY2VtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB1cmk7Ci0JCX0KLQkJRW50cnk8U3RyaW5nLCBTdHJpbmc+IG1hdGNoID0gbnVsbDsKLQkJZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gcmVwbGFjZW1lbnQgOiByZXBsYWNlbWVudHMuZW50cnlTZXQoKSkgewotCQkJLy8gSWdub3JlIGN1cnJlbnQgZW50cnkgaWYgbm90IGxvbmdlciB0aGFuIHByZXZpb3VzIG1hdGNoCi0JCQlpZiAobWF0Y2ggIT0gbnVsbAotCQkJCQkmJiBtYXRjaC5nZXRLZXkoKS5sZW5ndGgoKSA+IHJlcGxhY2VtZW50LmdldEtleSgpCi0JCQkJCQkJLmxlbmd0aCgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXVyaS5zdGFydHNXaXRoKHJlcGxhY2VtZW50LmdldEtleSgpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbWF0Y2ggPSByZXBsYWNlbWVudDsKLQkJfQotCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJcmV0dXJuIG1hdGNoLmdldFZhbHVlKCkgKyB1cmkuc3Vic3RyaW5nKG1hdGNoLmdldEtleSgpLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQogCS8qKgogCSAqIEdldCB0aGUgbG9jYWwgbmFtZSB0aGlzIHJlbW90ZSBjb25maWd1cmF0aW9uIGlzIHJlY29nbml6ZWQgYXMuCiAJICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKaW5kZXggNDNlYWFjNy4uMjE4ZTYyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKQEAgLTEyLDcgKzEyLDkgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CkBAIC0xMTYsNiArMTE4LDEyIEBAIHB1YmxpYyBlbnVtIFN0YXR1cyB7CiAJcHJpdmF0ZSBSZWZVcGRhdGUgbG9jYWxVcGRhdGU7CiAKIAkvKioKKwkgKiBJZiBzZXQsIHRoZSBSZW1vdGVSZWZVcGRhdGUgaXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlICJtYXRjaGluZyIgUmVmU3BlYworCSAqIHRvIGJlIGV4cGFuZGVkIGFmdGVyIHRoZSBhZHZlcnRpc2VtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQgaW4gYSBwdXNoLgorCSAqLworCXByaXZhdGUgQ29sbGVjdGlvbjxSZWZTcGVjPiBmZXRjaFNwZWNzOworCisJLyoqCiAJICogQ29uc3RydWN0IHJlbW90ZSByZWYgdXBkYXRlIHJlcXVlc3QgYnkgcHJvdmlkaW5nIGFuIHVwZGF0ZSBzcGVjaWZpY2F0aW9uLgogCSAqIE9iamVjdCBpcyBjcmVhdGVkIHdpdGggZGVmYXVsdAogCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZW1vdGVSZWZVcGRhdGUuU3RhdHVzI05PVF9BVFRFTVBURUR9CkBAIC0xNTcsOSArMTY1LDggQEAgcHVibGljIGVudW0gU3RhdHVzIHsKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBzb21lIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbnVsbAogCSAqLwotCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoZmluYWwgUmVwb3NpdG9yeSBsb2NhbERiLCBmaW5hbCBTdHJpbmcgc3JjUmVmLAotCQkJZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsIGZpbmFsIGJvb2xlYW4gZm9yY2VVcGRhdGUsCi0JCQlmaW5hbCBTdHJpbmcgbG9jYWxOYW1lLCBmaW5hbCBPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKQorCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoUmVwb3NpdG9yeSBsb2NhbERiLCBTdHJpbmcgc3JjUmVmLCBTdHJpbmcgcmVtb3RlTmFtZSwKKwkJCWJvb2xlYW4gZm9yY2VVcGRhdGUsIFN0cmluZyBsb2NhbE5hbWUsIE9iamVjdElkIGV4cGVjdGVkT2xkT2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzKGxvY2FsRGIsIHNyY1JlZiwgc3JjUmVmICE9IG51bGwgPyBsb2NhbERiLnJlc29sdmUoc3JjUmVmKQogCQkJCTogT2JqZWN0SWQuemVyb0lkKCksIHJlbW90ZU5hbWUsIGZvcmNlVXBkYXRlLCBsb2NhbE5hbWUsCkBAIC0yMDMsOSArMjEwLDggQEAgcHVibGljIFJlbW90ZVJlZlVwZGF0ZShmaW5hbCBSZXBvc2l0b3J5IGxvY2FsRGIsIGZpbmFsIFN0cmluZyBzcmNSZWYsCiAJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgc29tZSByZXF1aXJlZCBwYXJhbWV0ZXIgd2FzIG51bGwKIAkgKi8KLQlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWxEYiwgZmluYWwgUmVmIHNyY1JlZiwKLQkJCWZpbmFsIFN0cmluZyByZW1vdGVOYW1lLCBmaW5hbCBib29sZWFuIGZvcmNlVXBkYXRlLAotCQkJZmluYWwgU3RyaW5nIGxvY2FsTmFtZSwgZmluYWwgT2JqZWN0SWQgZXhwZWN0ZWRPbGRPYmplY3RJZCkKKwlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKFJlcG9zaXRvcnkgbG9jYWxEYiwgUmVmIHNyY1JlZiwgU3RyaW5nIHJlbW90ZU5hbWUsCisJCQlib29sZWFuIGZvcmNlVXBkYXRlLCBTdHJpbmcgbG9jYWxOYW1lLCBPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhpcyhsb2NhbERiLCBzcmNSZWYgIT0gbnVsbCA/IHNyY1JlZi5nZXROYW1lKCkgOiBudWxsLAogCQkJCXNyY1JlZiAhPSBudWxsID8gc3JjUmVmLmdldE9iamVjdElkKCkgOiBudWxsLCByZW1vdGVOYW1lLApAQCAtMjU1LDI4ICsyNjEsNDEgQEAgcHVibGljIFJlbW90ZVJlZlVwZGF0ZShmaW5hbCBSZXBvc2l0b3J5IGxvY2FsRGIsIGZpbmFsIFJlZiBzcmNSZWYsCiAJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgc29tZSByZXF1aXJlZCBwYXJhbWV0ZXIgd2FzIG51bGwKIAkgKi8KLQlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWxEYiwgZmluYWwgU3RyaW5nIHNyY1JlZiwKLQkJCWZpbmFsIE9iamVjdElkIHNyY0lkLCBmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSwKLQkJCWZpbmFsIGJvb2xlYW4gZm9yY2VVcGRhdGUsIGZpbmFsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlmaW5hbCBPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAocmVtb3RlTmFtZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5yZW1vdGVOYW1lQ2Fubm90QmVOdWxsKTsKLQkJaWYgKHNyY0lkID09IG51bGwgJiYgc3JjUmVmICE9IG51bGwpCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCUpHaXRUZXh0LmdldCgpLnNvdXJjZVJlZkRvZXNudFJlc29sdmVUb0FueU9iamVjdCwgc3JjUmVmKSk7CisJcHVibGljIFJlbW90ZVJlZlVwZGF0ZShSZXBvc2l0b3J5IGxvY2FsRGIsIFN0cmluZyBzcmNSZWYsIE9iamVjdElkIHNyY0lkLAorCQkJU3RyaW5nIHJlbW90ZU5hbWUsIGJvb2xlYW4gZm9yY2VVcGRhdGUsIFN0cmluZyBsb2NhbE5hbWUsCisJCQlPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0aGlzKGxvY2FsRGIsIHNyY1JlZiwgc3JjSWQsIHJlbW90ZU5hbWUsIGZvcmNlVXBkYXRlLCBsb2NhbE5hbWUsIG51bGwsCisJCQkJZXhwZWN0ZWRPbGRPYmplY3RJZCk7CisJfQogCi0JCWlmIChzcmNSZWYgIT0gbnVsbCkKKwlwcml2YXRlIFJlbW90ZVJlZlVwZGF0ZShSZXBvc2l0b3J5IGxvY2FsRGIsIFN0cmluZyBzcmNSZWYsIE9iamVjdElkIHNyY0lkLAorCQkJU3RyaW5nIHJlbW90ZU5hbWUsIGJvb2xlYW4gZm9yY2VVcGRhdGUsIFN0cmluZyBsb2NhbE5hbWUsCisJCQlDb2xsZWN0aW9uPFJlZlNwZWM+IGZldGNoU3BlY3MsIE9iamVjdElkIGV4cGVjdGVkT2xkT2JqZWN0SWQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoZmV0Y2hTcGVjcyA9PSBudWxsKSB7CisJCQlpZiAocmVtb3RlTmFtZSA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJCUpHaXRUZXh0LmdldCgpLnJlbW90ZU5hbWVDYW5ub3RCZU51bGwpOworCQkJfQorCQkJaWYgKHNyY0lkID09IG51bGwgJiYgc3JjUmVmICE9IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQlKR2l0VGV4dC5nZXQoKS5zb3VyY2VSZWZEb2VzbnRSZXNvbHZlVG9BbnlPYmplY3QsCisJCQkJCQlzcmNSZWYpKTsKKwkJCX0KKwkJfQorCQlpZiAoc3JjUmVmICE9IG51bGwpIHsKIAkJCXRoaXMuc3JjUmVmID0gc3JjUmVmOwotCQllbHNlIGlmIChzcmNJZCAhPSBudWxsICYmICFzcmNJZC5lcXVhbHMoT2JqZWN0SWQuemVyb0lkKCkpKQorCQl9IGVsc2UgaWYgKHNyY0lkICE9IG51bGwgJiYgIXNyY0lkLmVxdWFscyhPYmplY3RJZC56ZXJvSWQoKSkpIHsKIAkJCXRoaXMuc3JjUmVmID0gc3JjSWQubmFtZSgpOwotCQllbHNlCisJCX0gZWxzZSB7CiAJCQl0aGlzLnNyY1JlZiA9IG51bGw7Ci0KLQkJaWYgKHNyY0lkICE9IG51bGwpCisJCX0KKwkJaWYgKHNyY0lkICE9IG51bGwpIHsKIAkJCXRoaXMubmV3T2JqZWN0SWQgPSBzcmNJZDsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJdGhpcy5uZXdPYmplY3RJZCA9IE9iamVjdElkLnplcm9JZCgpOwotCisJCX0KKwkJdGhpcy5mZXRjaFNwZWNzID0gZmV0Y2hTcGVjczsKIAkJdGhpcy5yZW1vdGVOYW1lID0gcmVtb3RlTmFtZTsKIAkJdGhpcy5mb3JjZVVwZGF0ZSA9IGZvcmNlVXBkYXRlOwogCQlpZiAobG9jYWxOYW1lICE9IG51bGwgJiYgbG9jYWxEYiAhPSBudWxsKSB7CkBAIC0yOTIsOCArMzExLDkgQEAgZWxzZSBpZiAoc3JjSWQgIT0gbnVsbCAmJiAhc3JjSWQuZXF1YWxzKE9iamVjdElkLnplcm9JZCgpKSkKIAkJCQkJCT8gbG9jYWxVcGRhdGUuZ2V0T2xkT2JqZWN0SWQoKQogCQkJCQkJOiBPYmplY3RJZC56ZXJvSWQoKSwKIAkJCQkJbmV3T2JqZWN0SWQpOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXRyYWNraW5nUmVmVXBkYXRlID0gbnVsbDsKKwkJfQogCQl0aGlzLmxvY2FsRGIgPSBsb2NhbERiOwogCQl0aGlzLmV4cGVjdGVkT2xkT2JqZWN0SWQgPSBleHBlY3RlZE9sZE9iamVjdElkOwogCQl0aGlzLnN0YXR1cyA9IFN0YXR1cy5OT1RfQVRURU1QVEVEOwpAQCAtMzE2LDExICszMzYsNTcgQEAgZWxzZSBpZiAoc3JjSWQgIT0gbnVsbCAmJiAhc3JjSWQuZXF1YWxzKE9iamVjdElkLnplcm9JZCgpKSkKIAkgKiAgICAgICAgICAgICBsb2NhbCB0cmFja2luZyBicmFuY2ggb3Igc3JjUmVmIG9mIGJhc2Ugb2JqZWN0IG5vIGxvbmdlciBjYW4KIAkgKiAgICAgICAgICAgICBiZSByZXNvbHZlZCB0byBhbnkgb2JqZWN0LgogCSAqLwotCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoZmluYWwgUmVtb3RlUmVmVXBkYXRlIGJhc2UsCi0JCQlmaW5hbCBPYmplY3RJZCBuZXdFeHBlY3RlZE9sZE9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzKGJhc2UubG9jYWxEYiwgYmFzZS5zcmNSZWYsIGJhc2UucmVtb3RlTmFtZSwgYmFzZS5mb3JjZVVwZGF0ZSwKKwlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKFJlbW90ZVJlZlVwZGF0ZSBiYXNlLAorCQkJT2JqZWN0SWQgbmV3RXhwZWN0ZWRPbGRPYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdGhpcyhiYXNlLmxvY2FsRGIsIGJhc2Uuc3JjUmVmLCBiYXNlLm5ld09iamVjdElkLCBiYXNlLnJlbW90ZU5hbWUsCisJCQkJYmFzZS5mb3JjZVVwZGF0ZSwKIAkJCQkoYmFzZS50cmFja2luZ1JlZlVwZGF0ZSA9PSBudWxsID8gbnVsbCA6IGJhc2UudHJhY2tpbmdSZWZVcGRhdGUKLQkJCQkJCS5nZXRMb2NhbE5hbWUoKSksIG5ld0V4cGVjdGVkT2xkT2JqZWN0SWQpOworCQkJCQkJLmdldExvY2FsTmFtZSgpKSwKKwkJCQliYXNlLmZldGNoU3BlY3MsIG5ld0V4cGVjdGVkT2xkT2JqZWN0SWQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSAicGxhY2Vob2xkZXIiIHVwZGF0ZSBmb3IgdGhlICJtYXRjaGluZyIgUmVmU3BlYyAiOiIuCisJICoKKwkgKiBAcGFyYW0gbG9jYWxEYgorCSAqICAgICAgICAgICAgbG9jYWwgcmVwb3NpdG9yeSB0byBwdXNoIGZyb20KKwkgKiBAcGFyYW0gZm9yY2VVcGRhdGUKKwkgKiAgICAgICAgICAgIHdoZXRoZXIgbm9uLWZhc3QtZm9yd2FyZCB1cGRhdGVzIHNoYWxsIGJlIGFsbG93ZWQKKwkgKiBAcGFyYW0gZmV0Y2hTcGVjcworCSAqICAgICAgICAgICAgVGhlIGZldGNoIHtAbGluayBSZWZTcGVjfXMgdG8gdXNlIHdoZW4gdGhpcyBwbGFjZWhvbGRlciBpcworCSAqICAgICAgICAgICAgZXhwYW5kZWQgdG8gZGV0ZXJtaW5lIHJlbW90ZSB0cmFja2luZyBicmFuY2ggdXBkYXRlcworCSAqLworCVJlbW90ZVJlZlVwZGF0ZShSZXBvc2l0b3J5IGxvY2FsRGIsIGJvb2xlYW4gZm9yY2VVcGRhdGUsCisJCQlATm9uTnVsbCBDb2xsZWN0aW9uPFJlZlNwZWM+IGZldGNoU3BlY3MpIHsKKwkJdGhpcy5sb2NhbERiID0gbG9jYWxEYjsKKwkJdGhpcy5mb3JjZVVwZGF0ZSA9IGZvcmNlVXBkYXRlOworCQl0aGlzLmZldGNoU3BlY3MgPSBmZXRjaFNwZWNzOworCQl0aGlzLnRyYWNraW5nUmVmVXBkYXRlID0gbnVsbDsKKwkJdGhpcy5zcmNSZWYgPSBudWxsOworCQl0aGlzLnJlbW90ZU5hbWUgPSBudWxsOworCQl0aGlzLm5ld09iamVjdElkID0gbnVsbDsKKwkJdGhpcy5zdGF0dXMgPSBTdGF0dXMuTk9UX0FUVEVNUFRFRDsKKwl9CisKKwkvKioKKwkgKiBUZWxscyB3aGV0aGVyIHRoaXMge0BsaW5rIFJlbW90ZVJlZlVwZGF0ZX0gaXMgYSBwbGFjZWhvbGRlciBmb3IgYQorCSAqICJtYXRjaGluZyIge0BsaW5rIFJlZlNwZWN9LgorCSAqCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nKCkgeworCQlyZXR1cm4gZmV0Y2hTcGVjcyAhPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgZmV0Y2gge0BsaW5rIFJlZlNwZWN9cyBvZiB0aGlzIHtAbGluayBSZW1vdGVSZWZVcGRhdGV9LgorCSAqCisJICogQHJldHVybiB0aGUgZmV0Y2gge0BsaW5rIFJlZlNwZWN9cywgb3Ige0Bjb2RlIG51bGx9IGlmCisJICogICAgICAgICB7QGNvZGUgdGhpcy59e0BsaW5rICNpc01hdGNoaW5nKCl9IHtAY29kZSA9PSBmYWxzZX0KKwkgKi8KKwlDb2xsZWN0aW9uPFJlZlNwZWM+IGdldEZldGNoU3BlY3MoKSB7CisJCXJldHVybiBmZXRjaFNwZWNzOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDhhOGQ5NzcuLjk2YzdiZTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZElucHV0U3RyZWFtLmphdmEKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA4LCBSb2JpbiBSb3NlbmJlcmcgPHJvYmluLnJvc2VuYmVyZ0BkZXdpcmUuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA4LCBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAyMiBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTI4LDYgKzI4LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdQYXJzZVV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIC8qKgogICogVW5tdWx0aXBsZXhlcyB0aGUgZGF0YSBwb3J0aW9uIG9mIGEgc2lkZS1iYW5kIGNoYW5uZWwuCkBAIC00Niw2ICs0OCwxMCBAQAogICogQHNpbmNlIDQuMTEKICAqLwogcHVibGljIGNsYXNzIFNpZGVCYW5kSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQorCQkJLmdldExvZ2dlcihTaWRlQmFuZElucHV0U3RyZWFtLmNsYXNzKTsKKwogCXN0YXRpYyBmaW5hbCBpbnQgQ0hfREFUQSA9IDE7CiAJc3RhdGljIGZpbmFsIGludCBDSF9QUk9HUkVTUyA9IDI7CiAJc3RhdGljIGZpbmFsIGludCBDSF9FUlJPUiA9IDM7CkBAIC0yMTAsNiArMjE2LDIxIEBAIHByaXZhdGUgdm9pZCBiZWdpblRhc2soaW50IHRvdGFsV29ya1VuaXRzKSB7CiAJCW1vbml0b3IuYmVnaW5UYXNrKHJlbW90ZShjdXJyZW50VGFzayksIHRvdGFsV29ya1VuaXRzKTsKIAl9CiAKKwkvKioKKwkgKiBGb3JjZXMgYW55IGJ1ZmZlcmVkIHByb2dyZXNzIG1lc3NhZ2VzIHRvIGJlIHdyaXR0ZW4uCisJICovCisJdm9pZCBkcmFpbk1lc3NhZ2VzKCkgeworCQlpZiAoIXByb2dyZXNzQnVmZmVyLmlzRW1wdHkoKSkgeworCQkJdHJ5IHsKKwkJCQlwcm9ncmVzcygiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCS8vIEp1c3QgbG9nOyBvdGhlcndpc2UgdGhpcyBJT0V4Y2VwdGlvbiBtaWdodCBoaWRlIGEgcmVhbAorCQkJCS8vIFRyYW5zcG9ydEV4Y2VwdGlvbgorCQkJCUxPRy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl9CisJCX0KKwl9CisKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3RlKFN0cmluZyBtc2cpIHsKIAkJU3RyaW5nIHByZWZpeCA9IEpHaXRUZXh0LmdldCgpLnByZWZpeFJlbW90ZTsKIAkJU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIocHJlZml4Lmxlbmd0aCgpICsgbXNnLmxlbmd0aCgpICsgMSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaENvbnN0YW50cy5qYXZhCmluZGV4IDIxMmE0ZTQuLjQ4Y2FjZjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaENvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaENvbnN0YW50cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCwgMjAyMCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIxIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC00NCw2ICs0NCwxNCBAQCBwcml2YXRlIFNzaENvbnN0YW50cygpIHsKIAogCS8vIENvbmZpZyBmaWxlIGtleXMKIAorCS8qKgorCSAqIFByb3BlcnR5IHRvIGNvbnRyb2wgd2hldGhlciBwcml2YXRlIGtleXMgYXJlIGFkZGVkIHRvIGFuIFNTSCBhZ2VudCwgaWYKKwkgKiBvbmUgaXMgcnVubmluZywgYWZ0ZXIgaGF2aW5nIGJlZW4gbG9hZGVkLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9LRVlTX1RPX0FHRU5UID0gIkFkZEtleXNUb0FnZW50IjsKKwogCS8qKiBLZXkgaW4gYW4gc3NoIGNvbmZpZyBmaWxlLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENIX01PREUgPSAiQmF0Y2hNb2RlIjsKIApAQCAtNjIsNiArNzAsMTUgQEAgcHJpdmF0ZSBTc2hDb25zdGFudHMoKSB7CiAJLyoqIEtleSBpbiBhbiBzc2ggY29uZmlnIGZpbGUuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9BVFRFTVBUUyA9ICJDb25uZWN0aW9uQXR0ZW1wdHMiOwogCisJLyoqCisJICogQW4gT3BlblNTSCB0aW1lIHZhbHVlIGZvciB0aGUgY29ubmVjdGlvbiB0aW1lb3V0LiBJbiBPcGVuU1NILCB0aGlzCisJICogaW5jbHVkZXMgZXZlcnl0aGluZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBpbml0aWFsIGtleSBleGNoYW5nZTsgaW4gSkdpdCBpdAorCSAqIGNvdmVycyBvbmx5IHRoZSB1bmRlcmx5aW5nIFRDUCBjb25uZWN0LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RfVElNRU9VVCA9ICJDb25uZWN0VGltZW91dCI7CisKIAkvKiogS2V5IGluIGFuIHNzaCBjb25maWcgZmlsZS4gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX1BBVEggPSAiQ29udHJvbFBhdGgiOwogCkBAIC0xNTksNiArMTc2LDE0IEBAIHByaXZhdGUgU3NoQ29uc3RhbnRzKCkgewogCS8qKiBLZXkgaW4gYW4gc3NoIGNvbmZpZyBmaWxlLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9GT1JXQVJEID0gIlJlbW90ZUZvcndhcmQiOwogCisJLyoqCisJICogKEFic29sdXRlKSBwYXRoIHRvIGEgbWlkZGxld2FyZSBsaWJyYXJ5IHRoZSBTU0ggYWdlbnQgc2hhbGwgdXNlIHRvIGxvYWQKKwkgKiBTSyAoVTJGKSBrZXlzLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1VSSVRZX0tFWV9QUk9WSURFUiA9ICJTZWN1cml0eUtleVByb3ZpZGVyIjsKKwogCS8qKiBLZXkgaW4gYW4gc3NoIGNvbmZpZyBmaWxlLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTkRfRU5WID0gIlNlbmRFbnYiOwogCkBAIC0yMjksNCArMjU0LDEyIEBAIHByaXZhdGUgU3NoQ29uc3RhbnRzKCkgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9JREVOVElUSUVTID0geyAvLwogCQkJSURfUlNBLCBJRF9EU0EsIElEX0VDRFNBLCBJRF9FRDI1NTE5CiAJfTsKKworCS8qKgorCSAqIE5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGhvbGRpbmcgdGhlIFVuaXggZG9tYWluIHNvY2tldCBmb3IKKwkgKiBjb21tdW5pY2F0aW9uIHdpdGggYW4gU1NIIGFnZW50LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVl9TU0hfQVVUSF9TT0NLRVQgPSAiU1NIX0FVVEhfU09DSyI7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hTZXNzaW9uRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoU2Vzc2lvbkZhY3RvcnkuamF2YQppbmRleCAxZTk4YTU2Li5hMDE5NGVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hTZXNzaW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaFNlc3Npb25GYWN0b3J5LmphdmEKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA4LCBSb2JpbiBSb3NlbmJlcmcgPHJvYmluLnJvc2VuYmVyZ0BkZXdpcmUuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIwIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIyIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMzYsMTUgKzM2LDM1IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTc2hTZXNzaW9uRmFjdG9yeSB7CiAKLQlwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBTc2hTZXNzaW9uRmFjdG9yeSBJTlNUQU5DRSA9IGxvYWRTc2hTZXNzaW9uRmFjdG9yeSgpOworCXByaXZhdGUgc3RhdGljIGNsYXNzIERlZmF1bHRGYWN0b3J5IHsKIAotCXByaXZhdGUgc3RhdGljIFNzaFNlc3Npb25GYWN0b3J5IGxvYWRTc2hTZXNzaW9uRmFjdG9yeSgpIHsKLQkJU2VydmljZUxvYWRlcjxTc2hTZXNzaW9uRmFjdG9yeT4gbG9hZGVyID0gU2VydmljZUxvYWRlci5sb2FkKFNzaFNlc3Npb25GYWN0b3J5LmNsYXNzKTsKLQkJSXRlcmF0b3I8U3NoU2Vzc2lvbkZhY3Rvcnk+IGl0ZXIgPSBsb2FkZXIuaXRlcmF0b3IoKTsKLQkJaWYoaXRlci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBpdGVyLm5leHQoKTsKKwkJcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgU3NoU2Vzc2lvbkZhY3RvcnkgSU5TVEFOQ0UgPSBsb2FkU3NoU2Vzc2lvbkZhY3RvcnkoKTsKKworCQlwcml2YXRlIHN0YXRpYyBTc2hTZXNzaW9uRmFjdG9yeSBsb2FkU3NoU2Vzc2lvbkZhY3RvcnkoKSB7CisJCQlTZXJ2aWNlTG9hZGVyPFNzaFNlc3Npb25GYWN0b3J5PiBsb2FkZXIgPSBTZXJ2aWNlTG9hZGVyCisJCQkJCS5sb2FkKFNzaFNlc3Npb25GYWN0b3J5LmNsYXNzKTsKKwkJCUl0ZXJhdG9yPFNzaFNlc3Npb25GYWN0b3J5PiBpdGVyID0gbG9hZGVyLml0ZXJhdG9yKCk7CisJCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlyZXR1cm4gaXRlci5uZXh0KCk7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gbnVsbDsKKworCQlwcml2YXRlIERlZmF1bHRGYWN0b3J5KCkgeworCQkJLy8gTm8gaW5zdGFudGlhdGlvbgorCQl9CisKKwkJcHVibGljIHN0YXRpYyBTc2hTZXNzaW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKKwkJCXJldHVybiBJTlNUQU5DRTsKKwkJfQorCisJCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZShTc2hTZXNzaW9uRmFjdG9yeSBuZXdGYWN0b3J5KSB7CisJCQlpZiAobmV3RmFjdG9yeSAhPSBudWxsKSB7CisJCQkJSU5TVEFOQ0UgPSBuZXdGYWN0b3J5OworCQkJfSBlbHNlIHsKKwkJCQlJTlNUQU5DRSA9IGxvYWRTc2hTZXNzaW9uRmFjdG9yeSgpOworCQkJfQorCQl9CiAJfQogCiAJLyoqCkBAIC01Nyw3ICs3Nyw3IEBAIHByaXZhdGUgc3RhdGljIFNzaFNlc3Npb25GYWN0b3J5IGxvYWRTc2hTZXNzaW9uRmFjdG9yeSgpIHsKIAkgKiBAcmV0dXJuIGZhY3RvcnkgdGhlIGN1cnJlbnQgZmFjdG9yeSBmb3IgdGhpcyBKVk0uCiAJICovCiAJcHVibGljIHN0YXRpYyBTc2hTZXNzaW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOworCQlyZXR1cm4gRGVmYXVsdEZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKIAl9CiAKIAkvKioKQEAgLTY4LDExICs4OCw3IEBAIHB1YmxpYyBzdGF0aWMgU3NoU2Vzc2lvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7CiAJICogICAgICAgICAgICB7QGNvZGUgbnVsbH0gdGhlIGRlZmF1bHQgZmFjdG9yeSB3aWxsIGJlIHJlc3RvcmVkLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZShTc2hTZXNzaW9uRmFjdG9yeSBuZXdGYWN0b3J5KSB7Ci0JCWlmIChuZXdGYWN0b3J5ICE9IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3RmFjdG9yeTsKLQkJfSBlbHNlIHsKLQkJCUlOU1RBTkNFID0gbG9hZFNzaFNlc3Npb25GYWN0b3J5KCk7Ci0JCX0KKwkJRGVmYXVsdEZhY3Rvcnkuc2V0SW5zdGFuY2UobmV3RmFjdG9yeSk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFja2luZ1JlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhY2tpbmdSZWZVcGRhdGUuamF2YQppbmRleCA2OTZjYTdjLi41MWJjMDdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFja2luZ1JlZlVwZGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYWNraW5nUmVmVXBkYXRlLmphdmEKQEAgLTEyLDYgKzEyLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOwpAQCAtMTg0LDkgKzE4NiwxMyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZm9yY2VVcGRhdGUpCiAJCQlzYi5hcHBlbmQoIiAoZm9yY2VkKSIpOwogCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKG9sZE9iamVjdElkID09IG51bGwgPyAiIiA6IG9sZE9iamVjdElkLmFiYnJldmlhdGUoNykubmFtZSgpKTsKKwkJc2IuYXBwZW5kKG9sZE9iamVjdElkID09IG51bGwgPyAiIgorCQkJCTogb2xkT2JqZWN0SWQuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpCisJCQkJCQkubmFtZSgpKTsKIAkJc2IuYXBwZW5kKCIuLiIpOwotCQlzYi5hcHBlbmQobmV3T2JqZWN0SWQgPT0gbnVsbCA/ICIiIDogbmV3T2JqZWN0SWQuYWJicmV2aWF0ZSg3KS5uYW1lKCkpOworCQlzYi5hcHBlbmQobmV3T2JqZWN0SWQgPT0gbnVsbCA/ICIiCisJCQkJOiBuZXdPYmplY3RJZC5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkKKwkJCQkJCS5uYW1lKCkpOwogCQlzYi5hcHBlbmQoIl0iKTsKIAkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQppbmRleCA1Yjc4MWFjLi4zMjIyZDYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQpAQCAtMiw3ICsyLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBHb29nbGUgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA4LCBNYXJlayBaYXdpcnNraSA8bWFyZWsuemF3aXJza2lAZ21haWwuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDA4LCBSb2JpbiBSb3NlbmJlcmcgPHJvYmluLnJvc2VuYmVyZ0BkZXdpcmUuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIwIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDIyIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtNDAsNyArNDAsNiBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkFib3J0ZWRCeUhvb2tFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzLkhvb2tzOwpAQCAtNTkwLDYgKzU4OSwxMSBAQCBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiBmaW5kUmVtb3RlUmVmVXBkYXRlc0ZvcigKIAkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBwcm9jUmVmcyA9IGV4cGFuZFB1c2hXaWxkY2FyZHNGb3IoZGIsIHNwZWNzKTsKIAogCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHByb2NSZWZzKSB7CisJCQlpZiAoc3BlYy5pc01hdGNoaW5nKCkpIHsKKwkJCQlyZXN1bHQuYWRkKG5ldyBSZW1vdGVSZWZVcGRhdGUoZGIsIHNwZWMuaXNGb3JjZVVwZGF0ZSgpLAorCQkJCQkJZmV0Y2hTcGVjcykpOworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJU3RyaW5nIHNyY1NwZWMgPSBzcGVjLmdldFNvdXJjZSgpOwogCQkJZmluYWwgUmVmIHNyY1JlZiA9IGRiLmZpbmRSZWYoc3JjU3BlYyk7CiAJCQlpZiAoc3JjUmVmICE9IG51bGwpCkBAIC02NTYsMTQgKzY2MCwxOCBAQCBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiBmaW5kUmVtb3RlUmVmVXBkYXRlc0ZvcigKIAlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFJlZlNwZWM+IGV4cGFuZFB1c2hXaWxkY2FyZHNGb3IoCiAJCQlmaW5hbCBSZXBvc2l0b3J5IGRiLCBmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IHNwZWNzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgTGlzdDxSZWY+IGxvY2FsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOwogCQlmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IHByb2NSZWZzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwogCisJCUxpc3Q8UmVmPiBsb2NhbFJlZnMgPSBudWxsOwogCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHNwZWNzKSB7Ci0JCQlpZiAoc3BlYy5pc1dpbGRjYXJkKCkpIHsKKwkJCWlmICghc3BlYy5pc01hdGNoaW5nKCkgJiYgc3BlYy5pc1dpbGRjYXJkKCkpIHsKKwkJCQlpZiAobG9jYWxSZWZzID09IG51bGwpIHsKKwkJCQkJbG9jYWxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CisJCQkJfQogCQkJCWZvciAoUmVmIGxvY2FsUmVmIDogbG9jYWxSZWZzKSB7Ci0JCQkJCWlmIChzcGVjLm1hdGNoU291cmNlKGxvY2FsUmVmKSkKKwkJCQkJaWYgKHNwZWMubWF0Y2hTb3VyY2UobG9jYWxSZWYpKSB7CiAJCQkJCQlwcm9jUmVmcy5hZGQoc3BlYy5leHBhbmRGcm9tU291cmNlKGxvY2FsUmVmKSk7CisJCQkJCX0KIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXByb2NSZWZzLmFkZChzcGVjKTsKQEAgLTY3Miw3ICs2ODAsNyBAQCBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFJlZlNwZWM+IGV4cGFuZFB1c2hXaWxkY2FyZHNGb3IoCiAJCXJldHVybiBwcm9jUmVmczsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZFRyYWNraW5nUmVmTmFtZShmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSwKKwlzdGF0aWMgU3RyaW5nIGZpbmRUcmFja2luZ1JlZk5hbWUoZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsCiAJCQlmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IGZldGNoU3BlY3MpIHsKIAkJLy8gdHJ5IHRvIGZpbmQgbWF0Y2hpbmcgdHJhY2tpbmcgcmVmcwogCQlmb3IgKFJlZlNwZWMgZmV0Y2hTcGVjIDogZmV0Y2hTcGVjcykgewpAQCAtMTIyMiw3ICsxMjMwLDkgQEAgcHVibGljIHZvaWQgc2V0UHVzaE9wdGlvbnMoTGlzdDxTdHJpbmc+IHB1c2hPcHRpb25zKSB7CiAJICogQHBhcmFtIHRvRmV0Y2gKIAkgKiAgICAgICAgICAgIHNwZWNpZmljYXRpb24gb2YgcmVmcyB0byBmZXRjaCBsb2NhbGx5LiBNYXkgYmUgbnVsbCBvciB0aGUKIAkgKiAgICAgICAgICAgIGVtcHR5IGNvbGxlY3Rpb24gdG8gdXNlIHRoZSBzcGVjaWZpY2F0aW9ucyBmcm9tIHRoZQotCSAqICAgICAgICAgICAgUmVtb3RlQ29uZmlnLiBTb3VyY2UgZm9yIGVhY2ggUmVmU3BlYyBjYW4ndCBiZSBudWxsLgorCSAqICAgICAgICAgICAgUmVtb3RlQ29uZmlnLiBNYXkgY29udGFpbnMgcmVndWxhciBhbmQgbmVnYXRpdmUgCisJICogICAgICAgICAgICB7QGxpbmsgUmVmU3BlY31zLiBTb3VyY2UgZm9yIGVhY2ggcmVndWxhciBSZWZTcGVjIGNhbid0CisJICogICAgICAgICAgICBiZSBudWxsLgogCSAqIEByZXR1cm4gaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgdHJhY2tpbmcgcmVmcyB1cGRhdGVkLgogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhpcyB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBmZXRjaGluZwpAQCAtMTI1Niw3ICsxMjY2LDkgQEAgcHVibGljIEZldGNoUmVzdWx0IGZldGNoKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCSAqIEBwYXJhbSB0b0ZldGNoCiAJICogICAgICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHJlZnMgdG8gZmV0Y2ggbG9jYWxseS4gTWF5IGJlIG51bGwgb3IgdGhlCiAJICogICAgICAgICAgICBlbXB0eSBjb2xsZWN0aW9uIHRvIHVzZSB0aGUgc3BlY2lmaWNhdGlvbnMgZnJvbSB0aGUKLQkgKiAgICAgICAgICAgIFJlbW90ZUNvbmZpZy4gU291cmNlIGZvciBlYWNoIFJlZlNwZWMgY2FuJ3QgYmUgbnVsbC4KKwkgKiAgICAgICAgICAgIFJlbW90ZUNvbmZpZy4gTWF5IGNvbnRhaW5zIHJlZ3VsYXIgYW5kIG5lZ2F0aXZlIAorCSAqICAgICAgICAgICAge0BsaW5rIFJlZlNwZWN9cy4gU291cmNlIGZvciBlYWNoIHJlZ3VsYXIgUmVmU3BlYyBjYW4ndAorCSAqICAgICAgICAgICAgYmUgbnVsbC4KIAkgKiBAcGFyYW0gYnJhbmNoCiAJICogICAgICAgICAgICB0aGUgaW5pdGlhbCBicmFuY2ggdG8gY2hlY2sgb3V0IHdoZW4gY2xvbmluZyB0aGUgcmVwb3NpdG9yeS4KIAkgKiAgICAgICAgICAgIENhbiBiZSBzcGVjaWZpZWQgYXMgcmVmIG5hbWUgKDxjb2RlPnJlZnMvaGVhZHMvbWFzdGVyPC9jb2RlPiksCkBAIC0xMzcxLDE2ICsxMzgzLDkgQEAgcHVibGljIFB1c2hSZXN1bHQgcHVzaChmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCWlmICh0b1B1c2guaXNFbXB0eSgpKQogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkubm90aGluZ1RvUHVzaCk7CiAJCX0KLQkJaWYgKHByZVB1c2ggIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwcmVQdXNoLnNldFJlZnModG9QdXNoKTsKLQkJCQlwcmVQdXNoLmNhbGwoKTsKLQkJCX0gY2F0Y2ggKEFib3J0ZWRCeUhvb2tFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KIAotCQlmaW5hbCBQdXNoUHJvY2VzcyBwdXNoUHJvY2VzcyA9IG5ldyBQdXNoUHJvY2Vzcyh0aGlzLCB0b1B1c2gsIG91dCk7CisJCWZpbmFsIFB1c2hQcm9jZXNzIHB1c2hQcm9jZXNzID0gbmV3IFB1c2hQcm9jZXNzKHRoaXMsIHRvUHVzaCwgcHJlUHVzaCwKKwkJCQlvdXQpOwogCQlyZXR1cm4gcHVzaFByb2Nlc3MuZXhlY3V0ZShtb25pdG9yKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEh0dHAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEh0dHAuamF2YQppbmRleCAwNzEwZDNmLi40MDUzNzNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRIdHRwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0SHR0cC5qYXZhCkBAIC0xNTQwLDE0ICsxNTQwLDE5IEBAIGNsYXNzIFNtYXJ0SHR0cEZldGNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrRmV0Y2hDb25uZWN0aW9uIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkb0ZldGNoKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCWZpbmFsIENvbGxlY3Rpb248UmVmPiB3YW50LCBmaW5hbCBTZXQ8T2JqZWN0SWQ+IGhhdmUsCi0JCQkJZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCXN2YyA9IG5ldyBNdWx0aVJlcXVlc3RTZXJ2aWNlKFNWQ19VUExPQURfUEFDSywKLQkJCQkJCWdldFByb3RvY29sVmVyc2lvbigpKTsKLQkJCQlpbml0KHN2Yy5nZXRJbnB1dFN0cmVhbSgpLCBzdmMuZ2V0T3V0cHV0U3RyZWFtKCkpOworCQlwcm90ZWN0ZWQgdm9pZCBkb0ZldGNoKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDb2xsZWN0aW9uPFJlZj4gd2FudCwKKwkJCQlTZXQ8T2JqZWN0SWQ+IGhhdmUsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCisJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJCQlzdmMgPSBuZXcgTXVsdGlSZXF1ZXN0U2VydmljZShTVkNfVVBMT0FEX1BBQ0ssCisJCQkJCWdldFByb3RvY29sVmVyc2lvbigpKTsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gc3ZjSW4gPSBzdmMuZ2V0SW5wdXRTdHJlYW0oKTsKKwkJCQkJT3V0cHV0U3RyZWFtIHN2Y091dCA9IHN2Yy5nZXRPdXRwdXRTdHJlYW0oKSkgeworCQkJCWluaXQoc3ZjSW4sIHN2Y091dCk7CiAJCQkJc3VwZXIuZG9GZXRjaChtb25pdG9yLCB3YW50LCBoYXZlLCBvdXRwdXRTdHJlYW0pOworCQkJfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBlOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogCQkJfSBmaW5hbGx5IHsKIAkJCQlzdmMgPSBudWxsOwogCQkJfQpAQCAtMTU3MSwxMyArMTU3NiwyMCBAQCBjbGFzcyBTbWFydEh0dHBQdXNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrUHVzaENvbm5lY3Rpb24gewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRvUHVzaChmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQlmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMsCisJCXByb3RlY3RlZCB2b2lkIGRvUHVzaChQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKKwkJCQlNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMsCiAJCQkJT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCQlmaW5hbCBTZXJ2aWNlIHN2YyA9IG5ldyBNdWx0aVJlcXVlc3RTZXJ2aWNlKFNWQ19SRUNFSVZFX1BBQ0ssCisJCQlTZXJ2aWNlIHN2YyA9IG5ldyBNdWx0aVJlcXVlc3RTZXJ2aWNlKFNWQ19SRUNFSVZFX1BBQ0ssCiAJCQkJCWdldFByb3RvY29sVmVyc2lvbigpKTsKLQkJCWluaXQoc3ZjLmdldElucHV0U3RyZWFtKCksIHN2Yy5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0JCQlzdXBlci5kb1B1c2gobW9uaXRvciwgcmVmVXBkYXRlcywgb3V0cHV0U3RyZWFtKTsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gc3ZjSW4gPSBzdmMuZ2V0SW5wdXRTdHJlYW0oKTsKKwkJCQkJT3V0cHV0U3RyZWFtIHN2Y091dCA9IHN2Yy5nZXRPdXRwdXRTdHJlYW0oKSkgeworCQkJCWluaXQoc3ZjSW4sIHN2Y091dCk7CisJCQkJc3VwZXIuZG9QdXNoKG1vbml0b3IsIHJlZlVwZGF0ZXMsIG91dHB1dFN0cmVhbSk7CisJCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworCQkJCXRocm93IGU7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YQppbmRleCA2ZGE2YzEzLi5kY2Q4MDZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SZWZNYXAudG9SZWZNYXA7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0xMDUsNyArMTA2LDcgQEAKIC8qKgogICogSW1wbGVtZW50cyB0aGUgc2VydmVyIHNpZGUgb2YgYSBmZXRjaCBjb25uZWN0aW9uLCB0cmFuc21pdHRpbmcgb2JqZWN0cy4KICAqLwotcHVibGljIGNsYXNzIFVwbG9hZFBhY2sgeworcHVibGljIGNsYXNzIFVwbG9hZFBhY2sgaW1wbGVtZW50cyBDbG9zZWFibGUgewogCS8qKiBQb2xpY3kgdGhlIHNlcnZlciB1c2VzIHRvIHZhbGlkYXRlIGNsaWVudCByZXF1ZXN0cyAqLwogCXB1YmxpYyBlbnVtIFJlcXVlc3RQb2xpY3kgewogCQkvKiogQ2xpZW50IG1heSBvbmx5IGFzayBmb3Igb2JqZWN0cyB0aGUgc2VydmVyIGFkdmVydGlzZWQgYSByZWZlcmVuY2UgZm9yLiAqLwpAQCAtNzMzLDYgKzczNCwxNyBAQCBwcml2YXRlIGJvb2xlYW4gdXNlUHJvdG9jb2xWMigpIHsKIAkJCQkmJiBjbGllbnRSZXF1ZXN0ZWRWMjsKIAl9CiAKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwkJaWYgKHRpbWVyICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJdGltZXIudGVybWluYXRlKCk7CisJCQl9IGZpbmFsbHkgeworCQkJCXRpbWVyID0gbnVsbDsKKwkJCX0KKwkJfQorCX0KKwogCS8qKgogCSAqIEV4ZWN1dGUgdGhlIHVwbG9hZCB0YXNrIG9uIHRoZSBzb2NrZXQuCiAJICoKQEAgLTc4MCw2ICs3OTIsOCBAQCBwdWJsaWMgdm9pZCB1cGxvYWQoSW5wdXRTdHJlYW0gaW5wdXQsIE91dHB1dFN0cmVhbSBvdXRwdXQsCiAJCQkJdGhyb3cgbmV3IFVwbG9hZFBhY2tJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKGVycik7CiAJCQl9CiAJCQl0aHJvdyBlcnI7CisJCX0gZmluYWxseSB7CisJCQljbG9zZSgpOwogCQl9CiAJfQogCkBAIC03ODksNiArODAzLDEwIEBAIHB1YmxpYyB2b2lkIHVwbG9hZChJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCwKIAkgKiA8cD4KIAkgKiBJZiB0aGUgY2xpZW50IHBhc3NlZCBleHRyYSBwYXJhbWV0ZXJzIChlLmcuLCAidmVyc2lvbj0yIikgdGhyb3VnaCBhIHNpZGUKIAkgKiBjaGFubmVsLCB0aGUgY2FsbGVyIG11c3QgY2FsbCBzZXRFeHRyYVBhcmFtZXRlcnMgZmlyc3QgdG8gc3VwcGx5IHRoZW0uCisJICogQ2FsbGVycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCB7QGxpbmsgI2Nsb3NlKCl9IHRvIHRlcm1pbmF0ZSB0aGUKKwkgKiBpbnRlcm5hbCBpbnRlcnJ1cHQgdGltZXIgdGhyZWFkLiBJZiB0aGUgY2FsbGVyIGZhaWxzIHRvIHRlcm1pbmF0ZSB0aGUKKwkgKiB0aHJlYWQsIGl0IHdpbGwgKGV2ZW50dWFsbHkpIHRlcm1pbmF0ZSBpdHNlbGYgd2hlbiB0aGUgSW50ZXJydXB0VGltZXIKKwkgKiBpbnN0YW5jZSBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KIAkgKgogCSAqIEBwYXJhbSBpbnB1dAogCSAqICAgICAgICAgICAgcmF3IGlucHV0IHRvIHJlYWQgY2xpZW50IGNvbW1hbmRzIGZyb20uIENhbGxlciBtdXN0IGVuc3VyZSB0aGUKQEAgLTg0NSwxMyArODYzLDYgQEAgcHVibGljIHZvaWQgdXBsb2FkV2l0aEV4Y2VwdGlvblByb3BhZ2F0aW9uKElucHV0U3RyZWFtIGlucHV0LAogCQl9IGZpbmFsbHkgewogCQkJbXNnT3V0ID0gTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRTsKIAkJCXdhbGsuY2xvc2UoKTsKLQkJCWlmICh0aW1lciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGltZXIudGVybWluYXRlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdGltZXIgPSBudWxsOwotCQkJCX0KLQkJCX0KIAkJfQogCX0KIApAQCAtMTk5OCwxMiArMjAwOSwxNiBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTm90QWR2ZXJ0aXNlZFdhbnRzKFVwbG9hZFBhY2sgdXAsCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJCU9iamVjdFJlYWRlciByZWFkZXIgPSB1cC5nZXRSZXZXYWxrKCkuZ2V0T2JqZWN0UmVhZGVyKCk7CisJCVNldDxPYmplY3RJZD4gZGlyZWN0bHlWaXNpYmxlT2JqZWN0cyA9IHJlZklkU2V0KHZpc2libGVSZWZzKTsKKwkJTGlzdDxPYmplY3RJZD4gbm9uVGlwV2FudHMgPSBub3RBZHZlcnRpc2VkV2FudHMuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKG5vdChkaXJlY3RseVZpc2libGVPYmplY3RzOjpjb250YWlucykpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAKIAkJdHJ5IChSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhyZWFkZXIpKSB7CiAJCQl3YWxrLnNldFJldGFpbkJvZHkoZmFsc2UpOwogCQkJLy8gTWlzc2luZyAid2FudHMiIHRocm93IGV4Y2VwdGlvbiBoZXJlCiAJCQlMaXN0PFJldk9iamVjdD4gd2FudHNBc09ianMgPSBvYmplY3RJZHNUb1Jldk9iamVjdHMod2FsaywKLQkJCQkJbm90QWR2ZXJ0aXNlZFdhbnRzKTsKKwkJCQkJbm9uVGlwV2FudHMpOwogCQkJTGlzdDxSZXZDb21taXQ+IHdhbnRzQXNDb21taXRzID0gd2FudHNBc09ianMuc3RyZWFtKCkKIAkJCQkJLmZpbHRlcihvYmogLT4gb2JqIGluc3RhbmNlb2YgUmV2Q29tbWl0KQogCQkJCQkubWFwKG9iaiAtPiAoUmV2Q29tbWl0KSBvYmopCkBAIC0yMDIzLDcgKzIwMzgsOCBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTm90QWR2ZXJ0aXNlZFdhbnRzKFVwbG9hZFBhY2sgdXAsCiAJCQkJCQkJLmZpbHRlcihvYmogLT4gIShvYmogaW5zdGFuY2VvZiBSZXZDb21taXQpKQogCQkJCQkJCS5saW1pdCgxKQogCQkJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLmdldCgwKTsKLQkJCQkJdGhyb3cgbmV3IFdhbnROb3RWYWxpZEV4Y2VwdGlvbihub25Db21taXQpOworCQkJCQl0aHJvdyBuZXcgV2FudE5vdFZhbGlkRXhjZXB0aW9uKG5vbkNvbW1pdCwKKwkJCQkJCQluZXcgRXhjZXB0aW9uKCJDYW5ub3Qgd2FsayB3aXRob3V0IGJpdG1hcHMiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CiAKIAkJCQl0cnkgKE9iamVjdFdhbGsgb2JqV2FsayA9IHdhbGsudG9PYmplY3RXYWxrV2l0aFNhbWVPYmplY3RzKCkpIHsKQEAgLTIwMzcsNiArMjA1MywxMSBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTm90QWR2ZXJ0aXNlZFdhbnRzKFVwbG9hZFBhY2sgdXAsCiAJCQkJCU9wdGlvbmFsPFJldk9iamVjdD4gdW5yZWFjaGFibGUgPSByZWFjaGFiaWxpdHlDaGVja2VyCiAJCQkJCQkJLmFyZUFsbFJlYWNoYWJsZSh3YW50c0FzT2Jqcywgc3RhcnRlcnNBc09ianMpOwogCQkJCQlpZiAodW5yZWFjaGFibGUuaXNQcmVzZW50KCkpIHsKKwkJCQkJCWlmICghcmVwb0hhc0JpdG1hcHMpIHsKKwkJCQkJCQl0aHJvdyBuZXcgV2FudE5vdFZhbGlkRXhjZXB0aW9uKAorCQkJCQkJCQkJdW5yZWFjaGFibGUuZ2V0KCksIG5ldyBFeGNlcHRpb24oCisJCQkJCQkJCQkJCSJSZXRyeSB3aXRoIGJpdG1hcHMgZW5hYmxlZCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQogCQkJCQkJdGhyb3cgbmV3IFdhbnROb3RWYWxpZEV4Y2VwdGlvbih1bnJlYWNoYWJsZS5nZXQoKSk7CiAJCQkJCX0KIAkJCQl9CkBAIC0yMDYzLDYgKzIwODQsMTAgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja05vdEFkdmVydGlzZWRXYW50cyhVcGxvYWRQYWNrIHVwLAogCQl9CiAJfQogCisJcHJpdmF0ZSBzdGF0aWMgPFQ+IFByZWRpY2F0ZTxUPiBub3QoUHJlZGljYXRlPFQ+IHQpIHsKKwkgICAgcmV0dXJuIHQubmVnYXRlKCk7CisJfQorCiAJc3RhdGljIFN0cmVhbTxSZWY+IGltcG9ydGFudFJlZnNGaXJzdCgKIAkJCUNvbGxlY3Rpb248UmVmPiB2aXNpYmxlUmVmcykgewogCQlQcmVkaWNhdGU8UmVmPiBzdGFydHNXaXRoUmVmc0hlYWRzID0gcmVmIC0+IHJlZi5nZXROYW1lKCkKQEAgLTIxNzUsNiArMjIwMCwxMSBAQCBwcml2YXRlIGJvb2xlYW4gd2FudFNhdGlzZmllZChSZXZPYmplY3Qgd2FudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHdhbnQuaGFzKFNBVElTRklFRCkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAorCQlpZiAoKChSZXZDb21taXQpIHdhbnQpLmdldFBhcmVudENvdW50KCkgPT0gMCkgeworCQkJd2FudC5hZGQoU0FUSVNGSUVEKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKIAkJd2Fsay5yZXNldFJldGFpbihTQVZFKTsKIAkJd2Fsay5tYXJrU3RhcnQoKFJldkNvbW1pdCkgd2FudCk7CiAJCWlmIChvbGRlc3RUaW1lICE9IDApCkBAIC0yMzM0LDcgKzIzNjQsNyBAQCBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQogCQkJCQkJOiByZXEuZ2V0RGVwdGgoKSAtIDE7CiAJCQkJcHcuc2V0U2hhbGxvd1BhY2socmVxLmdldERlcHRoKCksIHVuc2hhbGxvd0NvbW1pdHMpOwogCi0JCQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gT3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIGJlbG93CisJCQkJLy8gT3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIGJlbG93CiAJCQkJRGVwdGhXYWxrLlJldldhbGsgZHcgPSBuZXcgRGVwdGhXYWxrLlJldldhbGsoCiAJCQkJCQl3YWxrLmdldE9iamVjdFJlYWRlcigpLCB3YWxrRGVwdGgpOwogCQkJCWR3LnNldERlZXBlblNpbmNlKHJlcS5nZXREZWVwZW5TaW5jZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VybENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXJsQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0ZmNmOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VybENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworLyoqCisgKiBTdXBwb3J0IGZvciBVUkwgdHJhbnNsYXRpb25zIHZpYSBnaXQgY29uZmlncyB7QGNvZGUgdXJsLjxiYXNlPi5pbnN0ZWFkT2Z9IGFuZAorICoge0Bjb2RlIHVybC48YmFzZT4ucHVzaEluc3RlYWRPZn0uCisgKgorICogQHNpbmNlIDYuMgorICovCitwdWJsaWMgY2xhc3MgVXJsQ29uZmlnIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSU5TVEVBRE9GID0gImluc3RlYWRvZiI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFVTSElOU1RFQURPRiA9ICJwdXNoaW5zdGVhZG9mIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fVVJMID0gInVybCI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgZmluYWwgQ29uZmlnIGNvbmZpZzsKKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBpbnN0ZWFkT2Y7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcHVzaEluc3RlYWRPZjsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFVybENvbmZpZ30gaW5zdGFuY2UuCisJICoKKwkgKiBAcGFyYW0gY29uZmlnCisJICogICAgICAgICAgICB7QGxpbmsgQ29uZmlnfSB0byByZWFkIHZhbHVlcyBmcm9tCisJICovCisJcHVibGljIFVybENvbmZpZyhDb25maWcgY29uZmlnKSB7CisJCXRoaXMuY29uZmlnID0gY29uZmlnOworCX0KKworCS8qKgorCSAqIFBlcmZvcm1zIHJlcGxhY2VtZW50cyBhcyBkZWZpbmVkIGJ5IGdpdCBjb25maWcKKwkgKiB7QGNvZGUgdXJsLjxiYXNlPi5pbnN0ZWFkT2Z9LiBJZiB0aGVyZSBpcyBubyBtYXRjaCwgdGhlIGlucHV0IGlzIHJldHVybmVkCisJICogdW5jaGFuZ2VkLgorCSAqCisJICogQHBhcmFtIHVybAorCSAqICAgICAgICAgICAgdG8gc3Vic3RpdHV0ZQorCSAqIEByZXR1cm4gdGhlIHtAY29kZSB1cmx9IHdpdGggc3Vic3RpdHV0aW9uIGFwcGxpZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHVybCkgeworCQlpZiAoaW5zdGVhZE9mID09IG51bGwpIHsKKwkJCWluc3RlYWRPZiA9IGxvYWQoS0VZX0lOU1RFQURPRik7CisJCX0KKwkJcmV0dXJuIHJlcGxhY2UodXJsLCBpbnN0ZWFkT2YpOworCX0KKworCS8qKgorCSAqIFRlbGxzIHdoZXRoZXIgdGhlcmUgYXJlIHB1c2ggcmVwbGFjZW1lbnRzLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgYXJlIHB1c2ggcmVwbGFjZW1lbnRzLCB7QGNvZGUgZmFsc2V9CisJICogICAgICAgICBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNQdXNoUmVwbGFjZW1lbnRzKCkgeworCQlpZiAocHVzaEluc3RlYWRPZiA9PSBudWxsKSB7CisJCQlwdXNoSW5zdGVhZE9mID0gbG9hZChLRVlfUFVTSElOU1RFQURPRik7CisJCX0KKwkJcmV0dXJuICFwdXNoSW5zdGVhZE9mLmlzRW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtcyByZXBsYWNlbWVudHMgYXMgZGVmaW5lZCBieSBnaXQgY29uZmlnCisJICoge0Bjb2RlIHVybC48YmFzZT4ucHVzaEluc3RlYWRPZn0uIElmIHRoZXJlIGlzIG5vIG1hdGNoLCB0aGUgaW5wdXQgaXMKKwkgKiByZXR1cm5lZCB1bmNoYW5nZWQuCisJICoKKwkgKiBAcGFyYW0gdXJsCisJICogICAgICAgICAgICB0byBzdWJzdGl0dXRlCisJICogQHJldHVybiB0aGUge0Bjb2RlIHVybH0gd2l0aCBzdWJzdGl0dXRpb24gYXBwbGllZAorCSAqLworCXB1YmxpYyBTdHJpbmcgcmVwbGFjZVB1c2goU3RyaW5nIHVybCkgeworCQlpZiAocHVzaEluc3RlYWRPZiA9PSBudWxsKSB7CisJCQlwdXNoSW5zdGVhZE9mID0gbG9hZChLRVlfUFVTSElOU1RFQURPRik7CisJCX0KKwkJcmV0dXJuIHJlcGxhY2UodXJsLCBwdXNoSW5zdGVhZE9mKTsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9hZChTdHJpbmcga2V5KSB7CisJCU1hcDxTdHJpbmcsIFN0cmluZz4gcmVwbGFjZW1lbnRzID0gbmV3IEhhc2hNYXA8PigpOworCQlmb3IgKFN0cmluZyB1cmwgOiBjb25maWcuZ2V0U3Vic2VjdGlvbnMoU0VDVElPTl9VUkwpKSB7CisJCQlmb3IgKFN0cmluZyBwcmVmaXggOiBjb25maWcuZ2V0U3RyaW5nTGlzdChTRUNUSU9OX1VSTCwgdXJsLCBrZXkpKSB7CisJCQkJcmVwbGFjZW1lbnRzLnB1dChwcmVmaXgsIHVybCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlcGxhY2VtZW50czsKKwl9CisKKwlwcml2YXRlIFN0cmluZyByZXBsYWNlKFN0cmluZyB1cmksIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVwbGFjZW1lbnRzKSB7CisJCUVudHJ5PFN0cmluZywgU3RyaW5nPiBtYXRjaCA9IG51bGw7CisJCWZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IHJlcGxhY2VtZW50IDogcmVwbGFjZW1lbnRzLmVudHJ5U2V0KCkpIHsKKwkJCS8vIElnbm9yZSBjdXJyZW50IGVudHJ5IGlmIG5vdCBsb25nZXIgdGhhbiBwcmV2aW91cyBtYXRjaAorCQkJaWYgKG1hdGNoICE9IG51bGwgJiYgbWF0Y2guZ2V0S2V5KCkubGVuZ3RoKCkgPiByZXBsYWNlbWVudC5nZXRLZXkoKQorCQkJCQkubGVuZ3RoKCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICh1cmkuc3RhcnRzV2l0aChyZXBsYWNlbWVudC5nZXRLZXkoKSkpIHsKKwkJCQltYXRjaCA9IHJlcGxhY2VtZW50OworCQkJfQorCQl9CisJCWlmIChtYXRjaCAhPSBudWxsKSB7CisJCQlyZXR1cm4gbWF0Y2guZ2V0VmFsdWUoKSArIHVyaS5zdWJzdHJpbmcobWF0Y2guZ2V0S2V5KCkubGVuZ3RoKCkpOworCQl9CisJCXJldHVybiB1cmk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQppbmRleCAzZDE1ZWY1Li4wNDZmMzk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMjIsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTE4LDExICsxOCwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnlDYWNoZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5Q2FjaGUuRmlsZUtleTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIERlZmF1bHQgcmVzb2x2ZXIgc2VydmluZyBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtLgpAQCAtNjcsNyArNjcsNyBAQCBwdWJsaWMgUmVwb3NpdG9yeSBvcGVuKEMgcmVxLCBTdHJpbmcgbmFtZSkKIAkJaWYgKGlzVW5yZWFzb25hYmxlTmFtZShuYW1lKSkKIAkJCXRocm93IG5ldyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24obmFtZSk7CiAKLQkJUmVwb3NpdG9yeSBkYiA9IGV4cG9ydHMuZ2V0KG5hbWVXaXRoRG90R2l0KG5hbWUpKTsKKwkJUmVwb3NpdG9yeSBkYiA9IGV4cG9ydHMuZ2V0KFN0cmluZ1V0aWxzLm5hbWVXaXRoRG90R2l0KG5hbWUpKTsKIAkJaWYgKGRiICE9IG51bGwpIHsKIAkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCXJldHVybiBkYjsKQEAgLTE1NCw3ICsxNTQsNyBAQCBwdWJsaWMgdm9pZCBzZXRFeHBvcnRBbGwoYm9vbGVhbiBleHBvcnQpIHsKIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IGluc3RhbmNlLgogCSAqLwogCXB1YmxpYyB2b2lkIGV4cG9ydFJlcG9zaXRvcnkoU3RyaW5nIG5hbWUsIFJlcG9zaXRvcnkgZGIpIHsKLQkJZXhwb3J0cy5wdXQobmFtZVdpdGhEb3RHaXQobmFtZSksIGRiKTsKKwkJZXhwb3J0cy5wdXQoU3RyaW5nVXRpbHMubmFtZVdpdGhEb3RHaXQobmFtZSksIGRiKTsKIAl9CiAKIAkvKioKQEAgLTE5NywxMiArMTk3LDYgQEAgZWxzZSBpZiAoZGIuZ2V0RGlyZWN0b3J5KCkgIT0gbnVsbCkKIAkJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZVdpdGhEb3RHaXQoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUuZW5kc1dpdGgoQ29uc3RhbnRzLkRPVF9HSVRfRVhUKSkKLQkJCXJldHVybiBuYW1lOwotCQlyZXR1cm4gbmFtZSArIENvbnN0YW50cy5ET1RfR0lUX0VYVDsKLQl9Ci0KIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5yZWFzb25hYmxlTmFtZShTdHJpbmcgbmFtZSkgewogCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuIHRydWU7IC8vIG5vIGVtcHR5IHBhdGhzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEKaW5kZXggMWY2MTRlMy4uODI2OTY2NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YQpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgR29vZ2xlIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAyMiBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKQEAgLTczLDYgKzc0LDcgQEAKICAqIHRocmVhZHMuCiAgKi8KIHB1YmxpYyBjbGFzcyBUcmVlV2FsayBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUsIEF0dHJpYnV0ZXNQcm92aWRlciB7CisKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvcltdIE5PX1RSRUVTID0ge307CiAKIAkvKioKQEAgLTkyLDcgKzk0LDcgQEAgcHVibGljIGVudW0gT3BlcmF0aW9uVHlwZSB7CiAJfQogCiAJLyoqCi0JICogICAgICAgICAgICBUeXBlIG9mIG9wZXJhdGlvbiB5b3Ugd2FudCB0byByZXRyaWV2ZSB0aGUgZ2l0IGF0dHJpYnV0ZXMgZm9yLgorCSAqIFR5cGUgb2Ygb3BlcmF0aW9uIHlvdSB3YW50IHRvIHJldHJpZXZlIHRoZSBnaXQgYXR0cmlidXRlcyBmb3IuCiAJICovCiAJcHJpdmF0ZSBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBPcGVyYXRpb25UeXBlLkNIRUNLT1VUX09QOwogCkBAIC0yODQsMTEgKzI4NiwyMCBAQCBwdWJsaWMgc3RhdGljIFRyZWVXYWxrIGZvclBhdGgoZmluYWwgUmVwb3NpdG9yeSBkYiwgZmluYWwgU3RyaW5nIHBhdGgsCiAKIAlBYnN0cmFjdFRyZWVJdGVyYXRvciBjdXJyZW50SGVhZDsKIAotCS8qKiBDYWNoZWQgYXR0cmlidXRlIGZvciB0aGUgY3VycmVudCBlbnRyeSAqLwotCXByaXZhdGUgQXR0cmlidXRlcyBhdHRycyA9IG51bGw7CisJLyoqCisJICogQ2FjaGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBjdXJyZW50IGVudHJ5OyBwZXIgdHJlZS4gSW5kZXggaSsxIGlzIGZvciB0cmVlCisJICogaTsgaW5kZXggMCBpcyBmb3IgdGhlIGRlcHJlY2F0ZWQgbGVnYWN5IGJlaGF2aW9yLgorCSAqLworCXByaXZhdGUgQXR0cmlidXRlc1tdIGF0dHJzOwogCi0JLyoqIENhY2hlZCBhdHRyaWJ1dGVzIGhhbmRsZXIgKi8KLQlwcml2YXRlIEF0dHJpYnV0ZXNIYW5kbGVyIGF0dHJpYnV0ZXNIYW5kbGVyOworCS8qKgorCSAqIENhY2hlZCBhdHRyaWJ1dGVzIGhhbmRsZXI7IHBlciB0cmVlLiBJbmRleCBpKzEgaXMgZm9yIHRyZWUgaTsgaW5kZXggMCBpcworCSAqIGZvciB0aGUgZGVwcmVjYXRlZCBsZWdhY3kgYmVoYXZpb3IuCisJICovCisJcHJpdmF0ZSBBdHRyaWJ1dGVzSGFuZGxlcltdIGF0dHJpYnV0ZXNIYW5kbGVyczsKKworCS8qKiBDYW4gYmUgc2V0IHRvIGlkZW50aWZ5IHRoZSB0cmVlIHRvIHVzZSBmb3Ige0BsaW5rICNnZXRBdHRyaWJ1dGVzKCl9LiAqLworCXByaXZhdGUgaW50IGhlYWRJbmRleCA9IC0xOwogCiAJcHJpdmF0ZSBDb25maWcgY29uZmlnOwogCkBAIC01MTUsNiArNTI2LDI0IEBAIHB1YmxpYyBBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyIGdldEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIoKSB7CiAJfQogCiAJLyoqCisJICogSWRlbnRpZmllcyB0aGUgdHJlZSBhdCB0aGUgZ2l2ZW4gaW5kZXggYXMgdGhlIGhlYWQgdHJlZS4gVGhpcyBpcyB0aGUgdHJlZQorCSAqIHVzZSBieSBkZWZhdWx0IHRvIGRldGVybWluZSBhdHRyaWJ1dGVzIGFuZCBFT0wgbW9kZXMuCisJICoKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIG9mIHRoZSB0cmVlIHRvIHVzZSBhcyBoZWFkCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyB2b2lkIHNldEhlYWQoaW50IGluZGV4KSB7CisJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdHJlZXMubGVuZ3RoKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIZWFkIGluZGV4ICIgKyBpbmRleCAvLyROT04tTkxTLTEkCisJCQkJCSsgIiBvdXQgb2YgcmFuZ2UgWzAsIiArIHRyZWVzLmxlbmd0aCArICcpJyk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQloZWFkSW5kZXggPSBpbmRleDsKKwl9CisKKwkvKioKIAkgKiB7QGluaGVyaXREb2N9CiAJICogPHA+CiAJICogUmV0cmlldmUgdGhlIGdpdCBhdHRyaWJ1dGVzIGZvciB0aGUgY3VycmVudCBlbnRyeS4KQEAgLTU1NiwyNSArNTg1LDUxIEBAIHB1YmxpYyBBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyIGdldEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIoKSB7CiAJICovCiAJQE92ZXJyaWRlCiAJcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGF0dHJzICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0cnM7CisJCXJldHVybiBnZXRBdHRyaWJ1dGVzKGhlYWRJbmRleCk7CisJfQogCisJLyoqCisJICogUmV0cmlldmVzIHRoZSBnaXQgYXR0cmlidXRlcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gdHJlZS4KKwkgKgorCSAqIEBwYXJhbSBpbmRleAorCSAqICAgICAgICAgICAgb2YgdGhlIHRyZWUgdG8gdXNlIGFzIGJhc2UgZm9yIHRoZSBhdHRyaWJ1dGVzCisJICogQHJldHVybiB0aGUgYXR0cmlidXRlcworCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKGludCBpbmRleCkgeworCQlpbnQgYXR0ckluZGV4ID0gaW5kZXggKyAxOworCQlBdHRyaWJ1dGVzIHJlc3VsdCA9IGF0dHJzW2F0dHJJbmRleF07CisJCWlmIChyZXN1bHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQogCQlpZiAoYXR0cmlidXRlc05vZGVQcm92aWRlciA9PSBudWxsKSB7Ci0JCQkvLyBUaGUgd29yayB0cmVlIHNob3VsZCBoYXZlIGEgQXR0cmlidXRlc05vZGVQcm92aWRlciB0byBiZSBhYmxlIHRvCi0JCQkvLyByZXRyaWV2ZSB0aGUgaW5mbyBhbmQgZ2xvYmFsIGF0dHJpYnV0ZXMgbm9kZQogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKIAkJCQkJIlRoZSB0cmVlIHdhbGsgc2hvdWxkIGhhdmUgb25lIEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgc2V0IGluIG9yZGVyIHRvIGNvbXB1dGUgdGhlIGdpdCBhdHRyaWJ1dGVzLiIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAogCQl0cnkgewotCQkJLy8gTGF6eSBjcmVhdGUgdGhlIGF0dHJpYnV0ZXNIYW5kbGVyIG9uIHRoZSBmaXJzdCBhY2Nlc3Mgb2YKLQkJCS8vIGF0dHJpYnV0ZXMuIFRoaXMgcmVxdWlyZXMgdGhlIGluZm8sIGdsb2JhbCBhbmQgcm9vdAotCQkJLy8gYXR0cmlidXRlcyBub2RlcwotCQkJaWYgKGF0dHJpYnV0ZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQlhdHRyaWJ1dGVzSGFuZGxlciA9IG5ldyBBdHRyaWJ1dGVzSGFuZGxlcih0aGlzKTsKKwkJCUF0dHJpYnV0ZXNIYW5kbGVyIGhhbmRsZXIgPSBhdHRyaWJ1dGVzSGFuZGxlcnNbYXR0ckluZGV4XTsKKwkJCWlmIChoYW5kbGVyID09IG51bGwpIHsKKwkJCQlpZiAoaW5kZXggPCAwKSB7CisJCQkJCS8vIExlZ2FjeSBiZWhhdmlvciAoaGVhZEluZGV4IG5vdCBzZXQsIGdldEF0dHJpYnV0ZXMoKSBhYm92ZQorCQkJCQkvLyBjYWxsZWQpCisJCQkJCWhhbmRsZXIgPSBuZXcgQXR0cmlidXRlc0hhbmRsZXIodGhpcywgKCkgLT4geworCQkJCQkJcmV0dXJuIGdldFRyZWUoQ2Fub25pY2FsVHJlZVBhcnNlci5jbGFzcyk7CisJCQkJCX0pOworCQkJCX0gZWxzZSB7CisJCQkJCWhhbmRsZXIgPSBuZXcgQXR0cmlidXRlc0hhbmRsZXIodGhpcywgKCkgLT4geworCQkJCQkJQWJzdHJhY3RUcmVlSXRlcmF0b3IgdHJlZSA9IHRyZWVzW2luZGV4XTsKKwkJCQkJCWlmICh0cmVlIGluc3RhbmNlb2YgQ2Fub25pY2FsVHJlZVBhcnNlcikgeworCQkJCQkJCXJldHVybiAoQ2Fub25pY2FsVHJlZVBhcnNlcikgdHJlZTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9KTsKKwkJCQl9CisJCQkJYXR0cmlidXRlc0hhbmRsZXJzW2F0dHJJbmRleF0gPSBoYW5kbGVyOwogCQkJfQotCQkJYXR0cnMgPSBhdHRyaWJ1dGVzSGFuZGxlci5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlyZXR1cm4gYXR0cnM7CisJCQlyZXN1bHQgPSBoYW5kbGVyLmdldEF0dHJpYnV0ZXMoKTsKKwkJCWF0dHJzW2F0dHJJbmRleF0gPSByZXN1bHQ7CisJCQlyZXR1cm4gcmVzdWx0OwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgSkdpdEludGVybmFsRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBwYXJzaW5nIGF0dHJpYnV0ZXMiLCAvLyROT04tTkxTLTEkCiAJCQkJCWUpOwpAQCAtNTk1LDExICs2NTAsMzQgQEAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKIAkgKi8KIAlATnVsbGFibGUKIAlwdWJsaWMgRW9sU3RyZWFtVHlwZSBnZXRFb2xTdHJlYW1UeXBlKE9wZXJhdGlvblR5cGUgb3BUeXBlKSB7Ci0JCWlmIChhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID09IG51bGwgfHwgY29uZmlnID09IG51bGwpCisJCWlmIChhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID09IG51bGwgfHwgY29uZmlnID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gRW9sU3RyZWFtVHlwZVV0aWwuZGV0ZWN0U3RyZWFtVHlwZSgKLQkJCQlvcFR5cGUgIT0gbnVsbCA/IG9wVHlwZSA6IG9wZXJhdGlvblR5cGUsCi0JCQkJCWNvbmZpZy5nZXQoV29ya2luZ1RyZWVPcHRpb25zLktFWSksIGdldEF0dHJpYnV0ZXMoKSk7CisJCX0KKwkJT3BlcmF0aW9uVHlwZSBvcCA9IG9wVHlwZSAhPSBudWxsID8gb3BUeXBlIDogb3BlcmF0aW9uVHlwZTsKKwkJcmV0dXJuIEVvbFN0cmVhbVR5cGVVdGlsLmRldGVjdFN0cmVhbVR5cGUob3AsCisJCQkJY29uZmlnLmdldChXb3JraW5nVHJlZU9wdGlvbnMuS0VZKSwgZ2V0QXR0cmlidXRlcygpKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIEVPTCBzdHJlYW0gdHlwZSBvZiB0aGUgY3VycmVudCBlbnRyeSBmb3IgY2hlY2tpbmcgb3V0IHVzaW5nIHRoZQorCSAqIGNvbmZpZyBhbmQge0BsaW5rICNnZXRBdHRyaWJ1dGVzKCl9LgorCSAqCisJICogQHBhcmFtIHRyZWUKKwkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSB0cmVlIHRoZSBjaGVjay1vdXQgaXMgdG8gYmUgZnJvbQorCSAqIEByZXR1cm4gdGhlIEVPTCBzdHJlYW0gdHlwZSBvZiB0aGUgY3VycmVudCBlbnRyeSB1c2luZyB0aGUgY29uZmlnIGFuZAorCSAqICAgICAgICAge0BsaW5rICNnZXRBdHRyaWJ1dGVzKCl9LiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsCisJICogICAgICAgICBpZiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGt9IGlzIG5vdCBiYXNlZCBvbgorCSAqICAgICAgICAgYSB3b3JraW5nIHRyZWUKKwkgKiBAc2luY2UgNi4xCisJICovCisJQE51bGxhYmxlCisJcHVibGljIEVvbFN0cmVhbVR5cGUgZ2V0Q2hlY2tvdXRFb2xTdHJlYW1UeXBlKGludCB0cmVlKSB7CisJCWlmIChhdHRyaWJ1dGVzTm9kZVByb3ZpZGVyID09IG51bGwgfHwgY29uZmlnID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUF0dHJpYnV0ZXMgYXR0ciA9IGdldEF0dHJpYnV0ZXModHJlZSk7CisJCXJldHVybiBFb2xTdHJlYW1UeXBlVXRpbC5kZXRlY3RTdHJlYW1UeXBlKE9wZXJhdGlvblR5cGUuQ0hFQ0tPVVRfT1AsCisJCQkJY29uZmlnLmdldChXb3JraW5nVHJlZU9wdGlvbnMuS0VZKSwgYXR0cik7CiAJfQogCiAJLyoqCkBAIC02MDcsNyArNjg1LDggQEAgcHVibGljIEVvbFN0cmVhbVR5cGUgZ2V0RW9sU3RyZWFtVHlwZShPcGVyYXRpb25UeXBlIG9wVHlwZSkgewogCSAqLwogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewogCQlhdHRycyA9IG51bGw7Ci0JCWF0dHJpYnV0ZXNIYW5kbGVyID0gbnVsbDsKKwkJYXR0cmlidXRlc0hhbmRsZXJzID0gbnVsbDsKKwkJaGVhZEluZGV4ID0gLTE7CiAJCXRyZWVzID0gTk9fVFJFRVM7CiAJCWFkdmFuY2UgPSBmYWxzZTsKIAkJZGVwdGggPSAwOwpAQCAtNjUxLDcgKzczMCw5IEBAIHB1YmxpYyB2b2lkIHJlc2V0KEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAogCQlhZHZhbmNlID0gZmFsc2U7CiAJCWRlcHRoID0gMDsKLQkJYXR0cnMgPSBudWxsOworCQlhdHRycyA9IG5ldyBBdHRyaWJ1dGVzWzJdOworCQlhdHRyaWJ1dGVzSGFuZGxlcnMgPSBuZXcgQXR0cmlidXRlc0hhbmRsZXJbMl07CisJCWhlYWRJbmRleCA9IC0xOwogCX0KIAogCS8qKgpAQCAtNzAxLDcgKzc4MiwxNCBAQCBwdWJsaWMgdm9pZCByZXNldChBbnlPYmplY3RJZC4uLiBpZHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQl0cmVlcyA9IHI7CiAJCWFkdmFuY2UgPSBmYWxzZTsKIAkJZGVwdGggPSAwOwotCQlhdHRycyA9IG51bGw7CisJCWlmIChvbGRMZW4gPT0gbmV3TGVuKSB7CisJCQlBcnJheXMuZmlsbChhdHRycywgbnVsbCk7CisJCQlBcnJheXMuZmlsbChhdHRyaWJ1dGVzSGFuZGxlcnMsIG51bGwpOworCQl9IGVsc2UgeworCQkJYXR0cnMgPSBuZXcgQXR0cmlidXRlc1tuZXdMZW4gKyAxXTsKKwkJCWF0dHJpYnV0ZXNIYW5kbGVycyA9IG5ldyBBdHRyaWJ1dGVzSGFuZGxlcltuZXdMZW4gKyAxXTsKKwkJfQorCQloZWFkSW5kZXggPSAtMTsKIAl9CiAKIAkvKioKQEAgLTc1OCw2ICs4NDYsMTYgQEAgcHVibGljIGludCBhZGRUcmVlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJcC5tYXRjaFNoaWZ0ID0gMDsKIAogCQl0cmVlcyA9IG5ld1RyZWVzOworCQlpZiAoYXR0cnMgPT0gbnVsbCkgeworCQkJYXR0cnMgPSBuZXcgQXR0cmlidXRlc1tuICsgMl07CisJCX0gZWxzZSB7CisJCQlhdHRycyA9IEFycmF5cy5jb3B5T2YoYXR0cnMsIG4gKyAyKTsKKwkJfQorCQlpZiAoYXR0cmlidXRlc0hhbmRsZXJzID09IG51bGwpIHsKKwkJCWF0dHJpYnV0ZXNIYW5kbGVycyA9IG5ldyBBdHRyaWJ1dGVzSGFuZGxlcltuICsgMl07CisJCX0gZWxzZSB7CisJCQlhdHRyaWJ1dGVzSGFuZGxlcnMgPSBBcnJheXMuY29weU9mKGF0dHJpYnV0ZXNIYW5kbGVycywgbiArIDIpOworCQl9CiAJCXJldHVybiBuOwogCX0KIApAQCAtODAwLDcgKzg5OCw3IEBAIHB1YmxpYyBib29sZWFuIG5leHQoKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCX0KIAogCQkJZm9yICg7OykgewotCQkJCWF0dHJzID0gbnVsbDsKKwkJCQlBcnJheXMuZmlsbChhdHRycywgbnVsbCk7CiAJCQkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IG1pbigpOwogCQkJCWlmICh0LmVvZigpKSB7CiAJCQkJCWlmIChkZXB0aCA+IDApIHsKQEAgLTEyNTUsNyArMTM1Myw3IEBAIHB1YmxpYyBib29sZWFuIGlzUG9zdENoaWxkcmVuKCkgewogCSAqLwogCXB1YmxpYyB2b2lkIGVudGVyU3VidHJlZSgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlhdHRycyA9IG51bGw7CisJCUFycmF5cy5maWxsKGF0dHJzLCBudWxsKTsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY2ggPSBjdXJyZW50SGVhZDsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3JbXSB0bXAgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3JbdHJlZXMubGVuZ3RoXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlcy5sZW5ndGg7IGkrKykgewpAQCAtMTM3NCwxMSArMTQ3MiwxMiBAQCBwdWJsaWMgPFQgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvcj4gVCBnZXRUcmVlKENsYXNzPFQ+IHR5cGUpIHsKIAogCS8qKgogCSAqIEluc3BlY3QgY29uZmlnIGFuZCBhdHRyaWJ1dGVzIHRvIHJldHVybiBhIGZpbHRlcmNvbW1hbmQgYXBwbGljYWJsZSBmb3IKLQkgKiB0aGUgY3VycmVudCBwYXRoLCBidXQgd2l0aG91dCBleHBhbmRpbmcgJWYgb2NjdXJlbmNlcworCSAqIHRoZSBjdXJyZW50IHBhdGguCiAJICoKIAkgKiBAcGFyYW0gZmlsdGVyQ29tbWFuZFR5cGUKIAkgKiAgICAgICAgICAgIHdoaWNoIHR5cGUgb2YgZmlsdGVyQ29tbWFuZCBzaG91bGQgYmUgZXhlY3V0ZWQuIEUuZy4gImNsZWFuIiwKLQkgKiAgICAgICAgICAgICJzbXVkZ2UiCisJICogICAgICAgICAgICAic211ZGdlIi4gRm9yICJzbXVkZ2UiIGNvbnNpZGVyIHVzaW5nCisJICogICAgICAgICAgICB7e0BsaW5rICNnZXRTbXVkZ2VDb21tYW5kKGludCl9IGluc3RlYWQuCiAJICogQHJldHVybiBhIGZpbHRlciBjb21tYW5kCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuMgpAQCAtMTQwNyw2ICsxNTA2LDU0IEBAIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyQ29tbWFuZChTdHJpbmcgZmlsdGVyQ29tbWFuZFR5cGUpCiAJfQogCiAJLyoqCisJICogSW5zcGVjdCBjb25maWcgYW5kIGF0dHJpYnV0ZXMgdG8gcmV0dXJuIGEgZmlsdGVyY29tbWFuZCBhcHBsaWNhYmxlIGZvcgorCSAqIHRoZSBjdXJyZW50IHBhdGguCisJICoKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIG9mIHRoZSB0cmVlIHRoZSBpdGVtIHRvIGJlIHNtdWRnZWQgaXMgaW4KKwkgKiBAcmV0dXJuIGEgZmlsdGVyIGNvbW1hbmQKKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFN0cmluZyBnZXRTbXVkZ2VDb21tYW5kKGludCBpbmRleCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRTbXVkZ2VDb21tYW5kKGdldEF0dHJpYnV0ZXMoaW5kZXgpKTsKKwl9CisKKwkvKioKKwkgKiBJbnNwZWN0IGNvbmZpZyBhbmQgYXR0cmlidXRlcyB0byByZXR1cm4gYSBmaWx0ZXJjb21tYW5kIGFwcGxpY2FibGUgZm9yCisJICogdGhlIGN1cnJlbnQgcGF0aC4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCisJICogICAgICAgICAgICB0byB1c2UKKwkgKiBAcmV0dXJuIGEgZmlsdGVyIGNvbW1hbmQKKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFN0cmluZyBnZXRTbXVkZ2VDb21tYW5kKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJQXR0cmlidXRlIGYgPSBhdHRyaWJ1dGVzLmdldChDb25zdGFudHMuQVRUUl9GSUxURVIpOworCQlpZiAoZiA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTdHJpbmcgZmlsdGVyVmFsdWUgPSBmLmdldFZhbHVlKCk7CisJCWlmIChmaWx0ZXJWYWx1ZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCVN0cmluZyBmaWx0ZXJDb21tYW5kID0gZ2V0RmlsdGVyQ29tbWFuZERlZmluaXRpb24oZmlsdGVyVmFsdWUsCisJCQkJQ29uc3RhbnRzLkFUVFJfRklMVEVSX1RZUEVfU01VREdFKTsKKwkJaWYgKGZpbHRlckNvbW1hbmQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGZpbHRlckNvbW1hbmQucmVwbGFjZUFsbCgiJWYiLCAvLyROT04tTkxTLTEkCisJCQkJTWF0Y2hlci5xdW90ZVJlcGxhY2VtZW50KAorCQkJCQkJUXVvdGVkU3RyaW5nLkJPVVJORS5xdW90ZSgoZ2V0UGF0aFN0cmluZygpKSkpKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhlIGZpbHRlciBjb21tYW5kIGhvdyBpdCBpcyBkZWZpbmVkIGluIGdpdGNvbmZpZy4gVGhlIHJldHVybmVkCiAJICogc3RyaW5nIG1heSBjb250YWluICIlZiIgd2hpY2ggbmVlZHMgdG8gYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgcGF0aAogCSAqIGJlZm9yZSBleGVjdXRpbmcgdGhlIGZpbHRlciBjb21tYW5kLiBUaGVzZSBmaWx0ZXIgZGVmaW5pdGlvbnMgYXJlIGNhY2hlZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQppbmRleCA1MGNlMTVlLi40MjdlYWM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YQpAQCAtMiw3ICsyLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwOCwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDEwLCBDaHJpc3RpYW4gSGFsc3RyaWNrIDxjaHJpc3RpYW4uaGFsc3RyaWNrQHNhcC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hdHRoaWFzIFNvaG4gPG1hdHRoaWFzLnNvaG5Ac2FwLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMi0yMDIxLCBSb2JpbiBSb3NlbmJlcmcgYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDEyLCAyMDIyLCBSb2JpbiBSb3NlbmJlcmcgYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMzg3LDggKzM4Nyw4IEBAIHB1YmxpYyBib29sZWFuIGlzV29ya1RyZWUoKSB7CiAJCQkJc3RhdGUuaW5pdGlhbGl6ZVJlYWRCdWZmZXIoKTsKIAogCQkJCWZpbmFsIGxvbmcgbGVuID0gZS5nZXRMZW5ndGgoKTsKLQkJCQlJbnB1dFN0cmVhbSBmaWx0ZXJlZElzID0gcG9zc2libHlGaWx0ZXJlZElucHV0U3RyZWFtKGUsIGlzLCBsZW4sCi0JCQkJCQlPcGVyYXRpb25UeXBlLkNIRUNLSU5fT1ApOworCQkJCUlucHV0U3RyZWFtIGZpbHRlcmVkSXMgPSBwb3NzaWJseUZpbHRlcmVkSW5wdXRTdHJlYW0oZSwgaXMsCisJCQkJCQlsZW4pOwogCQkJCXJldHVybiBjb21wdXRlSGFzaChmaWx0ZXJlZElzLCBjYW5vbkxlbik7CiAJCQl9IGZpbmFsbHkgewogCQkJCXNhZmVDbG9zZShpcyk7CkBAIC00MDAsMjMgKzQwMCwxOCBAQCBwdWJsaWMgYm9vbGVhbiBpc1dvcmtUcmVlKCkgewogCX0KIAogCXByaXZhdGUgSW5wdXRTdHJlYW0gcG9zc2libHlGaWx0ZXJlZElucHV0U3RyZWFtKGZpbmFsIEVudHJ5IGUsCi0JCQlmaW5hbCBJbnB1dFN0cmVhbSBpcywgZmluYWwgbG9uZyBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBwb3NzaWJseUZpbHRlcmVkSW5wdXRTdHJlYW0oZSwgaXMsIGxlbiwgbnVsbCk7Ci0KLQl9Ci0KLQlwcml2YXRlIElucHV0U3RyZWFtIHBvc3NpYmx5RmlsdGVyZWRJbnB1dFN0cmVhbShmaW5hbCBFbnRyeSBlLAotCQkJZmluYWwgSW5wdXRTdHJlYW0gaXMsIGZpbmFsIGxvbmcgbGVuLCBPcGVyYXRpb25UeXBlIG9wVHlwZSkKKwkJCWZpbmFsIElucHV0U3RyZWFtIGlzLCBmaW5hbCBsb25nIGxlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChnZXRDbGVhbkZpbHRlckNvbW1hbmQoKSA9PSBudWxsCi0JCQkJJiYgZ2V0RW9sU3RyZWFtVHlwZShvcFR5cGUpID09IEVvbFN0cmVhbVR5cGUuRElSRUNUKSB7CisJCQkJJiYgZ2V0RW9sU3RyZWFtVHlwZSgKKwkJCQkJCU9wZXJhdGlvblR5cGUuQ0hFQ0tJTl9PUCkgPT0gRW9sU3RyZWFtVHlwZS5ESVJFQ1QpIHsKIAkJCWNhbm9uTGVuID0gbGVuOwogCQkJcmV0dXJuIGlzOwogCQl9CiAKIAkJaWYgKGxlbiA8PSBNQVhJTVVNX0ZJTEVfU0laRV9UT19SRUFEX0ZVTExZKSB7CiAJCQlCeXRlQnVmZmVyIHJhd2J1ZiA9IElPLnJlYWRXaG9sZVN0cmVhbShpcywgKGludCkgbGVuKTsKLQkJCXJhd2J1ZiA9IGZpbHRlckNsZWFuKHJhd2J1Zi5hcnJheSgpLCByYXdidWYubGltaXQoKSwgb3BUeXBlKTsKKwkJCXJhd2J1ZiA9IGZpbHRlckNsZWFuKHJhd2J1Zi5hcnJheSgpLCByYXdidWYubGltaXQoKSk7CiAJCQljYW5vbkxlbiA9IHJhd2J1Zi5saW1pdCgpOwogCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXdidWYuYXJyYXkoKSwgMCwgKGludCkgY2Fub25MZW4pOwogCQl9CkBAIC00MjYsMTQgKzQyMSwxMyBAQCAmJiBnZXRFb2xTdHJlYW1UeXBlKG9wVHlwZSkgPT0gRW9sU3RyZWFtVHlwZS5ESVJFQ1QpIHsKIAkJCQlyZXR1cm4gaXM7CiAJCQl9CiAKLQkJZmluYWwgSW5wdXRTdHJlYW0gbGVuSXMgPSBmaWx0ZXJDbGVhbihlLm9wZW5JbnB1dFN0cmVhbSgpLAotCQkJCW9wVHlwZSk7CisJCQlmaW5hbCBJbnB1dFN0cmVhbSBsZW5JcyA9IGZpbHRlckNsZWFuKGUub3BlbklucHV0U3RyZWFtKCkpOwogCQl0cnkgewogCQkJY2Fub25MZW4gPSBjb21wdXRlTGVuZ3RoKGxlbklzKTsKIAkJfSBmaW5hbGx5IHsKIAkJCXNhZmVDbG9zZShsZW5Jcyk7CiAJCX0KLQkJcmV0dXJuIGZpbHRlckNsZWFuKGlzLCBvcFR5cGUpOworCQlyZXR1cm4gZmlsdGVyQ2xlYW4oaXMpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgc2FmZUNsb3NlKElucHV0U3RyZWFtIGluKSB7CkBAIC00NTUsMjMgKzQ0OSwyMCBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5KEVudHJ5IGVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBCeXRlQnVmZmVyIGZpbHRlckNsZWFuKGJ5dGVbXSBzcmMsIGludCBuLCBPcGVyYXRpb25UeXBlIG9wVHlwZSkKKwlwcml2YXRlIEJ5dGVCdWZmZXIgZmlsdGVyQ2xlYW4oYnl0ZVtdIHNyYywgaW50IG4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzcmMpOwogCQl0cnkgewotCQkJcmV0dXJuIElPLnJlYWRXaG9sZVN0cmVhbShmaWx0ZXJDbGVhbihpbiwgb3BUeXBlKSwgbik7CisJCQlyZXR1cm4gSU8ucmVhZFdob2xlU3RyZWFtKGZpbHRlckNsZWFuKGluKSwgbik7CiAJCX0gZmluYWxseSB7CiAJCQlzYWZlQ2xvc2UoaW4pOwogCQl9CiAJfQogCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBmaWx0ZXJDbGVhbihJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpbHRlckNsZWFuKGluLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElucHV0U3RyZWFtIGZpbHRlckNsZWFuKElucHV0U3RyZWFtIGluLCBPcGVyYXRpb25UeXBlIG9wVHlwZSkKKwlwcml2YXRlIElucHV0U3RyZWFtIGZpbHRlckNsZWFuKElucHV0U3RyZWFtIGluKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW4gPSBoYW5kbGVBdXRvQ1JMRihpbiwgb3BUeXBlKTsKKwkJaW4gPSBFb2xTdHJlYW1UeXBlVXRpbC53cmFwSW5wdXRTdHJlYW0oaW4sCisJCQkJZ2V0RW9sU3RyZWFtVHlwZShPcGVyYXRpb25UeXBlLkNIRUNLSU5fT1ApKTsKIAkJU3RyaW5nIGZpbHRlckNvbW1hbmQgPSBnZXRDbGVhbkZpbHRlckNvbW1hbmQoKTsKIAkJaWYgKGZpbHRlckNvbW1hbmQgIT0gbnVsbCkgewogCQkJaWYgKEZpbHRlckNvbW1hbmRSZWdpc3RyeS5pc1JlZ2lzdGVyZWQoZmlsdGVyQ29tbWFuZCkpIHsKQEAgLTUwOSwxMSArNTAwLDYgQEAgZmlsdGVyQ29tbWFuZCwgZ2V0RW50cnlQYXRoU3RyaW5nKCksCiAJCXJldHVybiBpbjsKIAl9CiAKLQlwcml2YXRlIElucHV0U3RyZWFtIGhhbmRsZUF1dG9DUkxGKElucHV0U3RyZWFtIGluLCBPcGVyYXRpb25UeXBlIG9wVHlwZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBFb2xTdHJlYW1UeXBlVXRpbC53cmFwSW5wdXRTdHJlYW0oaW4sIGdldEVvbFN0cmVhbVR5cGUob3BUeXBlKSk7Ci0JfQotCiAJLyoqCiAJICogUmV0dXJucyB0aGUgd29ya2luZyB0cmVlIG9wdGlvbnMgdXNlZCBieSB0aGlzIGl0ZXJhdG9yLgogCSAqCkBAIC02NjQsNyArNjUwLDggQEAgcHVibGljIEluc3RhbnQgZ2V0RW50cnlMYXN0TW9kaWZpZWRJbnN0YW50KCkgewogCXB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuRW50cnlTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlJbnB1dFN0cmVhbSByYXdpcyA9IGN1cnJlbnQoKS5vcGVuSW5wdXRTdHJlYW0oKTsKIAkJaWYgKGdldENsZWFuRmlsdGVyQ29tbWFuZCgpID09IG51bGwKLQkJCQkmJiBnZXRFb2xTdHJlYW1UeXBlKCkgPT0gRW9sU3RyZWFtVHlwZS5ESVJFQ1QpIHsKKwkJCQkmJiBnZXRFb2xTdHJlYW1UeXBlKAorCQkJCQkJT3BlcmF0aW9uVHlwZS5DSEVDS0lOX09QKSA9PSBFb2xTdHJlYW1UeXBlLkRJUkVDVCkgewogCQkJcmV0dXJuIHJhd2lzOwogCQl9CiAJCXJldHVybiBmaWx0ZXJDbGVhbihyYXdpcyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRXF1YWxpdHkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9FcXVhbGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTY4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRXF1YWxpdHkuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBGYWJpbyBQb25jaXJvbGkgPHBvbmNoNzhAZ21haWwuY29tPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKKworLyoqCisgKiBFcXVhbGl0eSB1dGlsaXRpZXMuCisgKgorICogQHNpbmNlOiA2LjIKKyAqLworcHVibGljIGNsYXNzIEVxdWFsaXR5IHsKKworICAgIC8qKgorICAgICAqIENvbXBhcmUgYnkgcmVmZXJlbmNlCisgICAgICoKKyAgICAgKiBAcGFyYW0gYQorICAgICAqICAgICAgICAgICAgRmlyc3Qgb2JqZWN0IHRvIGNvbXBhcmUKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgU2Vjb25kIG9iamVjdCB0byBjb21wYXJlCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9iamVjdHMgYXJlIGlkZW50aWNhbCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBAc2luY2UgNi4yCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlJlZmVyZW5jZUVxdWFsaXR5IikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBib29sZWFuIGlzU2FtZUluc3RhbmNlKFQgYSwgVCBiKSB7CisgICAgICAgIHJldHVybiBhID09IGI7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GUy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTLmphdmEKaW5kZXggOTIzN2MwYS4uZThmMzhkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTLmphdmEKQEAgLTQ3LDcgKzQ3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwpAQCAtMjYyLDggKzI2MSw5IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZVN0b3JlQXR0cmlidXRlcyB7CiAJCSAqCiAJCSAqIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzI25ld0NhY2hlZFRocmVhZFBvb2woKQogCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3IgRlVUVVJFX1JVTk5FUiA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMCwKLQkJCQk1LCAzMEwsIFRpbWVVbml0LlNFQ09ORFMsIG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigpLAorCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGVjdXRvclNlcnZpY2UgRlVUVVJFX1JVTk5FUiA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoCisJCQkJMCwgNSwgMzBMLCBUaW1lVW5pdC5TRUNPTkRTLAorCQkJCW5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigpLAogCQkJCXJ1bm5hYmxlIC0+IHsKIAkJCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlLAogCQkJCQkJCSJKR2l0LUZpbGVTdG9yZUF0dHJpYnV0ZVJlYWRlci0iIC8vJE5PTi1OTFMtMSQKQEAgLTI4NSw4ICsyODUsOSBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVTdG9yZUF0dHJpYnV0ZXMgewogCQkgKiBzbWFsbCBrZWVwLWFsaXZlIHRpbWUgdG8gYXZvaWQgZGVsYXlzIG9uIHNodXQtZG93bi4KIAkJICogPC9wPgogCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3IgU0FWRV9SVU5ORVIgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDAsIDEsCi0JCQkJMUwsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCksCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBTQVZFX1JVTk5FUiA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoCisJCQkJMCwgMSwgMUwsIFRpbWVVbml0Lk1JTExJU0VDT05EUywKKwkJCQluZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oKSwKIAkJCQlydW5uYWJsZSAtPiB7CiAJCQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZChydW5uYWJsZSwKIAkJCQkJCQkiSkdpdC1GaWxlU3RvcmVBdHRyaWJ1dGVXcml0ZXItIiAvLyROT04tTkxTLTEkCkBAIC0yOTYsNiArMjk3LDE4IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZVN0b3JlQXR0cmlidXRlcyB7CiAJCQkJCXJldHVybiB0OwogCQkJCX0pOwogCisJCXN0YXRpYyB7CisJCQkvLyBTaHV0IGRvd24gdGhlIFNBVkVfUlVOTkVSIG9uIFN5c3RlbS5leGl0KCkKKwkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKCgpIC0+IHsKKwkJCQl0cnkgeworCQkJCQlTQVZFX1JVTk5FUi5zaHV0ZG93bk5vdygpOworCQkJCQlTQVZFX1JVTk5FUi5hd2FpdFRlcm1pbmF0aW9uKDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkvLyBJZ25vcmU7IHdlJ3JlIHNodXR0aW5nIGRvd24KKwkJCQl9CisJCQl9KSk7CisJCX0KKwogCQkvKioKIAkJICogV2hldGhlciBGaWxlU3RvcmUgYXR0cmlidXRlcyBzaG91bGQgYmUgZGV0ZXJtaW5lZCBhc3luY2hyb25vdXNseQogCQkgKgpAQCAtNDUyLDExICs0NjUsMTMgQEAgcHJpdmF0ZSBzdGF0aWMgRmlsZVN0b3JlQXR0cmlidXRlcyBnZXRGaWxlU3RvcmVBdHRyaWJ1dGVzKFBhdGggZGlyKSB7CiAJCQkJCXJldHVybiBudWxsOwogCQkJCX0KIAkJCQkvLyBmYWxsIHRocm91Z2ggYW5kIHJldHVybiBmYWxsYmFjawotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCQkJCQl8IEV4ZWN1dGlvbkV4Y2VwdGlvbiB8IENhbmNlbGxhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiB8IENhbmNlbGxhdGlvbkV4Y2VwdGlvbiBlKSB7CiAJCQkJTE9HLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKIAkJCX0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gfCBTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAJCQkJLy8gdXNlIGZhbGxiYWNrCisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJTE9HLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwogCQkJfQogCQkJTE9HLmRlYnVnKCJ7fTogdXNlIGZhbGxiYWNrIHRpbWVzdGFtcCByZXNvbHV0aW9uIGZvciBkaXJlY3Rvcnkge30iLCAvLyROT04tTkxTLTEkCiAJCQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCksIGRpcik7CkBAIC00NzQsNiArNDg5LDcgQEAgcHJpdmF0ZSBzdGF0aWMgRHVyYXRpb24gbWVhc3VyZU1pbmltYWxSYWN5SW50ZXJ2YWwoUGF0aCBkaXIpIHsKIAkJCVBhdGggcHJvYmUgPSBkaXIucmVzb2x2ZSgiLnByb2JlLSIgKyBVVUlELnJhbmRvbVVVSUQoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCUluc3RhbnQgZW5kID0gSW5zdGFudC5ub3coKS5wbHVzU2Vjb25kcygzKTsKIAkJCXRyeSB7CisJCQkJcHJvYmUudG9GaWxlKCkuZGVsZXRlT25FeGl0KCk7CiAJCQkJRmlsZXMuY3JlYXRlRmlsZShwcm9iZSk7CiAJCQkJZG8gewogCQkJCQluKys7CkBAIC01NDAsNiArNTU2LDcgQEAgcHJpdmF0ZSBzdGF0aWMgT3B0aW9uYWw8RHVyYXRpb24+IG1lYXN1cmVGc1RpbWVzdGFtcFJlc29sdXRpb24oCiAJCQl9CiAJCQlQYXRoIHByb2JlID0gZGlyLnJlc29sdmUoIi5wcm9iZS0iICsgVVVJRC5yYW5kb21VVUlEKCkpOyAvLyROT04tTkxTLTEkCiAJCQl0cnkgeworCQkJCXByb2JlLnRvRmlsZSgpLmRlbGV0ZU9uRXhpdCgpOwogCQkJCUZpbGVzLmNyZWF0ZUZpbGUocHJvYmUpOwogCQkJCUR1cmF0aW9uIGZzUmVzb2x1dGlvbiA9IGdldEZzUmVzb2x1dGlvbihzLCBkaXIsIHByb2JlKTsKIAkJCQlEdXJhdGlvbiBjbG9ja1Jlc29sdXRpb24gPSBtZWFzdXJlQ2xvY2tSZXNvbHV0aW9uKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhCmluZGV4IGZmMDk0ZjYuLmFlNzNkM2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlVmlzaXRPcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlVmlzaXRSZXN1bHQ7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwogaW1wb3J0IGphdmEubmlvLmZpbGUuU2ltcGxlRmlsZVZpc2l0b3I7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuQmFzaWNGaWxlQXR0cmlidXRlczsKQEAgLTk2LDYgKzk3LDkgQEAgcHVibGljIGJvb2xlYW4gcmV0cnlGYWlsZWRMb2NrRmlsZUNvbW1pdCgpIHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBFbnRyeVtdIGxpc3QoRmlsZSBkaXJlY3RvcnksIEZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgeworCQlpZiAoIUZpbGVzLmlzRGlyZWN0b3J5KGRpcmVjdG9yeS50b1BhdGgoKSwgTGlua09wdGlvbi5OT0ZPTExPV19MSU5LUykpIHsKKwkJCXJldHVybiBOT19FTlRSSUVTOworCQl9CiAJCUxpc3Q8RW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlGUyBmcyA9IHRoaXM7CiAJCWJvb2xlYW4gY2hlY2tFeGVjdXRhYmxlID0gZnMuc3VwcG9ydHNFeGVjdXRlKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWxzLmphdmEKaW5kZXggYjlkZDliYS4uZjAxM2U3ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbHMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKIGltcG9ydCBqYXZhLm5pby5maWxlLkF0b21pY01vdmVOb3RTdXBwb3J0ZWRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5Db3B5T3B0aW9uOwpAQCAtNjU1LDYgKzY1Niw5OSBAQCAmJiBpc1N0YWxlRmlsZUhhbmRsZSgoSU9FeGNlcHRpb24pIHRocm93YWJsZSkpIHsKIAl9CiAKIAkvKioKKwkgKiBMaWtlIGEge0BsaW5rIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbn0gYnV0IHRocm93aW5nIGFuCisJICoge0BsaW5rIEV4Y2VwdGlvbn0uCisJICoKKwkgKiBAcGFyYW0gPEE+CisJICogICAgICAgICAgICBpbnB1dCB0eXBlCisJICogQHBhcmFtIDxCPgorCSAqICAgICAgICAgICAgb3V0cHV0IHR5cGUKKwkgKiBAc2luY2UgNi4yCisJICovCisJQEZ1bmN0aW9uYWxJbnRlcmZhY2UKKwlwdWJsaWMgaW50ZXJmYWNlIElPRnVuY3Rpb248QSwgQj4geworCisJCS8qKgorCQkgKiBQZXJmb3JtcyB0aGUgZnVuY3Rpb24uCisJCSAqCisJCSAqIEBwYXJhbSB0CisJCSAqICAgICAgICAgICAgaW5wdXQgdG8gb3BlcmF0ZSBvbgorCQkgKiBAcmV0dXJuIHRoZSBvdXRwdXQKKwkJICogQHRocm93cyBFeGNlcHRpb24KKwkJICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycworCQkgKi8KKwkJQiBhcHBseShBIHQpIHRocm93cyBFeGNlcHRpb247CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBiYWNrT2ZmKGxvbmcgZGVsYXksIElPRXhjZXB0aW9uIGNhdXNlKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcChkZWxheSk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUlPRXhjZXB0aW9uIGludGVycnVwdGlvbiA9IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7CisJCQlpbnRlcnJ1cHRpb24uaW5pdENhdXNlKGUpOworCQkJaW50ZXJydXB0aW9uLmFkZFN1cHByZXNzZWQoY2F1c2UpOworCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsgLy8gUmUtc2V0IGZsYWcKKwkJCXRocm93IGludGVycnVwdGlvbjsKKwkJfQorCX0KKworCS8qKgorCSAqIEludm9rZXMgdGhlIGdpdmVuIHtAbGluayBJT0Z1bmN0aW9ufSwgcGVyZm9ybWluZyBhIGxpbWl0ZWQgbnVtYmVyIG9mCisJICogcmUtdHJpZXMgaWYgZXhjZXB0aW9ucyBvY2N1ciB0aGF0IGluZGljYXRlIGVpdGhlciBhIHN0YWxlIE5GUyBmaWxlIGhhbmRsZQorCSAqIG9yIHRoYXQgaW5kaWNhdGUgdGhhdCB0aGUgZmlsZSBtYXkgYmUgd3JpdHRlbiBjb25jdXJyZW50bHkuCisJICoKKwkgKiBAcGFyYW0gPFQ+CisJICogICAgICAgICAgICByZXN1bHQgdHlwZQorCSAqIEBwYXJhbSBmaWxlCisJICogICAgICAgICAgICB0byByZWFkCisJICogQHBhcmFtIHJlYWRlcgorCSAqICAgICAgICAgICAgZm9yIHJlYWRpbmcgdGhlIGZpbGUgYW5kIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIHtAY29kZSBUfQorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUge0Bjb2RlIHJlYWRlcn0sIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgZmlsZQorCSAqICAgICAgICAgZG9lcyBub3QgZXhpc3QKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMKKwkgKiBAc2luY2UgNi4yCisJICovCisJcHVibGljIHN0YXRpYyA8VD4gVCByZWFkV2l0aFJldHJpZXMoRmlsZSBmaWxlLAorCQkJSU9GdW5jdGlvbjxGaWxlLCA/IGV4dGVuZHMgVD4gcmVhZGVyKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWludCBtYXhTdGFsZVJldHJpZXMgPSA1OworCQlpbnQgcmV0cmllcyA9IDA7CisJCWxvbmcgYmFja29mZiA9IDUwOworCQl3aGlsZSAodHJ1ZSkgeworCQkJdHJ5IHsKKwkJCQl0cnkgeworCQkJCQlyZXR1cm4gcmVhZGVyLmFwcGx5KGZpbGUpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJaWYgKEZpbGVVdGlscy5pc1N0YWxlRmlsZUhhbmRsZUluQ2F1c2FsQ2hhaW4oZSkKKwkJCQkJCQkmJiByZXRyaWVzIDwgbWF4U3RhbGVSZXRyaWVzKSB7CisJCQkJCQlpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQkJCQlMT0cuZGVidWcoTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJCQlKR2l0VGV4dC5nZXQoKS5wYWNrZWRSZWZzSGFuZGxlSXNTdGFsZSwKKwkJCQkJCQkJCUludGVnZXIudmFsdWVPZihyZXRyaWVzKSksIGUpOworCQkJCQkJfQorCQkJCQkJcmV0cmllcysrOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJdGhyb3cgZTsKKwkJCQl9CisJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gbm9GaWxlKSB7CisJCQkJaWYgKCFmaWxlLmlzRmlsZSgpKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQkvLyBQcm9iYWJseSBXaW5kb3dzIGFuZCBzb21lIG90aGVyIHRocmVhZCBpcyB3cml0aW5nIHRoZSBmaWxlCisJCQkJLy8gY29uY3VycmVudGx5LgorCQkJCWlmIChiYWNrb2ZmID4gMTAwMCkgeworCQkJCQl0aHJvdyBub0ZpbGU7CisJCQkJfQorCQkJCWJhY2tPZmYoYmFja29mZiwgbm9GaWxlKTsKKwkJCQliYWNrb2ZmICo9IDI7IC8vIDUwLCAxMDAsIDIwMCwgNDAwLCA4MDAgbXMKKwkJCX0KKwkJfQorCX0KKworCS8qKgogCSAqIEBwYXJhbSBmaWxlCiAJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBhc3NlZCBmaWxlIGlzIGEgc3ltYm9saWMgbGluawogCSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0h0dHBTdXBwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YQppbmRleCAyM2E3M2ZhLi42NjNhMzQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YQpAQCAtMTg2LDYgKzE4NiwzMyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgZW5jb2RlKFN0cmluZ0J1aWxkZXIgdXJsc3RyLCBTdHJpbmcga2V5KSB7CiAJfQogCiAJLyoqCisJICogVHJhbnNsYXRlcyB0aGUgcHJvdmlkZWQgVVJMIGludG8gYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkCisJICogZm9ybWF0LgorCSAqCisJICogQHBhcmFtIHVybAorCSAqICAgICAgICAgICAgVGhlIFVSTCB0byB0cmFuc2xhdGUuCisJICogQHBhcmFtIGtlZXBQYXRoU2xhc2gKKwkgKiAgICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRvIGtlZXAgIi8iIGluIHRoZSBVUkwgKGkuZS4gZG9uJ3QgdHJhbnNsYXRlCisJICogICAgICAgICAgICB0aGVtIHRvICIlMkYiKS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHRyYW5zbGF0ZWQgVVJMLgorCSAqIEBzaW5jZSA1LjEzCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdXJsRW5jb2RlKFN0cmluZyB1cmwsIGJvb2xlYW4ga2VlcFBhdGhTbGFzaCkgeworCQlTdHJpbmcgZW5jb2RlZDsKKwkJdHJ5IHsKKwkJCWVuY29kZWQgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwsIFVURl84Lm5hbWUoKSk7CisJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY291bGROb3RVUkxFbmNvZGVUb1VURjgsCisJCQkJCWUpOworCQl9CisJCWlmIChrZWVwUGF0aFNsYXNoKSB7CisJCQllbmNvZGVkID0gZW5jb2RlZC5yZXBsYWNlKCIlMkYiLCAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCQlyZXR1cm4gZW5jb2RlZDsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhlIEhUVFAgcmVzcG9uc2UgY29kZSBmcm9tIHRoZSByZXF1ZXN0LgogCSAqIDxwPgogCSAqIFJvdWdobHkgdGhlIHNhbWUgYXMgPGNvZGU+Yy5nZXRSZXNwb25zZUNvZGUoKTwvY29kZT4gYnV0IHRoZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQppbmRleCA4YWIxMzM4Li45MTdhZGQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMjIsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDYgKzE1LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIAogLyoqCiAgKiBNaXNjZWxsYW5lb3VzIHN0cmluZyBjb21wYXJpc29uIHV0aWxpdHkgbWV0aG9kcy4KQEAgLTM3LDYgKzM4LDEwIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdVdGlscyB7CiAJCQlMQ1tjXSA9IChjaGFyKSAoJ2EnICsgKGMgLSAnQScpKTsKIAl9CiAKKwlwcml2YXRlIFN0cmluZ1V0aWxzKCkgeworCQkvLyBEbyBub3QgY3JlYXRlIGluc3RhbmNlcworCX0KKwogCS8qKgogCSAqIENvbnZlcnQgdGhlIGlucHV0IHRvIGxvd2VyY2FzZS4KIAkgKiA8cD4KQEAgLTI2OSw4ICsyNzQsMjAgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgam9pbihDb2xsZWN0aW9uPFN0cmluZz4gcGFydHMsIFN0cmluZyBzZXBhcmF0b3IsCiAJCXJldHVybiBzYi50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nVXRpbHMoKSB7Ci0JCS8vIERvIG5vdCBjcmVhdGUgaW5zdGFuY2VzCisJLyoqCisJICogQXBwZW5kcyB7QGxpbmsgQ29uc3RhbnRzI0RPVF9HSVRfRVhUfSB1bmxlc3MgdGhlIGdpdmVuIG5hbWUgYWxyZWFkeSBlbmRzCisJICogd2l0aCB0aGF0IHN1ZmZpeC4KKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICB0byBjb21wbGV0ZQorCSAqIEByZXR1cm4gdGhlIG5hbWUgZW5kaW5nIHdpdGgge0BsaW5rIENvbnN0YW50cyNET1RfR0lUX0VYVH0KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZVdpdGhEb3RHaXQoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKG5hbWUuZW5kc1dpdGgoQ29uc3RhbnRzLkRPVF9HSVRfRVhUKSkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKwkJcmV0dXJuIG5hbWUgKyBDb25zdGFudHMuRE9UX0dJVF9FWFQ7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3lzdGVtUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3lzdGVtUmVhZGVyLmphdmEKaW5kZXggMTZlMjU3Ny4uNWNlZDA3MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N5c3RlbVJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TeXN0ZW1SZWFkZXIuamF2YQpAQCAtNjMsNiArNjMsOCBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3lzdGVtUmVhZGVyIHsKIAogCXByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEJvb2xlYW4gaXNXaW5kb3dzOwogCisJcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQm9vbGVhbiBpc0xpbnV4OworCiAJc3RhdGljIHsKIAkJU3lzdGVtUmVhZGVyIHIgPSBuZXcgRGVmYXVsdCgpOwogCQlyLmluaXQoKTsKQEAgLTE4NSw2ICsxODcsNyBAQCBwdWJsaWMgc3RhdGljIFN5c3RlbVJlYWRlciBnZXRJbnN0YW5jZSgpIHsKIAlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5zdGFuY2UoU3lzdGVtUmVhZGVyIG5ld1JlYWRlcikgewogCQlpc01hY09TID0gbnVsbDsKIAkJaXNXaW5kb3dzID0gbnVsbDsKKwkJaXNMaW51eCA9IG51bGw7CiAJCWlmIChuZXdSZWFkZXIgPT0gbnVsbCkKIAkJCUlOU1RBTkNFID0gREVGQVVMVDsKIAkJZWxzZSB7CkBAIC01NDMsNiArNTQ2LDIwIEBAIHB1YmxpYyBib29sZWFuIGlzTWFjT1MoKSB7CiAJCXJldHVybiBpc01hY09TLmJvb2xlYW5WYWx1ZSgpOwogCX0KIAorCS8qKgorCSAqIFdoZXRoZXIgd2UgYXJlIHJ1bm5pbmcgb24gTGludXguCisJICoKKwkgKiBAcmV0dXJuIHRydWUgaWYgd2UgYXJlIHJ1bm5pbmcgb24gTGludXguCisJICogQHNpbmNlIDYuMworCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGludXgoKSB7CisJCWlmIChpc0xpbnV4ID09IG51bGwpIHsKKwkJCVN0cmluZyBvc25hbWUgPSBnZXRPc05hbWUoKTsKKwkJCWlzTGludXggPSBCb29sZWFuLnZhbHVlT2Yob3NuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgibGludXgiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gaXNMaW51eC5ib29sZWFuVmFsdWUoKTsKKwl9CisKIAlwcml2YXRlIFN0cmluZyBnZXRPc05hbWUoKSB7CiAJCXJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKIAkJCQkoUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KSAoKSAtPiBnZXRQcm9wZXJ0eSgib3MubmFtZSIpIC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rSW5wdXRTdHJlYW0uamF2YQppbmRleCA0Zjk0MGQ3Li4yYzk3MmI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5SHVua0lucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtJbnB1dFN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDIxLCAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC05MCw3ICs5MCw3IEBAIHByaXZhdGUgdm9pZCBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYnl0ZVtdIGVuY29kZWQgPSBuZXcgYnl0ZVtCYXNlODUuZW5jb2RlZExlbmd0aChsZW5ndGgpXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSsrKSB7CiAJCQlpbnQgYiA9IGluLnJlYWQoKTsKLQkJCWlmIChiIDwgMCB8fCBiID09ICdcbicpIHsKKwkJCWlmIChiIDwgMCB8fCBiID09ICdccicgfHwgYiA9PSAnXG4nKSB7CiAJCQkJdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmJpbmFyeUh1bmtJbnZhbGlkTGVuZ3RoLAogCQkJCQkJSW50ZWdlci52YWx1ZU9mKGxpbmVOdW1iZXIpKSk7CkBAIC05OSw2ICs5OSwxMCBAQCBwcml2YXRlIHZvaWQgZmlsbEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAkJLy8gTXVzdCBiZSBmb2xsb3dlZCBieSBhIG5ld2xpbmU7IHRvbGVyYXRlIEVPRi4KIAkJaW50IGIgPSBpbi5yZWFkKCk7CisJCWlmIChiID09ICdccicpIHsKKwkJCS8vIEJlIGxlbmllbnQgYW5kIGFjY2VwdCBDUi1MRiwgdG9vLgorCQkJYiA9IGluLnJlYWQoKTsKKwkJfQogCQlpZiAoYiA+PSAwICYmIGIgIT0gJ1xuJykgewogCQkJdGhyb3cgbmV3IFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuYmluYXJ5SHVua01pc3NpbmdOZXdsaW5lLApkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKaW5kZXggZDhlYzAwZC4uYzcxODM3YyAxMDA2NDQKLS0tIGEvcG9tLnhtbAorKysgYi9wb20ueG1sCkBAIC0xNTAsMjggKzE1MCwyNyBAQAogICAgIDxqYXZhLnZlcnNpb24+MTE8L2phdmEudmVyc2lvbj4KICAgICA8YnVuZGxlLW1hbmlmZXN0PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L01FVEEtSU5GL01BTklGRVNULk1GPC9idW5kbGUtbWFuaWZlc3Q+CiAKLSAgICA8amdpdC1sYXN0LXJlbGVhc2UtdmVyc2lvbj41LjEzLjAuMjAyMTA5MDgwODI3LXI8L2pnaXQtbGFzdC1yZWxlYXNlLXZlcnNpb24+CisgICAgPGpnaXQtbGFzdC1yZWxlYXNlLXZlcnNpb24+Ni4yLjAuMjAyMjA2MDcxNTUwLXI8L2pnaXQtbGFzdC1yZWxlYXNlLXZlcnNpb24+CiAgICAgPGFudC12ZXJzaW9uPjEuMTAuMTI8L2FudC12ZXJzaW9uPgotICAgIDxhcGFjaGUtc3NoZC12ZXJzaW9uPjIuNy4wPC9hcGFjaGUtc3NoZC12ZXJzaW9uPgorICAgIDxhcGFjaGUtc3NoZC12ZXJzaW9uPjIuOC4wPC9hcGFjaGUtc3NoZC12ZXJzaW9uPgogICAgIDxqc2NoLXZlcnNpb24+MC4xLjU1PC9qc2NoLXZlcnNpb24+Ci0gICAgPGp6bGliLXZlcnNpb24+MS4xLjE8L2p6bGliLXZlcnNpb24+CisgICAgPGp6bGliLXZlcnNpb24+MS4xLjM8L2p6bGliLXZlcnNpb24+CiAgICAgPGphdmFld2FoLXZlcnNpb24+MS4xLjEzPC9qYXZhZXdhaC12ZXJzaW9uPgogICAgIDxqdW5pdC12ZXJzaW9uPjQuMTMuMjwvanVuaXQtdmVyc2lvbj4KICAgICA8dGVzdC1mb3JrLWNvdW50PjFDPC90ZXN0LWZvcmstY291bnQ+CiAgICAgPGFyZ3M0ai12ZXJzaW9uPjIuMzM8L2FyZ3M0ai12ZXJzaW9uPgogICAgIDxjb21tb25zLWNvbXByZXNzLXZlcnNpb24+MS4yMTwvY29tbW9ucy1jb21wcmVzcy12ZXJzaW9uPgotICAgIDxvc2dpLWNvcmUtdmVyc2lvbj40LjMuMTwvb3NnaS1jb3JlLXZlcnNpb24+Ci0gICAgPHNlcnZsZXQtYXBpLXZlcnNpb24+My4xLjA8L3NlcnZsZXQtYXBpLXZlcnNpb24+CisgICAgPG9zZ2ktY29yZS12ZXJzaW9uPjYuMC4wPC9vc2dpLWNvcmUtdmVyc2lvbj4KKyAgICA8c2VydmxldC1hcGktdmVyc2lvbj40LjAuMDwvc2VydmxldC1hcGktdmVyc2lvbj4KICAgICA8amV0dHktdmVyc2lvbj4xMC4wLjY8L2pldHR5LXZlcnNpb24+CiAgICAgPGphcGljbXAtdmVyc2lvbj4wLjE1LjM8L2phcGljbXAtdmVyc2lvbj4KICAgICA8aHR0cGNsaWVudC12ZXJzaW9uPjQuNS4xMzwvaHR0cGNsaWVudC12ZXJzaW9uPgogICAgIDxodHRwY29yZS12ZXJzaW9uPjQuNC4xNDwvaHR0cGNvcmUtdmVyc2lvbj4KICAgICA8c2xmNGotdmVyc2lvbj4xLjcuMzA8L3NsZjRqLXZlcnNpb24+Ci0gICAgPGxvZzRqLXZlcnNpb24+MS4yLjE1PC9sb2c0ai12ZXJzaW9uPgogICAgIDxtYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPjMuMy4xPC9tYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPgotICAgIDx0eWNoby1leHRyYXMtdmVyc2lvbj4yLjUuMDwvdHljaG8tZXh0cmFzLXZlcnNpb24+Ci0gICAgPGdzb24tdmVyc2lvbj4yLjguODwvZ3Nvbi12ZXJzaW9uPgotICAgIDxib3VuY3ljYXN0bGUtdmVyc2lvbj4xLjY5PC9ib3VuY3ljYXN0bGUtdmVyc2lvbj4KKyAgICA8dHljaG8tZXh0cmFzLXZlcnNpb24+Mi42LjA8L3R5Y2hvLWV4dHJhcy12ZXJzaW9uPgorICAgIDxnc29uLXZlcnNpb24+Mi44Ljk8L2dzb24tdmVyc2lvbj4KKyAgICA8Ym91bmN5Y2FzdGxlLXZlcnNpb24+MS43MDwvYm91bmN5Y2FzdGxlLXZlcnNpb24+CiAgICAgPHNwb3RidWdzLW1hdmVuLXBsdWdpbi12ZXJzaW9uPjQuMy4wPC9zcG90YnVncy1tYXZlbi1wbHVnaW4tdmVyc2lvbj4KICAgICA8bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luLXZlcnNpb24+My4xLjI8L21hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbi12ZXJzaW9uPgogICAgIDxtYXZlbi1qeHItcGx1Z2luLXZlcnNpb24+My4xLjE8L21hdmVuLWp4ci1wbHVnaW4tdmVyc2lvbj4KQEAgLTIwNCw2ICsyMDMsMTQgQEAKICAgICAgIDxpZD5yZXBvLmVjbGlwc2Uub3JnLmNiaS1zbmFwc2hvdHM8L2lkPgogICAgICAgPHVybD5odHRwczovL3JlcG8uZWNsaXBzZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvY2JpLXNuYXBzaG90cy88L3VybD4KICAgICA8L3BsdWdpblJlcG9zaXRvcnk+CisgICAgPHBsdWdpblJlcG9zaXRvcnk+CisgICAgICA8aWQ+cmVwby5lY2xpcHNlLm9yZy5kYXNoLXJlbGVhc2VzPC9pZD4KKyAgICAgIDx1cmw+aHR0cHM6Ly9yZXBvLmVjbGlwc2Uub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL2Rhc2gtbGljZW5zZXMtcmVsZWFzZXMvPC91cmw+CisgICAgPC9wbHVnaW5SZXBvc2l0b3J5PgorICAgIDxwbHVnaW5SZXBvc2l0b3J5PgorICAgICAgPGlkPnJlcG8uZWNsaXBzZS5vcmcuZGFzaC1zbmFwc2hvdHM8L2lkPgorICAgICAgPHVybD5odHRwczovL3JlcG8uZWNsaXBzZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvZGFzaC1saWNlbnNlcy1zbmFwc2hvdHMvPC91cmw+CisgICAgPC9wbHVnaW5SZXBvc2l0b3J5PgogICA8L3BsdWdpblJlcG9zaXRvcmllcz4KIAogICA8YnVpbGQ+CkBAIC0zMzksNyArMzQ2LDcgQEAKICAgICAgICAgICAgIDxkZXBlbmRlbmN5PjwhLS0gYWRkIHN1cHBvcnQgZm9yIHNzaC9zY3AgLS0+CiAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb248L2dyb3VwSWQ+CiAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLXNzaDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPHZlcnNpb24+My40LjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuNS4xPC92ZXJzaW9uPgogICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgogICAgICAgICA8L3BsdWdpbj4KQEAgLTM4Myw2ICszOTAsMTEgQEAKICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgPHZlcnNpb24+Mi41LjQ8L3ZlcnNpb24+CiAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmRhc2g8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bGljZW5zZS10b29sLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4wLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9wbHVnaW4+CiAgICAgICA8L3BsdWdpbnM+CiAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgogCkBAIC01NDEsNiArNTUzLDEwIEBACiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuZGFzaDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bGljZW5zZS10b29sLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KICAgPC9idWlsZD4KIApAQCAtNzIyLDM1ICs3MzgsMTEgQEAKIAogICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotc2ltcGxlPC9hcnRpZmFjdElkPgogICAgICAgICA8dmVyc2lvbj4ke3NsZjRqLXZlcnNpb259PC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke2xvZzRqLXZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgubWFpbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1haWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LmptczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmptczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZG1rPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+am14dG9vbHM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uam14PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+am14cmk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5nc29uPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5nc29uPC9hcnRpZmFjdElkPgogICAgICAgICA8dmVyc2lvbj4ke2dzb24tdmVyc2lvbn08L3ZlcnNpb24+CkBAIC04NzgsNyArODcwLDcgQEAKICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamR0PC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVjajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjI3LjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4yOC4wPC92ZXJzaW9uPgogICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KICAgICAgICAgICA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL0JVSUxEIGIvdG9vbHMvQlVJTEQKaW5kZXggMGM2YjhlYy4uYTEwOTAxOSAxMDA2NDQKLS0tIGEvdG9vbHMvQlVJTEQKKysrIGIvdG9vbHMvQlVJTEQKQEAgLTEsMzQgKzEsMjggQEAKIGxvYWQoCiAgICAgIkBiYXplbF90b29scy8vdG9vbHMvamRrOmRlZmF1bHRfamF2YV90b29sY2hhaW4uYnpsIiwKLSAgICAiSkRLOV9KVk1fT1BUUyIsCiAgICAgImRlZmF1bHRfamF2YV90b29sY2hhaW4iLAogKQogbG9hZCgiQHJ1bGVzX2phdmEvL2phdmE6ZGVmcy5iemwiLCAiamF2YV9wYWNrYWdlX2NvbmZpZ3VyYXRpb24iKQogCi1KREsxMV9KVk1fT1BUUyA9IFsKLSAgICAiLS1hZGQtZXhwb3J0cz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5hcGk9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmNvZGU9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmNvbXA9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmZpbGU9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLm1haW49QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLnRyZWU9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLnV0aWw9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1vcGVucz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5maWxlPUFMTC1VTk5BTUVEIiwKLSAgICAiLS1wYXRjaC1tb2R1bGU9amF2YS5jb21waWxlcj0kKGxvY2F0aW9uIEBiYXplbF90b29scy8vdG9vbHMvamRrOmphdmFfY29tcGlsZXJfamFyKSIsCi0gICAgIi0tcGF0Y2gtbW9kdWxlPWpkay5jb21waWxlcj0kKGxvY2F0aW9uIEBiYXplbF90b29scy8vdG9vbHMvamRrOmpka19jb21waWxlcl9qYXIpIiwKLSAgICAiLS1hZGQtb3BlbnM9amF2YS5iYXNlL2phdmEubmlvPUFMTC1VTk5BTUVEIiwKLSAgICAiLS1hZGQtb3BlbnM9amF2YS5iYXNlL2phdmEubGFuZz1BTEwtVU5OQU1FRCIsCi1dCi0KIGRlZmF1bHRfamF2YV90b29sY2hhaW4oCi0gICAgbmFtZSA9ICJlcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW4iLAotICAgIGJvb3RjbGFzc3BhdGggPSBbIkBiYXplbF90b29scy8vdG9vbHMvamRrOnBsYXRmb3JtY2xhc3NwYXRoLmphciJdLAotICAgIGp2bV9vcHRzID0gSkRLMTFfSlZNX09QVFMsCi0gICAgc291cmNlX3ZlcnNpb24gPSAiMTEiLAotICAgIHRhcmdldF92ZXJzaW9uID0gIjExIiwKKyAgICBuYW1lID0gImVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTEiLAogICAgIHBhY2thZ2VfY29uZmlndXJhdGlvbiA9IFsKICAgICAgICAgIjplcnJvcl9wcm9uZSIsCiAgICAgXSwKKyAgICBzb3VyY2VfdmVyc2lvbiA9ICIxMSIsCisgICAgdGFyZ2V0X3ZlcnNpb24gPSAiMTEiLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKykKKworZGVmYXVsdF9qYXZhX3Rvb2xjaGFpbigKKyAgICBuYW1lID0gImVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTciLAorICAgIGNvbmZpZ3VyYXRpb24gPSBkaWN0KCksCisgICAgamF2YV9ydW50aW1lID0gIkBiYXplbF90b29scy8vdG9vbHMvamRrOnJlbW90ZWpka18xNyIsCisgICAgcGFja2FnZV9jb25maWd1cmF0aW9uID0gWworICAgICAgICAiOmVycm9yX3Byb25lIiwKKyAgICBdLAorICAgIHNvdXJjZV92ZXJzaW9uID0gIjE3IiwKKyAgICB0YXJnZXRfdmVyc2lvbiA9ICIxNyIsCiAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogKQogCkBAIC0xMDgsMjAgKzEwMiwyNSBAQAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0Ly4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuYW50Ly4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLy4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC8uLi4iLAotICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvLi4uIiwKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5qdW5pdC8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L2h0dHAvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLy4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMvLi4uIiwKLSAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS8uLi4iLAotICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvLi4uIiwKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC51aS8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Ly4uLiIsCmRpZmYgLS1naXQgYS90b29scy9iYXplbGlza192ZXJzaW9uLmJ6bCBiL3Rvb2xzL2JhemVsaXNrX3ZlcnNpb24uYnpsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIzZDEwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2JhemVsaXNrX3ZlcnNpb24uYnpsCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotX3RlbXBsYXRlID0gIiIiCi1sb2FkKCJAYmF6ZWxfc2t5bGliLy9saWI6dmVyc2lvbnMuYnpsIiwgInZlcnNpb25zIikKLQotZGVmIGNoZWNrX2JhemVsX3ZlcnNpb24oKToKLSAgdmVyc2lvbnMuY2hlY2sobWluaW11bV9iYXplbF92ZXJzaW9uID0gInt2ZXJzaW9ufSIpCi0iIiIuc3RyaXAoKQotCi1kZWYgX2ltcGwocmVwb3NpdG9yeV9jdHgpOgotICAgIHJlcG9zaXRvcnlfY3R4LnN5bWxpbmsoTGFiZWwoIkAvLzouYmF6ZWx2ZXJzaW9uIiksICIuYmF6ZWx2ZXJzaW9uIikKLSAgICBiYXplbHZlcnNpb24gPSByZXBvc2l0b3J5X2N0eC5yZWFkKCIuYmF6ZWx2ZXJzaW9uIikuc3RyaXAoKQotCi0gICAgcmVwb3NpdG9yeV9jdHguZmlsZSgiQlVJTEQiLCBleGVjdXRhYmxlID0gRmFsc2UpCi0KLSAgICByZXBvc2l0b3J5X2N0eC5maWxlKCJjaGVjay5iemwiLCBleGVjdXRhYmxlID0gRmFsc2UsIGNvbnRlbnQgPSBfdGVtcGxhdGUuZm9ybWF0KHZlcnNpb24gPSBiYXplbHZlcnNpb24pKQotCi1iYXplbGlza192ZXJzaW9uID0gcmVwb3NpdG9yeV9ydWxlKGltcGxlbWVudGF0aW9uID0gX2ltcGwpCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGUtYmF6ZWxyYyBiL3Rvb2xzL3JlbW90ZS1iYXplbHJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Zjc5NGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZW1vdGUtYmF6ZWxyYwpAQCAtMCwwICsxLDY3IEBACisjIENvcHlyaWdodCAyMDIyIFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGZyb20gcmVsZWFzZS9iYXplbHJjLnRwbCBhbmQgc2hvdWxkIG5vdCBiZQorIyBtb2RpZmllZCBkaXJlY3RseS4KKworIyBUaGlzIC5iYXplbHJjIGZpbGUgY29udGFpbnMgYWxsIG9mIHRoZSBmbGFncyByZXF1aXJlZCBmb3IgdGhlIHByb3ZpZGVkCisjIHRvb2xjaGFpbiB3aXRoIFJlbW90ZSBCdWlsZCBFeGVjdXRpb24uCisjCisjIFRoaXMgLmJhemVscmMgZmlsZSBhbHNvIGNvbnRhaW5zIGFsbCBvZiB0aGUgZmxhZ3MgcmVxdWlyZWQgZm9yIHRoZSBsb2NhbAorIyBkb2NrZXIgc2FuZGJveGluZy4KKworIyBEZXBlbmRpbmcgb24gaG93IG1hbnkgbWFjaGluZXMgYXJlIGluIHRoZSByZW1vdGUgZXhlY3V0aW9uIGluc3RhbmNlLCBzZXR0aW5nCisjIHRoaXMgaGlnaGVyIGNhbiBtYWtlIGJ1aWxkcyBmYXN0ZXIgYnkgYWxsb3dpbmcgbW9yZSBqb2JzIHRvIHJ1biBpbiBwYXJhbGxlbC4KKyMgU2V0dGluZyBpdCB0b28gaGlnaCBjYW4gcmVzdWx0IGluIGpvYnMgdGhhdCB0aW1lb3V0LCBob3dldmVyLCB3aGlsZSB3YWl0aW5nCisjIGZvciBhIHJlbW90ZSBtYWNoaW5lIHRvIGV4ZWN1dGUgdGhlbS4KK2J1aWxkOnJlbW90ZSAtLWpvYnM9MjAwCitidWlsZDpyZW1vdGUgLS1kaXNrX2NhY2hlPQorCisjIFNldCBzZXZlcmFsIGZsYWdzIHJlbGF0ZWQgdG8gc3BlY2lmeWluZyB0aGUgcGxhdGZvcm0sIHRvb2xjaGFpbiBhbmQgamF2YQorIyBwcm9wZXJ0aWVzLgorYnVpbGQ6cmVtb3RlIC0taG9zdF9qYXZhYmFzZT1AcmJlX2pkazExLy9qYXZhOmpkaworYnVpbGQ6cmVtb3RlIC0tamF2YWJhc2U9QHJiZV9qZGsxMS8vamF2YTpqZGsKK2J1aWxkOnJlbW90ZSAtLWNyb3NzdG9vbF90b3A9QHJiZV9qZGsxMS8vY2M6dG9vbGNoYWluCitidWlsZDpyZW1vdGUgLS1leHRyYV90b29sY2hhaW5zPUByYmVfamRrMTEvL2NvbmZpZzpjYy10b29sY2hhaW4KK2J1aWxkOnJlbW90ZSAtLWV4dHJhX2V4ZWN1dGlvbl9wbGF0Zm9ybXM9QHJiZV9qZGsxMS8vY29uZmlnOnBsYXRmb3JtCitidWlsZDpyZW1vdGUgLS1ob3N0X3BsYXRmb3JtPUByYmVfamRrMTEvL2NvbmZpZzpwbGF0Zm9ybQorYnVpbGQ6cmVtb3RlIC0tcGxhdGZvcm1zPUByYmVfamRrMTEvL2NvbmZpZzpwbGF0Zm9ybQorYnVpbGQ6cmVtb3RlIC0tYWN0aW9uX2Vudj1CQVpFTF9ET19OT1RfREVURUNUX0NQUF9UT09MQ0hBSU49MQorCisjIFNldCB2YXJpb3VzIHN0cmF0ZWdpZXMgc28gdGhhdCBhbGwgYWN0aW9ucyBleGVjdXRlIHJlbW90ZWx5LiBNaXhpbmcgcmVtb3RlCisjIGFuZCBsb2NhbCBleGVjdXRpb24gd2lsbCBsZWFkIHRvIGVycm9ycyB1bmxlc3MgdGhlIHRvb2xjaGFpbiBhbmQgcmVtb3RlCisjIG1hY2hpbmUgZXhhY3RseSBtYXRjaCB0aGUgaG9zdCBtYWNoaW5lLgorYnVpbGQ6cmVtb3RlIC0tZGVmaW5lPUVYRUNVVE9SPXJlbW90ZQorCisjIEVuYWJsZSB0aGUgcmVtb3RlIGNhY2hlIHNvIGFjdGlvbiByZXN1bHRzIGNhbiBiZSBzaGFyZWQgYWNyb3NzIG1hY2hpbmVzLAorIyBkZXZlbG9wZXJzLCBhbmQgd29ya3NwYWNlcy4KK2J1aWxkOnJlbW90ZSAtLXJlbW90ZV9jYWNoZT1yZW1vdGVidWlsZGV4ZWN1dGlvbi5nb29nbGVhcGlzLmNvbQorCisjIEVuYWJsZSByZW1vdGUgZXhlY3V0aW9uIHNvIGFjdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgcmVtb3RlIHN5c3RlbXMuCitidWlsZDpyZW1vdGUgLS1yZW1vdGVfZXhlY3V0b3I9cmVtb3RlYnVpbGRleGVjdXRpb24uZ29vZ2xlYXBpcy5jb20KKworIyBTZXQgYSBoaWdoZXIgdGltZW91dCB2YWx1ZSwganVzdCBpbiBjYXNlLgorYnVpbGQ6cmVtb3RlIC0tcmVtb3RlX3RpbWVvdXQ9MzYwMAorCisjIEVuYWJsZSBhdXRoZW50aWNhdGlvbi4gVGhpcyB3aWxsIHBpY2sgdXAgYXBwbGljYXRpb24gZGVmYXVsdCBjcmVkZW50aWFscyBieQorIyBkZWZhdWx0LiBZb3UgY2FuIHVzZSAtLWF1dGhfY3JlZGVudGlhbHM9c29tZV9maWxlLmpzb24gdG8gdXNlIGEgc2VydmljZQorIyBhY2NvdW50IGNyZWRlbnRpYWwgaW5zdGVhZC4KK2J1aWxkOnJlbW90ZSAtLWdvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzCisKKyMgVGhlIGZvbGxvd2luZyBmbGFncyBlbmFibGUgdGhlIHJlbW90ZSBjYWNoZSBzbyBhY3Rpb24gcmVzdWx0cyBjYW4gYmUgc2hhcmVkCisjIGFjcm9zcyBtYWNoaW5lcywgZGV2ZWxvcGVycywgYW5kIHdvcmtzcGFjZXMuCitidWlsZDpyZW1vdGUtY2FjaGUgLS1yZW1vdGVfY2FjaGU9cmVtb3RlYnVpbGRleGVjdXRpb24uZ29vZ2xlYXBpcy5jb20KK2J1aWxkOnJlbW90ZS1jYWNoZSAtLXRsc19lbmFibGVkPXRydWUKK2J1aWxkOnJlbW90ZS1jYWNoZSAtLXJlbW90ZV90aW1lb3V0PTM2MDAKK2J1aWxkOnJlbW90ZS1jYWNoZSAtLWF1dGhfZW5hYmxlZD10cnVlCg==