ZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uY2xhc3NwYXRoIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTliYWYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRlc3QgcGx1Z2luIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgb3V0cHV0PSJ0ZXN0X3N1cHBvcnRfYmluIiBraW5kPSJzcmMiIHBhdGg9InRlc3Qgc3VwcG9ydCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLmN2c2lnbm9yZSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ4NDk1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWxpYgotdGVzdF9zdXBwb3J0X2JpbgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5leHRlcm5hbFRvb2xCdWlsZGVycy9BbnQgVGVzdCBTdXBwb3J0IExpYiBCdWlsZGVyLmxhdW5jaCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQW50IFRlc3QgU3VwcG9ydCBMaWIgQnVpbGRlci5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNGIwZDQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5leHRlcm5hbFRvb2xCdWlsZGVycy9BbnQgVGVzdCBTdXBwb3J0IExpYiBCdWlsZGVyLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuREVGQVVMVF9DTEFTU1BBVEgiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwmcXVvdDsgdHlwZT0mcXVvdDsxJnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0bywiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlJnF1b3Q7IHR5cGU9JnF1b3Q7NCZxdW90Oy8mZ3Q7JiMxMDsmbHQ7L2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0Jmd0OyYjMTA7fSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWx9Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfUlVOX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDM1MTAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgotCQkJCQk8dmFsdWU+QW50IFRlc3QgU3VwcG9ydCBMaWIgQnVpbGRlci5sYXVuY2g8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMWEzNzQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBNYXkgMjcgMTQ6NDg6NDMgUERUIDIwMDQNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLXNlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0X3N1cHBvcnRfYmluDQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3YjQzMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4xNnRoIE9jdG9iZXIsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODA0YzMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0JCQkgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RidWlsZGZpbGVzLyxcCi0gICAgICAgICAgICAgICB0ZXN0cmVzb3VyY2VzLyxcCi0gICAgICAgICAgICAgICB0ZXN0bGliLyxcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIGxpYi8qLmphcixcCi0gICAgICAgICAgICAgICAqLmphcgotICAgICAgICAgICAgICAgCi1zb3VyY2UuYW50dGVzdHNjb3JlLmphciA9IHRlc3QgcGx1Z2luLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGZpbGVzLwotc291cmNlLmxpYi9hbnRUZXN0c1N1cHBvcnQuamFyID0gdGVzdCBzdXBwb3J0LwotamFycy5jb21waWxlLm9yZGVyPWFudHRlc3RzY29yZS5qYXIsbGliL2FudFRlc3RzU3VwcG9ydC5qYXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2MjYyOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iYnVpbGQgdGVzdHMgc3VwcG9ydCBqYXIiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLiI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iYm9vdGNsYXNzcGF0aCIgdmFsdWU9IiIvPgotCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVzY3JpcHRpb249IlJlbW92ZXMgYWxsIGJ1aWxkIGFydGlmYWN0cywgcmVjcmVhdGVzIHRoZSBzdXBwb3J0IGphciwgYW5kIHJlZnJlc2hlcyB0aGlzIHBsdWdpbidzIHJlc291cmNlcyIgZGVwZW5kcz0iY2xlYW4sIGxpYi9hbnRUZXN0c1N1cHBvcnQuamFyIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCQk8cHJvcGVydHkgbmFtZT0idmVyc2lvbi5zdWZmaXgiIHZhbHVlPSJfMy4wLjAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImFudF92ZXJzaW9uLnN1ZmZpeCIgdmFsdWU9Il8xLjYuMSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImxpYi9hbnRUZXN0c1N1cHBvcnQuamFyIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0gIkJ1aWxkcyB0aGUgc3VwcG9ydCBKQVIiPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudFRlc3RzU3VwcG9ydC5qYXIuYmluIi8+Ci0JCTxta2RpciBkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyLmJpbiIvPgotCQk8IS0tIGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlIC0tPgotCQk8amF2YWMgdGFyZ2V0PSIxLjEiIGRlc3RkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyLmJpbiIgZmFpbG9uZXJyb3I9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9Im9uIiBpbmNsdWRlQW50UnVudGltZT0ieWVzIiBib290Y2xhc3NwYXRoPSIke2Jvb3RjbGFzc3BhdGh9IiAKLQkJCWNsYXNzcGF0aD0iJHtiYXNlZGlyfS8uLi9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvYmluOwotCQkJJHtlY2xpcHNlLmhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lJHt2ZXJzaW9uLnN1ZmZpeH0vcnVudGltZS5qYXI7Ci0JCQkke2Jhc2VkaXJ9L2JpbjsKLQkJCSR7ZWNsaXBzZS5ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5jb3JlJHt2ZXJzaW9uLnN1ZmZpeH0vYW50c3VwcG9ydC5qYXI7Ci0JCQkke2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLmFudC5jb3JlL2JpbiI+Ci0JCQk8c3JjIHBhdGg9InRlc3Qgc3VwcG9ydC8iLz4KLQkJPC9qYXZhYz4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIiLz4KLQkJPGphciBqYXJmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50VGVzdHNTdXBwb3J0Lmphci5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGRlbGV0ZSBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2xpYi8uY3ZzaWdub3JlIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQwYjYwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9saWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFudFRlc3RzU3VwcG9ydC5qYXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxNTI5NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUFudCBDb3JlIFRlc3QgUGx1Z2luCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYWI3NDcuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0UGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJhbnR0ZXN0c2NvcmUuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5leHRyYUNsYXNzcGF0aEVudHJpZXMiPgotICAgICAgPGV4dHJhQ2xhc3NwYXRoRW50cnkKLSAgICAgICAgICAgIGxpYnJhcnk9ImxpYi9hbnRUZXN0c1N1cHBvcnQuamFyIj4KLSAgICAgIDwvZXh0cmFDbGFzc3BhdGhFbnRyeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUYXNrcyI+Ci0JICAgIDxhbnRUYXNrIAotCSAgICAJbmFtZT0iY29vbFRhc2siIAotCSAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3MuQW50VGVzdFRhc2siCi0JICAgIAlsaWJyYXJ5PSJsaWIvYW50VGVzdHNTdXBwb3J0LmphciIKLQkgICAgCWhlYWRsZXNzPSJmYWxzZSI+Ci0JICAgIDwvYW50VGFzaz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50VHlwZXMiPgotCSAgICA8YW50VHlwZSAKLQkgICAgCW5hbWU9ImNvb2xUeXBlIiAKLQkgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnR5cGVzLkFudFRlc3RQYXRoIgotCSAgICAJbGlicmFyeT0ibGliL2FudFRlc3RzU3VwcG9ydC5qYXIiCi0JICAgIAloZWFkbGVzcz0iZmFsc2UiPgotCSAgICA8L2FudFR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFByb3BlcnRpZXMiPgotICAgICAgPGFudFByb3BlcnR5Ci0gICAgICAgICAgICBuYW1lPSJwcm9wZXJ0eS50ZXN0aW5nIgotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9hbnRQcm9wZXJ0eT4KLSAgICAgICA8YW50UHJvcGVydHkKLSAgICAgICAgICAgIG5hbWU9InByb3BlcnR5LnRlc3RpbmcyIgotICAgICAgICAgICAgdmFsdWU9ImhleSIKLSAgICAgICAgICAgIGNsYXNzPSAib3JnLmVjbGlwc2UuZG9lcy5ub3QuZXhpc3QiPgotICAgICAgPC9hbnRQcm9wZXJ0eT4KLSAgICAgIDxhbnRQcm9wZXJ0eQotICAgICAgICAgICAgbmFtZT0icHJvcGVydHkudGVzdGluZzMiCi0gICAgICAgICAgICBjbGFzcz0gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdFByb3BlcnR5VmFsdWVQcm92aWRlciI+Ci0gICAgICA8L2FudFByb3BlcnR5PgotICAgICAgIDxhbnRQcm9wZXJ0eQotICAgICAgICAgICAgbmFtZT0icHJvcGVydHkuaGVhZGxlc3MiCi0gICAgICAgICAgICB2YWx1ZT0iaGVhZGxlc3MiCi0gICAgICAgICAgICBoZWFkbGVzcz0gImZhbHNlIj4KLSAgICAgIDwvYW50UHJvcGVydHk+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRGaWxlUnVubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRGaWxlUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTgyMTYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50RmlsZVJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBydW5uaW5nIHRlc3QgYW50IGJ1aWxkIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgQW50RmlsZVJ1bm5lciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRElSX1BSRUZJWCA9ICItRGJhc2VkaXI9IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgcnVuKElGaWxlIGJ1aWxkRmlsZSwgU3RyaW5nW10gdGFyZ2V0cywgU3RyaW5nW10gYXJncywgU3RyaW5nIGJhc2VEaXIsIGJvb2xlYW4gY2FwdHVyZU91dHB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOwotCi0JCVN0cmluZ1tdIHJ1bm5lckFyZ3MgPSBhcmdzOwotCi0JCWlmIChiYXNlRGlyLmxlbmd0aCgpID4gMCkgewotCQkJLy8gQW50IHJlcXVpcmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSBzcGVjaWZpZWQKLQkJCS8vIGFzIG9uZSBvZiB0aGUgYXJndW1lbnRzLCBzbyBpdCBuZWVkcyB0byBiZSBhcHBlbmRlZC4KLQkJCWludCBsZW5ndGggPSAxOwotCQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoICsgMTsKLQkJCX0gCi0JCQkKLQkJCXJ1bm5lckFyZ3MgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0JCQlpZiAoYXJncyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7Ci0JCQl9Ci0JCQlydW5uZXJBcmdzW2xlbmd0aCAtIDFdID0gQkFTRV9ESVJfUFJFRklYICsgYmFzZURpcjsKLQkJfQotCQlydW5uZXIuc2V0QXJndW1lbnRzKHJ1bm5lckFyZ3MpOwotCi0JCWlmIChidWlsZEZpbGUgIT0gbnVsbCkgewotCQkJcnVubmVyLnNldEJ1aWxkRmlsZUxvY2F0aW9uKGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWlmICh0YXJnZXRzICE9IG51bGwgJiYgdGFyZ2V0cy5sZW5ndGggPiAwKSB7Ci0JCQlydW5uZXIuc2V0RXhlY3V0aW9uVGFyZ2V0cyh0YXJnZXRzKTsKLQkJfQotCQlpZiAoY2FwdHVyZU91dHB1dCkgewotCQkJcnVubmVyLmFkZEJ1aWxkTG9nZ2VyKEFic3RyYWN0QW50VGVzdC5BTlRfVEVTVF9CVUlMRF9MT0dHRVIpOwotCQl9Ci0KLQkJcnVubmVyLnJ1bihudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3MsIFN0cmluZyBiYXNlRGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJQW50UnVubmVyIHJ1bm5lciA9IG5ldyBBbnRSdW5uZXIoKTsKLQotCQlTdHJpbmdbXSBydW5uZXJBcmdzID0gYXJnczsKLQotCQlpZiAoYmFzZURpci5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIEFudCByZXF1aXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gYmUgc3BlY2lmaWVkCi0JCQkvLyBhcyBvbmUgb2YgdGhlIGFyZ3VtZW50cywgc28gaXQgbmVlZHMgdG8gYmUgYXBwZW5kZWQuCi0JCQlydW5uZXJBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7Ci0JCQlydW5uZXJBcmdzW2FyZ3MubGVuZ3RoXSA9IEJBU0VfRElSX1BSRUZJWCArIGJhc2VEaXI7Ci0JCX0KLQkJcnVubmVyLnNldEFyZ3VtZW50cyhydW5uZXJBcmdzKTsKLQotCQlydW5uZXIucnVuKGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RDaGVja2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2M1ODE2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0Q2hlY2tlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQW50VGVzdENoZWNrZXIgZGVmbHQ9IG51bGw7Ci0JCi0JcHJpdmF0ZSBpbnQgdGFza1N0YXJ0ZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCB0YXNrRmluaXNoZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCB0YXJnZXRzU3RhcnRlZENvdW50OwotCQotCXByaXZhdGUgaW50IHRhcmdldHNGaW5pc2hlZENvdW50OwotCQotCXByaXZhdGUgaW50IGJ1aWxkc1N0YXJ0ZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCBidWlsZHNGaW5pc2hlZENvdW50OwotCQotCXByaXZhdGUgTGlzdCBtZXNzYWdlcz0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgTGlzdCB0YXJnZXRzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0IHRhc2tzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0IHByb2plY3RzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBIYXNodGFibGUgdXNlclByb3BlcnRpZXM7Ci0JCi0JcHJpdmF0ZSBMaXN0IG5hbWVPZkxpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgQW50VGVzdENoZWNrZXIoKSAgewotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gQW50VGVzdENoZWNrZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFudFRlc3RDaGVja2VyIGdldERlZmF1bHQoKSB7Ci0JCWlmIChkZWZsdCA9PSBudWxsKSB7Ci0JCQlkZWZsdD0gbmV3IEFudFRlc3RDaGVja2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXNldHMgdGhlIHNpbmdsZXRvbiBBbnRUZXN0Q2hlY2tlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKLQkJaWYgKGRlZmx0ICE9IG51bGwpIHsKLQkJCWRlZmx0LnJlc2V0U3RhdGUoKTsKLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoKSB7Ci0JCWJ1aWxkc0ZpbmlzaGVkQ291bnQrKzsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCWJ1aWxkc1N0YXJ0ZWRDb3VudCsrOwotCQlwcm9qZWN0cy5hZGQocHJvamVjdE5hbWUpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKCkgewotCQl0YXJnZXRzRmluaXNoZWRDb3VudCsrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQl0YXJnZXRzU3RhcnRlZENvdW50Kys7Ci0JCXRhcmdldHMuYWRkKHRhcmdldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoKSB7Ci0JCXRhc2tGaW5pc2hlZENvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCXRhc2tTdGFydGVkQ291bnQrKzsKLQkJdGFza3MuYWRkKHRhc2tOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGRzRmluaXNoZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QnVpbGRzRmluaXNoZWRDb3VudCgpIHsKLQkJcmV0dXJuIGJ1aWxkc0ZpbmlzaGVkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGRzU3RhcnRlZENvdW50LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRCdWlsZHNTdGFydGVkQ291bnQoKSB7Ci0JCXJldHVybiBidWlsZHNTdGFydGVkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZXNMb2dnZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXRzRmluaXNoZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFyZ2V0c0ZpbmlzaGVkQ291bnQoKSB7Ci0JCXJldHVybiB0YXJnZXRzRmluaXNoZWRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXRzU3RhcnRlZENvdW50LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUYXJnZXRzU3RhcnRlZENvdW50KCkgewotCQlyZXR1cm4gdGFyZ2V0c1N0YXJ0ZWRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrRmluaXNoZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFza0ZpbmlzaGVkQ291bnQoKSB7Ci0JCXJldHVybiB0YXNrRmluaXNoZWRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrU3RhcnRlZENvdW50LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUYXNrU3RhcnRlZENvdW50KCkgewotCQlyZXR1cm4gdGFza1N0YXJ0ZWRDb3VudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRTdGF0ZSgpIHsKLQkJdGFza1N0YXJ0ZWRDb3VudD0gMDsKLQkJdGFza0ZpbmlzaGVkQ291bnQ9IDA7Ci0JCXRhcmdldHNTdGFydGVkQ291bnQ9IDA7Ci0JCXRhcmdldHNGaW5pc2hlZENvdW50PSAwOwotCQlidWlsZHNTdGFydGVkQ291bnQ9IDA7Ci0JCWJ1aWxkc0ZpbmlzaGVkQ291bnQ9IDA7Ci0JCW1lc3NhZ2VzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRhc2tzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRhcmdldHM9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHJvamVjdHM9IG5ldyBBcnJheUxpc3QoKTsKLQkJdXNlclByb3BlcnRpZXM9IG51bGw7Ci0JCW5hbWVPZkxpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQkvKioKLSAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgbiBmcm9tIHRoZSBsYXN0OgotICAgICAqIGUuZy4gZ2V0TG9nZ2VkTWVzc2FnZSgwKSByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBtZXNzYWdlCi0gICAgICogCi0JICogQHBhcmFtIG4gbWVzc2FnZSBpbmRleAotCSAqIEByZXR1cm4gdGhlIG50aCBsYXN0IG1lc3NhZ2UKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvZ2dlZE1lc3NhZ2UoaW50IG4pIHsKLSAgICAgICAgbiA9IG1lc3NhZ2VzLnNpemUoKSAtIChuICsgMSk7Ci0gICAgICAgIGlmICgobiA8IDApIHx8IChuID49IG1lc3NhZ2VzLnNpemUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBtZXNzYWdlcy5nZXQobik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldExvZ2dlZE1lc3NhZ2UoMCk7Ci0gICAgfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZXJQcm9wZXJ0aWVzKEhhc2h0YWJsZSB1c2VyUHJvcGVydGllcykgewotCQl0aGlzLnVzZXJQcm9wZXJ0aWVzPSB1c2VyUHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKFN0cmluZyl1c2VyUHJvcGVydGllcy5nZXQobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5hbWVPZkxpc3RlbmVyczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYXN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiAoU3RyaW5nKW5hbWVPZkxpc3RlbmVycy5nZXQobmFtZU9mTGlzdGVuZXJzLnNpemUoKSAtIDEpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkTmFtZU9mTGlzdGVuZXIoU3RyaW5nIG5hbWVPZkxpc3RlbmVyKSB7Ci0JCXRoaXMubmFtZU9mTGlzdGVuZXJzLmFkZChuYW1lT2ZMaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50VGVzdFBsdWdpbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50VGVzdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjJhYTcyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQW50VGVzdFBsdWdpbiBkZWZsdDsKLQkKLQlwdWJsaWMgQW50VGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJZGVmbHQ9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQW50VGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmbHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVBdXRvYnVpbGQoYm9vbGVhbiBlbmFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZGlzYWJsZSBhdXRvIGJ1aWxkCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlPSBBbnRUZXN0UGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzYz0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGVuYWJsZSk7Ci0JCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0RmlsZUluUGx1Z2luKElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0JCQlVUkwgaW5zdGFsbFVSTD0gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsKLQkJCVVSTCBsb2NhbFVSTD0gUGxhdGZvcm0uYXNMb2NhbFVSTChpbnN0YWxsVVJMKTsKLQkJCXJldHVybiBuZXcgRmlsZShsb2NhbFVSTC5nZXRGaWxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5YWM4OC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0UHJvcGVydHlWYWx1ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQW50VGVzdFByb3BlcnR5VmFsdWVQcm92aWRlciBpbXBsZW1lbnRzIElBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudFByb3BlcnR5VmFsdWVQcm92aWRlciNnZXRBbnRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbnRQcm9wZXJ0eVZhbHVlKFN0cmluZyBhbnRQcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJBbnRUZXN0UHJvcGVydHlWYWx1ZVByb3ZpZGVyIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL1Byb2plY3RIZWxwZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL1Byb2plY3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjYmJlZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9Qcm9qZWN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci4qOwotCi0vKioKLSAqIEhlbHBlciBtZXRob2RzIHRvIHNldCB1cCBhbiBJUHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RIZWxwZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9CVUlMREZJTEVTX0RJUj0gbmV3IFBhdGgoInRlc3RidWlsZGZpbGVzIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUX1JFU09VUkNFU19ESVI9IG5ldyBQYXRoKCJ0ZXN0cmVzb3VyY2VzIik7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9MSUJfRElSPSBuZXcgUGF0aCgidGVzdGxpYiIpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBJUHJvamVjdC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlUm9vdCByb290PSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUHJvamVjdCBwcm9qZWN0PSByb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQl9IGVsc2UgewotCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJfQotCQkKLQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFuIElQcm9qZWN0LgotCSAqLwkJCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogQWRkcyBhIGZvbGRlciB0byBhbiBJUHJvamVjdC4KLQkgKi8JCQotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBhZGRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbnRhaW5lck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCQlJRm9sZGVyIGZvbGRlcj0gcHJvamVjdC5nZXRGb2xkZXIoY29udGFpbmVyTmFtZSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQkJfQotCQkKLQkJcmV0dXJuIGZvbGRlcjsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbXBvcnRGaWxlc0Zyb21EaXJlY3RvcnkoRmlsZSByb290RGlyLCBJUGF0aCBkZXN0UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewkJCi0JCUlJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRTsKLQkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoMTAwKTsKLQkJYWRkRmlsZXMocm9vdERpciwgZmlsZXMpOwotCQl0cnkgewotCQkJSW1wb3J0T3BlcmF0aW9uIG9wPSBuZXcgSW1wb3J0T3BlcmF0aW9uKGRlc3RQYXRoLCByb290RGlyLCBzdHJ1Y3R1cmVQcm92aWRlciwgbmV3IEltcG9ydE92ZXJ3cml0ZVF1ZXJ5KCksIGZpbGVzKTsKLQkJCW9wLnNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZShmYWxzZSk7Ci0JCQlvcC5ydW4obW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBub3QgaGFwcGVuCi0JCX0KLQl9CQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmlsZXMoRmlsZSBkaXIsIExpc3QgY29sbGVjdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotCQlMaXN0IHN1YkRpcnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChmaWxlc1tpXSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlzdWJEaXJzLmFkZChmaWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3IgaXRlciA9IHN1YkRpcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlIHN1YkRpciA9IChGaWxlKWl0ZXIubmV4dCgpOwotCQkJYWRkRmlsZXMoc3ViRGlyLCBjb2xsZWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbXBvcnRPdmVyd3JpdGVRdWVyeSBpbXBsZW1lbnRzIElPdmVyd3JpdGVRdWVyeSB7Ci0JCXB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIGZpbGUpIHsKLQkJCXJldHVybiBBTEw7Ci0JCX0JCi0JfQkJCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC9pbnB1dEhhbmRsZXJzL0FudFRlc3RJbnB1dEhhbmRsZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC9pbnB1dEhhbmRsZXJzL0FudFRlc3RJbnB1dEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxMzM2Zi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvaW5wdXRIYW5kbGVycy9BbnRUZXN0SW5wdXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQuaW5wdXRIYW5kbGVyczsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dFJlcXVlc3Q7Ci0KLS8qKgotICogQSB0ZXN0IGlucHV0IGhhbmRsZXIgd2hlbiB1c2luZyBBbnQgd2l0aGluIEVjbGlwc2UuCi0gKiBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHdpbGwgcmVzcG9uZCB0byA8aW5wdXQ+IHJlcXVlc3RzIGZyb20KLSAqIHdpdGhpbiBhbiBBbnQgYnVpbGQgZmlsZS4KLSAqIElmIHRoZSBidWlsZCBpcyBvY2N1cnJpbmcgaW4gQW50IDEuNi4wIGFuZCB0aGUgLW5vaW5wdXQgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZAotICogdGhpcyBpbnB1dCBoYW5kbGVyIHdpbGwgZmFpbC4KLSAqLwotcHVibGljIGNsYXNzIEFudFRlc3RJbnB1dEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SW5wdXRIYW5kbGVyIHsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXIjaGFuZGxlSW5wdXQob3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRSZXF1ZXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUlucHV0KElucHV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJlY2xpcHNlLmFudC5ub0lucHV0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byByZXNwb25kIHRvIGlucHV0IHJlcXVlc3QgbGlrZWx5IGFzIGEgcmVzdWx0IG9mIHNwZWNpZnlpbmcgdGhlIC1ub2lucHV0IGNvbW1hbmQiKTsKLQkJfQotCQlyZXF1ZXN0LnNldElucHV0KCJ0ZXN0aW5nIGhhbmRsaW5nIGlucHV0IHJlcXVlc3RzIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczYzgzNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrczsKLQotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrIGV4dGVuZHMgVGFzayB7Ci0JCi0JcHVibGljIEFudFRlc3RUYXNrKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKTsKLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWRkZGM3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrczsKLQotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrMiBleHRlbmRzIFRhc2sgewotCQotCXB1YmxpYyBBbnRUZXN0VGFzazIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJRWNobyBlY2hvPSBuZXcgRWNobygpOwotCQllY2hvLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJZWNoby5zZXRNZXNzYWdlKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpOwotCQllY2hvLmV4ZWN1dGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTGlzdGVuZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ0ZGRmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEJ1aWxkTGlzdGVuZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI2J1aWxkU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5hZGROYW1lT2ZMaXN0ZW5lcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0U3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMb2dnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkYzc2Ni4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzOwotCi0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRTZWN1cml0eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RCdWlsZExvZ2dlciBpbXBsZW1lbnRzIEJ1aWxkTG9nZ2VyIHsKLQotCXByaXZhdGUgaW50IG1lc3NhZ2VPdXRwdXRMZXZlbCA9UHJvamVjdC5NU0dfSU5GTzsKLQlwcml2YXRlIFByaW50U3RyZWFtIGZFcnI9IG51bGw7Ci0JcHJpdmF0ZSBQcmludFN0cmVhbSBmT3V0PSBudWxsOwotCQotCS8qKgotCSAqIEFuIGV4Y2VwdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkLgotCSAqLwotCXByaXZhdGUgVGhyb3dhYmxlIGZIYW5kbGVkRXhjZXB0aW9uPSBudWxsOwotCQotCQotCXB1YmxpYyBUZXN0QnVpbGRMb2dnZXIoKSB7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0TWVzc2FnZU91dHB1dExldmVsKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50IGxldmVsKSB7Ci0JCW1lc3NhZ2VPdXRwdXRMZXZlbD0gbGV2ZWw7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0TWVzc2FnZU91dHB1dExldmVsKCkgewotCQlyZXR1cm4gbWVzc2FnZU91dHB1dExldmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0RW1hY3NNb2RlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1hY3NNb2RlKGJvb2xlYW4gZW1hY3NNb2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI2J1aWxkU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5idWlsZFN0YXJ0ZWQoZXZlbnQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5zZXRVc2VyUHJvcGVydGllcyhldmVudC5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCQloYW5kbGVFeGNlcHRpb24oZXZlbnQpOwotCQlmSGFuZGxlZEV4Y2VwdGlvbj0gbnVsbDsKLQkJQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmJ1aWxkRmluaXNoZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0U3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkudGFyZ2V0U3RhcnRlZChldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJaGFuZGxlRXhjZXB0aW9uKGV2ZW50KTsKLQkJQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLnRhcmdldEZpbmlzaGVkKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkudGFza1N0YXJ0ZWQoZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCQloYW5kbGVFeGNlcHRpb24oZXZlbnQpOwotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkudGFyZ2V0RmluaXNoZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0UHJpb3JpdHkoKSA+IGdldE1lc3NhZ2VPdXRwdXRMZXZlbCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbG9nTWVzc2FnZShldmVudC5nZXRNZXNzYWdlKCksIGV2ZW50LmdldFByaW9yaXR5KCkpOwotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkubWVzc2FnZUxvZ2dlZChldmVudC5nZXRNZXNzYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBnZXRFcnJvclByaW50U3RyZWFtKCkgewotCQlyZXR1cm4gZkVycjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGdldE91dHB1dFByaW50U3RyZWFtKCkgewotCQlyZXR1cm4gZk91dDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExvZ2dlciNzZXRFcnJvclByaW50U3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSBlcnIpIHsKLQkJLy90aGlzIGJ1aWxkIGxvZ2dlciBsb2dzIHRvICJudWxsIiB1bmxlc3MKLQkJLy90aGUgdXNlciBoYXMgZXhwbGljaXRseSBzZXQgYSBsb2dmaWxlIHRvIHVzZQotCQlpZiAoZXJyID09IFN5c3RlbS5lcnIpIHsKLQkJCWZFcnI9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlmRXJyPSBlcnI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldE91dHB1dFByaW50U3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0UHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gb3V0cHV0KSB7Ci0JCS8vdGhpcyBidWlsZCBsb2dnZXIgbG9ncyB0byAibnVsbCIgdW5sZXNzCi0JCS8vdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgc2V0IGEgbG9nZmlsZSB0byB1c2UKLQkJaWYgKG91dHB1dCA9PSBTeXN0ZW0ub3V0KSB7Ci0JCQlmT3V0PSBudWxsOwotCQl9IGVsc2UgewotCQkJZk91dD0gb3V0cHV0OwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvZ01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBwcmlvcml0eSkgewotCQlpZiAocHJpb3JpdHkgPiBnZXRNZXNzYWdlT3V0cHV0TGV2ZWwoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAocHJpb3JpdHkgPT0gUHJvamVjdC5NU0dfRVJSKSB7Ci0JCQlpZiAoZ2V0RXJyb3JQcmludFN0cmVhbSgpICE9IG51bGwgJiYgZ2V0RXJyb3JQcmludFN0cmVhbSgpICE9IFN5c3RlbS5lcnIpIHsKLQkJCQkvL3VzZXIgaGFzIGRlc2lnbmF0ZWQgdG8gbG9nIHRvIGEgbG9nZmlsZQotCQkJCWdldEVycm9yUHJpbnRTdHJlYW0oKS5wcmludGxuKG1lc3NhZ2UpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGdldE91dHB1dFByaW50U3RyZWFtKCkgIT0gbnVsbCAmJiBnZXRPdXRwdXRQcmludFN0cmVhbSgpICE9IFN5c3RlbS5vdXQpIHsKLQkJCQkvL3VzZXIgaGFzIGRlc2lnbmF0ZWQgdG8gbG9nIHRvIGEgbG9nZmlsZQotCQkJCWdldE91dHB1dFByaW50U3RyZWFtKCkucHJpbnRsbihtZXNzYWdlKTsKLQkJCX0gCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IGV2ZW50LmdldEV4Y2VwdGlvbigpOwotCQlpZiAoZXhjZXB0aW9uID09IG51bGwgfHwgZXhjZXB0aW9uID09IGZIYW5kbGVkRXhjZXB0aW9uCi0JCXx8IGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JCXx8IGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEFudFNlY3VyaXR5RXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZkhhbmRsZWRFeGNlcHRpb249IGV4Y2VwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdHlwZXMvQW50VGVzdFBhdGguamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhhYzRhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnR5cGVzOwotCi0KLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotcHVibGljIGNsYXNzIEFudFRlc3RQYXRoIGV4dGVuZHMgUGF0aCB7Ci0JCi0JU3RyaW5nIG1lc3NhZ2U7Ci0JCi0JcHVibGljIEFudFRlc3RQYXRoKFByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihwcm9qZWN0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzLm1lc3NhZ2U9IG1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWIxZTRmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+Ci08cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pkdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqZHQtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIAotICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BdXRvbWF0ZWRTdWl0ZSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnMzI1NTEueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzMyNTUxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0Mzk5Ny4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnMzI1NTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iYnVnIiBkZWZhdWx0PSJhbGwiPgotIDxwYXRoIGlkPSJteWNsYXNzcGF0aCI+Ci0gCTxmaWxlc2V0IGRpcj0iLi5cbGliIj4KLSAgCQk8aW5jbHVkZSBuYW1lPSJhbnRUZXN0c1N1cHBvcnQuamFyIiAvPiAKLSAgCTwvZmlsZXNldD4KLSAgPC9wYXRoPgotICAKLSA8dGFza2RlZiBuYW1lPSJoZWxsbyIgY2xhc3NuYW1lPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIj4KLSAgCTxjbGFzc3BhdGggcmVmaWQ9Im15Y2xhc3NwYXRoIiAvPiAKLSAgPC90YXNrZGVmPgotICAKLSA8dGFyZ2V0IG5hbWU9ImFsbCI+Ci0gIAk8aGVsbG8gLz4gCi0gIDwvdGFyZ2V0PgotICA8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzM0NjYzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczNDY2My54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTAzZjEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzM0NjYzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iMzQ2NjMueG1sIiBkZWZhdWx0PSJlY2hvUCI+Ci0KLTx0YXNrZGVmIGZpbGU9IiR7Uk9PVERJUn0vdGFza2RlZnMucHJvcGVydGllcyIgLz4KLSAKLSA8dGFyZ2V0IG5hbWU9ImVjaG9QIj4KLSAJPGVjaG9Qcm9wZXJ0aWVzLz4KLSA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnNDI5MjYueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzQyOTI2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiODZhMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnNDI5MjYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0iYWxsIj4KLQk8cGF0aCBpZD0ic29tZWNsYXNzcGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0vbGliIiBpbmNsdWRlcz0ic29tZXRhc2suamFyIi8+Ci0JPC9wYXRoPgotCi0JPHRhc2tkZWYgbmFtZT0ic29tZXRhc2siIGNsYXNzbmFtZT0iY29tLmZvby5Tb21lVGFzayIKLWNsYXNzcGF0aHJlZj0ic29tZWNsYXNzcGF0aCIvPgotCi0JPHRhcmdldCBuYW1lPSJhbGwiPgotCQk8ZWNobz5IZWxsbyAke2FudC5ob21lfTwvZWNobz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ2xhc3NwYXRoT3JkZXJpbmcueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0NsYXNzcGF0aE9yZGVyaW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5YjY1ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ2xhc3NwYXRoT3JkZXJpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJDbGFzc3BhdGhPcmRlcmluZyIgZGVmYXVsdD0ib3JkZXJlZCIgYmFzZWRpcj0iLi4iPgotCi0JPHRhcmdldCBuYW1lPSJvcmRlcmVkIj4KLQkJPGphdmEgY2xhc3NuYW1lPSAiQ2xhc3NwYXRoT3JkZXJpbmciLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UYXNrLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UYXNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1MjVjOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVGFzay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJDdXN0b20gVGFzayIgZGVmYXVsdD0iQ3VzdG9tIFRhc2siIGJhc2VkaXI9Ii4iPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJDdXN0b20gVGFzayIgZGVzY3JpcHRpb249ICJUZXN0IGFkZGluZyBhIGN1c3RvbSB0YXNrIiBkZXBlbmRzPSJpbml0Ij4KLQkJPEFudFRlc3RUYXNrLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9IkN1c3RvbSBUYXNrIGZyb20gRW50cnkiIGRlc2NyaXB0aW9uPSAiVGVzdCBhZGRpbmcgYSBjdXN0b20gdGFzayI+Ci0JCTxBbnRUZXN0VGFzazIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVR5cGUueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWUxZWY1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UeXBlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkN1c3RvbSBUeXBlIiBkZWZhdWx0PSJDdXN0b20gVHlwZSIgYmFzZWRpcj0iLiI+Ci0KLQk8YW50dGVzdHBhdGggaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0ibGliIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2FudHRlc3RwYXRoPgotICAgIAotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJDdXN0b20gVHlwZSIgZGVzY3JpcHRpb249ICJUZXN0IGFkZGluZyBhIGN1c3RvbSB0eXBlIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVGVzdCBhZGRpbmcgYSBjdXN0b20gdHlwZSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0V4dGVuc2lvblBvaW50VGFzay54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUYXNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMzE0MC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUYXNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFRhc2siIGRlZmF1bHQ9IkV4dGVuc2lvbiBQb2ludCBUYXNrIiBiYXNlZGlyPSIuIj4KLQk8dGFyZ2V0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUYXNrIiBkZXNjcmlwdGlvbj0gIkVuc3VyZSB0aGF0IGFuIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIHRhc2sgaXMgcHJlc2VudCI+Ci0JCTxjb29sVGFzay8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUeXBlLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9FeHRlbnNpb25Qb2ludFR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmFhYWVjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9FeHRlbnNpb25Qb2ludFR5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFR5cGUiIGRlZmF1bHQ9IkV4dGVuc2lvbiBQb2ludCBUeXBlIiBiYXNlZGlyPSIuIj4KLQotCTxjb29sVHlwZSBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgotICAgICAgPGZpbGVzZXQgZGlyPSJsaWIiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29vbFR5cGU+Ci0gICAgCi0JPHRhcmdldCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVHlwZSIgZGVzY3JpcHRpb249ICJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlIGlzIHByZXNlbnQiPgotCQk8ZWNobyBtZXNzYWdlPSJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlIGlzIHByZXNlbnQiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9Ob0RlZmF1bHQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL05vRGVmYXVsdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNWQ3ZTkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL05vRGVmYXVsdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ICJUZXN0aW5nIiBkZWZhdWx0PSJidWlsZCI+Ci0KLQk8dGFyZ2V0IG5hbWU9ICJ0ZXN0Ij4KLQkJPGVjaG8gbWVzc2FnZT0idGVzdGluZyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9UZXN0Rm9yRWNoby54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvVGVzdEZvckVjaG8ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjEzZTVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9UZXN0Rm9yRWNoby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFY2hvIFRlc3QiIGRlZmF1bHQ9IlRlc3QgZm9yIEVjaG8iIGJhc2VkaXI9Ii4iPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJUZXN0IGZvciBFY2hvIiBkZXNjcmlwdGlvbj0gIkNhbGxzIG90aGVyIGVjaG9zIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudCBhbnRmaWxlPSJidWlsZGZpbGVzL2VjaG9pbmcueG1sIiBkaXI9Ii4uLy4uL0FudFRlc3RzIiB0YXJnZXQ9ImVjaG8xIi8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGRmaWxlcy9lY2hvaW5nLnhtbCIgZGlyPSIuLi8uLi9BbnRUZXN0cyIgdGFyZ2V0PSJlY2hvMiIvPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkZmlsZXMvZWNob2luZy54bWwiIGRpcj0iLi4vLi4vQW50VGVzdHMiIHRhcmdldD0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjM4YTUzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFY2hpbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzEiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8yIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8zIiBkZXNjcmlwdGlvbj0gIkFuIGVjaG8zISI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8zIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZGQ2NGQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRWNob2luZyIgZGVmYXVsdD0iZWNobzEiIGJhc2VkaXI9Ii4uIj4KLQotCTx0YXJnZXQgbmFtZT0iZWNobzEiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzIiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMiIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzMiIGRlc2NyaXB0aW9uPSAiQW4gZWNobzMhIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9mYWlsaW5nVGFyZ2V0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9mYWlsaW5nVGFyZ2V0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0MThlMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZmFpbGluZ1RhcmdldC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImFsbCI+Ci0JPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImZhaWxzLCBlY2hvcyIvPgotCTx0YXJnZXQgbmFtZT0iZmFpbHMiPgotCQk8amFyIGphcmZpbGU9ImphcjE2LmphciIgYmFzZWRpcj0iZG9lc05vdEV4aXN0Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJlY2hvcyI+Ci0JCTxlY2hvPlN0aWxsIGVjaG8gb24gZmFpbHVyZTwvZWNobz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvaW5wdXQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3MGFiNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvaW5wdXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJpbnB1dCB0ZXN0aW5nIiBkZWZhdWx0PSAiaW5wdXQgdGVzdCI+Ci0JPHRhcmdldCBuYW1lPSJpbnB1dCB0ZXN0Ij4KLQkJPGlucHV0IG1lc3NhZ2U9IkVudGVyIGZvciBlY2hvIiBhZGRwcm9wZXJ0eT0gImlucHV0VGVzdCI+Ci0JCTwvaW5wdXQ+Ci0JCTxlY2hvIG1lc3NhZ2U9IiR7aW5wdXRUZXN0fSIvPgotCTwvdGFyZ2V0PgkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmMDIyNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLmFudC5jb3JlIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi4iPgotCi0JCi0JPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9IkFudFRlc3RzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0idXNlLmVjbGlwc2UuSkRUQ29tcGlsZXIiPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L2phdmFjLmJpbiIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iLz4KLQkJPCEtLSBjb21waWxlIHRoZSBzb3VyY2UgY29kZSAtLT4KLQkJPGphdmFjIGRlc3RkaXI9IiR7dGVtcC5mb2xkZXJ9L2phdmFjLmJpbiIgZmFpbG9uZXJyb3I9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9Im9uIiBpbmNsdWRlQW50UnVudGltZT0ieWVzIj4KLQkJCTxzcmMgcGF0aD0icmVzb3VyY2VzIi8+Ci0JCTwvamF2YWM+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJyZWZyZXNoIiBkZXBlbmRzPSJpbml0IiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPGVjbGlwc2UucmVmcmVzaExvY2FsIHJlc291cmNlPSIke3BsdWdpbn0iIGRlcHRoPSJpbmZpbml0ZSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvY2xhc3NwYXRoT3JkZXJpbmcxLmphciBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMGNiN2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvY2xhc3NwYXRoT3JkZXJpbmcxLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMi5qYXIgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODE2NzQxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi90YXNrRm9sZGVyL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmNsYXNzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvdGFza0ZvbGRlci9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzN2ViNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi90YXNrRm9sZGVyL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvQW50VGVzdFRhc2suamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL0FudFRlc3RUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNGY2MDIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvQW50VGVzdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrIGV4dGVuZHMgVGFzayB7Ci0JCi0JcHVibGljIEFudFRlc3RUYXNrKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKTsKLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvdGFza2RlZnMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rhc2tkZWZzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDQ5ZmYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvdGFza2RlZnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWVjaG9Qcm9wZXJ0aWVzPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkVjaG9Qcm9wZXJ0aWVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWFjZDNhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BbnRUZXN0cz10ZXN0aW5nIGZyb20gcHJvcGVydGllcyBmaWxlCi1lY2xpcHNlLmlzLmNvb2w9WWVwCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvQWJzdHJhY3RBbnRUZXN0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvQWJzdHJhY3RBbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTNmY2UuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0Fic3RyYWN0QW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50UnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXJnZXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudEZpbGVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLSAKLS8qKgotICogVGVzdHMgZm9yIEFudCBjb3JlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfU1VDQ0VTU0ZVTD0gIkJVSUxEIFNVQ0NFU1NGVUwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9URVNUX0JVSUxEX0xPR0dFUiA9ICJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzLlRlc3RCdWlsZExvZ2dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfVEVTVF9CVUlMRF9MSVNURU5FUj0gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGVzdGxvZ2dlcnMuVGVzdEJ1aWxkTGlzdGVuZXIiOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlICdBbnRUZXN0cycgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXN0IHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgiQW50VGVzdHMiKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBwcm9qZWN0OwotCQotCQotCXB1YmxpYyBBYnN0cmFjdEFudFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJRmlsZSBnZXRCdWlsZEZpbGUoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImJ1aWxkZmlsZXMiKS5nZXRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBidWlsZCBmaWxlIG5hbWVkOiAiICsgYnVpbGRGaWxlTmFtZSwgZmlsZS5leGlzdHMoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUZvbGRlciBnZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyB3b3JraW5nRGlyZWN0b3J5TmFtZSkgewotCQlJRm9sZGVyIGZvbGRlciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIod29ya2luZ0RpcmVjdG9yeU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCB0aGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZWQ6ICIgKyB3b3JraW5nRGlyZWN0b3J5TmFtZSwgZm9sZGVyLmV4aXN0cygpKTsKLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGaWxlIGNoZWNrRmlsZUV4aXN0cyhTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQlJRmlsZSBmaWxlID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiYnVpbGRmaWxlcyIpLmdldEZpbGUoZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBmaWxlIG5hbWVkOiAiICsgZmlsZU5hbWUsIGZpbGUuZXhpc3RzKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bihidWlsZEZpbGVOYW1lLCBudWxsLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bihidWlsZEZpbGVOYW1lLCBhcmdzLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmdbXSBhcmdzLCBib29sZWFuIHJldHJpZXZlVGFyZ2V0cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oYnVpbGRGaWxlTmFtZSwgYXJncywgcmV0cmlldmVUYXJnZXRzLCAiIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nW10gYXJncywgYm9vbGVhbiByZXRyaWV2ZVRhcmdldHMsIFN0cmluZyB3b3JraW5nRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudFRlc3RDaGVja2VyLnJlc2V0KCk7Ci0JCUlGaWxlIGJ1aWxkRmlsZT0gbnVsbDsKLQkJaWYgKGJ1aWxkRmlsZU5hbWUgIT0gbnVsbCkgewotCQkJYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSk7Ci0JCX0KLQkJQW50RmlsZVJ1bm5lciBydW5uZXI9IG5ldyBBbnRGaWxlUnVubmVyKCk7Ci0JCVN0cmluZ1tdIHRhcmdldHM9IG51bGw7Ci0JCWlmIChyZXRyaWV2ZVRhcmdldHMpIHsKLQkJCXRhcmdldHM9IGdldFRhcmdldE5hbWVzKGJ1aWxkRmlsZU5hbWUpOwotCQl9Ci0JCWlmICh3b3JraW5nRGlyLmxlbmd0aCgpID4gMCkgewotCQkJd29ya2luZ0Rpcj0gZ2V0V29ya2luZ0RpcmVjdG9yeSh3b3JraW5nRGlyKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQl9IAotCQlydW5uZXIucnVuKGJ1aWxkRmlsZSwgdGFyZ2V0cywgYXJncywgd29ya2luZ0RpciwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHN0YXJ0cyBkaWQgbm90IGVxdWFsIGJ1aWxkIGZpbmlzaGVzIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldEJ1aWxkc1N0YXJ0ZWRDb3VudCgpID09IEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRCdWlsZHNGaW5pc2hlZENvdW50KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFyZ2V0SW5mb1tdIGdldFRhcmdldHMoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSk7Ci0JCQotCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOwotCQlydW5uZXIuc2V0QnVpbGRGaWxlTG9jYXRpb24oYnVpbGRGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCSAJcmV0dXJuIHJ1bm5lci5nZXRBdmFpbGFibGVUYXJnZXRzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUYXJnZXROYW1lcyhTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gaW5mb3M9IGdldFRhcmdldHMoYnVpbGRGaWxlTmFtZSk7Ci0JCVN0cmluZ1tdIG5hbWVzPSBuZXcgU3RyaW5nW2luZm9zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCVRhcmdldEluZm8gaW5mbyA9IGluZm9zW2ldOwotCQkJbmFtZXNbaV09IGluZm8uZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFRhcmdldERlc2NyaXB0aW9ucyhTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gaW5mb3M9IGdldFRhcmdldHMoYnVpbGRGaWxlTmFtZSk7Ci0JCVN0cmluZ1tdIGRlc2NyaXB0aW9ucz0gbmV3IFN0cmluZ1tpbmZvcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYXJnZXRJbmZvIGluZm8gPSBpbmZvc1tpXTsKLQkJCWRlc2NyaXB0aW9uc1tpXT0gaW5mby5nZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGFyZ2V0IGluIHRoZSBnaXZlbiBidWlsZCBmaWxlIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvamVjdCBuYW1lIGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3ROYW1lKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvIGluZm89IGdldFRhcmdldChidWlsZEZpbGVOYW1lLCB0YXJnZXROYW1lKTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHN1Y2ggdGFyZ2V0IGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RGVwZW5kZW5jaWVzKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvIGluZm89IGdldFRhcmdldChidWlsZEZpbGVOYW1lLCB0YXJnZXROYW1lKTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uZ2V0RGVwZW5kZW5jaWVzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhcmdldCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBidWlsZCBmaWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm8gc3VjaCB0YXJnZXQgY2FuIGJlIGZvdW5kLgotCSAqLwotCXByb3RlY3RlZCBUYXJnZXRJbmZvIGdldFRhcmdldChTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nIHRhcmdldE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFyZ2V0SW5mb1tdIGluZm9zPSBnZXRUYXJnZXRzKGJ1aWxkRmlsZU5hbWUpOwotCQlmb3IgKGludCBpPSAwLCBudW1UYXJnZXRzPSBpbmZvcy5sZW5ndGg7IGkgPCBudW1UYXJnZXRzOyBpKyspIHsKLQkJCWlmIChpbmZvc1tpXS5nZXROYW1lKCkuZXF1YWxzKHRhcmdldE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGluZm9zW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxvZyBtZXNzYWdlIG4gZnJvbSB0aGUgbGFzdDoKLSAgICAgKiBlLmcuIGdldExvZ2dlZE1lc3NhZ2UoMCkgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgbWVzc2FnZQotICAgICAqIAotICAgICAqIEBwYXJhbSBuIG1lc3NhZ2UgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBudGggbGFzdCBtZXNzYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2dnZWRNZXNzYWdlKGludCBuKSB7Ci0gICAgICAgIHJldHVybiBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VkTWVzc2FnZShuKTsKLSAgICB9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpIHsKLQkJcmV0dXJuIGdldExvZ2dlZE1lc3NhZ2UoMCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFN1Y2Nlc3NmdWwoKSB7Ci0JCUxpc3QgbWVzc2FnZXM9IEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpOwotCQlTdHJpbmcgc3VjY2Vzcz0gKFN0cmluZyltZXNzYWdlcy5nZXQobWVzc2FnZXMuc2l6ZSgpIC0gMSk7Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHdhcyBub3QgZmxhZ2dlZCBhcyBzdWNjZXNzZnVsOiAiICsgc3VjY2VzcywgQlVJTERfU1VDQ0VTU0ZVTC5lcXVhbHMoc3VjY2VzcykpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJyZXNvdXJjZXMiKS5nZXRGaWxlKCJ0ZXN0LnByb3BlcnRpZXMiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCkgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5IHRvb2xzRW50cnk9IHByZWZzLmdldFRvb2xzSmFyRW50cnkoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5W10gYWRkaXRpb25hbEVudHJpZXM7Ci0JCWlmICh0b29sc0VudHJ5ID09IG51bGwpIHsKLQkJCWFkZGl0aW9uYWxFbnRyaWVzPSBuZXcgSUFudENsYXNzcGF0aEVudHJ5W117fTsKLQkJfSBlbHNlIHsKLQkJCWFkZGl0aW9uYWxFbnRyaWVzPSBuZXcgSUFudENsYXNzcGF0aEVudHJ5W10ge3Rvb2xzRW50cnl9OwotCQl9Ci0JCXByZWZzLnNldEFkZGl0aW9uYWxDbGFzc3BhdGhFbnRyaWVzKGFkZGl0aW9uYWxFbnRyaWVzKTsKLQkJcHJlZnMuc2V0QW50SG9tZUNsYXNzcGF0aEVudHJpZXMocHJlZnMuZ2V0RGVmYXVsdEFudEhvbWVFbnRyaWVzKCkpOwotCQlwcmVmcy5zZXRDdXN0b21UYXNrcyhuZXcgVGFza1tde30pOwotCQlwcmVmcy5zZXRDdXN0b21UeXBlcyhuZXcgVHlwZVtde30pOwotCQlwcmVmcy5zZXRDdXN0b21Qcm9wZXJ0eUZpbGVzKG5ldyBTdHJpbmdbXXt9KTsKLQkJcHJlZnMuc2V0Q3VzdG9tUHJvcGVydGllcyhuZXcgUHJvcGVydHlbXXt9KTsKLQkJcHJlZnMuc2V0QW50SG9tZShwcmVmcy5nZXREZWZhdWx0QW50SG9tZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbnRIb21lKCkgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5W10gZW50cmllcz0gcHJlZnMuZ2V0QW50SG9tZUNsYXNzcGF0aEVudHJpZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5IGFudGphcj0gZW50cmllc1swXTsKLQkJSVBhdGggYW50SG9tZVBhdGg9IG5ldyBQYXRoKGFudGphci5nZXRFbnRyeVVSTCgpLmdldEZpbGUoKSk7Ci0JCWFudEhvbWVQYXRoPSBhbnRIb21lUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCXJldHVybiBhbnRIb21lUGF0aC50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9BdXRvbWF0ZWRTdWl0ZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0F1dG9tYXRlZFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWJhYmEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0F1dG9tYXRlZFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHMuKjsKLQotLyoqCi0gKiBUZXN0IGFsbCBhcmVhcyBvZiBBbnQuCi0gKiAKLSAqIFRvIHJ1biB0aGlzIHRlc3Qgc3VpdGU6Ci0gKiA8b2w+Ci0gKiA8bGk+Q3JlYXRlIGEgbmV3IEpVbml0IHBsdWdpbiB0ZXN0IGxhdW5jaCBjb25maWd1cmF0aW9uPC9saT4KLSAqIDxsaT5TZXQgdGhlIFRlc3QgY2xhc3MgdG8gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkF1dG9tYXRlZFN1aXRlIjwvbGk+Ci0gKiA8bGk+U2V0IHRoZSBQcm9qZWN0IHRvICJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSI8L2xpPgotICogPGxpPlJ1biB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24uIE91dHB1dCBmcm9tIHRoZSB0ZXN0cyB3aWxsIGJlIGRpc3BsYXllZCBpbiBhIEpVbml0IHZpZXc8L2xpPgotICogPC9vbD4KLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkKLQkvKioKLQkgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRlc3QgYXJlIGluIHByb2dyZXNzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGVzdGluZyA9IHRydWU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gIFRoaXMgaXMgcmVxdWlyZWQgdG8KLQkgKiB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBdXRvbWF0ZWRTdWl0ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLQkgKi8KLQlwdWJsaWMgQXV0b21hdGVkU3VpdGUoKSB7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEZyYW1ld29ya1Rlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShUYXJnZXRUZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoUHJvamVjdFRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShPcHRpb25UZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGFza1Rlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShUeXBlVGVzdHMuY2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSB0ZXN0cyBhbmQgY29sbGVjdHMgdGhlaXIgcmVzdWx0IGluIGEgVGVzdFJlc3VsdCB3aXRob3V0IGJsb2NraW5nLgotCSAqIHRoZSBVSSB0aHJlYWQuIE5vdCBub3JtYWxseSBuZWVkZWQgYnV0IG5pY2UgdG8gaGF2ZSB0byBjaGVjayBvbiB0aGUgc3RhdGUgb2YKLQkgKiBlbnZpcm9ubWVudCBkdXJpbmcgYSB0ZXN0IHJ1bi4KLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHJ1bihmaW5hbCBUZXN0UmVzdWx0IHJlc3VsdCkgewotLy8JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotLy8JCVRocmVhZCB0aHJlYWQgPSBudWxsOwotLy8JCXRyeSB7Ci0vLwkJCVJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7Ci0vLwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJZm9yIChFbnVtZXJhdGlvbiBlPSB0ZXN0cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLS8vCQkJCSAgCQlpZiAocmVzdWx0LnNob3VsZFN0b3AoKSApCi0vLwkJCQkgIAkJCWJyZWFrOwotLy8JCQkJCQlUZXN0IHRlc3Q9IChUZXN0KWUubmV4dEVsZW1lbnQoKTsKLS8vCQkJCQkJcnVuVGVzdCh0ZXN0LCByZXN1bHQpOwotLy8JCQkJCX0JCQkJCQotLy8JCQkJCXRlc3RpbmcgPSBmYWxzZTsKLS8vCQkJCQlkaXNwbGF5Lndha2UoKTsKLS8vCQkJCX0KLS8vCQkJfTsKLS8vCQkJdGhyZWFkID0gbmV3IFRocmVhZChyKTsKLS8vCQkJdGhyZWFkLnN0YXJ0KCk7Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0vLwkJCQkKLS8vCQl3aGlsZSAodGVzdGluZykgewotLy8JCQl0cnkgewotLy8JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotLy8JCQkJCWRpc3BsYXkuc2xlZXAoKTsKLS8vCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLS8vCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCX0JCQkKLS8vCQl9CQkKLS8vCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDVkNjRlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9Qcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLQotLyoqCi0gKiBUZXN0IHRvIGNsb3NlIHRoZSB3b3JrYmVuY2gsIHNpbmNlIGRlYnVnIHRlc3RzIGRvIG5vdCBydW4gaW4gdGhlIFVJCi0gKiB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZGVsZXRlIGFueSBwcmUtZXhpc3RpbmcgcHJvamVjdAotCQlJUHJvamVjdCBwcm8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIkFudFRlc3RzIik7Ci0JCWlmIChwcm8uZXhpc3RzKCkpIHsKLQkJCXByby5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCX0KLQkJLy8gY3JlYXRlIHByb2plY3QgYW5kIGltcG9ydCBidWlsZGZpbGVzIGFuZCBzdXBwb3J0IGZpbGVzCi0JCXByb2plY3QgPSBQcm9qZWN0SGVscGVyLmNyZWF0ZVByb2plY3QoIkFudFRlc3RzIik7Ci0JCUlGb2xkZXIgZm9sZGVyID0gUHJvamVjdEhlbHBlci5hZGRGb2xkZXIocHJvamVjdCwgImJ1aWxkZmlsZXMiKTsKLQkJRmlsZSByb290ID0gQW50VGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RmlsZUluUGx1Z2luKFByb2plY3RIZWxwZXIuVEVTVF9CVUlMREZJTEVTX0RJUik7Ci0JCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQkJCi0JCWZvbGRlciA9IFByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsICJyZXNvdXJjZXMiKTsKLQkJcm9vdCA9IEFudFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEZpbGVJblBsdWdpbihQcm9qZWN0SGVscGVyLlRFU1RfUkVTT1VSQ0VTX0RJUik7Ci0JCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQkJCi0JCWZvbGRlciA9IFByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsICJsaWIiKTsKLQkJcm9vdCA9IEFudFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEZpbGVJblBsdWdpbihQcm9qZWN0SGVscGVyLlRFU1RfTElCX0RJUik7Ci0JCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvRnJhbWV3b3JrVGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9GcmFtZXdvcmtUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGJkN2E0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9GcmFtZXdvcmtUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHM7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudENsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudENsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRnJhbWV3b3JrVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBGcmFtZXdvcmtUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHRoZSBkZXByZWNhdGVkIG1lYW5zIG9mIHNldHRpbmcgdGhlIGNsYXNzcGF0aCBzdGlsbCB3b3JrcyBjb3JyZWN0bHkKLQkgKiBEbyBub3QgZml4IGRlcHJlY2F0aW9ucyB1bmxlc3MgdGhlIGRlcHJlY2F0ZWQgbWV0aG9kcyBhcmUgYmVpbmcgcmVtb3ZlZC4KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhPcmRlcmluZ0RlcHJlY2F0ZWQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCQotCQlTdHJpbmcgcGF0aD0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigibGliIikuZ2V0RmlsZSgiY2xhc3NwYXRoT3JkZXJpbmcxLmphciIpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCVVSTCB1cmw9IG5ldyBVUkwoImZpbGU6IiArIHBhdGgpOwotCQkKLQkJcGF0aD0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigibGliIikuZ2V0RmlsZSgiY2xhc3NwYXRoT3JkZXJpbmcyLmphciIpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCVVSTCB1cmwyPSBuZXcgVVJMKCJmaWxlOiIgKyBwYXRoKTsKLQkJCi0JCVVSTCB1cmxzW10gPSBwcmVmcy5nZXRDdXN0b21VUkxzKCk7Ci0JCVVSTCBuZXdVcmxzW10gPSBuZXcgVVJMW3VybHMubGVuZ3RoICsgMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodXJscywgMCwgbmV3VXJscywgMCwgdXJscy5sZW5ndGgpOwotCQluZXdVcmxzW3VybHMubGVuZ3RoXSA9IHVybDsKLQkJbmV3VXJsc1t1cmxzLmxlbmd0aCArIDFdID0gdXJsMjsKLQkJcHJlZnMuc2V0Q3VzdG9tVVJMcyhuZXdVcmxzKTsKLQkJCi0JCXByZWZzLnVwZGF0ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlydW4oIkNsYXNzcGF0aE9yZGVyaW5nLnhtbCIpOwotCQlTdHJpbmcgbXNnPSAoU3RyaW5nKUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpLmdldCgxKTsKLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csIG1zZy5lcXVhbHMoImNsYXNzcGF0aE9yZGVyaW5nMSIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQkKLQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwotCQkKLQkJdXJscyA9IHByZWZzLmdldEN1c3RvbVVSTHMoKTsKLQkJbmV3VXJscyA9IG5ldyBVUkxbdXJscy5sZW5ndGggKyAyXTsKLQkJU3lzdGVtLmFycmF5Y29weSh1cmxzLCAwLCBuZXdVcmxzLCAwLCB1cmxzLmxlbmd0aCk7Ci0JCW5ld1VybHNbdXJscy5sZW5ndGhdID0gdXJsMjsKLQkJbmV3VXJsc1t1cmxzLmxlbmd0aCArIDFdID0gdXJsOwotCQlwcmVmcy5zZXRDdXN0b21VUkxzKG5ld1VybHMpOwotCQkKLQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJ1bigiQ2xhc3NwYXRoT3JkZXJpbmcueG1sIik7Ci0JCW1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJjbGFzc3BhdGhPcmRlcmluZzIiKSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoT3JkZXJpbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQkKLQkJU3RyaW5nIHBhdGg9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImxpYiIpLmdldEZpbGUoImNsYXNzcGF0aE9yZGVyaW5nMS5qYXIiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlJQW50Q2xhc3NwYXRoRW50cnkgZW50cnk9IG5ldyBBbnRDbGFzc3BhdGhFbnRyeShwYXRoKTsKLQkJCi0JCXBhdGg9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImxpYiIpLmdldEZpbGUoImNsYXNzcGF0aE9yZGVyaW5nMi5qYXIiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlJQW50Q2xhc3NwYXRoRW50cnkgZW50cnkyPSBuZXcgQW50Q2xhc3NwYXRoRW50cnkocGF0aCk7Ci0JCQotCQlJQW50Q2xhc3NwYXRoRW50cnkgZW50cmllc1tdID0gcHJlZnMuZ2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5IG5ld0VudHJpZXNbXSA9IG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbZW50cmllcy5sZW5ndGggKyAyXTsKLQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBlbnRyaWVzLmxlbmd0aCk7Ci0JCW5ld0VudHJpZXNbZW50cmllcy5sZW5ndGhdID0gZW50cnk7Ci0JCW5ld0VudHJpZXNbZW50cmllcy5sZW5ndGggKyAxXSA9IGVudHJ5MjsKLQkJcHJlZnMuc2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMobmV3RW50cmllcyk7Ci0JCQotCQlwcmVmcy51cGRhdGVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkKLQkJcnVuKCJDbGFzc3BhdGhPcmRlcmluZy54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJjbGFzc3BhdGhPcmRlcmluZzEiKSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJCi0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJCi0JCWVudHJpZXMgPSBwcmVmcy5nZXRBZGRpdGlvbmFsQ2xhc3NwYXRoRW50cmllcygpOwotCQluZXdFbnRyaWVzID0gbmV3IElBbnRDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLmxlbmd0aCArIDJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIGVudHJpZXMubGVuZ3RoKTsKLQkJbmV3RW50cmllc1tlbnRyaWVzLmxlbmd0aF0gPSBlbnRyeTI7Ci0JCW5ld0VudHJpZXNbZW50cmllcy5sZW5ndGggKyAxXSA9IGVudHJ5OwotCQlwcmVmcy5zZXRBZGRpdGlvbmFsQ2xhc3NwYXRoRW50cmllcyhuZXdFbnRyaWVzKTsKLQkJCi0JCXByZWZzLnVwZGF0ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlydW4oIkNsYXNzcGF0aE9yZGVyaW5nLnhtbCIpOwotCQltc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDEpOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiY2xhc3NwYXRoT3JkZXJpbmcyIikpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vRGVmYXVsdFRhcmdldCgpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiTm9EZWZhdWx0LnhtbCIsIG5ldyBTdHJpbmdbXXsidGVzdCJ9LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZz0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiRGVmYXVsdCB0YXJnZXQgJ2J1aWxkJyBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHByb2plY3QiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQnVpbGQgZmlsZXMgd2l0aCBubyBkZWZhdWx0IHRhcmdldHMgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHRhc2tzIGxpa2UgamF2YWMgd29yayB3aGVuIGluY2x1ZGVBbnRSdW50aW1lIGlzIHNwZWNpZmllZAotCSAqIGJ1ZyAyMDg1Ny4KLQkgKiBUaGlzIHRlc3Qgd2lsbCBqdXN0IHJldHVybiBpZiB0aGUgdGVzdHMgYXJlIGNvbmR1Y3RlZCBvbiBhIEpSRSAobm8gdG9vbHMuamFyKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZUFudFJ1bnRpbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlBbnRDbGFzc3BhdGhFbnRyeSB0b29sc0VudHJ5PSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuZ2V0VG9vbHNKYXJFbnRyeSgpOwotCQlpZiAodG9vbHNFbnRyeSA9PSBudWxsKSB7Ci0JCQkvL3J1bm5pbmcgb24gYSBKUkUgd2hlcmUgdG9vbHMuamFyIGNvdWxkIG5vdCBiZSBmb3VuZAotCQkJcmV0dXJuOwotCQl9Ci0JCXJ1bigiamF2YWMueG1sIiwgbmV3IFN0cmluZ1tdeyJidWlsZCIsInJlZnJlc2gifSwgZmFsc2UpOyAvL3N0YW5kYXJkIGNvbXBpbGVyCi0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJSUZpbGUgY2xhc3NGaWxlPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJ0ZW1wLmZvbGRlciIpLmdldEZvbGRlcigiamF2YWMuYmluIikuZ2V0RmlsZSgiQW50VGVzdFRhc2suY2xhc3MiKTsKLQkJYXNzZXJ0VHJ1ZSgiQ2xhc3MgZmlsZSB3YXMgbm90IGdlbmVyYXRlZCIsIGNsYXNzRmlsZS5leGlzdHMoKSk7Ci0JCXJ1bigiamF2YWMueG1sIiwgbmV3IFN0cmluZ1tdeyItRHVzZS5lY2xpcHNlLmNvbXBpbGVyPXRydWUiLCAiY2xlYW4iLCAiYnVpbGQiLCAicmVmcmVzaCJ9LCBmYWxzZSk7IC8vSkRUQ29tcGlsZXIKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQljbGFzc0ZpbGU9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoInRlbXAuZm9sZGVyIikuZ2V0Rm9sZGVyKCJqYXZhYy5iaW4iKS5nZXRGaWxlKCJBbnRUZXN0VGFzay5jbGFzcyIpOwotCQlhc3NlcnRUcnVlKCJDbGFzcyBmaWxlIHdhcyBub3QgZ2VuZXJhdGVkIiwgY2xhc3NGaWxlLmV4aXN0cygpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlIHByb3BlcnRpZXMgYWRkZWQgdXNpbmcgYSBnbG9iYWwgcHJvcGVydHkgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHbG9iYWxQcm9wZXJ0eUZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCi0JCVN0cmluZyBwYXRoPSBnZXRQcm9wZXJ0eUZpbGVOYW1lKCk7Ci0JCXByZWZzLnNldEN1c3RvbVByb3BlcnR5RmlsZXMobmV3IFN0cmluZ1tde3BhdGh9KTsKLQkJCi0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tde30pOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCWFzc2VydFRydWUoImVjbGlwc2UuaXMuY29vbCBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyBZZXAiLCAiWWVwIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5pcy5jb29sIikpKTsKLQkJYXNzZXJ0VHJ1ZSgiQW50VGVzdHMgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiB0ZXN0aW5nIiwgInRlc3RpbmcgZnJvbSBwcm9wZXJ0aWVzIGZpbGUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJBbnRUZXN0cyIpKSk7Ci0JCWFzc2VydE51bGwoIm15Lm5hbWUgd2FzIG5vdCBzZXQgYW5kIHNob3VsZCBiZSBudWxsIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgibXkubmFtZSIpKTsKLQkJCi0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlIHByb3BlcnRpZXMgYWRkZWQgdXNpbmcgYSBnbG9iYWwgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2xvYmFsUHJvcGVydHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0Q3VzdG9tUHJvcGVydGllcyhuZXcgUHJvcGVydHlbXXtuZXcgUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIsICJZZXAiKSwgbmV3IFByb3BlcnR5KCJKVW5pdFRlc3QiLCAidHJ1ZSIpfSk7Ci0JCQotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXt9KTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLmlzLmNvb2wgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgWWVwIiwgIlllcCIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkpVbml0VGVzdHMgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiB0cnVlIiwgInRydWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJKVW5pdFRlc3QiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JCQotCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHbG9iYWxQcm9wZXJ0eUZpbGVXaXRoTWludXNEVGFraW5nUHJlY2VkZW5jZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCQotCQlTdHJpbmcgcGF0aD0gZ2V0UHJvcGVydHlGaWxlTmFtZSgpOwotCQlwcmVmcy5zZXRDdXN0b21Qcm9wZXJ0eUZpbGVzKG5ldyBTdHJpbmdbXXtwYXRofSk7Ci0JCQotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyItREFudFRlc3RzPXRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhhdCB0aGUgZGVmYXVsdCBBTlRfSE9NRSBpcyBzZXQgYW5kIHRoYXQgaXQgY2FuIGJlIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0dGluZ0FudEhvbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCXJ1bigiZWNob2luZy54bWwiKTsKLQkJCWFzc2VydFRydWUoIkFOVF9IT01FIG5vdCBzZXQgY29ycmVjdGx5IiwgcHJlZnMuZ2V0RGVmYXVsdEFudEhvbWUoKS5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJhbnQuaG9tZSIpKSk7Ci0JCQlGaWxlIGFudExpYkRpcj0gbmV3IEZpbGUocHJlZnMuZ2V0RGVmYXVsdEFudEhvbWUoKSwgImxpYiIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJhbnQubGlicmFyeS5kaXIgbm90IHNldCBjb3JyZWN0bHkiLCBhbnRMaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LmxpYnJhcnkuZGlyIikpKTsKLQkJCXByZWZzLnNldEFudEhvbWUoIiIpOwotCQkJcnVuKCJlY2hvaW5nLnhtbCIpOwotCQkJYXNzZXJ0VHJ1ZSgiQU5UX0hPTUUgbm90IHNldCBjb3JyZWN0bHkiLCBudWxsID09IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LmhvbWUiKSk7Ci0JCQlhc3NlcnRUcnVlKCJhbnQubGlicmFyeS5kaXIgbm90IHNldCBjb3JyZWN0bHkiLCBudWxsID09IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LmxpYnJhcnkuZGlyIikpOwotCQl9IGZpbmFsbHkgewotCQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwotCQl9CQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9PcHRpb25UZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL09wdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjE1NWMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL09wdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0czsKLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BYnN0cmFjdEFudFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE9wdGlvblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRUZXN0IHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0FSRz0gIlVua25vd24gYXJndW1lbnQ6ICI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfT0ZfSEVMUD0gImFudCBbb3B0aW9uc10gW3RhcmdldCBbdGFyZ2V0MiBbdGFyZ2V0M10gLi4uXV0iOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT049ICJBcGFjaGUgQW50IHZlcnNpb24gMS42LjEgY29tcGlsZWQgb24gRmVicnVhcnkgMTIgMjAwNCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX1ZFUlNJT049ICJvcmcuYXBhY2hlLmFudF8xLjYuMSI7Ci0JIAotCXB1YmxpYyBPcHRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlICItaGVscCIgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEhlbHAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItaGVscCJ9KTsKLQkJYXNzZXJ0VHJ1ZSgiT25lIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDEpOwotCQlhc3NlcnRUcnVlKCJIZWxwIGlzIGluY29ycmVjdCIsIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkgIT0gbnVsbCAmJiBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpLnN0YXJ0c1dpdGgoU1RBUlRfT0ZfSEVMUCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1oIiBvcHRpb24gKGhlbHApCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzSCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1oIn0pOwotCQlhc3NlcnRUcnVlKCJPbmUgbWVzc2FnZSBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZCwgd2FzICIgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDEpOwotCQlhc3NlcnRUcnVlKCJIZWxwIGlzIGluY29ycmVjdCIsIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkgIT0gbnVsbCAmJiBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpLnN0YXJ0c1dpdGgoU1RBUlRfT0ZfSEVMUCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi12ZXJzaW9uIiBvcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii12ZXJzaW9uIn0pOwotCQlhc3NlcnRUcnVlKCJPbmUgbWVzc2FnZSBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoIlZlcnNpb24gaXMgaW5jb3JyZWN0IiwgVkVSU0lPTi5lcXVhbHMoZ2V0TGFzdE1lc3NhZ2VMb2dnZWQoKSkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1wcm9qZWN0aGVscCIgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RoZWxwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXByb2plY3RoZWxwIn0pOwotCQlhc3NlcnRUcnVlKCI1IG1lc3NhZ2VzIHNob3VsZCBoYXZlIGJlZW4gbG9nZ2VkOyB3YXMgIiArIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCksIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgPT0gNSk7Ci0JCWFzc2VydFRydWUoIlByb2plY3QgaGVscCBpcyBpbmNvcnJlY3QiLCBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpLnN0YXJ0c1dpdGgoIlN1YnRhcmdldHM6IikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1wIiBvcHRpb24gKHByb2plY3QgaGVscCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWludXNQKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXAifSk7Ci0JCWFzc2VydFRydWUoIjUgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSA1KTsKLQkJYXNzZXJ0VHJ1ZSgiUHJvamVjdCBoZWxwIGlzIGluY29ycmVjdCIsIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkuc3RhcnRzV2l0aCgiU3VidGFyZ2V0czoiKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLXByb2plY3RoZWxwIiBvcHRpb24gd2hlbiBpdCB3aWxsIG5vdCBzaG93IChxdWl0ZSBtb2RlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0aGVscFF1aWV0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXByb2plY3RoZWxwIiwgIi1xIn0pOwotCQlhc3NlcnRUcnVlKCJubyBtZXNzYWdlcyBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZDsgd2FzICIgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDApOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1saXN0ZW5lciIgb3B0aW9uIHdpdGggYSBsaXN0ZW5lciB0aGF0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBCdWlsZExpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyQmFkKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1saXN0ZW5lciIsICJqYXZhLmxhbmcuU3RyaW5nIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdHJpbmcgbXNnPSBjZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdCE6ICIgKyBtc2csIG1zZy5lcXVhbHMoImphdmEubGFuZy5TdHJpbmcgd2hpY2ggd2FzIHNwZWNpZmllZCB0byBiZSBhIGJ1aWxkIGxpc3RlbmVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyLiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJBIGNvcmUgZXhjZXB0aW9uIHNob3VsZCBoYXZlIG9jY3VycmVkIHdyYXBwZXJpbmcgYSBjbGFzcyBjYXN0IGV4Y2VwdGlvbiIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgcGFzc2luZyBhbiB1bnJlY29nbml6ZWQgYXJndW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkFyZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCi0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItbGlzdGVuciJ9KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5yZWNvZ25pemVkIG9wdGlvbiBtZXNzYWdlIHNob3VsZCBoYXZlIGJlZW4gbG9nZ2VkIGJlZm9yZSBzdWNjZXNzZnVsIGJ1aWxkIiwKLQkJCQkJKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgPT0gNikKLQkJCQkJICYmIChnZXRMb2dnZWRNZXNzYWdlKDUpLnN0YXJ0c1dpdGgoVU5LTk9XTl9BUkcpKQotICAgICAgICAgICAgICAgICAgICAgJiYgKGdldExhc3RNZXNzYWdlTG9nZ2VkKCkuc3RhcnRzV2l0aChCVUlMRF9TVUNDRVNTRlVMKSkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHRoZSAtbG9nZmlsZSB3aXRoIG5vIGFyZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMb2dGaWxlV2l0aE5vQXJnKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dmaWxlIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiWW91IG11c3Qgc3BlY2lmeSBhIGxvZyBmaWxlIHdoZW4gdXNpbmcgdGhlIC1sb2cgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1sb2dmaWxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExvZ0ZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxvZ2ZpbGUiLCAiVGVzdExvZ0ZpbGUudHh0In0pOwotCQlJRmlsZSBmaWxlPSBjaGVja0ZpbGVFeGlzdHMoIlRlc3RMb2dGaWxlLnR4dCIpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPWZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCi0JCUlucHV0U3RyZWFtUmVhZGVyIGluPSBudWxsOwotCQl0cnkgewkJCi0JCQlpbj0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSkpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJY2hhcltdIHJlYWRCdWZmZXI9IG5ldyBjaGFyWzIwNDhdOwotCQkJaW50IG49IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW49IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJGaWxlIHNob3VsZCBoYXZlIHN0YXJ0ZWQgd2l0aCBCdWlsZGZpbGUiLCBidWZmZXIudG9TdHJpbmcoKS5zdGFydHNXaXRoKCJCdWlsZGZpbGUiKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbi5jbG9zZSgpOwotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1sb2dnZXIgd2l0aCBubyBhcmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TG9nZ2VyV2l0aE5vQXJnKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dnZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gdXNpbmcgdGhlIC1sb2dnZXIgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWxvZ2dlciIgb3B0aW9uIHdpdGggYSBsb2dnZXIgdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgQnVpbGRMb2dnZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TG9nZ2VyQmFkKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dnZXIiLCAiamF2YS5sYW5nLlN0cmluZyJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkEgY29yZSBleGNlcHRpb24gc2hvdWxkIGhhdmUgb2NjdXJyZWQgd3JhcHBlcmluZyBhIGNsYXNzIGNhc3QgZXhjZXB0aW9uIiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1sb2dnZXIiIG9wdGlvbiB3aXRoIHR3byBsb2dnZXJzIHNwZWNpZmllZC4uLm9ubHkgb25lIGlzIGFsbG93ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvTG9nZ2VycygpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItbG9nZ2VyIiwgImphdmEubGFuZy5TdHJpbmciLCAiLXEiLCAiLWxvZ2dlciIsICJqYXZhLmxhbmcuU3RyaW5nIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQXMgb25seSBvbmUgbG9nZ2VyIGNhbiBiZSBzcGVjaWZpZWQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1saXN0ZW5lciB3aXRoIG5vIGFyZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcldpdGhOb0FyZygpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItbGlzdGVuZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgbGlzdGVuZXJzIHdoZW4gdXNpbmcgdGhlIC1saXN0ZW5lciBhcmd1bWVudCAiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1saXN0ZW5lciB3aXRoIGEgY2xhc3MgdGhhdCB3aWxsIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lckNsYXNzTm90Rm91bmQoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxpc3RlbmVyIiwgIlRlc3RCdWlsZExpc3RlbmVyIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLQkJCWFzc2VydFRydWUoIlNob3VsZCBiZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwgImphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uOiBUZXN0QnVpbGRMaXN0ZW5lciIuZXF1YWxzKG1lc3NhZ2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJBIENvcmVFeGNlcHRpb24gc2hvdWxkIGhhdmUgb2NjdXJyZWQgYXMgdGhlIGxpc3RlbmVyIGNsYXNzIHdpbGwgbm90IGJlIGZvdW5kIiwgZmFsc2UpOwotCQkKLQl9Ci0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyB0aGUgLWxpc3RlbmVyIG9wdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1saXN0ZW5lciIsIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSfSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiQSBsaXN0ZW5lciBzaG91bGQgaGF2ZSBiZWVuIGFkZGVkIG5hbWVkOiAiICsgQU5UX1RFU1RfQlVJTERfTElTVEVORVIsIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TGFzdExpc3RlbmVyKCkpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyB0aGUgLWxpc3RlbmVyIG9wdGlvbiBtdWx0aXBsZSB0aW1lcy4uLndoaWNoIGlzIGFsbG93ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNdWx0aXBsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1saXN0ZW5lciIsIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSLCAiLWxpc3RlbmVyIiwgQU5UX1RFU1RfQlVJTERfTElTVEVORVJ9KTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJBIGxpc3RlbmVyIHNob3VsZCBoYXZlIGJlZW4gYWRkZWQgbmFtZWQ6ICIgKyBBTlRfVEVTVF9CVUlMRF9MSVNURU5FUiwgQU5UX1RFU1RfQlVJTERfTElTVEVORVIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRMYXN0TGlzdGVuZXIoKSkpOwotCQlhc3NlcnRUcnVlKCJUd28gbGlzdGVuZXJzIHNob3VsZCBoYXZlIGJlZW4gYWRkZWQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TGlzdGVuZXJzKCkuc2l6ZSgpID09IDIpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHRoZSAtbGlzdGVuZXIgb3B0aW9uIG11bHRpcGxlIHRpbWVzLCB3aXRoIG9uZSBtaXNzaW5nIHRoZSBhcmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNdWx0aXBsZVdpdGhCYWQoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxpc3RlbmVyIiwgQU5UX1RFU1RfQlVJTERfTElTVEVORVIsICItcSIsICItbGlzdGVuZXIiLCAiLXZlcmJvc2UifSk7Ci0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1lvdSBtdXN0IHNwZWNpZnkgYSBsaXN0ZW5lciBmb3IgYWxsIC1saXN0ZW5lciBhcmd1bWVudHMKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIGFsbCAtbGlzdGVuZXIgYXJndW1lbnRzICIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyB0aGUgLWJ1aWxkZmlsZSB3aXRoIG5vIGFyZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZEZpbGVXaXRoTm9BcmcoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWJ1aWxkZmlsZSJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9Zb3UgbXVzdCBzcGVjaWZ5IGEgYnVpbGRmaWxlIHdoZW4gdXNpbmcgdGhlIC1idWlsZGZpbGUgYXJndW1lbnQKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgYnVpbGRmaWxlIHdoZW4gdXNpbmcgdGhlIC1idWlsZGZpbGUgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1idWlsZGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiYnVpbGRmaWxlcyIpLmdldEZpbGUoImVjaG9pbmcueG1sIikuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1idWlsZGZpbGUiLCBidWlsZEZpbGVOYW1lfSwgZmFsc2UsICJidWlsZGZpbGVzIik7Ci0JCQotCQlhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBiZWVuIDEgdGFza3MsIHdhczogIiArIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRUYXNrU3RhcnRlZENvdW50KCksIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRUYXNrU3RhcnRlZENvdW50KCkgPT0gMSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgYSB0YXJnZXQgYXQgdGhlIGNvbW1hbmQgbGluZSB0aGF0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZ5QmFkVGFyZ2V0QXNBcmcoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiZWNobzIifSwgZmFsc2UpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQSBjb3JlIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBvY2N1cnJlZCBhcyB0aGUgdGFyZ2V0IGRvZXMgbm90IGV4aXN0IiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmeVRhcmdldEFzQXJnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyJlY2hvMyJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjMgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSAzKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUgd2l0aCBvdGhlciBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZnlUYXJnZXRBc0FyZ1dpdGhPdGhlck9wdGlvbnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dmaWxlIiwgIlRlc3RMb2dGaWxlLnR4dCIsICJlY2hvMyJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjQgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSA0KTsKLQkJTGlzdCBtZXNzYWdlcz0gQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCk7Ci0JCS8vZW5zdXJlIHRoYXQgZWNobzMgdGFyZ2V0IGV4ZWN1dGVkIGFuZCBvbmx5IHRoYXQgdGFyZ2V0Ci0JCWFzc2VydFRydWUoImVjaG8zIHRhcmdldCBub3QgZXhlY3V0ZWQiLCBtZXNzYWdlcy5nZXQoMikuZXF1YWxzKCJlY2hvMyIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHRhcmdldHMgYXQgdGhlIGNvbW1hbmQgbGluZSB3aXRoIG90aGVyIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmeVRhcmdldHNBc0FyZ1dpdGhPdGhlck9wdGlvbnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dmaWxlIiwgIlRlc3RMb2dGaWxlLnR4dCIsICJlY2hvMiIsICJlY2hvMyJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjUgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSA1KTsKLQkJTGlzdCBtZXNzYWdlcz0gQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCk7Ci0JCS8vZW5zdXJlIHRoYXQgZWNobzIgdGFyZ2V0IGV4ZWN1dGVkCi0JCWFzc2VydFRydWUoImVjaG8yIHRhcmdldCBub3QgZXhlY3V0ZWQiLCBtZXNzYWdlcy5nZXQoMikuZXF1YWxzKCJlY2hvMiIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUgYW5kIHF1aWV0IHJlcG9ydGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZ5VGFyZ2V0QXNBcmdBbmRRdWlldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJlY2hvaW5nLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxvZ2ZpbGUiLCAiVGVzdExvZ0ZpbGUudHh0IiwgImVjaG8zIiwgIi1xdWlldCJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjIgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSAyKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgcHJvcGVydGllcyB1c2luZyAiLUQiCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzRCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJlY2hvaW5nLnhtbCIsIG5ldyBTdHJpbmdbXXsiLURBbnRUZXN0cz10ZXN0aW5nIiwgIi1EZWNsaXBzZS5pcy5jb29sPXRydWUifSwgZmFsc2UpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCWFzc2VydFRydWUoImVjbGlwc2UuaXMuY29vbCBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyB0cnVlIiwgInRydWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJlY2xpcHNlLmlzLmNvb2wiKSkpOwotCQlhc3NlcnRUcnVlKCJBbnRUZXN0cyBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mIHRlc3RpbmciLCAidGVzdGluZyIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIkFudFRlc3RzIikpKTsKLQkJYXNzZXJ0TnVsbCgibXkubmFtZSB3YXMgbm90IHNldCBhbmQgc2hvdWxkIGJlIG51bGwiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJteS5uYW1lIikpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgcHJvcGVydGllcyB1c2luZyAiLUQiIGFuZCAiLWQiIHRvIHNwZWNpZnkgZGVidWcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWludXNETWludXNkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyItZCIsICItREFudFRlc3RzPXRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNaW51c0RBbmRHbG9iYWxQcm9wZXJ0aWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyItREFudFRlc3RzPXRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5ydW5uaW5nIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UucnVubmluZyIpKSk7Ci0JCWFzc2VydE5vdE51bGwoImVjbGlwc2UuaG9tZSBzaG91bGQgaGF2ZSBiZWVuIHNldCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaG9tZSIpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyBhIHByb3BlcnR5IHN1Y2ggYXMgIi1EPWVtcHR5U3RyaW5nSXNNeU5hbWUKLQkgKiBCdWcgMzcwMDcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWludXNERW1wdHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1EPWVtcHR5U3RyaW5nSXNNeU5hbWUiLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIlwiXCIgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiBlbXB0eVN0cmluZ0lzTXlOYW1lIiwgImVtcHR5U3RyaW5nSXNNeU5hbWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCIiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgcHJvcGVydGllcyB0aGF0IGNvbnRhaW4gc3BhY2VzCi0JICogQnVnIDM3MDk0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzRFdpdGhTcGFjZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1EQW50VGVzdHM9IHRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9ICAgIHRydWUifSwgZmFsc2UpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCWFzc2VydFRydWUoImVjbGlwc2UuaXMuY29vbCBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyB0cnVlIiwgInRydWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJlY2xpcHNlLmlzLmNvb2wiKSkpOwotCQlhc3NlcnRUcnVlKCJBbnRUZXN0cyBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mIHRlc3RpbmciLCAidGVzdGluZyIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIkFudFRlc3RzIikpKTsKLQkJYXNzZXJ0TnVsbCgibXkubmFtZSB3YXMgbm90IHNldCBhbmQgc2hvdWxkIGJlIG51bGwiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJteS5uYW1lIikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHByb3BlcnRpZXMgd2hlbiB0aGUgdXNlciBoYXMgaW5jb3JyZWN0bHkgc3BlY2lmaWVkICItRGVidWciCi0JICogQnVnIDQwOTM1Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNXaXRoTWludXNEZWJ1ZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJlY2hvaW5nLnhtbCIsIG5ldyBTdHJpbmdbXXsiLURlYnVnIiwgIi1EQW50VGVzdHM9IHRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9ICAgIHRydWUifSwgZmFsc2UpOwotCQlhc3NlcnRUcnVlKCJcIi1EZWJ1Z1wiIHNob3VsZCBiZSBmbGFnZ2VkIGFzIGFuIHVua25vd24gYXJndW1lbnQiLCAiVW5rbm93biBhcmd1bWVudDogLURlYnVnIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDApKSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHdoZW4gdGhlIHVzZXIgaGFzIGluY29ycmVjdGx5IHNwZWNpZmllZCAiLURlYnVnIgotCSAqIEJ1ZyA0MDkzNQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNaW51c0RlYnVnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyItRGVidWcifSk7Ci0JCWFzc2VydFRydWUoIlwiLURlYnVnXCIgc2hvdWxkIGJlIGZsYWdnZWQgYXMgYW4gdW5rbm93biBhcmd1bWVudCIsICJVbmtub3duIGFyZ3VtZW50OiAtRGVidWciLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMCkpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlGaWxlV2l0aE5vQXJnKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1wcm9wZXJ0eWZpbGUifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDApOwotCQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3QhOiAiICsgbXNnLCBtc2cuZXF1YWxzKCJZb3UgbXVzdCBzcGVjaWZ5IGEgcHJvcGVydHkgZmlsZW5hbWUgd2hlbiB1c2luZyB0aGUgLXByb3BlcnR5ZmlsZSBhcmd1bWVudCIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgcHJvcGVydHkgZmlsZW5hbWUgd2hlbiB1c2luZyB0aGUgLXByb3BlcnR5ZmlsZSBhcmd1bWVudCIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBidWlsZCBzaG91bGQgc3VjY2VlZCB3aGVuIGEgcHJvcGVydHkgZmlsZSBpcyBub3QgZm91bmQuCi0JICogVGhlIGVycm9yIGlzIHJlcG9ydGVkIGFuZCB0aGUgYnVpbGQgY29udGludWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUZpbGVGaWxlTm90Rm91bmQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXByb3BlcnR5ZmlsZSIsICJxcS50eHQifSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0ITogIiArIG1zZywgbXNnLnN0YXJ0c1dpdGgoIkNvdWxkIG5vdCBsb2FkIHByb3BlcnR5IGZpbGUgcXEudHh0OiIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5RmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1wcm9wZXJ0eWZpbGUiLCBnZXRQcm9wZXJ0eUZpbGVOYW1lKCl9KTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLmlzLmNvb2wgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgWWVwIiwgIlllcCIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIGZyb20gcHJvcGVydGllcyBmaWxlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUZpbGVXaXRoTWludXNEVGFraW5nUHJlY2VkZW5jZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJlY2hvaW5nLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXByb3BlcnR5ZmlsZSIsIGdldFByb3BlcnR5RmlsZU5hbWUoKSwgIi1EQW50VGVzdHM9dGVzdGluZyIsICItRGVjbGlwc2UuaXMuY29vbD10cnVlIn0sIGZhbHNlKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLmlzLmNvb2wgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdHJ1ZSIsICJ0cnVlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5pcy5jb29sIikpKTsKLQkJYXNzZXJ0VHJ1ZSgiQW50VGVzdHMgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiB0ZXN0aW5nIiwgInRlc3RpbmciLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJBbnRUZXN0cyIpKSk7Ci0JCWFzc2VydE51bGwoIm15Lm5hbWUgd2FzIG5vdCBzZXQgYW5kIHNob3VsZCBiZSBudWxsIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgibXkubmFtZSIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElucHV0SGFuZGxlcldpdGhOb0FyZygpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItaW5wdXRoYW5kbGVyIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdHJpbmcgbXNnPSBjZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdCE6ICIgKyBtc2csIG1zZy5lcXVhbHMoIllvdSBtdXN0IHNwZWNpZnkgYSBjbGFzc25hbWUgd2hlbiB1c2luZyB0aGUgLWlucHV0aGFuZGxlciBhcmd1bWVudCIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gdXNpbmcgdGhlIC1pbnB1dGhhbmRsZXIgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWlucHV0aGFuZGxlciIgb3B0aW9uIHdpdGggdHdvIGhhbmRsZXJzIHNwZWNpZmllZC4uLm9ubHkgb25lIGlzIGFsbG93ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5wdXRIYW5kbGVyTXVsdGlwbGUoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWlucHV0aGFuZGxlciIsICJvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyIiwgIi1xIiwgIi1pbnB1dGhhbmRsZXIiLCAib3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlciJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJU3RyaW5nIG1zZz0gY2UuZ2V0TWVzc2FnZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3QhOiAiICsgbXNnLCBtc2cuZXF1YWxzKCJPbmx5IG9uZSBpbnB1dCBoYW5kbGVyIGNsYXNzIG1heSBiZSBzcGVjaWZpZWQuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkFzIG9ubHkgb25lIGlucHV0IGhhbmRsZXIgY2FuIGJlIHNwZWNpZmllZCIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlICItaW5wdXRoYW5kbGVyIiBvcHRpb24gd2l0aCBhIGlucHV0IGhhbmRsZXIgdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSW5wdXRIYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdElucHV0SGFuZGxlckJhZCgpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItaW5wdXRoYW5kbGVyIiwgImphdmEubGFuZy5TdHJpbmdCdWZmZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0cmluZyBtc2c9IGNlLmdldE1lc3NhZ2UoKTsKLQkJCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0ITogIiArIG1zZywgbXNnLmVxdWFscygiVGhlIHNwZWNpZmllZCBpbnB1dCBoYW5kbGVyIGNsYXNzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXIgaW50ZXJmYWNlIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBpbnB1dGhhbmRsZXIiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWlucHV0aGFuZGxlciIgb3B0aW9uIHdpdGggYSBpbnB1dCBoYW5kbGVyIHRoYXQgaXMgbm90IGEgZGVmaW5lZCBjbGFzcwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnB1dEhhbmRsZXJCYWQyKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1pbnB1dGhhbmRsZXIiLCAiamEubGFuZy5TdHJpbmdCdWZmZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0cmluZyBtc2c9IGNlLmdldE1lc3NhZ2UoKTsKLQkJCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0ITogIiArIG1zZywgbXNnLnN0YXJ0c1dpdGgoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBzcGVjaWZpZWQgaW5wdXQgaGFuZGxlciBjbGFzcyBqYS5sYW5nLlN0cmluZ0J1ZmZlciIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgaW5wdXRoYW5kbGVyIiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1pbnB1dGhhbmRsZXIiIG9wdGlvbiB3aXRoIGEgdGVzdCBpbnB1dCBoYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdElucHV0SGFuZGxlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCXJ1bigiaW5wdXQueG1sIiwgbmV3IFN0cmluZ1tdeyItaW5wdXRoYW5kbGVyIiwgIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQuaW5wdXRIYW5kbGVycy5BbnRUZXN0SW5wdXRIYW5kbGVyIn0pOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDEpOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygidGVzdGluZyBoYW5kbGluZyBpbnB1dCByZXF1ZXN0cyIpKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWlucHV0aGFuZGxlciIgb3B0aW9uIHdpdGggYSB0ZXN0IGlucHV0IGhhbmRsZXIgYW5kIHRoZSAtbm9pbnB1dCBvcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5wdXRIYW5kbGVyV2l0aE1pbnVzTm9JbnB1dCgpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiaW5wdXQueG1sIiwgbmV3IFN0cmluZ1tdeyItaW5wdXRoYW5kbGVyIiwgIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQuaW5wdXRIYW5kbGVycy5BbnRUZXN0SW5wdXRIYW5kbGVyIiwgIi1ub2lucHV0In0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIGNlLmdldE1lc3NhZ2UoKSwgY2UuZ2V0TWVzc2FnZSgpLmVuZHNXaXRoKCJVbmFibGUgdG8gcmVzcG9uZCB0byBpbnB1dCByZXF1ZXN0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBzcGVjaWZ5aW5nIHRoZSAtbm9pbnB1dCBjb21tYW5kIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAtbm9pbnB1dCBvcHRpb24gd2l0aCB0aGUgZGVmYXVsdCBpbnB1dCBoYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzTm9JbnB1dCgpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiaW5wdXQueG1sIiwgbmV3IFN0cmluZ1tdeyItbm9pbnB1dCJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBjZS5nZXRNZXNzYWdlKCksIGNlLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgiRmFpbGVkIHRvIHJlYWQgaW5wdXQgZnJvbSBDb25zb2xlLiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQotCQlhc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWRpYWdub3N0aWNzIiBvcHRpb24gd2l0aCBubyBBTlRfSE9NRSBzZXQKLQkgKiBidWcgMjU2OTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGlhZ25vc3RpY3NXaXRoTm9BbnRIb21lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpLnNldEFudEhvbWUobnVsbCk7Ci0JCQlydW4oImlucHV0LnhtbCIsIG5ldyBTdHJpbmdbXXsiLWRpYWdub3N0aWNzIn0pOwotCQkKLQkJCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDApOwotCQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csIG1zZy5lcXVhbHMoIi0tLS0tLS0gQW50IGRpYWdub3N0aWNzIHJlcG9ydCAtLS0tLS0tIikpOwotCQl9IGZpbmFsbHkgewotCQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1kaWFnbm9zdGljcyIgb3B0aW9uIHdpdGggQU5UX0hPTUUgc2V0Ci0JICogYnVnIDI1NjkzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERpYWdub3N0aWNzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCQl0cnkgewotCQkJcnVuKCJpbnB1dC54bWwiLCBuZXcgU3RyaW5nW117Ii1kaWFnbm9zdGljcyJ9KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJfQotCQkKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMTIpOwotCQkvL21zZyBkZXBlbmRzIG9uIHdoZXRoZXIgc2VsZiBob3N0aW5nIHRlc3Rpbmcgb3IgYnVpbGQgdGVzdGluZwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVuZHNXaXRoKCJvcmcuYXBhY2hlLmFudCIpIHx8IG1zZy5lbmRzV2l0aChQTFVHSU5fVkVSU0lPTikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1xdWlldCIgc3RpbGwgcmVwb3J0cyBidWlsZCBzdWNjZXNzZnVsCi0JICogYnVnIDM0NDg4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzUXVpZXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItcXVpZXQifSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsJCi0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlICIta2VlcC1nb2luZyIgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzS2VlcEdvaW5nKCkgewotCQl0cnkgewotCQkJcnVuKCJmYWlsaW5nVGFyZ2V0LnhtbCIsIG5ldyBTdHJpbmdbXXsiLWtlZXAtZ29pbmcifSwgZmFsc2UpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGJlKSB7Ci0JCQlhc3NlcnRUcnVlKCI0IG1lc3NhZ2VzIHNob3VsZCBoYXZlIGJlZW4gbG9nZ2VkOyB3YXMgIiArIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCksIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgPT0gNCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbWVzc2FnZToiICArIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRMb2dnZWRNZXNzYWdlKDEpLCAiU3RpbGwgZWNobyBvbiBmYWlsdXJlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldExvZ2dlZE1lc3NhZ2UoMSkpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlICItayIgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzSygpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiZmFpbGluZ1RhcmdldC54bWwiLCBuZXcgU3RyaW5nW117Ii1rZWVwLWdvaW5nIn0sIGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBiZSkgewotCQkJYXNzZXJ0VHJ1ZSgiNCBtZXNzYWdlcyBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZDsgd2FzICIgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDQpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG1lc3NhZ2U6IiAgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VkTWVzc2FnZSgxKSwgIlN0aWxsIGVjaG8gb24gZmFpbHVyZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRMb2dnZWRNZXNzYWdlKDEpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoIlRoZSBidWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWxzZSk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9Qcm9qZWN0VGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9Qcm9qZWN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3N2ViNC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvUHJvamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoYXQgdGhlIHRocmVlIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYWx3YXlzIGJlIHNldCBhcmUgY29ycmVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCYXNlUHJvcGVydGllc1NldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAotCQlydW4oYnVpbGRGaWxlTmFtZSk7Ci0JCUlGaWxlIGJ1aWxkRmlsZT0gZ2V0QnVpbGRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQlTdHJpbmcgZnVsbE5hbWU9IGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLnJ1bm5pbmcgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdHJ1ZSIsICJ0cnVlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5ydW5uaW5nIikpKTsKLQkJYXNzZXJ0VHJ1ZSgiYW50LmZpbGUgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdGhlIGJ1aWxkIGZpbGUgbmFtZSIsIGZ1bGxOYW1lLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJhbnQuZmlsZSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoImFudC5qYXZhLnZlcnNpb24gc2hvdWxkIGhhdmUgYmVlbiBzZXQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJhbnQuamF2YS52ZXJzaW9uIikpOwotCQlhc3NlcnROb3ROdWxsKCJhbnQudmVyc2lvbiBzaG91bGQgaGF2ZSBiZWVuIHNldCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImFudC52ZXJzaW9uIikpOwotCQlhc3NlcnROb3ROdWxsKCJlY2xpcHNlLmhvbWUgc2hvdWxkIGhhdmUgYmVlbiBzZXQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJlY2xpcHNlLmhvbWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0iVGVzdEZvckVjaG8ueG1sIjsgCi0JCXJ1bihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgicHJvcGVydHkudGVzdGluZyBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyB0cnVlIiwgInRydWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJwcm9wZXJ0eS50ZXN0aW5nIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVXaXRoQ2xhc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0iVGVzdEZvckVjaG8ueG1sIjsgCi0JCXJ1bihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgicHJvcGVydHkudGVzdGluZzIgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgaGV5IiwgImhleSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoInByb3BlcnR5LnRlc3RpbmcyIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBidWlsZEZpbGVOYW1lPSJUZXN0Rm9yRWNoby54bWwiOyAKLQkJcnVuKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJwcm9wZXJ0eS50ZXN0aW5nMyBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyBBbnRUZXN0UHJvcGVydHlQcm92aWRlciIsICJBbnRUZXN0UHJvcGVydHlWYWx1ZVByb3ZpZGVyIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgicHJvcGVydHkudGVzdGluZzMiKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGVhZGxlc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLnNldFJ1bm5pbmdIZWFkbGVzcyh0cnVlKTsKLQkJCVN0cmluZyBidWlsZEZpbGVOYW1lPSJUZXN0Rm9yRWNoby54bWwiOyAKLQkJCXJ1bihidWlsZEZpbGVOYW1lKTsKLQkJCWFzc2VydE51bGwoInByb3BlcnR5LmhlYWRsZXNzIHNob3VsZCBub3QgaGF2ZSBiZWVuIHNldCBhcyBBbnRUZXN0UHJvcGVydHlQcm92aWRlciIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoInByb3BlcnR5LmhlYWRsZXNzIikpOwotCQl9IGZpbmFsbHkgewotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3MoZmFsc2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROb3RIZWFkbGVzcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAotCQlydW4oYnVpbGRGaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoInByb3BlcnR5LmhlYWRsZXNzIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIEFudFRlc3RQcm9wZXJ0eVByb3ZpZGVyIiwgImhlYWRsZXNzIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgicHJvcGVydHkuaGVhZGxlc3MiKSkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1RhcmdldFRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFyZ2V0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkZjcyYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFyZ2V0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXJnZXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUYXJnZXRUZXN0cyBleHRlbmRzIEFic3RyYWN0QW50VGVzdCB7Ci0JCi0JcHVibGljIFRhcmdldFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgYSBkZWZhdWx0IHRhcmdldCBpcyBmb3VuZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gdGFyZ2V0cz0gZ2V0VGFyZ2V0cygiVGVzdEZvckVjaG8ueG1sIik7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSB0d28gdGFyZ2V0cyBpbiBUZXN0Rm9yRWNoby54bWwiLCB0YXJnZXRzLmxlbmd0aCA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZSgiVGVzdCBmb3IgRWNobyBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0IiwgdGFyZ2V0c1sxXS5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB0YXJnZXRzIGFyZSBmb3VuZCBpbiBhIGJ1aWxkIGZpbGUgd2l0aCBkYXRhIHR5cGVzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldFRhcmdldHNXaXRoRGF0YVR5cGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gdGFyZ2V0cz0gZ2V0VGFyZ2V0cygiQnVnMzI1NTEueG1sIik7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSBvbmUgdGFyZ2V0cyBpbiBCdWczMjU1MS54bWwiLCB0YXJnZXRzLmxlbmd0aCA9PSAxKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHRhcmdldHMgYXJlIGZvdW5kIGluIGEgYnVpbGRmaWxlIHdpdGggYSBmaWxlc2V0IGJhc2VkIG9uIGFudF9ob21lCi0JICogKHRoYXQgYW50X2hvbWUgaXMgc2V0IGF0IHBhcnNlIHRpbWUpCi0JICogQnVnIDQyOTI2LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRzV2l0aEFudEhvbWUoKSB7Ci0JCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKCJhbnQuaG9tZSIpOwotCQl0cnkgewotCQkJZ2V0VGFyZ2V0cygiQnVnNDI5MjYueG1sIik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vY2xhc3NwYXRocmVmIHdhcyBzdWNjZXNzZnVsIGJ1dCB0aGUgdGFzayBpcyBub3QgZGVmaW5lZAotCQkJY2UuZ2V0TWVzc2FnZSgpLmVxdWFscygiZmlsZTpjOi9ydW50aW1lLXRlc3Qtd29ya3NwYWNlL0FudFRlc3RzL2J1aWxkZmlsZXMvQnVnNDI5MjYueG1sOjc6IHRhc2tkZWYgY2xhc3MgY29tLmZvby5Tb21lVGFzayBjYW5ub3QgYmUgZm91bmQiKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgdGFyZ2V0IG5hbWVzIGFyZSByZXRyaWV2ZWQgcHJvcGVybHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0TmFtZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHRhcmdldE5hbWVzPSBnZXRUYXJnZXROYW1lcygiVGVzdEZvckVjaG8ueG1sIik7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSB0d28gdGFyZ2V0cyBpbiBUZXN0Rm9yRWNoby54bWwiLCB0YXJnZXROYW1lcy5sZW5ndGggPT0gMik7Ci0JCWFzc2VydFRydWUoIkZpcnN0IG5hbWUgc2hvdWxkIGJlIGluaXQiLCB0YXJnZXROYW1lc1swXS5lcXVhbHMoImluaXQiKSk7Ci0JCWFzc2VydFRydWUoIlNlY29uZCBuYW1lIHNob3VsZCBiZSBUZXN0IGZvciBFY2hvIiwgdGFyZ2V0TmFtZXNbMV0uZXF1YWxzKCJUZXN0IGZvciBFY2hvIikpOwotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgdGFyZ2V0IGRlc2NyaXB0aW9ucyBhcmUgcmV0cmlldmVkIHByb3Blcmx5Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldERlc2NyaXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmdbXSB0YXJnZXREZXNjcmlwdGlvbnM9IGdldFRhcmdldERlc2NyaXB0aW9ucygiVGVzdEZvckVjaG8ueG1sIik7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSB0d28gdGFyZ2V0cyBpbiBUZXN0Rm9yRWNoby54bWwiLCB0YXJnZXREZXNjcmlwdGlvbnMubGVuZ3RoID09IDIpOwotCQlhc3NlcnROdWxsKCJGaXJzdCBkZXNjcmlwdGlvbiBzaG91bGQgYmUgbnVsbCIsIHRhcmdldERlc2NyaXB0aW9uc1swXSk7Ci0JCWFzc2VydFRydWUoIlNlY29uZCBkZXNjcmlwdGlvbiBzaG91bGQgYmUgQ2FsbHMgb3RoZXIgdGFyZ2V0cyIsIHRhcmdldERlc2NyaXB0aW9uc1sxXS5lcXVhbHMoIkNhbGxzIG90aGVyIGVjaG9zIikpOwotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgdGFyZ2V0IHByb2plY3RzIGFyZSByZXRyaWV2ZWQgcHJvcGVybHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRhcmdldFByb2plY3Q9IGdldFByb2plY3ROYW1lKCJUZXN0Rm9yRWNoby54bWwiLCAiVGVzdCBmb3IgRWNobyIpOwotCQlhc3NlcnRUcnVlKCJQcm9qZWN0IG5hbWUgc2hvdWxkIGJlIEVjaG8gVGVzdCIsICJFY2hvIFRlc3QiLmVxdWFscyh0YXJnZXRQcm9qZWN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB0YXJnZXQgZGVwZW5kZW5jaWVzIGFyZSByZXRyaWV2ZWQgcHJvcGVybHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RGVwZW5kZW5jaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmdbXSBkZXBlbmRlbmNpZXM9IGdldERlcGVuZGVuY2llcygiVGVzdEZvckVjaG8ueG1sIiwgIlRlc3QgZm9yIEVjaG8iKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRGVwZW5kZW5jaWVzIHNob3VsZCBub3QgYmUgbnVsbCIsIGRlcGVuZGVuY2llcyk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSBvbmUgZGVwZW5kZW5jeSBpbiBUZXN0IGZvciBFY2hvIiwgZGVwZW5kZW5jaWVzLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlyc3QgZGVwZW5kZW5jeSBzaG91bGQgYmUgaW5pdCIsICJpbml0Ii5lcXVhbHMoZGVwZW5kZW5jaWVzWzBdKSk7Ci0JfQotCQotCS8qKgotCSAqIFJ1bnMgYW4gQW50IGJ1aWxkIGFuZCBlbnN1cmUgdGhhdCB0aGUgYnVpbGQgZmlsZSBsb2NhdGlvbiBpcyBsb2dnZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UnVuU2NyaXB0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIpOwotCQlTdHJpbmcgbWVzc2FnZT0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIkJ1aWxkIGZpbGUgbG9jYXRpb24gc2hvdWxkIGJlIGxvZ2dlZCBhcyB0aGUgZmlyc3QgbWVzc2FnZSIsIG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmVuZHNXaXRoKCJBbnRUZXN0cyIgKyBGaWxlLnNlcGFyYXRvciArICJidWlsZGZpbGVzIiArIEZpbGUuc2VwYXJhdG9yICsgIlRlc3RGb3JFY2hvLnhtbCIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Rhc2tUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Rhc2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ5Y2ZjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UYXNrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudENsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGFza1Rlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRUZXN0IHsKLQotCQotCXB1YmxpYyBUYXNrVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RpbmcgdGhlIG9sZCBkZXByZWNhdGVkIEFQSQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRUYXNrU2V0dGluZ0xpYnJhcnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlVUkxbXSB1cmxzPSBwcmVmcy5nZXRFeHRyYUNsYXNzcGF0aFVSTHMoKTsKLQkJVGFzayBuZXdUYXNrPSBuZXcgVGFzaygpOwotCQluZXdUYXNrLnNldExpYnJhcnkodXJsc1swXSk7Ci0JCW5ld1Rhc2suc2V0VGFza05hbWUoIkFudFRlc3RUYXNrIik7Ci0JCW5ld1Rhc2suc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIik7Ci0JCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117bmV3VGFza30pOwotCQkKLQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJ1bigiQ3VzdG9tVGFzay54bWwiLCBuZXcgU3RyaW5nWzBdLCBmYWxzZSk7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDEpOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRhc2tTZXR0aW5nTGlicmFyeUVudHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJVVJMW10gdXJscz0gcHJlZnMuZ2V0RXh0cmFDbGFzc3BhdGhVUkxzKCk7Ci0JCVRhc2sgbmV3VGFzaz0gbmV3IFRhc2soKTsKLQkJbmV3VGFzay5zZXRMaWJyYXJ5RW50cnkobmV3IEFudENsYXNzcGF0aEVudHJ5KHVybHNbMF0pKTsKLQkJbmV3VGFzay5zZXRUYXNrTmFtZSgiQW50VGVzdFRhc2syIik7Ci0JCW5ld1Rhc2suc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIik7Ci0JCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117bmV3VGFza30pOwotCQkKLQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJ1bigiQ3VzdG9tVGFzay54bWwiLCBuZXcgU3RyaW5nW10geyJDdXN0b20gVGFzayBmcm9tIEVudHJ5In0sIGZhbHNlKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFzaygpIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117fSk7Ci0JCXRyeSB7Ci0JCQlydW4oIkN1c3RvbVRhc2sueG1sIik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWFzc2VydFRydWUoIkV4Y2VwdGlvbiBmcm9tIHVuZGVmaW5lZCB0YXNrIGlzIGluY29ycmVjdCIsIGNlLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgiYXMgdGhpcyBpcyBub3QgYW4gQW50IGJ1Zy4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7CQotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0YXNrIG5vIGxvbmdlciBkZWZpbmVkIiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFza0Zyb21Gb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCVRhc2sgbmV3VGFzaz0gbmV3IFRhc2soKTsKLQkJCVN0cmluZyBwYXRoPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsaWIiKS5nZXRGaWxlKCJ0YXNrRm9sZGVyIikuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCUlBbnRDbGFzc3BhdGhFbnRyeSBlbnRyeT0gbmV3IEFudENsYXNzcGF0aEVudHJ5KHBhdGggKyBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJSUFudENsYXNzcGF0aEVudHJ5IGVudHJpZXNbXSA9IHByZWZzLmdldEFkZGl0aW9uYWxDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQlJQW50Q2xhc3NwYXRoRW50cnkgbmV3RW50cmllc1tdID0gbmV3IElBbnRDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBlbnRyaWVzLmxlbmd0aCk7Ci0JCQluZXdFbnRyaWVzW2VudHJpZXMubGVuZ3RoXSA9IGVudHJ5OwotCQkJcHJlZnMuc2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMobmV3RW50cmllcyk7Ci0JCQotCQkJbmV3VGFzay5zZXRMaWJyYXJ5RW50cnkoZW50cnkpOwotCQkJbmV3VGFzay5zZXRUYXNrTmFtZSgiQW50VGVzdFRhc2siKTsKLQkJCW5ld1Rhc2suc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrMiIpOwotCQkJcHJlZnMuc2V0Q3VzdG9tVGFza3MobmV3IFRhc2tbXXtuZXdUYXNrfSk7Ci0JCQotCQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCQlydW4oIkN1c3RvbVRhc2sueG1sIiwgbmV3IFN0cmluZ1swXSwgZmFsc2UpOwotCQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKSk7Ci0JCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RUYXNrc0RlZmluZWRJblByb3BlcnR5RmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQkJUHJvcGVydHkgbmV3UHJvcD0gbmV3IFByb3BlcnR5KCJST09URElSIiwgIi4uLy9yZXNvdXJjZXMiKTsKLQkJCXByZWZzLnNldEN1c3RvbVByb3BlcnRpZXMobmV3IFByb3BlcnR5W117bmV3UHJvcH0pOwotCQkJcnVuKCJCdWczNDY2My54bWwiKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFza0RlZmluZWRJbkV4dGVuc2lvblBvaW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIkV4dGVuc2lvblBvaW50VGFzay54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFRhc2tEZWZpbmVkSW5FeHRlbnNpb25Qb2ludEhlYWRsZXNzKCkgewotCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLnNldFJ1bm5pbmdIZWFkbGVzcyh0cnVlKTsKLQkJdHJ5IHsKLQkJCXJ1bigiRXh0ZW5zaW9uUG9pbnRUYXNrLnhtbCIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlhc3NlcnRUcnVlKCJFeGNlcHRpb24gZnJvbSB1bmRlZmluZWQgdGFzayBpcyBpbmNvcnJlY3QiLCBjZS5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoImFzIHRoaXMgaXMgbm90IGFuIEFudCBidWcuIikpOwotCQkJcmV0dXJuOwotCQl9IGZpbmFsbHkgewotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3MoZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0YXNrIHdhcyBub3QgZGVmaW5lZCB0byBydW4gaW4gaGVhZGxlc3MiLCBmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1R5cGVUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1R5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzIxMDJjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHM7Ci0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuQW50Q2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdENoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUeXBlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCi0JcHVibGljIFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlVUkxbXSB1cmxzPSBwcmVmcy5nZXRFeHRyYUNsYXNzcGF0aFVSTHMoKTsKLQkJVHlwZSBuZXdUeXBlPSBuZXcgVHlwZSgpOwotCQluZXdUeXBlLnNldExpYnJhcnlFbnRyeShuZXcgQW50Q2xhc3NwYXRoRW50cnkodXJsc1swXSkpOwotCQluZXdUeXBlLnNldFR5cGVOYW1lKCJhbnR0ZXN0cGF0aCIpOwotCQluZXdUeXBlLnNldENsYXNzTmFtZSgib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50eXBlcy5BbnRUZXN0UGF0aCIpOwotCQlwcmVmcy5zZXRDdXN0b21UeXBlcyhuZXcgVHlwZVtde25ld1R5cGV9KTsKLQkJCi0JCXJ1bigiQ3VzdG9tVHlwZS54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJUZXN0IGFkZGluZyBhIGN1c3RvbSB0eXBlIikpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUeXBlKCkgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0Q3VzdG9tVHlwZXMobmV3IFR5cGVbXXt9KTsKLQkJdHJ5IHsKLQkJCXJ1bigiQ3VzdG9tVHlwZS54bWwiKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiRXhjZXB0aW9uIGZyb20gdW5kZWZpbmVkIHR5cGUgaXMgaW5jb3JyZWN0OiAiKyBjZS5nZXRNZXNzYWdlKCksIGNlLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgiYXMgdGhpcyBpcyBub3QgYW4gQW50IGJ1Zy4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7CQotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0eXBlIG5vIGxvbmdlciBkZWZpbmVkIiwgZmFsc2UpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFR5cGVEZWZpbmVkSW5FeHRlbnNpb25Qb2ludCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJFeHRlbnNpb25Qb2ludFR5cGUueG1sIik7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDEpOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdHlwZSBpcyBwcmVzZW50IikpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlRGVmaW5lZEluRXh0ZW5zaW9uUG9pbnRIZWFkbGVzcygpIHsKLQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3ModHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlydW4oIkV4dGVuc2lvblBvaW50VHlwZS54bWwiKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiRXhjZXB0aW9uIGZyb20gdW5kZWZpbmVkIHR5cGUgaXMgaW5jb3JyZWN0OiAiICsgY2UuZ2V0TWVzc2FnZSgpLCBjZS5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoImFzIHRoaXMgaXMgbm90IGFuIEFudCBidWcuIikpOwotCQkJcmV0dXJuOwotCQl9IGZpbmFsbHkgewotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3MoZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0eXBlIHdhcyBub3QgZGVmaW5lZCB0byBydW4gaW4gaGVhZGxlc3MiLCBmYWxzZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY2xhc3NwYXRoIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTNiMDRjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBFZGl0b3IgVGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0IHBsdWdpbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkV4dGVybmFsIFRvb2xzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0idGVzdF9zdXBwb3J0X2JpbiIga2luZD0ic3JjIiBwYXRoPSJ0ZXN0IHN1cHBvcnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY3ZzaWdub3JlIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNiMGYwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi10ZXN0X3N1cHBvcnRfYmluCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBUZXN0IFN1cHBvcnQgSkFSLmxhdW5jaCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFRlc3QgU3VwcG9ydCBKQVIubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGI2MzVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFRlc3QgU3VwcG9ydCBKQVIubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfQlVJTERfU0NPUEUiIHZhbHVlPSIke3dvcmtpbmdfc2V0OiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsmIzEwOyZsdDtsYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2luZ1NldEZhY3RvcnkmcXVvdDsgbmFtZT0mcXVvdDt3b3JraW5nU2V0JnF1b3Q7IGVkaXRQYWdlSWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucmVzb3VyY2VXb3JraW5nU2V0UGFnZSZxdW90OyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sJnF1b3Q7IHR5cGU9JnF1b3Q7MSZxdW90Oy8mZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0bywiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7Jmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkmcXVvdDsgdHlwZT0mcXVvdDs0JnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWx9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWM4NTMwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hbnQudGVzdHMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgotCQkJCQk8dmFsdWU+QnVpbGQgVGVzdCBTdXBwb3J0IEpBUi5sYXVuY2g8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2NTRjZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBNYXkgMjcgMTQ6NDg6MzggUERUIDIwMDQNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLXNlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdF9zdXBwb3J0X2Jpbg0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZHRkL2R1bXBlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kdGQvZHVtcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZGM0ODYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kdGQvZHVtcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5kdGQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklEZm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5QYXJzZUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuUGFyc2VyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGhlbmNlIHRoZQotICogdW5jYXBpdGFsaXplZCBjbGFzcyBuYW1lKS4KLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgY2xhc3MgZHVtcGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IG1haW4oU3RyaW5nW10gYXJncykgewotCi0JCWlmIChhcmdzLmxlbmd0aCA8PSAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIERURE1lcmdlciBVUkwiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCVN0cmluZyBkb2N1bWVudCA9IGFyZ3NbMF07Ci0KLQkJUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIoKTsKLQkJCi0JCUlTY2hlbWEgc2NoZW1hOwotCQl0cnkgewotCQkJc2NoZW1hID0gcGFyc2VyLnBhcnNlKGRvY3VtZW50KTsKLQkJfSBjYXRjaCAoUGFyc2VFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiAxOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJEVEQgc3VjY2Vzc2Z1bGx5IHBhcnNlZCIpOwotCQlkdW1wU2NoZW1hKHNjaGVtYSk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSBzY2hlbWEgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFNjaGVtYShJU2NoZW1hIHNjaGVtYSkgewotCQlJRWxlbWVudFtdIGVsZW1lbnRzID0gc2NoZW1hLmdldEVsZW1lbnRzKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiIitlbGVtZW50cy5sZW5ndGgrIiBlbGVtZW50cyBkZWZpbmVkIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCUlNb2RlbCBtb2RlbCA9IGVsZW1lbnQuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVMRU1FTlQgIitlbGVtZW50LmdldE5hbWUoKQotCQkJCSsnIicrbW9kZWwuc3RyaW5nUmVwKCkrJyInKTsKLQkJCWR1bXBEZm0oZWxlbWVudC5nZXREZm0oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEdW1wIGRmbSBhcyBhIHNlcmllcyBvZiBzdGF0ZXMuCi0JICogPHByZT4KLQkgKiBTMCAgYT0+UzEgYj0+UzIgCi0JICogUzEgIGM9PlMyCi0JICogUzIqIGQ9PlMyCi0JICogPC9wcmU+Ci0JICogV2hlcmUgKiBpbmRpY2F0ZXMgYWNjZXB0aW5nIHN0YXRlLgotCSAqIEBwYXJhbSBkZm0gdG8gZHVtcAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcERmbShJRGZtIGRmbSkgewotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWR1bXBEZm0oZGZtLCBtYXAsIDApOwotCQlMaW5rZWRMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWxpc3QuYWRkKG5ldyBTdGF0ZSgoSURmbSllbnRyeS5nZXRLZXkoKSwgKEludGVnZXIpZW50cnkuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCVN0YXRlW10gc3RhdGVzID0gKFN0YXRlW10pIGxpc3QudG9BcnJheShuZXcgU3RhdGVbbGlzdC5zaXplKCldKTsKLQkJQXJyYXlzLnNvcnQoc3RhdGVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXByaW50KHN0YXRlc1tpXSwgbWFwKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnQoU3RhdGUgc3RhdGUsIEhhc2hNYXAgbWFwKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQoIiAgUyIrc3RhdGUubi5pbnRWYWx1ZSgpCi0JCQkrKHN0YXRlLmRmbS5pc0FjY2VwdGluZygpID8gIiogICIgOiAiICAiKSk7Ci0JCVN0cmluZ1tdIGFjY2VwdHMgPSBzdGF0ZS5kZm0uZ2V0QWNjZXB0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY2VwdHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhY2NlcHQgPSBhY2NlcHRzW2ldOwotCQkJSURmbSBuZXh0ID0gc3RhdGUuZGZtLmFkdmFuY2UoYWNjZXB0KTsKLQkJCWludCBuID0gKChJbnRlZ2VyKW1hcC5nZXQobmV4dCkpLmludFZhbHVlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgIithY2NlcHQrIj0+UyIrbik7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGludCBkdW1wRGZtKElEZm0gZGZtLCBIYXNoTWFwIG1hcCwgaW50IG51bSkgewotCQlpZiAoIW1hcC5jb250YWluc0tleShkZm0pKSB7Ci0JCQltYXAucHV0KGRmbSwgbmV3IEludGVnZXIobnVtKyspKTsKLQkJCVN0cmluZ1tdIGFjY2VwdHMgPSBkZm0uZ2V0QWNjZXB0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSURmbSBuZXh0ID0gZGZtLmFkdmFuY2UoYWNjZXB0c1tpXSk7Ci0JCQkJbnVtID0gZHVtcERmbShuZXh0LCBtYXAsIG51bSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGUgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQkJcHVibGljIElEZm0gZGZtOwotCQlwdWJsaWMgSW50ZWdlciBuOwotCQlwdWJsaWMgU3RhdGUoSURmbSBkZm0sIEludGVnZXIgbikgewotCQkJdGhpcy5kZm0gPSBkZm07Ci0JCQl0aGlzLm4gPSBuOwotCQl9Ci0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJCVN0YXRlIG90aGVyID0gKFN0YXRlKSBvOwotCQkJcmV0dXJuIG4uaW50VmFsdWUoKSA8IG90aGVyLm4uaW50VmFsdWUoKQotCQkJCT8gLTEgCi0JCQkJOiAobi5pbnRWYWx1ZSgpID09IG90aGVyLm4uaW50VmFsdWUoKSAKLQkJCQkJPyAwIAotCQkJCQk6IDEpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9BbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9BbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTE0ZDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvQW50RWRpdG9yQ29udGVudE91dGxpbmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nCi0gKiB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJILCAKLSAqIEJlcmxpbiwgRHVlc3NlbGRvcmYsIEZyYW5rZnVydCAoR2VybWFueSkgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqIAkgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRpdGlvbmFsIHRlc3RzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLkFudE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IubW9kZWwuQW50RWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgY29ycmVjdCBjcmVhdGlvbiBvZiB0aGUgb3V0bGluZSBmb3IgYW4geG1sIGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7Ci0gICAgCi0gICAgcHVibGljIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNyZWF0aW9uIG9mIHRoZSBBbnRFbGVtZW50Tm9kZSwgdGhhdCBpbmNsdWRlcyBwYXJzaW5nIGEgZmlsZQotICAgICAqIGFuZCBkZXRlcm1pbmluZyB0aGUgY29ycmVjdCBsb2NhdGlvbiBvZiB0aGUgdGFncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25PZk91dGxpbmVUcmVlKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJQW50TW9kZWwgbW9kZWw9IGdldEFudE1vZGVsKCJidWlsZHRlc3QxLnhtbCIpOwotICAgICAgICAKLQkJQW50RWxlbWVudE5vZGVbXSByb290cyA9IG1vZGVsLmdldFJvb3RFbGVtZW50cygpOwotCQlhc3NlcnROb3ROdWxsKHJvb3RzKTsKLQkJQW50RWxlbWVudE5vZGUgcm9vdFByb2plY3Q9IHJvb3RzWzBdOwotICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKHJvb3RQcm9qZWN0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgY29udGVudCBhcyBzdHJpbmcKLSAgICAgICAgU3RyaW5nIHdob2xlRG9jdW1lbnRTdHJpbmcgPSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIDxwcm9qZWN0PgotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZ2V0U3RhcnRpbmdSb3cocm9vdFByb2plY3QpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGdldFN0YXJ0aW5nQ29sdW1uKHJvb3RQcm9qZWN0KSk7Ci0gICAgICAgIGludCBvZmZzZXQgPSB3aG9sZURvY3VtZW50U3RyaW5nLmluZGV4T2YoInByb2plY3QiKTsKLQkgICAgYXNzZXJ0RXF1YWxzKG9mZnNldCwgcm9vdFByb2plY3QuZ2V0T2Zmc2V0KCkpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBjaGlsZHJlbiA9IHJvb3RQcm9qZWN0LmdldENoaWxkTm9kZXMoKTsKLQkJCi0JCS8vIDxwcm9wZXJ0eSBuYW1lPSJwcm9wRCI+Ci0JCUFudEVsZW1lbnROb2RlIGVsZW1lbnQgPSAoQW50RWxlbWVudE5vZGUpY2hpbGRyZW4uZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0U3RhcnRpbmdSb3coZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0U3RhcnRpbmdDb2x1bW4oZWxlbWVudCkpOyAvLyB3aXRoIHRhYiBpbiBmaWxlCi0JCWFzc2VydEVxdWFscygzLCBnZXRFbmRpbmdSb3coZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoMzksIGdldEVuZGluZ0NvbHVtbihlbGVtZW50KSk7ICAvLyB3aXRoIHRhYiBpbiBmaWxlCi0KLSAgICAgICAgb2Zmc2V0ID0gd2hvbGVEb2N1bWVudFN0cmluZy5pbmRleE9mKCJwcm9wZXJ0eSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2Zmc2V0LCBlbGVtZW50LmdldE9mZnNldCgpKTsKLSAgICAgICAgaW50IGxlbmd0aCA9ICI8cHJvcGVydHkgbmFtZT1cInByb3BEXCIgdmFsdWU9XCJ2YWxEXCIgLz4iLmxlbmd0aCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGVuZ3RoLSAxLCBlbGVtZW50LmdldExlbmd0aCgpKTsgLy93ZSBkbyBub3QgaW5jbHVkZSB0aGUgZmlyc3QgJzwnCi0JCQotCQkvLyA8cHJvcGVydHkgZmlsZT0iYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzIj4KLQkJZWxlbWVudCA9IChBbnRFbGVtZW50Tm9kZSljaGlsZHJlbi5nZXQoMSk7Ci0JCWFzc2VydEVxdWFscyg0LCBnZXRTdGFydGluZ1JvdyhlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscyg2LCBnZXRTdGFydGluZ0NvbHVtbihlbGVtZW50KSk7IC8vIG5vIHRhYgotCQlhc3NlcnRFcXVhbHMoNCwgZ2V0RW5kaW5nUm93KGVsZW1lbnQpKTsKLQkJYXNzZXJ0RXF1YWxzKDQ1LCBnZXRFbmRpbmdDb2x1bW4oZWxlbWVudCkpOwotCi0JCS8vIDxwcm9wZXJ0eSBuYW1lPSJwcm9wViI+Ci0JCWVsZW1lbnQgPSAoQW50RWxlbWVudE5vZGUpY2hpbGRyZW4uZ2V0KDIpOwotCQlhc3NlcnRFcXVhbHMoNSwgZ2V0U3RhcnRpbmdSb3coZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZ2V0U3RhcnRpbmdDb2x1bW4oZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZ2V0RW5kaW5nUm93KGVsZW1lbnQpKTsKLQkJYXNzZXJ0RXF1YWxzKDQyLCBnZXRFbmRpbmdDb2x1bW4oZWxlbWVudCkpOwotCQkKLQkJLy8gPHRhcmdldCBuYW1lPSJtYWluIj4KLQkJZWxlbWVudCA9IChBbnRFbGVtZW50Tm9kZSljaGlsZHJlbi5nZXQoMyk7Ci0JCWFzc2VydEVxdWFscyg2LCBnZXRTdGFydGluZ1JvdyhlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscyg2LCBnZXRTdGFydGluZ0NvbHVtbihlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscyg5LCBnZXRFbmRpbmdSb3coZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoMTMsIGdldEVuZGluZ0NvbHVtbihlbGVtZW50KSk7Ci0JCQotCQkvLyA8cHJvcGVydHkgbmFtZT0icHJvcGVydHlfaW5fdGFyZ2V0Ij4KLQkJZWxlbWVudCA9IChBbnRFbGVtZW50Tm9kZSllbGVtZW50LmdldENoaWxkTm9kZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyg3LCBnZXRTdGFydGluZ1JvdyhlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscygxMCwgZ2V0U3RhcnRpbmdDb2x1bW4oZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZ2V0RW5kaW5nUm93KGVsZW1lbnQpKTsKLQkJYXNzZXJ0RXF1YWxzKDU3LCBnZXRFbmRpbmdDb2x1bW4oZWxlbWVudCkpOwotICAgICAgICBvZmZzZXQgPSB3aG9sZURvY3VtZW50U3RyaW5nLmluZGV4T2YoInByb3BlcnR5IG5hbWU9XCJwcm9wZXJ0eV9pbl90YXJnZXRcIiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2Zmc2V0LCBlbGVtZW50LmdldE9mZnNldCgpKTsKLQkJCi0gICAgICAgIGFzc2VydEVxdWFscygyMSwgZ2V0RW5kaW5nUm93KHJvb3RQcm9qZWN0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCwgZ2V0RW5kaW5nQ29sdW1uKHJvb3RQcm9qZWN0KSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldENvbHVtbihpbnQgb2Zmc2V0LCBpbnQgbGluZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAJcmV0dXJuIG9mZnNldCAtIGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZSAtIDEpICsgMTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U3RhcnRpbmdSb3coQW50RWxlbWVudE5vZGUgZWxlbWVudCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAJcmV0dXJuIGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChlbGVtZW50LmdldE9mZnNldCgpKSArIDE7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldEVuZGluZ1JvdyhBbnRFbGVtZW50Tm9kZSBlbGVtZW50KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotICAgIAlyZXR1cm4gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mT2Zmc2V0KGVsZW1lbnQuZ2V0T2Zmc2V0KCkgKyBlbGVtZW50LmdldExlbmd0aCgpIC0gMSkgKyAxOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRTdGFydGluZ0NvbHVtbihBbnRFbGVtZW50Tm9kZSBlbGVtZW50KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotICAgIAlyZXR1cm4gZ2V0Q29sdW1uKGVsZW1lbnQuZ2V0T2Zmc2V0KCksIGdldFN0YXJ0aW5nUm93KGVsZW1lbnQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZ2V0RW5kaW5nQ29sdW1uKEFudEVsZW1lbnROb2RlIGVsZW1lbnQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgCXJldHVybiBnZXRDb2x1bW4oZWxlbWVudC5nZXRPZmZzZXQoKSArIGVsZW1lbnQuZ2V0TGVuZ3RoKCkgLSAxLCBnZXRFbmRpbmdSb3coZWxlbWVudCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjcmVhdGlvbiBvZiB0aGUgQW50RWxlbWVudE5vZGUsIHRoYXQgaW5jbHVkZXMgcGFyc2luZyBhIG5vbi12YWxpZCAKLSAgICAgKiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzaW5nT2ZOb25WYWxpZEZpbGUoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlBbnRNb2RlbCBtb2RlbD0gZ2V0QW50TW9kZWwoImJ1aWxkdGVzdDIueG1sIik7Ci0gICAgICAgIAotCQlBbnRFbGVtZW50Tm9kZVtdIHJvb3RzID0gbW9kZWwuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JCWFzc2VydE5vdE51bGwocm9vdHMpOwotCQlBbnRFbGVtZW50Tm9kZSByb290PSByb290c1swXTsKLSAgIAkJYXNzZXJ0Tm90TnVsbChyb290KTsKLQotICAgICAgICBMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0KLQkJLy8gPHRhcmdldCBuYW1lPSJtYWluIj4KLQkJQW50RWxlbWVudE5vZGUgZWxlbWVudCA9IChBbnRFbGVtZW50Tm9kZSljaGlsZHJlbi5nZXQoMik7Ci0JCWFzc2VydEVxdWFscyg1LCBnZXRTdGFydGluZ1JvdyhlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRTdGFydGluZ0NvbHVtbihlbGVtZW50KSk7IC8vIHdpdGggdGFiIGluIGZpbGUKLQkJYXNzZXJ0RXF1YWxzKDUsIGdldEVuZGluZ1JvdyhlbGVtZW50KSk7Ci0JCS8vbWFpbiBoYXMgbm8gZW5kaW5nIGNvbHVtbiBhcyB0aGUgZWxlbWVudCBpcyBub3QgY2xvc2VkCi0gICAgICAgIGludCBvZmZzZXQgPSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXQoKS5pbmRleE9mKCJ0YXJnZXQgbmFtZT1cIm1haW5cIiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2Zmc2V0LCBlbGVtZW50LmdldE9mZnNldCgpKTsgCi0gICAgfQotCi0JCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgb3V0bGluZSBjYW4gaGFuZGxlIGEgYnVpbGQgZmlsZSB3aXRoIG9ubHkgdGhlIDxwcm9qZWN0PjwvcHJvamVjdD4gdGFncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2l0aFByb2plY3RPbmx5QnVpbGRGaWxlKCkgewotCQlBbnRNb2RlbCBtb2RlbD0gZ2V0QW50TW9kZWwoInByb2plY3RPbmx5LnhtbCIpOwotCQlBbnRFbGVtZW50Tm9kZVtdIHJvb3RzID0gbW9kZWwuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JCWFzc2VydE5vdE51bGwocm9vdHMpOwotCQlBbnRFbGVtZW50Tm9kZSByb290PSByb290c1swXTsKLQkJYXNzZXJ0Tm90TnVsbChyb290KTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgb3V0bGluZSBjYW4gaGFuZGxlIGFuIGVtcHR5IGJ1aWxkIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdpdGhFbXB0eUJ1aWxkRmlsZSgpIHsKLQkJQW50TW9kZWwgbW9kZWw9IGdldEFudE1vZGVsKCJlbXB0eS54bWwiKTsKLQkJQW50RWxlbWVudE5vZGVbXSByb290cyA9IG1vZGVsLmdldFJvb3RFbGVtZW50cygpOwotCQlhc3NlcnROb3ROdWxsKHJvb3RzKTsKLQkJYXNzZXJ0VHJ1ZShyb290cy5sZW5ndGggPT0gMCk7Ci0JfQkJCi0KLQkvKioKLQkgKiBTb21lIHRlc3Rpbmcgb2YgZ2V0dGluZyB0aGUgcmlnaHQgbG9jYXRpb24gb2YgdGFncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWR2YW5jZWRUYXNrTG9jYXRpb24oKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlBbnRNb2RlbCBtb2RlbD0gZ2V0QW50TW9kZWwoIm91dGxpbmVfc2VsZWN0X3Rlc3RfYnVpbGQueG1sIik7Ci0gICAgICAgIAotCQlBbnRFbGVtZW50Tm9kZVtdIHJvb3RzID0gbW9kZWwuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocm9vdHMpOwotICAgICAgICBBbnRFbGVtZW50Tm9kZSByb290UHJvamVjdD0gcm9vdHNbMF07Ci0gICAgICAgIC8vIEdldCB0aGUgY29udGVudCBhcyBzdHJpbmcKLSAgICAgICAgU3RyaW5nIHdob2xlRG9jdW1lbnRTdHJpbmcgPSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIDxwcm9qZWN0PgotICAgICAgICBhc3NlcnROb3ROdWxsKHJvb3RQcm9qZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGdldFN0YXJ0aW5nUm93KHJvb3RQcm9qZWN0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBnZXRTdGFydGluZ0NvbHVtbihyb290UHJvamVjdCkpOwotICAgICAgICBpbnQgb2Zmc2V0ID0gd2hvbGVEb2N1bWVudFN0cmluZy5pbmRleE9mKCJwcm9qZWN0Iik7Ci0gICAgICAgIAotCSAgICBhc3NlcnRFcXVhbHMob2Zmc2V0LCByb290UHJvamVjdC5nZXRPZmZzZXQoKSk7Ci0gICAgICAgIAotCQkvLyA8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICBBbnRFbGVtZW50Tm9kZSBlbGVtZW50ID0gKEFudEVsZW1lbnROb2RlKXJvb3RQcm9qZWN0LmdldENoaWxkTm9kZXMoKS5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicHJvcGVydGllcyIsIGVsZW1lbnQuZ2V0TGFiZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxNiwgZ2V0U3RhcnRpbmdSb3coZWxlbWVudCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgZ2V0U3RhcnRpbmdDb2x1bW4oZWxlbWVudCkpOwotICAgICAgICBvZmZzZXQgPSB3aG9sZURvY3VtZW50U3RyaW5nLmluZGV4T2YoInRhcmdldCBuYW1lPVwicHJvcGVydGllc1wiIik7Ci0gICAgICAKLQkgICAgYXNzZXJ0RXF1YWxzKG9mZnNldCwgZWxlbWVudC5nZXRPZmZzZXQoKSk7Ci0JfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShBbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzLmNsYXNzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvQ29kZUNvbXBsZXRpb25UZXN0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9Db2RlQ29tcGxldGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiYzRlMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9Db2RlQ29tcGxldGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZwotICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCi0gKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkggLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkaXRpb25hbCB0ZXN0cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0LlRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5BYnN0cmFjdEFudFVJVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRlc3RzIGV2ZXJ5dGhpbmcgYWJvdXQgY29kZSBjb21wbGV0aW9uIGFuZCBjb2RlIGFzc2lzdGFuY2UuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvZGVDb21wbGV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb2RlQ29tcGxldGlvblRlc3QuCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29kZUNvbXBsZXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENvZGVDb21wbGV0aW9uVGVzdC5jbGFzcyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgYXR0cmlidXRlcyBvZiB0YXNrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlUHJvcG9zYWxzKCkgewotICAgICAgICBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcigpOwotCi0gICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJjb250YWlucyIsICJjYSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2FzZXNlbnNpdGl2ZSAtICh0cnVlIHwgZmFsc2UgfCBvbiB8IG9mZiB8IHllcyB8IG5vKSIsIHByb3Bvc2Fsc1swXS5nZXREaXNwbGF5U3RyaW5nKCkpOwotCi0gICAgICAgIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRBdHRyaWJ1dGVQcm9wb3NhbHMoIm1vdmUiLCAiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxNiwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBwcm9wb3NhbHNbMF07Ci0gICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJpZCIpIAotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygidGFza25hbWUiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygiZGVzY3JpcHRpb24iKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygiZmlsZSIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJwcmVzZXJ2ZWxhc3Rtb2RpZmllZCAtICh0cnVlIHwgZmFsc2UgfCBvbiB8IG9mZiB8IHllcyB8IG5vKSIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJ0b2ZpbGUiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygidG9kaXIiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygib3ZlcndyaXRlIC0gKHRydWUgfCBmYWxzZSB8IG9uIHwgb2ZmIHwgeWVzIHwgbm8pIikKLSAgICAgICAgfHwgZGlzcGxheVN0cmluZy5lcXVhbHMoImZpbHRlcmluZyAtICh0cnVlIHwgZmFsc2UgfCBvbiB8IG9mZiB8IHllcyB8IG5vKSIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJmbGF0dGVuIC0gKHRydWUgfCBmYWxzZSB8IG9uIHwgb2ZmIHwgeWVzIHwgbm8pIikKLSAgICAgICAgfHwgZGlzcGxheVN0cmluZy5lcXVhbHMoImluY2x1ZGVlbXB0eWRpcnMiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygiZmFpbG9uZXJyb3IgLSAodHJ1ZSB8IGZhbHNlIHwgb24gfCBvZmYgfCB5ZXMgfCBubykiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygidmVyYm9zZSAtICh0cnVlIHwgZmFsc2UgfCBvbiB8IG9mZiB8IHllcyB8IG5vKSIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJlbmNvZGluZyIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJvdXRwdXRlbmNvZGluZyIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJlbmFibGVtdWx0aXBsZW1hcHBpbmcgLSAodHJ1ZSB8IGZhbHNlIHwgb24gfCBvZmYgfCB5ZXMgfCBubykiKSk7Ci0gICAgICAgIAotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJtb3ZlIiwgInRvIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJyZWZlcmVuY2UiLCAiaWRsIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJyZWZlcmVuY2UiLCAiaWQiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImlkIiwgcHJvcG9zYWxzWzBdLmdldERpc3BsYXlTdHJpbmcoKSk7Ci0KLSAgICAgICAgcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldEF0dHJpYnV0ZVByb3Bvc2FscygicmVmZXJlbmNlIiwgImkiKTsKLSAgICAgICAgLy9pZCBpbmNsdWRlc2ZpbGUgaW5jbHVkZXMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgICAgICBkaXNwbGF5U3RyaW5nPSBwcm9wb3NhbHNbMF0uZ2V0RGlzcGxheVN0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJpZCIpIAotICAgICAgICAJCXx8ICBkaXNwbGF5U3RyaW5nLmVxdWFscygiaW5jbHVkZUZpbGUiKQotCQkJCXx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJpbmNsdWRlcyIpKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJwcm9qZWN0IiwgImRlIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwcm9wb3NhbHMubGVuZ3RoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgY29kZSBjb21wbGV0aW9uIGZvciBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdW5xdW90ZWQgKGJ1ZyA0MDg3MSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotICAgIAlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgiYnVpbGR0ZXN0MS54bWwiKSk7Ci0KLSAgICAJaW50IGxpbmVOdW1iZXI9IDc7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDE3OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3BlcnR5UHJvcG9zYWxzKGdldEN1cnJlbnREb2N1bWVudCgpLCAiIiwgbGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCWFzc2VydFRydWUocHJvcG9zYWxzLmxlbmd0aCA+PSAxKTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoInByb3AxIiwgcHJvcG9zYWxzKTsKLSAgICAJCi0gICAgCWxpbmVOdW1iZXI9IDE4OwotICAgIAljb2x1bW5OdW1iZXI9IDI1OwotICAgIAlsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCXByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wZXJ0eVByb3Bvc2FscyhnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIsIGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPj0gMSk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJwcm9wMiIsIHByb3Bvc2Fscyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgInN5c3RlbSIgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1Qcm9wZXJ0eVByb3Bvc2FscygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJidWlsZHRlc3QxLnhtbCIpKTsKLSAgICAJCi0gICAgCWludCBsaW5lTnVtYmVyPSAxODsKLSAgICAJaW50IGNvbHVtbk51bWJlcj0gMjU7Ci0gICAgCWludCBsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0UHJvcGVydHlQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksICIiLCBsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID49IDEpOwotICAgIAlhc3NlcnRDb250YWlucygiamF2YS5ob21lIiwgcHJvcG9zYWxzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgY29kZSBjb21wbGV0aW9uIGZvciB0aGUgZGVwZW5kIGF0dHJpYnV0ZSBvZiBhIHRhcmdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RGVwZW5kUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImJ1aWxkdGVzdDEueG1sIikpOwotICAgIAkvL3NpbXBsZSBkZXBlbmRzCi0gICAgCWludCBsaW5lTnVtYmVyPSAxMDsKLSAgICAJaW50IGNvbHVtbk51bWJlcj0gMzQ7Ci0gICAgCWludCBsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFyZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksIGdldEN1cnJlbnREb2N1bWVudCgpLmdldCgwLCBsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKSwgIiIsICJkZXBlbmRzIik7Ci0gICAgCWFzc2VydFRydWUocHJvcG9zYWxzLmxlbmd0aCA9PSA3KTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoInByZXRlc3QiLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnRDb250YWlucygidGVzdE1vcmVEZXBlbmRzIiwgcHJvcG9zYWxzKTsKLSAgICAJLy9jb21tYSBzZXBhcmF0ZWQgZGVwZW5kcwotICAgIAlsaW5lTnVtYmVyPSAxNzsKLSAgICAJY29sdW1uTnVtYmVyPSA1MzsKLSAgICAJbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFyZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksIGdldEN1cnJlbnREb2N1bWVudCgpLmdldCgwLCBsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKSwgIiIsICJkZXBlbmRzIik7Ci0gICAgCWFzc2VydFRydWUocHJvcG9zYWxzLmxlbmd0aCA9PSA2KTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoIm1haW4iLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnREb2VzTm90Q29udGFpbigicHJldGVzdCIsIHByb3Bvc2Fscyk7Ci0gICAgCQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIHRoZSBpZiBhdHRyaWJ1dGUgb2YgYSB0YXJnZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhcmdldElmUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImJ1aWxkdGVzdDEueG1sIikpOwotCi0gICAgCWludCBsaW5lTnVtYmVyPSAxNTsKLSAgICAJaW50IGNvbHVtbk51bWJlcj0gMzE7Ci0gICAgCWludCBsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFyZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksIGdldEN1cnJlbnREb2N1bWVudCgpLmdldCgwLCBsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKSwgIiIsICJpZiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPj0gMSk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJwcm9wMSIsIHByb3Bvc2Fscyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgdGhlIHVubGVzcyBhdHRyaWJ1dGUgb2YgYSB0YXJnZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhcmdldFVubGVzc1Byb3Bvc2FscygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJidWlsZHRlc3QxLnhtbCIpKTsKLQotICAgIAlpbnQgbGluZU51bWJlcj0gMTY7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDQzOwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFRhcmdldEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGdldEN1cnJlbnREb2N1bWVudCgpLCBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXQoMCwgbGluZU9mZnNldCArIGNvbHVtbk51bWJlciksICJwcm9wIiwgInVubGVzcyIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPj0gMSk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJwcm9wMSIsIHByb3Bvc2Fscyk7Ci0KLSAgICB9Ci0gICAgCi0gCS8qKgotIAkgKiBBc3NlcnRzIHRoYXQgPGNvZGU+ZGlzcGxheVN0cmluZzwvY29kZT4gaXMgaW4gb25lIG9mIHRoZSAKLSAJICogY29tcGxldGlvbiBwcm9wb3NhbHMuCi0gCSAqLwotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDb250YWlucyhTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FsQXJyYXkpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2FsQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBwcm9wb3NhbEFycmF5W2ldOwotICAgICAgICAgICAgU3RyaW5nIHByb3Bvc2FsRGlzcGxheVN0cmluZyA9IHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmKGRpc3BsYXlTdHJpbmcuZXF1YWxzKHByb3Bvc2FsRGlzcGxheVN0cmluZykpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGZvdW5kKTsKLSAgICB9ICAgICAgICAKLSAgICAKLSAgICAvKioKLSAJICogQXNzZXJ0cyB0aGF0IDxjb2RlPmRpc3BsYXlTdHJpbmc8L2NvZGU+IGlzIG5vdCBpbiBvbmUgb2YgdGhlIAotIAkgKiBjb21wbGV0aW9uIHByb3Bvc2Fscy4KLSAJICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydERvZXNOb3RDb250YWluKFN0cmluZyBkaXNwbGF5U3RyaW5nLCBJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxBcnJheSkgewotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHByb3Bvc2FsQXJyYXlbaV07Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcG9zYWxEaXNwbGF5U3RyaW5nID0gcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotICAgICAgICAgICAgaWYoZGlzcGxheVN0cmluZy5lcXVhbHMocHJvcG9zYWxEaXNwbGF5U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGZvdW5kKTsKLSAgICB9ICAgICAgICAKLQotCS8qKgotCSAqIFRlc3RzIHRoZSBwcm9wZXJ0eSBwcm9wb3NhbHMgZm9yIHRoZSBjYXNlIHRoYXQgdGhleSBhcmUgZGVmaW5lZCBpbgotCSAqIGEgZGVwZW5kZW50IHRhcmdldHMuCi0JICovCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5UHJvcG9zYWxEZWZpbmVkSW5EZXBlbmRhbnRUYXJnZXRzKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJkZXBlbmRlbmN5dGVzdC54bWwiKSk7Ci0KLSAgICAgICAgRmlsZSBmaWxlPSBnZXRCdWlsZEZpbGUoImRlcGVuZGVuY3l0ZXN0LnhtbCIpOwotICAgICAgICBwcm9jZXNzb3Iuc2V0RWRpdGVkRmlsZShmaWxlKTsKLQkJU3RyaW5nIGRvY3VtZW50VGV4dCA9IGdldEZpbGVDb250ZW50QXNTdHJpbmcoZmlsZSk7Ci0KLQkJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIoMzUpOwotCQlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKDQxKTsKLQkJaW50IGN1cnNvclBvc2l0aW9uID0gZG9jdW1lbnRUZXh0Lmxhc3RJbmRleE9mKCIkeyIpOwotCQlhc3NlcnRUcnVlKGN1cnNvclBvc2l0aW9uICE9IC0xKTsKLSAgICAgICAgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wZXJ0eVByb3Bvc2FscyhuZXcgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudChkb2N1bWVudFRleHQpLCAiIiwgY3Vyc29yUG9zaXRpb24rMik7Ci0JCWFzc2VydENvbnRhaW5zKCJpbml0X3Byb3AiLCBwcm9wb3NhbHMpOwotCQlhc3NlcnRDb250YWlucygibWFpbl9wcm9wIiwgcHJvcG9zYWxzKTsKLQkJYXNzZXJ0Q29udGFpbnMoInByb3BfcHJvcCIsIHByb3Bvc2Fscyk7Ci0JCWFzc2VydENvbnRhaW5zKCJkb19ub3RfY29tcGlsZSIsIHByb3Bvc2Fscyk7Ci0JCWFzc2VydENvbnRhaW5zKCJhZGl0X3Byb3AiLCBwcm9wb3NhbHMpOwotCQlhc3NlcnRDb250YWlucygiY29tcGlsZV9wcm9wIiwgcHJvcG9zYWxzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgdGFza3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBpbiB0aGUgYnVpbGRmaWxlCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbVRhc2tQcm9wb3NhbHMoKSB7Ci0JCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJ0YXNrZGVmLnhtbCIpKTsKLQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFRhc2tQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksICJ0YXJnZXQiLCAibWluIik7Ci0JCWFzc2VydEVxdWFscygxLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHByb3Bvc2Fsc1swXTsKLQkJYXNzZXJ0RXF1YWxzKCJtaW5lIiwgcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpKTsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgdGFza3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCB2aWEgdGhlIHRhc2sgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblBvaW50VGFza1Byb3Bvc2FscygpIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoInRhc2tkZWYueG1sIikpOwotCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscyhnZXRDdXJyZW50RG9jdW1lbnQoKSwgInRhcmdldCIsICJjb29sIik7Ci0JCWFzc2VydEVxdWFscyg0LCBwcm9wb3NhbHMubGVuZ3RoKTsKLQkJYXNzZXJ0Q29udGFpbnMoImNvb2xVSVRhc2siLCBwcm9wb3NhbHMpOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciB0YXNrcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIHZpYSBtYWNyb2RlZiBpbiB0aGUgYnVpbGRmaWxlCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdE1hY3JvZGVmUHJvcG9zYWxzKCkgewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgibWFjcm9kZWYueG1sIikpOwotCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscyhnZXRDdXJyZW50RG9jdW1lbnQoKSwgInRhcmdldCIsICJlY2xpcHNlbWEiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gcHJvcG9zYWxzWzBdOwotCQlhc3NlcnRFcXVhbHMoImVjbGlwc2VNYWNybyIsIHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKSk7Ci0gICAgICAgIAotCX0KLQkKLQkvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciBuZXN0ZWQgZWxlbWVudCBhdHRyaWJ1dGVzCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdE1hY3JvZGVmTmVzdGVkRWxlbWVudEF0dHJpYnV0ZVByb3Bvc2FscygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJtYWNyb2RlZi54bWwiKSk7Ci0JCWludCBsaW5lTnVtYmVyPSA1OwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAxMTsKLSAgICAJaW50IGxpbmVPZmZzZXQ9IGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDdXJzb3JQb3NpdGlvbihsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID09IDQpOwotICAgIAlhc3NlcnRDb250YWlucygiZGVzY3JpcHRpb24iLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnRDb250YWlucygibmFtZSIsIHByb3Bvc2Fscyk7Ci0JfQotCQotCS8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgdmlhIG1hY3JvZGVmIGluIHRoZSBidWlsZGZpbGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWFjcm9kZWZBdHRyaWJ1dGVQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgibWFjcm9kZWYueG1sIikpOwotCQlpbnQgbGluZU51bWJlcj0gMTI7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDE2OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gMik7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJ2IiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoImVjbGlwc2UiLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnRUcnVlKCJBZGRpdGlvbmFsIHByb3Bvc2FsIGluZm9ybWF0aW9uIG5vdCBjb3JyZWN0IiwgcHJvcG9zYWxzWzFdLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKS5zdGFydHNXaXRoKCJUZXN0aW5nIEVjbGlwc2UiKSk7Ci0JfQotCQotCS8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgdmlhIG1hY3JvZGVmIGluIHRoZSBidWlsZGZpbGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWFjcm9kZWZFbGVtZW50UHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoIm1hY3JvZGVmLnhtbCIpKTsKLQkJaW50IGxpbmVOdW1iZXI9IDEzOwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAzOwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gMSk7Ci0gICAgCWFzc2VydFRydWUoIlByb3Bvc2FsIG5vdCBjb3JyZWN0IiwgcHJvcG9zYWxzWzBdLmdldERpc3BsYXlTdHJpbmcoKS5lcXVhbHMoInNvbWUtdGFza3MiKSk7Ci0gICAgCWFzc2VydFRydWUoIkFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mb3JtYXRpb24gbm90IGNvcnJlY3QiLCBwcm9wb3NhbHNbMF0uZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpLmVuZHNXaXRoKCJOb3QgcmVxdWlyZWQiKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgdGFza3MgaGF2aW5nIHBhcmVudCB0YXNrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza1Byb3Bvc2FscygpIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImJ1aWxkdGVzdDEueG1sIikpOwotCi0gICAgICAgCi0gICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscygiICAgICAgICAgPCIsICJyZW5hbWUiLCAiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscygiICAgICAgIDxjbCIsICJwcm9wZXJ0eSIsICJjbCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBwcm9wb3NhbHNbMF07Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2xhc3NwYXRoIiwgcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscygiICAgICAgIDxwciIsICJwcm9wZXJ0eSIsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgICAgICBwcm9wb3NhbCA9IHByb3Bvc2Fsc1swXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzc3BhdGgiLCBwcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gIjxwcm9qZWN0Pjx0YXJnZXQ+PG1rIgotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscygiPHByb2plY3Q+PHRhcmdldD48bWsiLCAidGFyZ2V0IiwgIm1rIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwcm9wb3NhbHMubGVuZ3RoKTsKLSAgICAgICAgcHJvcG9zYWwgPSBwcm9wb3NhbHNbMF07Ci0gICAgICAgIGFzc2VydEVxdWFscygibWtkaXIiLCBwcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCkpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogVGVzdCBmb3IgYnVnIDQwOTUxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1peGVkRWxlbWVudHMoKSB7Ci0JCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJtaXhlZC54bWwiKSk7Ci0JCS8vU3RyaW5nIHN0cmluZyA9ICI8cHJvamVjdD48dGFyZ2V0PjxzcWwgZHJpdmVyPVwiXCIgcGFzc3dvcmQ9XCJcIiB1cmw9XCJcIiB1c2VyaWQ9XCJcIj48L3NxbD48Y29uY2F0PjwvY29uY2F0PiI7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscyhnZXRDdXJyZW50RG9jdW1lbnQoKSwgcHJvY2Vzc29yLmdldFBhcmVudE5hbWUoZ2V0Q3VycmVudERvY3VtZW50KCksIDAsIDYyKSwgInQiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gcHJvcG9zYWxzWzBdOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zYWN0aW9uIiwgcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpKTsKLQkJCi0JCXByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRUYXNrUHJvcG9zYWxzKGdldEN1cnJlbnREb2N1bWVudCgpLCBwcm9jZXNzb3IuZ2V0UGFyZW50TmFtZShnZXRDdXJyZW50RG9jdW1lbnQoKSwgMCwgNzYpLCAiIik7Ci0JCS8vZmlsZWxpc3QgZmlsZXNldCBmaWx0ZXJjaGFpbiBmb290ZXIgaGVhZGVyIHBhdGgKLQkJYXNzZXJ0RXF1YWxzKDYsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQlwcm9wb3NhbCA9IHByb3Bvc2Fsc1swXTsKLQkJYXNzZXJ0RXF1YWxzKCJmaWxlbGlzdCIsIHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKSk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBjaGlsZCBhcyB1c2VkIGJ5IHRoZSBwcm9jZXNzb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRDaGlsZEVsZW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIHRlc3QgZGF0YQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyZW50Iik7Ci0gICAgICAgIEF0dHIgYXR0cmlidXRlID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZSgiYXR0MSIpOwotICAgICAgICBwYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKLSAgICAgICAgQ29tbWVudCBjb21tZW50ID0gZG9jLmNyZWF0ZUNvbW1lbnQoImxha2pqZmxzYWtkZmoiKTsKLSAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjb21tZW50KTsKLSAgICAgICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiY2hpbGQiKTsKLSAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgICBjaGlsZEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgic2Vjb25kY2hpbGQiKTsKLSAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBwcm9jZXNzb3IKLSAgICAgICAgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgaXQhCi0gICAgICAgIGNoaWxkRWxlbWVudCA9IHByb2Nlc3Nvci5maW5kQ2hpbGRFbGVtZW50TmFtZWRPZihwYXJlbnRFbGVtZW50LCAiamtsIik7Ci0gICAgICAgIGFzc2VydE51bGwoY2hpbGRFbGVtZW50KTsKLSAgICAgICAgY2hpbGRFbGVtZW50ID0gcHJvY2Vzc29yLmZpbmRDaGlsZEVsZW1lbnROYW1lZE9mKHBhcmVudEVsZW1lbnQsICJzZWNvbmRjaGlsZCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic2Vjb25kY2hpbGQiLCBjaGlsZEVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgcHJvY2Vzc29yIGNvcnJlY3RseSBkZXRlcm1pbmVzIHRoZSBhdHRyaWJ1dGUgcHJvcG9zYWwgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZXRlcm1pbmluZ0F0dHJpYnV0ZVByb3Bvc2FsTW9kZSgpIHsKLSAgICAgICAgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLSAgICAgICAgaW50IG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48cHJvcGVydHkgdGEiLCAyMSwgInRhIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9QUk9QT1NBTCwgbW9kZSk7Ci0gICAgICAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48cHJvcGVydHkgIiwgMTksICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMLCBtb2RlKTsKLSAgICAgICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjxwcm9wZXJ0eSAgICIsIDIxLCAiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9QUk9QT1NBTCwgbW9kZSk7Ci0gICAgICAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvcGVydHkgaWQ9XCJodVwiICIsIDE4LCAiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9QUk9QT1NBTCwgbW9kZSk7Ci0gICAgICAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvcGVydHkgaWQ9XCJodVwiIFxyXG4gIiwgMjEsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMLCBtb2RlKTsKLSAgICAgICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9wZXJ0eVxuIiwgMTAsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMLCBtb2RlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgcHJvY2Vzc29yIGNvcnJlY3RseSBkZXRlcm1pbmVzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgcHJvcG9zYWwgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZXRlcm1pbmluZ0F0dHJpYnV0ZVZhbHVlUHJvcG9zYWxNb2RlKCkgewotICAgICAgICBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcigpOwotICAgICAgICBpbnQgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjxwcm9wZXJ0eSB0YWtlPVwiIiwgMjUsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1ZBTFVFX1BST1BPU0FMLCBtb2RlKTsKLSAgICAgICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9wZXJ0eSBpZD1cImh1XCIgIiwgMTQsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1ZBTFVFX1BST1BPU0FMLCBtb2RlKTsKLSAgICAgICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9wZXJ0eSBpZD1cImh1XCIgXHJcbiAiLCAxNiwgImh1Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9WQUxVRV9QUk9QT1NBTCwgbW9kZSk7Ci0gICAgICAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvcGVydHkgXG5cdFx0aWQ9XCJodVwiIFxyXG4gIiwgMTksICJodSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9BVFRSSUJVVEVfVkFMVUVfUFJPUE9TQUwsIG1vZGUpOwotICAgIH0KLSAgICAKLQkvKioKLQkqIFRlc3RzIGhvdyB0aGUgcHJvY2Vzc29yIGRldGVybWluZXMgdGhlIHByb3Bvc2FsIG1vZGUuCi0JKi8KLSAgIHB1YmxpYyB2b2lkIHRlc3REZXRlcm1pbmluZ1Byb3BlcnR5UHJvcG9zYWxNb2RlKCkgewotCSAgIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JICAgaW50IG1vZGUgPXByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjx0YXJnZXQgbmFtZT1cIiRcIiIsIDI0LCAiIik7Ci0JICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfUFJPUEVSVFlfUFJPUE9TQUwsIG1vZGUpOwotCSAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48dGFyZ2V0IG5hbWU9XCIke1wiIiwgMjUsICIiKTsKLQkgICBhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTCwgbW9kZSk7Ci0JICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjx0YXJnZXQgbmFtZT1cIiR7amEuYmxcIiIsIDMwLCAiamEuYmwiKTsKLQkgICBhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTCwgbW9kZSk7Ci0JICAKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjx0YXJnZXQ+PGVjaG8+JHsiLCAyNSwgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTCwgbW9kZSk7Ci0gICB9Ci0gICAgCi0JLyoqCi0JICogVGVzdHMgaG93IHRoZSBwcm9jZXNzb3IgZGV0ZXJtaW5lcyB0aGUgcHJvcG9zYWwgbW9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5pbmdUYXNrUHJvcG9zYWxNb2RlKCkgewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcigpOwotICAgIAotCQlpbnQgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjxwcm9wIiwgMTQsICJwcm9wIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUwsIG1vZGUpOwotCQltb2RlID0gcHJvY2Vzc29yLmRldGVybWluZVByb3Bvc2FsTW9kZSgiPHByb2plY3Q+IGhqayIsIDEzLCAiIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUwsIG1vZGUpOwotCQltb2RlID0gcHJvY2Vzc29yLmRldGVybWluZVByb3Bvc2FsTW9kZSgiPHByb2plY3Q+IGhqazwiLCAxNCwgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsgLy8gYWxsb3cgdGhpcyBjYXNlIHRob3VnaCBpdCBpcyBub3QgdmFsaWQgd2l0aCBBbnQKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0PiIsIDksICIiKTsKLQkJYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTCwgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD4gIiwgMTAsICIiKTsKLQkJYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTCwgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48LyIsIDExLCAiIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUxfQ0xPU0lORywgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48IDwvcHJvamVjdD4iLCAxMCwgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0IGRlZmF1bHQ9XCJoZXlcIj48dGFyZ2V0IG5hbWU9XCJoZXlcIj5hPC90YXJnZXQ+PC9wcm9qZWN0PiIsIDQ0LCAiYSIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0IGRlZmF1bHQ9XCJoZXlcIj48dGFyZ2V0IG5hbWU9XCJoZXlcIj48L3RhcmdldD48L3Byb2plY3Q+IiwgNDMsICIiKTsKLQkJYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTCwgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdCBkZWZhdWx0PVwiaGV5XCI+PHRhcmdldCBuYW1lPVwiaGV5XCI+PGE8L3RhcmdldD48L3Byb2plY3Q+IiwgNDUsICI8YSIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjx0YXJnZXQgbmFtZT1cIm1haW5cIj48emlwPjxzaXplPjwvc2l6ZT48L3ppcD48LyIsIDQ2LCAiIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUxfQ0xPU0lORywgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCIiLCAwLCAiIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0JVSUxERklMRSwgbW9kZSk7Ci0JCW1vZGU9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0IGRlZmF1bHQ9XCJoZXlcIj48dGFyZ2V0IG5hbWU9XCJoZXlcIj48amF2YWM+YTwvamF2YWM+PC90YXJnZXQ+PC9wcm9qZWN0PiIsIDUxLCAiYSIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0PiBoamsiLCAxMywgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgaG93IHRoZSBwcm9jZXNzb3IgZGV0ZXJtaW5lcyB0aGUgcHJvcG9zYWwgbW9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5pbmdUYXNrQ2xvc2luZ1Byb3Bvc2FsTW9kZSgpIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkKLQkJaW50IG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8dGFyZ2V0IG5hbWU9XCJtYWluXCI+PHppcD48c2l6ZT48L3NpemU+PC96aXA+PC8iLCA0NiwgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMX0NMT1NJTkcsIG1vZGUpOwotCX0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGhvdyB0aGUgcHJlZml4IHdpbGwgYmUgZGV0ZXJtaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5pbmdQcmVmaXgoKSB7Ci0gICAgICAgIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0KLSAgICAgICAgLy8gY3Vyc29yIGFmdGVyICR7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBwcm9jZXNzb3IuZ2V0UHJlZml4RnJvbURvY3VtZW50KCI8cHJvamVjdD48dGFyZ2V0IG5hbWU9XCIke31cIiIsIDI1KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBwcmVmaXgpOwotCi0gICAgICAgIC8vIGN1cnNvciBhZnRlciAkCi0gICAgICAgIHByZWZpeCA9IHByb2Nlc3Nvci5nZXRQcmVmaXhGcm9tRG9jdW1lbnQoIjxwcm9qZWN0Pjx0YXJnZXQgbmFtZT1cIiR7XCIiLCAyNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgcHJlZml4KTsKLQotICAgICAgICAvLyBjdXJzb3IgYWZ0ZXIgJHtqYS4KLSAgICAgICAgcHJlZml4ID0gcHJvY2Vzc29yLmdldFByZWZpeEZyb21Eb2N1bWVudCgiPHByb2plY3Q+PHRhcmdldCBuYW1lPVwiJHtqYS5cIiIsIDI4KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYS4iLCBwcmVmaXgpOwotICAgICAgICAKLSAgICAgICAgLy8gY3Vyc29yIGFmdGVyIDwKLQkJcHJlZml4ID0gcHJvY2Vzc29yLmdldFByZWZpeEZyb21Eb2N1bWVudCgiPHByb2plY3Q+PCIsIDEwKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBwcmVmaXgpOwotCQkKLQkJcHJlZml4ID0gcHJvY2Vzc29yLmdldFByZWZpeEZyb21Eb2N1bWVudCgiPHByb2plY3QgbmFtZT0gXCJ0ZXN0XCI+PHRhciIsIDI2KTsKLQkJYXNzZXJ0RXF1YWxzKCJ0YXIiLCBwcmVmaXgpOwotCQkKLQkJcHJlZml4ID0gcHJvY2Vzc29yLmdldFByZWZpeEZyb21Eb2N1bWVudCgicHJvIiwgMyk7Ci0JCWFzc2VydEVxdWFscygicHJvIiwgcHJlZml4KTsKLSAgICB9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIGhvdyB0aGUgcHJvY2Vzc29yIGRldGVybWluZXMgdGhlIHByb3Bvc2FsIG1vZGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERldGVybWluaW5nTm9uZVByb3Bvc2FsTW9kZSgpIHsKLSAgICAgICAgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQotICAgICAgICBpbnQgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjxwcm9wIGJsYSIsIDE4LCAiYmxhIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX05PTkUsIG1vZGUpOwotCQltb2RlPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdCBkZWZhdWx0PVwiaGV5XCI+PHRhcmdldCBuYW1lPSIsIDM3LCAibmFtZT0iKTsKLQkJYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfTk9ORSwgbW9kZSk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIHRhc2tzIGluIGFuIGVtcHR5IGJ1aWxkIGZpbGUgKG5vIHBhcmVudCkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhc2tQcm9wb3NhbHNGb3JFbXB0eUJ1aWxkRmlsZSgpIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImVtcHR5LnhtbCIpKTsKLQotICAgICAgICBJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldEJ1aWxkRmlsZVByb3Bvc2FscygiIiwgIiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicHJvamVjdCIsIHByb3Bvc2Fsc1swXS5nZXREaXNwbGF5U3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldEJ1aWxkRmlsZVByb3Bvc2FscygiICAgICAgICAgICAgamwiLCAiamwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgICAgICAKLSAgICAgICAgcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldEJ1aWxkRmlsZVByb3Bvc2FscygiICAgIFxuPHByb2plY3Q+PC9wcm9qZWN0PiIsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciByZWZpZHMgKEJ1ZyA0OTgzMCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmaWRQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgicmVmaWQueG1sIikpOwotCi0JCWludCBsaW5lTnVtYmVyPSA5OwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAxNjsKLSAgICAJaW50IGxpbmVPZmZzZXQ9IGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDdXJzb3JQb3NpdGlvbihsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJLy9mb3Igc3VyZSBzaG91bGQgaGF2ZSBwcm9qZWN0LmNsYXNzLnBhdGggYW5kIHByb2plY3QuY2xhc3MucGF0aDIKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID49IDIpOwotICAgIAlhc3NlcnRDb250YWlucygicHJvamVjdC5jbGFzcy5wYXRoIiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0RG9lc05vdENvbnRhaW4oInByb2plY3QuY2xhc3MucGF0aDIiLCBwcm9wb3NhbHMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciBjdXN0b20gdGFzayB0aGF0IGhhcyBhIGJvb2xlYW4gYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUJvb2xlYW5Qcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgiY3VzdG9tQm9vbGVhbi54bWwiKSk7Ci0KLQkJaW50IGxpbmVOdW1iZXI9IDI7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDQ0OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAkvL3RydWUgZmFsc2UgeWVzIG5vIG9uIG9mZgotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gNik7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJ0cnVlIiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoIm5vIiwgcHJvcG9zYWxzKTsKLSAgICB9Ci0gICAgCi0gICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIGN1c3RvbSB0YXNrIHRoYXQgaGFzIGFuIGVudW1lcmF0ZWQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUVudW1lcmF0ZWRQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgiZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0ueG1sIikpOwotCQlpbnQgbGluZU51bWJlcj0gMjsKLSAgICAJaW50IGNvbHVtbk51bWJlcj0gMjQ7Ci0gICAgCWludCBsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0UHJvcG9zYWxzRnJvbURvY3VtZW50KGdldEN1cnJlbnREb2N1bWVudCgpLCAiYyIpOwotICAgIAlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgcHJvcG9zYWxzIiwgMiwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJjb29sIiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoImNoaWxsaW4iLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnREb2VzTm90Q29udGFpbigiYXdlc29tZSIsIHByb3Bvc2Fscyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIGN1c3RvbSB0YXNrIHRoYXQgaGF2ZSBhIHJlZmVyZW5jZSBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tUmVmZXJlbmNlUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImV4dGVuc2lvblBvaW50VGFza1NlcFZNLnhtbCIpKTsKLQkJaW50IGxpbmVOdW1iZXI9IDI7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDQxOwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgImUiKTsKLSAgICAJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHByb3Bvc2FscyIsIDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgIAkvL3RoZSByZWZlcmVuY2UgdG8gdGhlIHByb2plY3QgYnkgbmFtZQotICAgIAlhc3NlcnRDb250YWlucygiRXh0ZW5zaW9uIFBvaW50IFRhc2siLCBwcm9wb3NhbHMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciBuZXN0ZWQgZWxlbWVudCBhdHRyaWJ1dGVzIG9mIGN1c3RvbSB0YXNrcwotICAgICAqLwotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFbGVtZW50QXR0cmlidXRlUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoIm5lc3RlZEVsZW1lbnRBdHRyaWJ1dGVzLnhtbCIpKTsKLQkJaW50IGxpbmVOdW1iZXI9IDQ7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDE4OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gMSk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJ3b3JrcyIsIHByb3Bvc2Fscyk7Ci0JfQotCQotCS8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIG5lc3RlZCBlbGVtZW50IGF0dHJpYnV0ZSB2YWx1ZXMgb2YgY3VzdG9tIHRhc2tzCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZEVsZW1lbnRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJuZXN0ZWRFbGVtZW50QXR0cmlidXRlcy54bWwiKSk7Ci0gICAgCWludCBsaW5lTnVtYmVyPSA0OwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAyNTsKLSAgICAJaW50IGxpbmVPZmZzZXQ9IGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDdXJzb3JQb3NpdGlvbihsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID09IDYpOyAvL3RoZSBib29sZWFuIHByb3Bvc2FscwotICAgIAlhc3NlcnRDb250YWlucygidHJ1ZSIsIHByb3Bvc2Fscyk7Ci0JfQotCQotCS8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gd2hlbiBhIHBhcnNlIGVycm9yIG9jY3VycyBpbiB0aGUgcHJvamVjdCBkZWZpbml0aW9uCi0gICAgICogYnVnIDYzMTUxCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdEJhZFByb2plY3RQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgiYmFkcHJvamVjdC54bWwiKSk7Ci0gICAgCWludCBsaW5lTnVtYmVyPSAwOwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAxMDsKLSAgICAJaW50IGxpbmVPZmZzZXQ9IGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDdXJzb3JQb3NpdGlvbihsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICJuIik7Ci0gICAgCWFzc2VydFRydWUocHJvcG9zYWxzLmxlbmd0aCA9PSAxKTsgCi0gICAgCWFzc2VydENvbnRhaW5zKCJuYW1lIiwgcHJvcG9zYWxzKTsKLQl9Ci0JCi0JLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgYXR0cmlidXRlIHZhbHVlIHByb3Bvc2FscyBib3RoIHdpdGggYW5kIHdpdGhvdXQgbGVhZGluZyB3aGl0ZXNwYWNlCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImphdmFjLnhtbCIpKTsKLSAgICAJaW50IGxpbmVOdW1iZXI9IDI7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDI5OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gNik7IC8vYm9vbGVhbiBwcm9wb3NhbHMgCi0gICAgCWFzc2VydENvbnRhaW5zKCJmYWxzZSIsIHByb3Bvc2Fscyk7Ci0gICAgCQotICAgIAlsaW5lTnVtYmVyPSAzOwotICAgIAljb2x1bW5OdW1iZXI9IDE5OwotICAgIAlsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCXByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID09IDYpOyAvL2Jvb2xlYW4gcHJvcG9zYWxzIAotICAgIAlhc3NlcnRDb250YWlucygidHJ1ZSIsIHByb3Bvc2Fscyk7Ci0gICAgCQotICAgIAlsaW5lTnVtYmVyPSA0OwotICAgIAljb2x1bW5OdW1iZXI9IDIyOwotICAgIAlsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCXByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID09IDYpOyAvL2Jvb2xlYW4gcHJvcG9zYWxzIAotICAgIAlhc3NlcnRDb250YWlucygibm8iLCBwcm9wb3NhbHMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9UYXNrRGVzY3JpcHRpb25Qcm92aWRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL1Rhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjFlY2RkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL1Rhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcKLSAqIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkgsIAotICogQmVybGluLCBEdWVzc2VsZG9yZiwgRnJhbmtmdXJ0IChHZXJtYW55KS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5UYXNrRGVzY3JpcHRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgdGFza3MgZGVzY3JpcHRpb24gcHJvdmlkZXIuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIHB1YmxpYyBUYXNrRGVzY3JpcHRpb25Qcm92aWRlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRlc3RzIGdldHRpbmcgdGhlIGRlc2NyaXB0aW9uIG9mIGEgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0dGluZ1Rhc2tEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBUYXNrRGVzY3JpcHRpb25Qcm92aWRlci5nZXREZWZhdWx0KCk7Ci0gICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHByb3ZpZGVyLmdldERlc2NyaXB0aW9uRm9yVGFzaygiYXBwbHkiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdGlvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBnZXR0aW5nIHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldHRpbmdBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RGVmYXVsdCgpOwotICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwcm92aWRlci5nZXREZXNjcmlwdGlvbkZvclRhc2tBdHRyaWJ1dGUoImFwcGx5IiwgImV4ZWN1dGFibGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdGlvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgZ2V0dGluZyB0aGUgcmVxdWlyZWQgdmFsdWUgb2YgYW4gYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXR0aW5nUmVxdWlyZWQoKSB7Ci0gICAgICAgIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RGVmYXVsdCgpOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBwcm92aWRlci5nZXRSZXF1aXJlZEF0dHJpYnV0ZUZvclRhc2tBdHRyaWJ1dGUoImFwcGx5IiwgImV4ZWN1dGFibGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXF1aXJlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygieWVzIiwgcmVxdWlyZWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXJUZXN0LmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL0Zvcm1hdHRpbmdQcmVmZXJlbmNlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5NWNmYy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuRm9ybWF0dGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OwotCi1wdWJsaWMgY2xhc3MgRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIEZvcm1hdHRpbmdQcmVmZXJlbmNlc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENhbm9uaWNhbEluZGVudCgpIHsKLSAgICAgCi0gICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmczsKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3Qgc3BhY2VzIAotICAgICAgICBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlU3BhY2VzSW5zdGVhZE9mVGFicygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIiAgICIscHJlZnMuZ2V0Q2Fub25pY2FsSW5kZW50KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBub3QgaGFyZCBjb2RlZAotICAgICAgICBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlU3BhY2VzSW5zdGVhZE9mVGFicygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIiAgICAgICAiLHByZWZzLmdldENhbm9uaWNhbEluZGVudCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHVzZSB0YWIgY2hhcmFjdGVyCi0gICAgICAgIHByZWZzID0gbmV3IEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpewotICAgICAgICAgICAgcHVibGljIGludCBnZXRUYWJXaWR0aCgpIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VTcGFjZXNJbnN0ZWFkT2ZUYWJzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIlx0IixwcmVmcy5nZXRDYW5vbmljYWxJbmRlbnQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRG9jdW1lbnRGb3JtYXR0ZXJUZXN0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRG9jdW1lbnRGb3JtYXR0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTJkZDUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbERvY3VtZW50Rm9ybWF0dGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuRm9ybWF0dGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbERvY3VtZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OwotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhtbERvY3VtZW50Rm9ybWF0dGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFhtbERvY3VtZW50Rm9ybWF0dGVyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmFsIFRlc3QgCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdlbmVyYWxGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzID0gbmV3IEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpewotICAgICAgICAgICAgcHVibGljIGludCBnZXRUYWJXaWR0aCgpIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdHJpcEJsYW5rTGluZXMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlU3BhY2VzSW5zdGVhZE9mVGFicygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2ltcGxlVGVzdCgiZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwiLCJmb3JtYXRUZXN0X3RhcmdldDAxLnhtbCIscHJlZnMpOyAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zdXJlIHRoYXQgdGFiIHdpZHRoIGlzIG5vdCBoYXJkIGNvZGVkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRhYldpZHRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc3RyaXBCbGFua0xpbmVzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHNpbXBsZVRlc3QoImZvcm1hdFRlc3Rfc291cmNlMDEueG1sIiwiZm9ybWF0VGVzdF90YXJnZXQwMi54bWwiLHByZWZzKTsgICAgICAgIAotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3Qgd2l0aCB0YWIgY2hhcmFjdGVycyBpbnN0ZWFkIG9mIHNwYWNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VGFic0luc3RlYWRPZlNwYWNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHN0cmlwQmxhbmtMaW5lcygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VTcGFjZXNJbnN0ZWFkT2ZUYWJzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2ltcGxlVGVzdCgiZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwiLCJmb3JtYXRUZXN0X3RhcmdldDAzLnhtbCIscHJlZnMpOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZSAtIGZpbGUgdG8gZm9ybWF0Ci0gICAgICogQHBhcmFtIHRhcmdldEZpbGVOYW1lIC0gdGhlIHNvdXJjZSBmaWxlIGFmdGVyIGEgcHJvcGVybHkgZXhlY3V0ZWQgZm9ybWF0Ci0gICAgICogQHBhcmFtIHByZWZzIC0gZ2l2ZW4gdGhlIGluY2x1ZGVkIHByZWZlcmVuY2UgaW5zdHJ1Y3Rpb25zCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2ltcGxlVGVzdChTdHJpbmcgc291cmNlRmlsZU5hbWUsIFN0cmluZyB0YXJnZXRGaWxlTmFtZSwgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIFhtbERvY3VtZW50Rm9ybWF0dGVyIHhtbEZvcm1hdHRlciA9IG5ldyBYbWxEb2N1bWVudEZvcm1hdHRlcigpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0geG1sRm9ybWF0dGVyLmZvcm1hdChnZXRGaWxlQ29udGVudEFzU3RyaW5nKGdldEJ1aWxkRmlsZShzb3VyY2VGaWxlTmFtZSkpLHByZWZzKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gZ2V0RmlsZUNvbnRlbnRBc1N0cmluZyhnZXRCdWlsZEZpbGUodGFyZ2V0RmlsZU5hbWUpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdCwgcmVzdWx0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRm9ybWF0dGVyVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbEZvcm1hdHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlOTdmOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRm9ybWF0dGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuRm9ybWF0dGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhtbEZvcm1hdHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Rm9ybWF0VXNpbmdQcmVmZXJlbmNlU3RvcmUoKSB7Ci0gICAgICAgIFByZWZlcmVuY2VzIHByZWZzID0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gICAgICAgIHByZWZzLnNldFZhbHVlKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRk9STUFUVEVSX1dSQVBfTE9ORywgdHJ1ZSk7Ci0gICAgICAgIHByZWZzLnNldFZhbHVlKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRk9STUFUVEVSX01BWF9MSU5FX0xFTkdUSCwgNDApOwotICAgICAgICBwcmVmcy5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTiwgZmFsc2UpOwotICAgICAgICBwcmVmcy5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUk1BVFRFUl9UQUJfQ0hBUiwgdHJ1ZSk7Ci0gICAgICAgIHByZWZzLnNldFZhbHVlKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRk9STUFUVEVSX1RBQl9TSVpFLCA0KTsKLSAgICAgICAgU3RyaW5nIHhtbERvYyA9ICI8cHJvamVjdCBkZWZhdWx0PVwiZ29cIj48dGFyZ2V0IG5hbWU9XCJnb1wiIGRlc2NyaXB0aW9uPVwiRGVtb25zdHJhdGUgdGhlIHdyYXBwaW5nIG9mIGxvbmcgdGFncy5cIj48ZWNobz5oaTwvZWNobz48L3RhcmdldD48L3Byb2plY3Q+IjsKLSAgICAgICAgU3RyaW5nIGZvcm1hdHRlZERvYyA9IFhtbEZvcm1hdHRlci5mb3JtYXQoeG1sRG9jKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIjxwcm9qZWN0IGRlZmF1bHQ9XCJnb1wiPlxuXHQ8dGFyZ2V0IG5hbWU9XCJnb1wiXG5cdCAgICAgICAgZGVzY3JpcHRpb249XCJEZW1vbnN0cmF0ZSB0aGUgd3JhcHBpbmcgb2YgbG9uZyB0YWdzLlwiPlxuXHRcdDxlY2hvPmhpPC9lY2hvPlxuXHQ8L3RhcmdldD5cbjwvcHJvamVjdD4iOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGZvcm1hdHRlZERvYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEZvcm1hdFdpdGhQcmVmZXJlbmNlUGFyYW1ldGVyKCkgewotICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gd3JhcExvbmdUYWdzKCkgeyByZXR1cm4gdHJ1ZTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldE1heGltdW1MaW5lV2lkdGgoKSB7IHJldHVybiA0MDt9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSB7IHJldHVybiBmYWxzZTt9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VTcGFjZXNJbnN0ZWFkT2ZUYWJzKCkgeyByZXR1cm4gdHJ1ZTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyByZXR1cm4gNjt9Ci0gICAgICAgIH07Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPHByb2plY3QgZGVmYXVsdD1cImdvXCI+PHRhcmdldCBuYW1lPVwiZ29cIiBkZXNjcmlwdGlvbj1cIkRlbW9uc3RyYXRlIHRoZSB3cmFwcGluZyBvZiBsb25nIHRhZ3MuXCI+PGVjaG8+aGk8L2VjaG8+PC90YXJnZXQ+PC9wcm9qZWN0PiI7Ci0gICAgICAgIFN0cmluZyBmb3JtYXR0ZWREb2MgPSBYbWxGb3JtYXR0ZXIuZm9ybWF0KHhtbERvYywgcHJlZnMpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiPHByb2plY3QgZGVmYXVsdD1cImdvXCI+XG4gICAgICA8dGFyZ2V0IG5hbWU9XCJnb1wiXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiRGVtb25zdHJhdGUgdGhlIHdyYXBwaW5nIG9mIGxvbmcgdGFncy5cIj5cbiAgICAgICAgICAgIDxlY2hvPmhpPC9lY2hvPlxuICAgICAgPC90YXJnZXQ+XG48L3Byb2plY3Q+IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBmb3JtYXR0ZWREb2MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbFRhZ0Zvcm1hdHRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxUYWdGb3JtYXR0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZmZiNGEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbFRhZ0Zvcm1hdHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbFRhZ0Zvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci0KLS8qKgotICogIAotICovCi1wdWJsaWMgY2xhc3MgWG1sVGFnRm9ybWF0dGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIC8vIFRPRE8gVGhpcyB0ZXN0IGlzIHRvbyBsb3cgbGV2ZWwgYW5kIHRvbyB0aWdodGx5IGNvdXBsZWQgdG8gaW50ZXJuYWxzLgotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLSBUZXN0IEZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8vIEluIGNhc2UgYW55b25lIHdvbmRlcnMgd2h5IG1hbnkgcGVvcGxlIHJlY29tbWVuZCBhZ2FpbnN0IHRlc3RpbmcKLSAgICAvLyBwcml2YXRlcywgSSBwcm9kdWNlIHRoaXMgZXhhbXBsZS4uLgotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElubmVyQ2xhc3NGYWN0b3J5IGV4dGVuZHMgWG1sVGFnRm9ybWF0dGVyIHsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMKLSAgICAgICAgICAgICAgICBYbWxUYWdGb3JtYXR0ZXIuUGFyc2VFeGNlcHRpb24gewotCi0gICAgICAgICAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGFnIGV4dGVuZHMgWG1sVGFnRm9ybWF0dGVyLlRhZyB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhZ0Zvcm1hdHRlciBleHRlbmRzIFhtbFRhZ0Zvcm1hdHRlci5UYWdGb3JtYXR0ZXIgewotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBsaW5lUmVxdWlyZXNXcmFwKFN0cmluZyBsaW5lLCBpbnQgbGluZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICBpbnQgdGFiV2lkdGgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIubGluZVJlcXVpcmVzV3JhcChsaW5lLCBsaW5lV2lkdGgsIHRhYldpZHRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCB0YWJFeHBhbmRlZExpbmVXaWR0aChTdHJpbmcgbGluZSwgaW50IHRhYldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRhYkV4cGFuZGVkTGluZVdpZHRoKGxpbmUsIHRhYldpZHRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyB3cmFwVGFnKFRhZyB0YWcsIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluZGVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci53cmFwVGFnKHRhZywgcHJlZnMsIGluZGVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhZ1BhcnNlciBleHRlbmRzIFhtbFRhZ0Zvcm1hdHRlci5UYWdQYXJzZXIgewotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKFN0cmluZyB0YWdUZXh0KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgWG1sVGFnRm9ybWF0dGVyLlBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWxlbWVudE5hbWUodGFnVGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBMaXN0IGdldEF0dGlidXRlcyhTdHJpbmcgZWxlbWVudFRleHQpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBYbWxUYWdGb3JtYXR0ZXIuUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRpYnV0ZXMoZWxlbWVudFRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBUYWcgY3JlYXRlVGFnKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGFnRm9ybWF0dGVyIGNyZWF0ZVRhZ0Zvcm1hdHRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFnRm9ybWF0dGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIFRhZ1BhcnNlciBjcmVhdGVUYWdQYXJzZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRhZ1BhcnNlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQXR0cmlidXRlUGFpcihPYmplY3QgYXR0cmlidXRlUGFpciwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBYbWxUYWdGb3JtYXR0ZXIuQXR0cmlidXRlUGFpciBwYWlyID0gKFhtbFRhZ0Zvcm1hdHRlci5BdHRyaWJ1dGVQYWlyKSBhdHRyaWJ1dGVQYWlyOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHJpYnV0ZSwgcGFpci5nZXRBdHRyaWJ1dGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHBhaXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBYbWxUYWdGb3JtYXR0ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKGZpbmFsIGJvb2xlYW4gd3JhcExvbmdUYWdzLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGlnbkNsb3NlQ2hhciwgZmluYWwgaW50IG1heExpbmVXaWR0aCkgewotCi0gICAgICAgIHJldHVybiBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFsaWduQ2xvc2VDaGFyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB3cmFwTG9uZ1RhZ3MoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBMb25nVGFnczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRNYXhpbXVtTGluZVdpZHRoKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtYXhMaW5lV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzaW1wbGVUZXN0KFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQsCi0gICAgICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMsIFN0cmluZyBpbmRlbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgIAkKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFhtbFRhZ0Zvcm1hdHRlci5mb3JtYXQoc291cmNlLCBwcmVmcywgaW5kZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRhcmdldCwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIFRlc3QgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyR2V0RWxlbWVudE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdQYXJzZXIgdGFnUGFyc2VyID0gSW5uZXJDbGFzc0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlVGFnUGFyc2VyKCk7Ci0KLSAgICAgICAgU3RyaW5nIGVsZW1lbnRGaXh0dXJlMSA9ICI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscygibXlFbGVtZW50IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKGVsZW1lbnRGaXh0dXJlMSkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgU3RyaW5nIGVsZW1lbnRGaXh0dXJlMiA9ICI8bXlFbGVtZW50XHRcbmF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscygibXlFbGVtZW50IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKGVsZW1lbnRGaXh0dXJlMikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8eC8+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8eD4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBhc3NlcnRFcXVhbHMoIng6eSIsIHRhZ1BhcnNlci5nZXRFbGVtZW50TmFtZSgiPHg6eS8+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4OnkiLCB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoIjx4OnkgYWJjLz4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIEV4Y2VwdGlvbiBlMSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoIjw+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUxID0gZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKGUxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlMS5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oCi0gICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKLQotICAgICAgICBFeGNlcHRpb24gZTIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8PiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlMiA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlMik7Ci0gICAgICAgIGFzc2VydFRydWUoZTIuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKAotICAgICAgICAgICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlBhcnNlRXhjZXB0aW9uLmNsYXNzKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyR2V0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdQYXJzZXIgdGFnUGFyc2VyID0gSW5uZXJDbGFzc0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlVGFnUGFyc2VyKCk7Ci0KLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVQYWlyczsKLQotICAgICAgICAvLyB0ZXN0IG5vcm1hbCBzaXR1YXRpb24KLSAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKLSAgICAgICAgICAgICAgICAuZ2V0QXR0aWJ1dGVzKCI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVQYWlycy5zaXplKCkpOwotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDApLAotICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUxIiwgInZhbHVlMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkudmFsaWRhdGVBdHRyaWJ1dGVQYWlyKGF0dHJpYnV0ZVBhaXJzLmdldCgxKSwKLSAgICAgICAgICAgICAgICAiYXR0cmlidXRlMiIsICJ2YWx1ZTIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3Qgd2l0aCBleHRyYSB3aGl0ZXNwYWNlIGFuZCBmdW5ueSBxdW90ZXMKLSAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKLSAgICAgICAgICAgICAgICAuZ2V0QXR0aWJ1dGVzKCI8bXlFbGVtZW50IFxuYXR0cmlidXRlMSA9ICAndmFsdWUxXCInXG5hdHRyaWJ1dGUyXHQ9XCJ2YWx1ZTInXCIgLz4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVQYWlycy5zaXplKCkpOwotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDApLAotICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUxIiwgInZhbHVlMVwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDEpLAotICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUyIiwgInZhbHVlMiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLS8vIFRPRE8gYXR0cmlidXRlcyB3aGljaCBjb250YWluIHdoaXRlc3BhY2Ugc2hvdWxkIHRocm93IGEgcGFyc2UgZXJyb3IKLS8vICAgICAgIAotLy8gICAgICAgIC8vIHRlc3QgcGFyc2UgZXJyb3JzIC0gd2hpdGVzcGFjZSBpbiBhdHRyaWJ1dGUgbmFtZQotLy8gICAgICAgIEV4Y2VwdGlvbiBlMSA9IG51bGw7Ci0vLyAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKLS8vICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0aWJ1dGVzKCI8bXlFbGVtZW50IGF0IHRyaWJ1dGUxID0gXCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iKTsKLS8vICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBlMSA9IGU7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGFzc2VydE5vdE51bGwoZTEpOwotLy8gICAgICAgIGFzc2VydFRydWUoZTEuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKAotLy8gICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IHBhcnNlIGVycm9ycyAtIGVxdWFscyBpbiB0aGUgd3JvbmcgcGxhY2UKLSAgICAgICAgRXhjZXB0aW9uIGUyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVBhaXJzID0gdGFnUGFyc2VyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRpYnV0ZXMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiID0gYXR0cmlidXRlMj1cInZhbHVlMlwiIC8+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUyID0gZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKGUyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlMi5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oCi0gICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IHBhcnNlIGVycm9ycyAtIHF1b3RlcyBpbiB0aGUgd3JvbmcgcGxhY2UKLSAgICAgICAgRXhjZXB0aW9uIGUzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVBhaXJzID0gdGFnUGFyc2VyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRpYnV0ZXMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cIlwidmFsdWUxXCIgIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlMyA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlMyk7Ci0gICAgICAgIGFzc2VydFRydWUoZTMuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKAotICAgICAgICAgICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlBhcnNlRXhjZXB0aW9uLmNsYXNzKSk7Ci0gICAgICAgIAotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXQwMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW5kZW50ID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgc291cmNlID0gIjx0YXJnZXQgbmFtZT1cIm15VGFyZ2V0TmFtZVwiIGRlcGVuZHM9XCJhLGIsYyxkLGUsZixnXCIgZGVzY3JpcHRpb249XCJUaGlzIGlzIGEgdmVyeSBsb25nIGVsZW1lbnQgd2hpY2ggb3VnaHQgdG8gYmUgd3JhcHBlZC5cIj4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0YXJnZXQgPSAiPHRhcmdldCBuYW1lPVwibXlUYXJnZXROYW1lXCJcbiIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgaW5kZW50Ci0gICAgICAgICAgICAgICAgKyAiICAgICAgICBkZXBlbmRzPVwiYSxiLGMsZCxlLGYsZ1wiXG4iIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArIGluZGVudAotICAgICAgICAgICAgICAgICsgIiAgICAgICAgZGVzY3JpcHRpb249XCJUaGlzIGlzIGEgdmVyeSBsb25nIGVsZW1lbnQgd2hpY2ggb3VnaHQgdG8gYmUgd3JhcHBlZC5cIj4iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgc2ltcGxlVGVzdChzb3VyY2UsIHRhcmdldCwgZ2V0UHJlZmVyZW5jZXModHJ1ZSwgZmFsc2UsIDYwKSwgaW5kZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZvcm1hdDAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbmRlbnQgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBzb3VyY2UgPSAiPHRhcmdldCBuYW1lPVwibXlUYXJnZXROYW1lXCIgZGVwZW5kcz1cImEsYixjLGQsZSxmLGdcIiBkZXNjcmlwdGlvbj1cIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgZWxlbWVudCB3aGljaCBvdWdodCB0byBiZSB3cmFwcGVkLlwiPiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHRhcmdldCA9ICI8dGFyZ2V0IG5hbWU9XCJteVRhcmdldE5hbWVcIlxuIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyBpbmRlbnQKLSAgICAgICAgICAgICAgICArICIgICAgICAgIGRlcGVuZHM9XCJhLGIsYyxkLGUsZixnXCJcbiIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgaW5kZW50Ci0gICAgICAgICAgICAgICAgKyAiICAgICAgICBkZXNjcmlwdGlvbj1cIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgZWxlbWVudCB3aGljaCBvdWdodCB0byBiZSB3cmFwcGVkLlwiXG4iIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArIGluZGVudCArICI+IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHNpbXBsZVRlc3Qoc291cmNlLCB0YXJnZXQsIGdldFByZWZlcmVuY2VzKHRydWUsIHRydWUsIDYwKSwgaW5kZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdExpbmVSZXF1aXJlc1dyYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdGb3JtYXR0ZXIgdGFnRm9ybWF0dGVyID0gSW5uZXJDbGFzc0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlVGFnRm9ybWF0dGVyKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBzaG91bGRXcmFwID0gdGFnRm9ybWF0dGVyCi0gICAgICAgICAgICAgICAgLmxpbmVSZXF1aXJlc1dyYXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHRcdCAgPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIgYXR0cmlidXRlMj1cInZhbHVlMlwiIC8+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgNzAsIDgpOwotICAgICAgICBib29sZWFuIHNob3VsZE5vdFdyYXAgPSB0YWdGb3JtYXR0ZXIKLSAgICAgICAgICAgICAgICAubGluZVJlcXVpcmVzV3JhcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0IDxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIDcwLCA4KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzaG91bGRXcmFwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghc2hvdWxkTm90V3JhcCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhYkV4cGFuZGVkTGluZVdpZHRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuVGFnRm9ybWF0dGVyIHRhZ0Zvcm1hdHRlciA9IElubmVyQ2xhc3NGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZVRhZ0Zvcm1hdHRlcigpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyMCwgdGFnRm9ybWF0dGVyLnRhYkV4cGFuZGVkTGluZVdpZHRoKCJcdCAgMTIzNDU2Nzg5MCIsIDgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIHRhZ0Zvcm1hdHRlci50YWJFeHBhbmRlZExpbmVXaWR0aCgiMTIzNDU2Nzg5MCIsIDgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoMTksIHRhZ0Zvcm1hdHRlcgotICAgICAgICAgICAgICAgIC50YWJFeHBhbmRlZExpbmVXaWR0aCgiXHQxXHQyCTM0NTY3ODkwIiwgMykpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRhYlRvU3RyaW5nQW5kTWluaW11bUxlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWcgdGFnID0gSW5uZXJDbGFzc0ZhY3RvcnkuY3JlYXRlVGFnKCk7Ci0KLSAgICAgICAgdGFnLnNldEVsZW1lbnROYW1lKCJteUVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0YWcuc2V0Q2xvc2VkKGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8bXlFbGVtZW50PiIsIHRhZy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQodHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCAvPiIsIHRhZy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotCi0gICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoImF0dHJpYnV0ZTEiLCAidmFsdWUxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB0YWcuYWRkQXR0cmlidXRlKCJhdHRyaWJ1dGUyIiwgInZhbHVlMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdGFnLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQoZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIj4iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdGFnLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcFRhZygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlRhZyB0YWcgPSBJbm5lckNsYXNzRmFjdG9yeS5jcmVhdGVUYWcoKTsKLQotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdGb3JtYXR0ZXIgdGFnRm9ybWF0dGVyID0gSW5uZXJDbGFzc0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlVGFnRm9ybWF0dGVyKCk7Ci0KLSAgICAgICAgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGRvbnRBbGlnbkNsb3NlQ2hhciA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFsaWduRWxlbWVudENsb3NlQ2hhcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBkb0FsaWduQ2xvc2VDaGFyID0gbmV3IEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpIHsKLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWxpZ25FbGVtZW50Q2xvc2VDaGFyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRhZy5zZXRFbGVtZW50TmFtZSgibXlFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGFnLmFkZEF0dHJpYnV0ZSgiYXR0cmlidXRlMSIsICJ2YWx1ZTEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoImF0dHJpYnV0ZTIiLCAidmFsdWUyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQodHJ1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIlxuIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiXHRcdCAgICAgICAgICAgICBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iLCB0YWdGb3JtYXR0ZXIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIC53cmFwVGFnKHRhZywgZG9udEFsaWduQ2xvc2VDaGFyLCAiXHRcdCAgIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIlxuIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiXHRcdCAgICAgICAgICAgICBhdHRyaWJ1dGUyPVwidmFsdWUyXCJcblx0XHQgIC8+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRhZ0Zvcm1hdHRlci53cmFwVGFnKHRhZywgZG9BbGlnbkNsb3NlQ2hhciwgIlx0XHQgICIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQoZmFsc2UpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCJcbiIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgIlx0XHQgICAgICAgICAgICAgYXR0cmlidXRlMj1cInZhbHVlMlwiPiIsIHRhZ0Zvcm1hdHRlciAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgLndyYXBUYWcodGFnLCBkb250QWxpZ25DbG9zZUNoYXIsICJcdFx0ICAiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiXG4iIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArICJcdFx0ICAgICAgICAgICAgIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIlxuXHRcdCAgPiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB0YWdGb3JtYXR0ZXIud3JhcFRhZyh0YWcsIGRvQWxpZ25DbG9zZUNoYXIsICJcdFx0ICAiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWc2MzU1OCgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy8gT3JkaW5hcmlseSB0aGUgZG91YmxlIHNwYWNlIGFmdGVyIHRoZSBlbGVtZW50IG5hbWUgd291bGQgYmUgcmVwYWlyZWQKLQkJLy8gYnV0IGlmIHRoZSBmb3JtYXR0ZXIgaXMgd29ya2luZyBjb3JyZWN0bHkgdGhlc2UgZXhhbXBsZXMgd2lsbCBiZQotCQkvLyBjb25zaWRlcmVkIG1hbGZvcm1lZCBhbmQgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB1bnRvdWNoZWQuCi0JCQotCQlTdHJpbmcgc291cmNlMSA9ICI8ZWNobyAgZmlsZT1cImZvb1wiPlxuJmx0O2h0bWw+Jmx0O2JvZHk+Jmx0O3ByZT4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrICIke2NvbXBpbGVsb2d9Jmx0Oy9wcmU+Jmx0Oy9ib2R5PiZsdDsvaHRtbD4iOyAvLyROT04tTkxTLTEkCi0JCUZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByZWZlcmVuY2VzKHRydWUsIGZhbHNlLCA2MCk7IC8vJE5PTi1OTFMtMSQKLQkJc2ltcGxlVGVzdChzb3VyY2UxLCBzb3VyY2UxLCBwcmVmcywgIlx0Iik7Ci0JCi0JCVN0cmluZyBzb3VyY2UyID0gIjxlY2hvICBmaWxlPVwiZm9vXCIvYmFyL2Jhej48L2VjaG8+IjsgLy8kTk9OLU5MUy0xJAkJCi0JCXNpbXBsZVRlc3Qoc291cmNlMiwgc291cmNlMiwgcHJlZnMsICJcdCIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdEVkaXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYTZjOTMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RWRpdG9yIGV4dGVuZHMgQW50RWRpdG9yIHsKLQkKLQlUZXN0RWRpdG9yKCkgewotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplRWRpdG9yKCkgewotICAgIH0KLSAgICAvKiogCi0gICAgICogUmV0dXJucyAnMTAnLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZ2V0Q3Vyc29yUG9zaXRpb24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiMTAiOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdExvY2F0aW9uUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdExvY2F0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4NWRlMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RMb2NhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLkxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0TG9jYXRpb25Qcm92aWRlciBleHRlbmRzIExvY2F0aW9uUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBGaWxlIGJ1aWxkRmlsZTsKLQkKLQlwdWJsaWMgVGVzdExvY2F0aW9uUHJvdmlkZXIoRmlsZSBidWlsZEZpbGUpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuYnVpbGRGaWxlPSBidWlsZEZpbGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JTG9jYXRpb25Qcm92aWRlciNnZXRMb2NhdGlvbigpCi0JICovCi0JcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhdGgoYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0UHJvYmxlbVJlcXVlc3Rvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0UHJvYmxlbVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM3OGQwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFByb2JsZW1SZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yOwotCi1wdWJsaWMgY2xhc3MgVGVzdFByb2JsZW1SZXF1ZXN0b3IgaW1wbGVtZW50cyBJUHJvYmxlbVJlcXVlc3RvciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW1SZXF1ZXN0b3IjYWNjZXB0UHJvYmxlbShvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0pCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW1SZXF1ZXN0b3IjYmVnaW5SZXBvcnRpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgewotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yI2VuZFJlcG9ydGluZygpCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjUxY2IuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLkFudE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEVTVF9QUk9QT1NBTF9NT0RFX05PTkUgPSBBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLlBST1BPU0FMX01PREVfTk9ORTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfQlVJTERGSUxFID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX0JVSUxERklMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTCA9IEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFU1RfUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTCA9IEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9QUk9QT1NBTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTF9DTE9TSU5HID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUxfQ0xPU0lORzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1ZBTFVFX1BST1BPU0FMID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9WQUxVRV9QUk9QT1NBTDsKLQkKLQlwcml2YXRlIEZpbGUgZWRpdGVkRmlsZTsKLQotCXB1YmxpYyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoQW50TW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlzdXBlcihudWxsKTsKLQl9Ci0JCi0gICAgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRBdHRyaWJ1dGVQcm9wb3NhbHMoU3RyaW5nIHRhc2tOYW1lLCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgCWlmIChjdXJzb3JQb3NpdGlvbiA9PSAtMSkgewotICAgIAkJY3Vyc29yUG9zaXRpb249IHRhc2tOYW1lLmxlbmd0aCgpOwotICAgIAl9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVQcm9wb3NhbHModGFza05hbWUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZmluZENoaWxkRWxlbWVudE5hbWVkT2YoRWxlbWVudCBhbkVsZW1lbnQsIFN0cmluZyBjaGlsZEVsZW1lbnROYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5maW5kQ2hpbGRFbGVtZW50TmFtZWRPZihhbkVsZW1lbnQsIGNoaWxkRWxlbWVudE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0VGFza1Byb3Bvc2FscyhTdHJpbmcgdGV4dCwgU3RyaW5nIHBhcmVudE5hbWUsIFN0cmluZyBwcmVmaXgpIHsKLSAgICAJY3Vyc29yUG9zaXRpb249IE1hdGgubWF4KDAsIHRleHQubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRhc2tQcm9wb3NhbHMobmV3IERvY3VtZW50KHRleHQpLCBwYXJlbnROYW1lLCBwcmVmaXgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFRhc2tQcm9wb3NhbHMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIGFQcmVmaXgpIHsKLSAgICAJY3Vyc29yUG9zaXRpb249IE1hdGgubWF4KDAsIGRvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0gICAgCXJldHVybiBzdXBlci5nZXRUYXNrUHJvcG9zYWxzKGRvY3VtZW50LCBwYXJlbnROYW1lLCBhUHJlZml4KTsKLSAgICB9Ci0gICAgCi0gICAgLy9UT0RPIGFkZCB0ZW1wbGF0ZSBwcm9wb3NhbCB0ZXN0aW5nCi0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0VGVtcGxhdGVQcm9wb3NhbHMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBkZXRlcm1pbmVQcm9wb3NhbE1vZGUoU3RyaW5nIHRleHQsIGludCB0aGVDdXJzb3JQb3NpdGlvbiwgU3RyaW5nIHByZWZpeCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKG5ldyBEb2N1bWVudCh0ZXh0KSwgdGhlQ3Vyc29yUG9zaXRpb24sIHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKFN0cmluZyB0ZXh0LCBpbnQgYUxpbmVOdW1iZXIsIGludCBhQ29sdW1uTnVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRQYXJlbnROYW1lKG5ldyBEb2N1bWVudCh0ZXh0KSwgYUxpbmVOdW1iZXIsIGFDb2x1bW5OdW1iZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoSURvY3VtZW50IGRvYywgaW50IGFMaW5lTnVtYmVyLCBpbnQgYUNvbHVtbk51bWJlcikgewotICAgIAlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50TmFtZShkb2MsIGFMaW5lTnVtYmVyLCBhQ29sdW1uTnVtYmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeEZyb21Eb2N1bWVudChTdHJpbmcgYURvY3VtZW50VGV4dCwgaW50IGFuT2Zmc2V0KSB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXg9IHN1cGVyLmdldFByZWZpeEZyb21Eb2N1bWVudChhRG9jdW1lbnRUZXh0LCBhbk9mZnNldCk7Ci0gICAgICAgIGN1cnJlbnRQcmVmaXg9IG51bGw7Ci0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRQcm9wZXJ0eVByb3Bvc2FscyhJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwcmVmaXgsIGludCBjdXJzb3JQb3MpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5UHJvcG9zYWxzKGRvY3VtZW50LCBwcmVmaXgsIGN1cnNvclBvcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWRpdGVkIEZpbGUgdGhhdCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3Igc2V0cyBvciBhIHRlbXBvcmFyeSAKLSAgICAgKiBmaWxlLCB3aGljaCBvbmx5IHNlcnZlcyBhcyBhIGR1bW15LgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yI2dldEVkaXRlZEZpbGUoKQotICAgICAqLwotCXB1YmxpYyBGaWxlIGdldEVkaXRlZEZpbGUoKSB7Ci0JCWlmIChlZGl0ZWRGaWxlICE9IG51bGwpewotCQkJcmV0dXJuIGVkaXRlZEZpbGU7Ci0JCX0KLQkJRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICByZXR1cm4gdGVtcEZpbGU7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgYUxpbmVOdW1iZXIpIHsKLSAgICAJbGluZU51bWJlciA9IGFMaW5lTnVtYmVyOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHNldENvbHVtbk51bWJlcihpbnQgYUNvbHVtbk51bWJlcikgewotICAgIAljb2x1bW5OdW1iZXIgPSBhQ29sdW1uTnVtYmVyOwotICAgIH0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJdGhpcy5jdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLSAgICAKLQlwdWJsaWMgdm9pZCBzZXRFZGl0ZWRGaWxlKEZpbGUgYUZpbGUpIHsKLQkJZWRpdGVkRmlsZT0gYUZpbGU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3NvciNnZXRUYXJnZXRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFRhcmdldEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHRleHRUb1NlYXJjaCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGRvY3VtZW50LCB0ZXh0VG9TZWFyY2gsIHByZWZpeCwgYXR0cmlidXRlTmFtZSk7Ci0JfQotCS8qKgotCSAqIFNpbmNlIHRoZSB0ZXN0aW5nIG9jY3VycyB3aXRob3V0IG5lY2Vzc2FyaWx5IGhhdmluZyBhbiBhc3NvY2lhdGVkIHZpZXdlciwgcmV0dXJuCi0JICogYSBkdW1teSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2hhciBnZXRQcmV2aW91c0NoYXIoKSB7Ci0JCXJldHVybiAnPyc7Ci0JfQotCQotCSAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0YXNrIG5hbWUgaXMga25vd24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNLbm93bkVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gICAgCWlmIChhbnRNb2RlbCAhPSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gc3VwZXIuaXNLbm93bkVsZW1lbnQoZWxlbWVudE5hbWUpOwotICAgIAl9IAotICAgIAlyZXR1cm4gZHRkLmdldEVsZW1lbnQoZWxlbWVudE5hbWUpICE9IG51bGwgOwotICAgIH0KLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IjZ2V0UHJvcG9zYWxzRnJvbURvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzRnJvbURvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcG9zYWxzRnJvbURvY3VtZW50KGRvY3VtZW50LCBwcmVmaXgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IjZ2V0QnVpbGRGaWxlUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0QnVpbGRGaWxlUHJvcG9zYWxzKFN0cmluZyB0ZXh0LCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBzdXBlci5nZXRCdWlsZEZpbGVQcm9wb3NhbHMobmV3IERvY3VtZW50KHRleHQpLCBwcmVmaXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0Fic3RyYWN0QW50VUlCdWlsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxZjI0NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQ29uc29sZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotCS8qKgotCSAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGVzdCBhcmUgaW4gcHJvZ3Jlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0aW5nID0gdHJ1ZTsKLQkJCi0JcHVibGljIEFic3RyYWN0QW50VUlCdWlsZFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJ1bnMgdGhlIHRlc3QgYW5kIGNvbGxlY3RzIHRoZSByZXN1bHQgaW4gYSBUZXN0UmVzdWx0IHdpdGhvdXQgYmxvY2tpbmcKLQkgKiB0aGUgVUkgdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihmaW5hbCBUZXN0UmVzdWx0IHJlc3VsdCkgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJVGhyZWFkIHRocmVhZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdC5zdXBlci5ydW4ocmVzdWx0KTsJCQotCQkJCQl0ZXN0aW5nID0gZmFsc2U7Ci0JCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJCX0KLQkJCX07Ci0JCQl0aHJlYWQgPSBuZXcgVGhyZWFkKHIpOwotCQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQl3aGlsZSAodGVzdGluZykgewotCQkJdHJ5IHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0JCQkKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIExhdW5jaGVzIHRoZSBBbnQgYnVpbGQgd2l0aCB0aGUgYnVpbGRmaWxlIG5hbWUgKG5vIGV4dGVuc2lvbikuCi0JICogV2FpdHMgZm9yIGFsbCBvZiB0aGUgbGluZXMgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIG1haW5UeXBlTmFtZSB0aGUgcHJvZ3JhbSB0byBsYXVuY2gKLQkgKiBAcmV0dXJuIHRocmVhZCBpbiB3aGljaCB0aGUgZmlyc3Qgc3VzcGVuZCBldmVudCBvY2N1cnJlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxhdW5jaChTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5sYXVuY2goYnVpbGRGaWxlTmFtZSk7Ci0JCUNvbnNvbGVMaW5lVHJhY2tlci53YWl0Rm9yQ29uc29sZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUxpbmsoZmluYWwgSUNvbnNvbGVIeXBlcmxpbmsgbGluaykgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWxpbmsubGlua0FjdGl2YXRlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3QjbGF1bmNoKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF1bmNoKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgYXJndW1lbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmxhdW5jaChidWlsZEZpbGVOYW1lLCBhcmd1bWVudHMpOwotCQlDb25zb2xlTGluZVRyYWNrZXIud2FpdEZvckNvbnNvbGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQnVpbGRUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0J1aWxkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NTYzZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQnVpbGRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLklBbnRVSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQ29uc29sZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLQotcHVibGljIGNsYXNzIEJ1aWxkVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFVJQnVpbGRUZXN0IHsKLQotCXB1YmxpYyBCdWlsZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLSAgLyoqCi0gICAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIGdldHRpbmcgbWVzc2FnZXMKLSAgICogbG9nZ2VkIHRvIHRoZSBjb25zb2xlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE91dHB1dCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgIGxhdW5jaCgiZWNob2luZyIpOwotCSAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiBtZXNzYWdlcyBsb2dnZWQgZm9yIGJ1aWxkLiBTaG91bGQgYmUgOC4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDgpOwotCSAgU3RyaW5nIG1lc3NhZ2U9IENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDYpOwotCSAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGxhc3QgbWVzc2FnZS4gU2hvdWxkIHN0YXJ0IHdpdGggVG90YWwgdGltZTouIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLCBtZXNzYWdlLnN0YXJ0c1dpdGgoIlRvdGFsIHRpbWU6IikpOwotICB9Ci0gIAotICAvKioKLQkgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGFuZCBnZXR0aW5nIHRoZSBidWlsZCBmYWlsZWQgbWVzc2FnZQotCSAqIGxvZ2dlZCB0byB0aGUgY29uc29sZSB3aXRoIGFzc29jaWF0ZWQgbGluay4KLQkgKiBCdWcgNDIzMzMgYW5kIDQ0NTY1Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkRmFpbGVkTWVzc2FnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbGF1bmNoKCJiYWQiKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiBtZXNzYWdlcyBsb2dnZWQgZm9yIGJ1aWxkLiBTaG91bGQgYmUgNy4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDcpOwotCQlTdHJpbmcgbWVzc2FnZT0gQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoNCk7Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIEJ1aWxkIEZhaWxlZDouIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLCBtZXNzYWdlLnN0YXJ0c1dpdGgoIkJVSUxEIEZBSUxFRDoiKSk7Ci0JCWludCBvZmZzZXQ9IC0xOwotCQl0cnkgewotCQkJb2Zmc2V0PSBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KDQpICsgMzA7IC8vbGluayB0byBidWlsZGZpbGUgdGhhdCBmYWlsZWQKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIGdldHRpbmcgb2Zmc2V0IG9mIGxpbmUiLCBmYWxzZSk7Ci0JCX0KLQkJSUNvbnNvbGVIeXBlcmxpbmsgbGluaz0gZ2V0SHlwZXJsaW5rKG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBoeXBlcmxpbmsgZm91bmQgYXQgb2Zmc2V0ICIgKyBvZmZzZXQsIGxpbmspOwotCX0KLSAgCi0gIC8qKgotCSAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIHRoYXQgdGhlCi0JICogY29ycmVjdCBsaW5rcyBhcmUgaW4gdGhlIGNvbnNvbGUgZG9jCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExpbmtzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsYXVuY2goImJ1aWxkIik7Ci0JCWludCBvZmZzZXQ9IDI1OyAvL2J1aWxkZmlsZSBsaW5rCi0JCUlDb25zb2xlSHlwZXJsaW5rIGxpbms9IGdldEh5cGVybGluayhvZmZzZXQsIENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gaHlwZXJsaW5rIGZvdW5kIGF0IG9mZnNldCAiICsgb2Zmc2V0LCBsaW5rKTsKLQkJYWN0aXZhdGVMaW5rKGxpbmspOwotCQkKLQkJdHJ5IHsKLQkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCg0KSArIDEwOyAvL2VjaG8gbGluawotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJmYWlsZWQgZ2V0dGluZyBvZmZzZXQgb2YgbGluZSIsIGZhbHNlKTsKLQkJfQotCQlsaW5rPSBnZXRIeXBlcmxpbmsob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGh5cGVybGluayBmb3VuZCBhdCBvZmZzZXQgIiArIG9mZnNldCwgbGluayk7Ci0JCWFjdGl2YXRlTGluayhsaW5rKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgbGF1bmNoaW5nIEFudCBhbmQgdGhhdCB0aGUKLQkgKiBjb3JyZWN0IGNvbG9ycyBhcmUgaW4gdGhlIGNvbnNvbGUgZG9jCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbG9yKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsJCQotCQlsYXVuY2goImVjaG9pbmciKTsKLQkJaW50IG9mZnNldD0gMTU7IC8vYnVpbGRmaWxlCi0JCUNvbG9yIGNvbG9yPSBnZXRDb2xvckF0T2Zmc2V0KG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb2xvciBmb3VuZCBhdCAiICsgb2Zmc2V0LCBjb2xvcik7Ci0JCWFzc2VydEVxdWFscyhBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0lORk9fQ09MT1IpLCBjb2xvcik7Ci0JCXRyeSB7Ci0JCQlvZmZzZXQ9IENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpLmdldExpbmVPZmZzZXQoNCkgKyAxMDsgLy9lY2hvCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoImZhaWxlZCBnZXR0aW5nIG9mZnNldCBvZiBsaW5lIiwgZmFsc2UpOwotCQl9Ci0JCWNvbG9yPSBnZXRDb2xvckF0T2Zmc2V0KG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb2xvciBmb3VuZCBhdCAiICsgb2Zmc2V0LCBjb2xvcik7Ci0JCWFzc2VydEVxdWFscyhBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfQ09MT1IpLCBjb2xvcik7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIGdldHRpbmcgdGhlIGJ1aWxkIGZhaWxlZCBtZXNzYWdlCi0JICogbG9nZ2VkIHRvIHRoZSBjb25zb2xlLgotCSAqIEJ1ZyA0MjMzMy4KLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RCdWlsZEZhaWxlZE1lc3NhZ2VEZWJ1ZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlsYXVuY2hJbkRlYnVnKCJiYWQiKTsKLS8vCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSAzNS4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDM1KTsKLS8vCQlTdHJpbmcgbWVzc2FnZT0gQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMzMpOwotLy8JCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIEJ1aWxkIEZhaWxlZDouIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLCBtZXNzYWdlLnN0YXJ0c1dpdGgoIkJVSUxEIEZBSUxFRDoiKSk7Ci0vLwkJfQotLy8gIAotLy8JICAvKioKLS8vCSAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIHRoYXQgdGhlCi0vLwkgKiBjb3JyZWN0IGxpbmtzIGFyZSBpbiB0aGUgY29uc29sZSBkb2MKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdExpbmtzRGVidWcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJbGF1bmNoSW5EZWJ1ZygiZWNob2luZyIpOwotLy8JCWludCBvZmZzZXQ9IDA7IAotLy8JCXRyeSB7Ci0vLwkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCgyKSArIDE1OyAvL2J1aWxkZmlsZSBsaW5lIDMKLS8vCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWFzc2VydFRydWUoImZhaWxlZCBnZXR0aW5nIG9mZnNldCBvZiBsaW5lIiwgZmFsc2UpOwotLy8JCX0KLS8vCQlJQ29uc29sZUh5cGVybGluayBsaW5rPSBnZXRIeXBlcmxpbmsob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiTm8gaHlwZXJsaW5rIGZvdW5kIGF0IG9mZnNldCAiICsgb2Zmc2V0LCBsaW5rKTsKLS8vCQotLy8JCXRyeSB7Ci0vLwkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCgzMykgKyAxMDsgLy9lY2hvIGxpbmsKLS8vCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWFzc2VydFRydWUoImZhaWxlZCBnZXR0aW5nIG9mZnNldCBvZiBsaW5lIiwgZmFsc2UpOwotLy8JCX0KLS8vCQlsaW5rPSBnZXRIeXBlcmxpbmsob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiTm8gaHlwZXJsaW5rIGZvdW5kIGF0IG9mZnNldCAiICsgb2Zmc2V0LCBsaW5rKTsKLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIHRoYXQgdGhlCi0vLwkgKiBjb3JyZWN0IGNvbG9ycyBhcmUgaW4gdGhlIGNvbnNvbGUgZG9jCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RDb2xvckRlYnVnKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLS8vCQlsYXVuY2hJbkRlYnVnKCJlY2hvaW5nIik7Ci0vLwkJaW50IG9mZnNldD0gMDsgCi0vLwkJdHJ5IHsKLS8vCQkJb2Zmc2V0PSBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KDIpICsgMTU7IC8vYnVpbGRmaWxlIGxpbmUgMwotLy8JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLS8vCQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIGdldHRpbmcgb2Zmc2V0IG9mIGxpbmUiLCBmYWxzZSk7Ci0vLwkJfQotLy8JCUNvbG9yIGNvbG9yPSBnZXRDb2xvckF0T2Zmc2V0KG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotLy8JCWFzc2VydE5vdE51bGwoIk5vIGNvbG9yIGZvdW5kIGF0ICIgKyBvZmZzZXQsIGNvbG9yKTsKLS8vCQlhc3NlcnRFcXVhbHMoQW50VUlQbHVnaW4uZ2V0UHJlZmVyZW5jZUNvbG9yKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9JTkZPX0NPTE9SKSwgY29sb3IpOwotLy8JCQotLy8JCXRyeSB7Ci0vLwkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCg0KSArIDM7IC8vZGVidWcgaW5mbwotLy8JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLS8vCQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIGdldHRpbmcgb2Zmc2V0IG9mIGxpbmUiLCBmYWxzZSk7Ci0vLwkJfQotLy8JCWNvbG9yPSBnZXRDb2xvckF0T2Zmc2V0KG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotLy8JCWFzc2VydE5vdE51bGwoIk5vIGNvbG9yIGZvdW5kIGF0ICIgKyBvZmZzZXQsIGNvbG9yKTsKLS8vCQlhc3NlcnRFcXVhbHMoQW50VUlQbHVnaW4uZ2V0UHJlZmVyZW5jZUNvbG9yKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9ERUJVR19DT0xPUiksIGNvbG9yKTsKLS8vCQkKLS8vCQl0cnkgewotLy8JCQlvZmZzZXQ9IENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpLmdldExpbmVPZmZzZXQoMzMpICsgMTA7IC8vZWNobyBsaW5lIDMzCi0vLwkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotLy8JCQlhc3NlcnRUcnVlKCJmYWlsZWQgZ2V0dGluZyBvZmZzZXQgb2YgbGluZSIsIGZhbHNlKTsKLS8vCQl9Ci0vLwkJY29sb3I9IGdldENvbG9yQXRPZmZzZXQob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiTm8gY29sb3IgZm91bmQgYXQgIiArIG9mZnNldCwgY29sb3IpOwotLy8JCWFzc2VydEVxdWFscyhBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfQ09MT1IpLCBjb2xvcik7Ci0vLwl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3NlcGFyYXRlVk0vU2VwYXJhdGVWTVRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc2VwYXJhdGVWTS9TZXBhcmF0ZVZNVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5Y2ZlZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc2VwYXJhdGVWTS9TZXBhcmF0ZVZNVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnNlcGFyYXRlVk07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5Db25zb2xlTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uUHJvamVjdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi1wdWJsaWMgY2xhc3MgU2VwYXJhdGVWTVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdCB7Ci0JCQotICAgIHB1YmxpYyBTZXBhcmF0ZVZNVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2VwYXJhdGVWTVRlc3RzLmNsYXNzKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gYW5kIGdldHRpbmcgbWVzc2FnZXMKLSAgICAgKiBsb2dnZWQgdG8gdGhlIGNvbnNvbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZWNob2luZ1NlcFZNIik7Ci0gICAgICAJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiBtZXNzYWdlcyBsb2dnZWQgZm9yIGJ1aWxkLiBTaG91bGQgYmUgNi4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDYpOwotICAgICAgCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIFRvdGFsIHRpbWU6LiBNZXNzYWdlOiAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoNCksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDQpLnN0YXJ0c1dpdGgoIlRvdGFsIHRpbWU6IikpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gYW5kIGhhdmluZyBhbiBleHRyYSBjbGFzc3BhdGggZW50cnkgZGVzaWduYXRlZCB0byBiZSBhdmFpbGJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFDbGFzc3BhdGhFbnRyaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZXh0ZW5zaW9uUG9pbnRTZXBWTSIpOwotICAgICAgCWFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgbWVzc2FnZXMgbG9nZ2VkIGZvciBidWlsZC4gU2hvdWxkIGJlIDguIFdhcyAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE51bWJlck9mTWVzc2FnZXMoKSwgQ29uc29sZUxpbmVUcmFja2VyLmdldE51bWJlck9mTWVzc2FnZXMoKSA9PSA4KTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGFzdCBtZXNzYWdlLiBTaG91bGQgc3RhcnQgd2l0aCBUb3RhbCB0aW1lOi4gTWVzc2FnZTogIiArIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDYpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TWVzc2FnZSg2KS5zdGFydHNXaXRoKCJUb3RhbCB0aW1lOiIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIHZtIGFuZCBoYXZpbmcgYW4gZXh0cmEgY2xhc3NwYXRoIGVudHJ5IGRlc2lnbmF0ZWQgdG8gYmUgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZXh0ZW5zaW9uUG9pbnRTZXBWTSIpOwotICAgICAgCWFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgbWVzc2FnZXMgbG9nZ2VkIGZvciBidWlsZC4gU2hvdWxkIGJlIDguIFdhcyAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE51bWJlck9mTWVzc2FnZXMoKSwgQ29uc29sZUxpbmVUcmFja2VyLmdldE51bWJlck9mTWVzc2FnZXMoKSA9PSA4KTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGFzdCBtZXNzYWdlLiBTaG91bGQgc3RhcnQgd2l0aCBbZWNob10gJHtwcm9wZXJ0eS51aS50ZXN0aW5nLiBNZXNzYWdlOiAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMyksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDMpLnRyaW0oKS5zdGFydHNXaXRoKCJbZWNob10gJHtwcm9wZXJ0eS51aS50ZXN0aW5nIikpOwotICAgICAgCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIFtlY2hvXSBoZXkuIE1lc3NhZ2U6ICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TWVzc2FnZSg0KSwgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoNCkudHJpbSgpLnN0YXJ0c1dpdGgoIltlY2hvXSBoZXkiKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSB2bSBhbmQgaGF2aW5nIGFuIGV4dHJhIGNsYXNzcGF0aCBlbnRyeSBkZXNpZ25hdGVkIHRvIGJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uUG9pbnRUYXNrKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0iKTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSA2LiBXYXMgIiArIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCksIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCkgPT0gNik7Ci0gICAgICAJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIFtudWxsXSBUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzazIuIE1lc3NhZ2U6ICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TWVzc2FnZSgyKSwgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMikudHJpbSgpLnN0YXJ0c1dpdGgoIltudWxsXSBUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzazIiKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSB2bSBhbmQgaGF2aW5nIGFuIGV4dHJhIGNsYXNzcGF0aCBlbnRyeSBkZXNpZ25hdGVkIHRvIGJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uUG9pbnRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZXh0ZW5zaW9uUG9pbnRUeXBlU2VwVk0iKTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSA2LiBXYXMgIiArIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCksIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCkgPT0gNik7Ci0gICAgICAJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIFtlY2hvXSBFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlLiBNZXNzYWdlOiAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMiksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDIpLnRyaW0oKS5zdGFydHNXaXRoKCJbZWNob10gRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdHlwZSIpKTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogVGVzdHMgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIHZtIGFuZCB0aGF0IHRoZQotCSAqIGNvcnJlY3QgbGlua3MgYXJlIGluIHRoZSBjb25zb2xlIGRvYwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaW5rcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbGF1bmNoKCJlY2hvaW5nU2VwVk0iKTsKLQkJaW50IG9mZnNldD0gMTU7IC8vYnVpbGRmaWxlIGxpbmsKLQkJSUNvbnNvbGVIeXBlcmxpbmsgbGluaz0gZ2V0SHlwZXJsaW5rKG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBoeXBlcmxpbmsgZm91bmQgYXQgb2Zmc2V0ICIgKyBvZmZzZXQsIGxpbmspOwotCQl0cnkgewotCQkJb2Zmc2V0PSBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KDIpICsgMTA7IC8vZWNobyBsaW5rCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoImZhaWxlZCBnZXR0aW5nIG9mZnNldCBvZiBsaW5lIiwgZmFsc2UpOwotCQl9Ci0JCWxpbms9IGdldEh5cGVybGluayhvZmZzZXQsIENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gaHlwZXJsaW5rIGZvdW5kIGF0IG9mZnNldCAiICsgb2Zmc2V0LCBsaW5rKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIHZtIGFuZCB0aGF0IHRoZQotCSAqIGNvcnJlY3QgY29sb3JzIGFyZSBpbiB0aGUgY29uc29sZSBkb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sb3IoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlsYXVuY2goImVjaG9pbmdTZXBWTSIpOwotCQlpbnQgb2Zmc2V0PSAxNTsgLy9idWlsZGZpbGUKLQkJQ29sb3IgY29sb3I9IGdldENvbG9yQXRPZmZzZXQob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbG9yIGZvdW5kIGF0ICIgKyBvZmZzZXQsIGNvbG9yKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbG9yLCBBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0lORk9fQ09MT1IpKTsKLQkJdHJ5IHsKLQkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCgyKSArIDEwOyAvL2VjaG8gbGluawotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJmYWlsZWQgZ2V0dGluZyBvZmZzZXQgb2YgbGluZSIsIGZhbHNlKTsKLQkJfQotCQljb2xvcj0gZ2V0Q29sb3JBdE9mZnNldChvZmZzZXQsIENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29sb3IgZm91bmQgYXQgIiArIG9mZnNldCwgY29sb3IpOwotCQlhc3NlcnRFcXVhbHMoY29sb3IsIEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfV0FSTklOR19DT0xPUikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gYW5kIHRoYXQgdGhlCi0JICogY29ycmVjdCB3b3JraW5nIGRpcmVjdG9yeSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V29ya2luZ0RpcmVjdG9yeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigiZWNob2luZ1NlcFZNIik7Ci0JCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBsb2NhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yICIgKyAiZWNob2luZ1NlcFZNIiwgY29uZmlnKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb3B5PSBjb25maWcuZ2V0V29ya2luZ0NvcHkoKTsKLQkJY29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksIGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJY29weS5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BTlRfVEFSR0VUUywgIkJ1ZzQyOTg0Iik7Ci0JCWxhdW5jaEFuZFRlcm1pbmF0ZShjb3B5LCAyMDAwMCk7Ci0JCUNvbnNvbGVMaW5lVHJhY2tlci53YWl0Rm9yQ29uc29sZSgpOwotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSA2LiBXYXMgIiArIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCksIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCkgPT0gNik7Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBlbmQgd2l0aCAiICsgUHJvamVjdEhlbHBlci5QUk9KRUNUX05BTUUgKyAiLiBNZXNzYWdlOiAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMiksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDIpLmVuZHNXaXRoKFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKSk7Ci0JfQotCQotCSAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gYW5kIGdldHRpbmcgbWVzc2FnZXMKLSAgICAgKiBsb2dnZWQgdG8gdGhlIGNvbnNvbGUgZm9yIHByb2plY3QgaGVscC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdEhlbHAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAJbGF1bmNoKCJlY2hvaW5nU2VwVk0iLCAiLXAiKTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSAxNC4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDE0KTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGFzdCBtZXNzYWdlLiBTaG91bGQgc3RhcnQgd2l0aCBlY2hvMjouIE1lc3NhZ2U6ICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TWVzc2FnZSgxMiksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDEyKS50cmltKCkuc3RhcnRzV2l0aCgiZWNobzIiKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS8ucHJvamVjdCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhZWE3MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgRXh0IERpciBUZXN0IEV4YW1wbGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5BbnRWaWV3IEV4dERpciBUZXN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEV4dCBEaXIgVGVzdCBFeGFtcGxlL2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MzNhZDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEV4dCBEaXIgVGVzdCBFeGFtcGxlL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJFeHRlcm5hbCBEaXIgVGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdC1vbmUiPiAgICAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9IkluaXQiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3Qtb25lIiBkZXBlbmRzPSJpbml0LHRlc3QtdHdvIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJPbmUgLSBtdWx0aXBsZSBkZXBlbmRlbnRzIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0LXR3byIgZGVwZW5kcz0iaW5pdCx0ZXN0LXRocmVlIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJUd28gLSBzaW1pbGFyIGRlcGVuZGVuY2llcyIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdC10aHJlZSI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iVGhyZWUgLSBzaW1wbGUiLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgRXh0IERpciBUZXN0IEV4YW1wbGUvcmVhZG1lLnR4dCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNiMTVhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLUNyZWF0ZSBhIG5ldyBzaW1wbGUgcHJvamVjdCB3aXRoIHByb2plY3QgZGlyZWN0b3J5IG91dHNpZGUgRUNMSVBTRV9IT01FCi0gCi1pbXBvcnQgdGhpcyBkaXJlY3RvcnkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC8uY2xhc3NwYXRoIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGZiNDg4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIgcm9vdHBhdGg9IkpSRV9TUkNST09UIiBzb3VyY2VwYXRoPSJKUkVfU1JDIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ4YWU5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5BbnRWaWV3IEphdmEgVGVzdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L2Jpbi5sb2cgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L2Jpbi5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjRmZTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC9iaW4ubG9nCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1Db21waWxlZCAxMyBsaW5lcyBpbiA5OTEgbXMgKDEzLjEgbGluZXMvcykNCi0xIC5jbGFzcyBmaWxlIGdlbmVyYXRlZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvYmluL21haW4uY2xhc3MgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L2Jpbi9tYWluLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjBkOTZjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvYmluL21haW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWFiMzUyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9IkphdmEgQ29tcGlsZSBUZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJjb21waWxlIj4gICAgICAgCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJwcm9wZXJ0aWVzLGVudiI+Ci0JICAgPGphdmFjIGRlc3RkaXI9ImJpbiIgZmFpbG9uZXJyb3I9ImZhbHNlIiB2ZXJib3NlPSJ0cnVlIiBkZWJ1Zz0ib24iIGluY2x1ZGVBbnRSdW50aW1lPSJubyI+Ci0JCQk8c3JjIHBhdGg9InNyYy8iLz4KLQkgICA8L2phdmFjPgotCTwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+IAotICAgICAgIDxkZWxldGUgZmlsZT0iYmluL21haW4uY2xhc3MiLz4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImVudiI+Ci0gICAgICAgPGVjaG8+IAotICAgICAgICAgICBTeXN0ZW0gUHJvcGVydGllcwotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBqYXZhLnZlcnNpb246ICR7amF2YS52ZXJzaW9ufQotICAgICAgICAgICBqYXZhLnZlbmRvcjogJHtqYXZhLnZlbmRvcn0KLSAgICAgICAgICAgamF2YS5ob21lOiAke2phdmEuaG9tZX0KLSAgICAgICAgICAgamF2YS5jbGFzcy5wYXRoOiAke2phdmEuY2xhc3MucGF0aH0KLSAgICAgICAgICAgamF2YS5leHQuZGlyczogJHtqYXZhLmV4dC5kaXJzfQotICAgICAgICAgICBvcy5uYW1lOiAke29zLm5hbWV9Ci0gICAgICAgICAgIG9zLmFyY2g6ICR7b3MuYXJjaH0KLSAgICAgICAgICAgb3MudmVyc2lvbjogJHtvcy52ZXJzaW9ufQotICAgICAgICAgICB1c2VyLm5hbWU6ICR7dXNlci5uYW1lfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgICAgIEFudCBFbnZpcm9ubWVudAotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgIGJhc2VkaXI6ICR7YmFzZWRpcn0KLSAgICAgICAgICAgYW50LmZpbGU6ICR7YW50LmZpbGV9Ci0gICAgICAgICAgIGFudC52ZXJzaW9uOiAke2FudC52ZXJzaW9ufQotICAgICAgICAgICBhbnQucHJvamVjdC5uYW1lOiAke2FudC5wcm9qZWN0Lm5hbWV9Ci0gICAgICAgICAgIGFudC5qYXZhLnZlcnNpb246ICR7YW50LmphdmEudmVyc2lvbn0KLSAgICAgICAgICAgYnVpbGQuY29tcGlsZXI6ICR7YnVpbGQuY29tcGlsZXJ9Ci0gICAgICA8L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC9zcmMvbWFpbi5jbGFzcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3Qvc3JjL21haW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2M5YjQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC9zcmMvbWFpbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3Qvc3JjL21haW4uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3Qvc3JjL21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhYjViOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L3NyYy9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKioKLSAqIEBhdXRob3Igcm9zY29lLm0ucnVzaAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIG1haW4gewotCXB1YmxpYyAgbWFpbigpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyBXb3JsZCFcbiIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0Ly5wcm9qZWN0IGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTlkZmIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5BbnRWaWV3IFRlc3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9CdWlsZGZpbGUgRXJyb3IvYnVpbGQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvQnVpbGRmaWxlIEVycm9yL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkZjYyYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9CdWlsZGZpbGUgRXJyb3IvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9IkFudFZpZXcgVGVzdC4wMSIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdC1vbmUiPiAgICAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9IkluaXQiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3Qtb25lIiBkZXBlbmRzPSJpbml0LHRlc3QtdHdvIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJPbmUgLSBtdWx0aXBsZSBkZXBlbmRlbnRzIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0LXR3byIgZGVwZW5kcz0iaW5pdCx0ZXN0LXRocmVlIiBkZXNjcmlwdGlvbj0iZGVzY3JpcHRpb24gb2YgdGVzdC10d28iPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9IlR3byAtIHNpbWlsYXIgZGVwZW5kZW5jaWVzIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0LXRocmVlIiBkZXNjcmlwdGlvbj0iZGVzY3JpcHRpb24gb2YgdGVzdC10aHJlZSI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iVGhyZWUgLSBzaW1wbGUiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImVudiIKLSAgICAgICA8ZWNobz4KLSAgICAgICAgICAgU2hlbGwgRW52aXJvbm1lbnQKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgQU5UX0hPTUU6ICR7ZS5BTlRfSE9NRX0KLSAgICAgICAgICAgSkFWQV9IT01FOiAke2UuSkFWQV9IT01FfQotICAgICAgICAgICBDTEFTU1BBVEg6ICR7ZS5DTEFTU1BBVEh9Ci0gICAgICAKLSAgICAgICAgICAgU3lzdGVtIFByb3BlcnRpZXMKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgamF2YS52ZXJzaW9uOiAke2phdmEudmVyc2lvbn0KLSAgICAgICAgICAgamF2YS52ZW5kb3I6ICR7amF2YS52ZW5kb3J9Ci0gICAgICAgICAgIGphdmEuaG9tZTogJHtqYXZhLmhvbWV9Ci0gICAgICAgICAgIGphdmEuY2xhc3MucGF0aDogJHtqYXZhLmNsYXNzLnBhdGh9Ci0gICAgICAgICAgIGphdmEuZXh0LmRpcnM6ICR7amF2YS5leHQuZGlyc30KLSAgICAgICAgICAgb3MubmFtZTogJHtvcy5uYW1lfQotICAgICAgICAgICBvcy5hcmNoOiAke29zLmFyY2h9Ci0gICAgICAgICAgIG9zLnZlcnNpb246ICR7b3MudmVyc2lvbn0KLSAgICAgICAgICAgdXNlci5uYW1lOiAke3VzZXIubmFtZX0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgICAgICBBbnQgRW52aXJvbm1lbnQKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBiYXNlZGlyOiAke2Jhc2VkaXJ9Ci0gICAgICAgICAgIGFudC5maWxlOiAke2FudC5maWxlfQotICAgICAgICAgICBhbnQudmVyc2lvbjogJHthbnQudmVyc2lvbn0KLSAgICAgICAgICAgYW50LnByb2plY3QubmFtZTogJHthbnQucHJvamVjdC5uYW1lfQotICAgICAgICAgICBhbnQuamF2YS52ZXJzaW9uOiAke2FudC5qYXZhLnZlcnNpb259Ci0gICAgICA8L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvQ3VzdG9tIEJ1aWxkIGZpbGVuYW1lL2N1c3RvbUJ1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L0N1c3RvbSBCdWlsZCBmaWxlbmFtZS9jdXN0b21CdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MGM5NzUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvQ3VzdG9tIEJ1aWxkIGZpbGVuYW1lL2N1c3RvbUJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJDdXN0b20gYnVpbGQgZmlsZW5hbWUiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3Qtb25lIj4gICAgICAgCi0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJJbml0Ii8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0LW9uZSIgZGVwZW5kcz0iaW5pdCx0ZXN0LXR3byI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iT25lIC0gbXVsdGlwbGUgZGVwZW5kZW50cyIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdC10d28iIGRlcGVuZHM9ImluaXQsdGVzdC10aHJlZSIgZGVzY3JpcHRpb249ImRlc2NyaXB0aW9uIG9mIHRlc3QtdHdvIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJUd28gLSBzaW1pbGFyIGRlcGVuZGVuY2llcyIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdC10aHJlZSIgZGVzY3JpcHRpb249ImRlc2NyaXB0aW9uIG9mIHRlc3QtdGhyZWUiPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9IlRocmVlIC0gc2ltcGxlIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJlbnYiPgotICAgICAgIDxlY2hvPgotICAgICAgICAgICBTeXN0ZW0gUHJvcGVydGllcwotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBqYXZhLnZlcnNpb246ICR7amF2YS52ZXJzaW9ufQotICAgICAgICAgICBqYXZhLnZlbmRvcjogJHtqYXZhLnZlbmRvcn0KLSAgICAgICAgICAgamF2YS5ob21lOiAke2phdmEuaG9tZX0KLSAgICAgICAgICAgamF2YS5jbGFzcy5wYXRoOiAke2phdmEuY2xhc3MucGF0aH0KLSAgICAgICAgICAgamF2YS5leHQuZGlyczogJHtqYXZhLmV4dC5kaXJzfQotICAgICAgICAgICBvcy5uYW1lOiAke29zLm5hbWV9Ci0gICAgICAgICAgIG9zLmFyY2g6ICR7b3MuYXJjaH0KLSAgICAgICAgICAgb3MudmVyc2lvbjogJHtvcy52ZXJzaW9ufQotICAgICAgICAgICB1c2VyLm5hbWU6ICR7dXNlci5uYW1lfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgICAgIEFudCBFbnZpcm9ubWVudAotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgIGJhc2VkaXI6ICR7YmFzZWRpcn0KLSAgICAgICAgICAgYW50LmZpbGU6ICR7YW50LmZpbGV9Ci0gICAgICAgICAgIGFudC52ZXJzaW9uOiAke2FudC52ZXJzaW9ufQotICAgICAgICAgICBhbnQucHJvamVjdC5uYW1lOiAke2FudC5wcm9qZWN0Lm5hbWV9Ci0gICAgICAgICAgIGFudC5qYXZhLnZlcnNpb246ICR7YW50LmphdmEudmVyc2lvbn0KLSAgICAgICAgICAgYnVpbGQuY29tcGlsZXI6ICR7YnVpbGQuY29tcGlsZXJ9Ci0gICAgICA8L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvTWlzc2luZyBkZWZhdWx0IHRhcmdldC9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9NaXNzaW5nIGRlZmF1bHQgdGFyZ2V0L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4ZTRjMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9NaXNzaW5nIGRlZmF1bHQgdGFyZ2V0L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJNaXNzaW5nIFByb2plY3QgZGVmYXVsdCB0ZXN0IiBiYXNlZGlyPSIuIj4gICAgICAgCi0gICAgPHRhcmdldCBuYW1lPSJlbnYiPgotICAgICAgIDxlY2hvPiAgICAKLSAgICAgICAgICAgU3lzdGVtIFByb3BlcnRpZXMKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgamF2YS52ZXJzaW9uOiAke2phdmEudmVyc2lvbn0KLSAgICAgICAgICAgamF2YS52ZW5kb3I6ICR7amF2YS52ZW5kb3J9Ci0gICAgICAgICAgIGphdmEuaG9tZTogJHtqYXZhLmhvbWV9Ci0gICAgICAgICAgIGphdmEuY2xhc3MucGF0aDogJHtqYXZhLmNsYXNzLnBhdGh9Ci0gICAgICAgICAgIGphdmEuZXh0LmRpcnM6ICR7amF2YS5leHQuZGlyc30KLSAgICAgICAgICAgb3MubmFtZTogJHtvcy5uYW1lfQotICAgICAgICAgICBvcy5hcmNoOiAke29zLmFyY2h9Ci0gICAgICAgICAgIG9zLnZlcnNpb246ICR7b3MudmVyc2lvbn0KLSAgICAgICAgICAgdXNlci5uYW1lOiAke3VzZXIubmFtZX0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgICAgICBBbnQgRW52aXJvbm1lbnQKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBiYXNlZGlyOiAke2Jhc2VkaXJ9Ci0gICAgICAgICAgIGFudC5maWxlOiAke2FudC5maWxlfQotICAgICAgICAgICBhbnQudmVyc2lvbjogJHthbnQudmVyc2lvbn0KLSAgICAgICAgICAgYW50LnByb2plY3QubmFtZTogJHthbnQucHJvamVjdC5uYW1lfQotICAgICAgICAgICBhbnQuamF2YS52ZXJzaW9uOiAke2FudC5qYXZhLnZlcnNpb259Ci0gICAgICAgICAgIGJ1aWxkLmNvbXBpbGVyOiAke2J1aWxkLmNvbXBpbGVyfQotICAgICAgPC9lY2hvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L01pc3NpbmcgcHJvamVjdCBlbGVtZW50L2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L01pc3NpbmcgcHJvamVjdCBlbGVtZW50L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmYmRhMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9NaXNzaW5nIHByb2plY3QgZWxlbWVudC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG1pc3Npbmdwcm9qZWN0IG5hbWU9Ik1pc3NpbmcgcHJvamVjdCBlbGVtZW50IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJlbnYiPiAgICAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImVudiI+Ci0gICAgICAgPGVjaG8+ICAgIAotICAgICAgICAgICBTeXN0ZW0gUHJvcGVydGllcwotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBqYXZhLnZlcnNpb246ICR7amF2YS52ZXJzaW9ufQotICAgICAgICAgICBqYXZhLnZlbmRvcjogJHtqYXZhLnZlbmRvcn0KLSAgICAgICAgICAgamF2YS5ob21lOiAke2phdmEuaG9tZX0KLSAgICAgICAgICAgamF2YS5jbGFzcy5wYXRoOiAke2phdmEuY2xhc3MucGF0aH0KLSAgICAgICAgICAgamF2YS5leHQuZGlyczogJHtqYXZhLmV4dC5kaXJzfQotICAgICAgICAgICBvcy5uYW1lOiAke29zLm5hbWV9Ci0gICAgICAgICAgIG9zLmFyY2g6ICR7b3MuYXJjaH0KLSAgICAgICAgICAgb3MudmVyc2lvbjogJHtvcy52ZXJzaW9ufQotICAgICAgICAgICB1c2VyLm5hbWU6ICR7dXNlci5uYW1lfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgICAgIEFudCBFbnZpcm9ubWVudAotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgIGJhc2VkaXI6ICR7YmFzZWRpcn0KLSAgICAgICAgICAgYW50LmZpbGU6ICR7YW50LmZpbGV9Ci0gICAgICAgICAgIGFudC52ZXJzaW9uOiAke2FudC52ZXJzaW9ufQotICAgICAgICAgICBhbnQucHJvamVjdC5uYW1lOiAke2FudC5wcm9qZWN0Lm5hbWV9Ci0gICAgICAgICAgIGFudC5qYXZhLnZlcnNpb246ICR7YW50LmphdmEudmVyc2lvbn0KLSAgICAgICAgICAgYnVpbGQuY29tcGlsZXI6ICR7YnVpbGQuY29tcGlsZXJ9Ci0gICAgICA8L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci08L21pc3Npbmdwcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L01pc3NpbmcgcHJvamVjdCBuYW1lL2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L01pc3NpbmcgcHJvamVjdCBuYW1lL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwZmU2NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9NaXNzaW5nIHByb2plY3QgbmFtZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZW52Ij4gICAgICAgCi0gICAgPHRhcmdldCBuYW1lPSJlbnYiPgotICAgICAgIDxlY2hvPiAgICAKLSAgICAgICAgICAgU3lzdGVtIFByb3BlcnRpZXMKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgamF2YS52ZXJzaW9uOiAke2phdmEudmVyc2lvbn0KLSAgICAgICAgICAgamF2YS52ZW5kb3I6ICR7amF2YS52ZW5kb3J9Ci0gICAgICAgICAgIGphdmEuaG9tZTogJHtqYXZhLmhvbWV9Ci0gICAgICAgICAgIGphdmEuY2xhc3MucGF0aDogJHtqYXZhLmNsYXNzLnBhdGh9Ci0gICAgICAgICAgIGphdmEuZXh0LmRpcnM6ICR7amF2YS5leHQuZGlyc30KLSAgICAgICAgICAgb3MubmFtZTogJHtvcy5uYW1lfQotICAgICAgICAgICBvcy5hcmNoOiAke29zLmFyY2h9Ci0gICAgICAgICAgIG9zLnZlcnNpb246ICR7b3MudmVyc2lvbn0KLSAgICAgICAgICAgdXNlci5uYW1lOiAke3VzZXIubmFtZX0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgICAgICBBbnQgRW52aXJvbm1lbnQKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBiYXNlZGlyOiAke2Jhc2VkaXJ9Ci0gICAgICAgICAgIGFudC5maWxlOiAke2FudC5maWxlfQotICAgICAgICAgICBhbnQudmVyc2lvbjogJHthbnQudmVyc2lvbn0KLSAgICAgICAgICAgYW50LnByb2plY3QubmFtZTogJHthbnQucHJvamVjdC5uYW1lfQotICAgICAgICAgICBhbnQuamF2YS52ZXJzaW9uOiAke2FudC5qYXZhLnZlcnNpb259Ci0gICAgICAgICAgIGJ1aWxkLmNvbXBpbGVyOiAke2J1aWxkLmNvbXBpbGVyfQotICAgICAgPC9lY2hvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L1NpbWlsYXIgRGVwZW5kZW5jaWVzL2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L1NpbWlsYXIgRGVwZW5kZW5jaWVzL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1YzY1MC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9TaW1pbGFyIERlcGVuZGVuY2llcy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iU2ltaWxpYXIgZGVwZW5kZW5jaWVzIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0LW9uZSI+ICAgICAgIAotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iSW5pdCIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdC1vbmUiIGRlcGVuZHM9ImluaXQsdGVzdC10d28iPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9Ik9uZSAtIG11bHRpcGxlIGRlcGVuZGVudHMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtdHdvIiBkZXBlbmRzPSJpbml0LHRlc3QtdGhyZWUiIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiBvZiB0ZXN0LXR3byI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iVHdvIC0gc2ltaWxhciBkZXBlbmRlbmNpZXMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtdGhyZWUiIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiBvZiB0ZXN0LXRocmVlIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJUaHJlZSAtIHNpbXBsZSIvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L1NpbXBsZSBEZXBlbmRlbmN5L2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L1NpbXBsZSBEZXBlbmRlbmN5L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxZThkZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9TaW1wbGUgRGVwZW5kZW5jeS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJTaW1wbGUiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QtYSI+ICAgICAgICAKLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYSI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iQSAtIG5vIGRlcGVuZGVudHMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYiIgZGVwZW5kcz0idGVzdC1hIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJCIC0gc2ltcGxlIGRlcGVuZGVuY3kiLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9leHRlcm5hbHRvb2xzL01pZ3JhdGlvblRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9leHRlcm5hbHRvb2xzL01pZ3JhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGZiNmEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZXh0ZXJuYWx0b29scy9NaWdyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmV4dGVybmFsdG9vbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5SZWZyZXNoVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnJlZ2lzdHJ5LkV4dGVybmFsVG9vbE1pZ3JhdGlvbjsKLQotLyoqCi0gKiBUZXN0cyBtaWdyYXRpb24gb2YgQW50IGFuZCBFeHRlcm5hbCBUb29sIGNvbmZpZ3VyYXRpb25zIGZyb20gb2xkCi0gKiBmb3JtYXRzIHRvIHRoZSBjdXJyZW50IGZvcm1hdC4KLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIFRlc3RzIG1pZ3JhdGlvbiBvZiBhcmd1bWVudHMgZnJvbSBhbiBFY2xpcHNlIDIuMCBBbnQgYnVpbGRmaWxlCi0JICogY29uZmlndXJhdGlvbiB0byBhIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDIwQW50TWlncmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlNYXAgYXJndW1lbnRNYXA9IGdldDIwQW50QXJndW1lbnRNYXAoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcgPSBFeHRlcm5hbFRvb2xNaWdyYXRpb24uY29uZmlnRnJvbUFyZ3VtZW50TWFwKGFyZ3VtZW50TWFwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTWlncmF0aW9uIGZhaWxlZCIsIGNvbmZpZyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbmZpZ3VyYXRpb24gdHlwZSIsIElBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0FOVF9CVUlMREVSX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUsIGNvbmZpZy5nZXRUeXBlKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbnQgdG9vbCIsIGNvbmZpZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImxvY2F0aW9uIiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sICIiKSk7Ci0JCWFzc2VydEVxdWFscygicmVmcmVzaCBzY29wZSIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoUmVmcmVzaFRhYi5BVFRSX1JFRlJFU0hfU0NPUEUsICIiKSk7Ci0JCVN0cmluZ1tdIHRhcmdldHM9IEFudFV0aWwuZ2V0VGFyZ2V0c0Zyb21Db25maWcoY29uZmlnKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdGFyZ2V0cyBmb3VuZCIsIHRhcmdldHMpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB0YXJnZXRzIiwgMiwgdGFyZ2V0cy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoInRhcmdldDEiLCB0YXJnZXRzWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0YXJnZXQyIiwgdGFyZ2V0c1sxXSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9DQVBUVVJFX09VVFBVVCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJidWlsZCBraW5kcyIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1JVTl9CVUlMRF9LSU5EUywgIiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhcmcgICIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1RPT0xfQVJHVU1FTlRTLCAiIikpOwotCQlhc3NlcnRFcXVhbHMoIndvcmtpbmcgZGlyIiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksICIiKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYXJndW1lbnRzIGZvciBhbiBBbnQgYnVpbGRmaWxlIHVzaW5nCi0JICogRWNsaXBzZSAyLjAgYXJndW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgMi4wIGFyZ3VtZW50cyBmb3IgYW4gQW50IGJ1aWxkZmlsZS4KLQkgKi8KLQlwcml2YXRlIE1hcCBnZXQyMEFudEFyZ3VtZW50TWFwKCkgewotCQlIYXNoTWFwIGFyZ3VtZW50cz0gbmV3IEhhc2hNYXAoKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1ZFUlNJT04sICIyLjAiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfVFlQRSwgIm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMudHlwZS5hbnQiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfTkFNRSwgImFudCB0b29sIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19UT09MX0xPQ0FUSU9OLCAibG9jYXRpb24iKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfUkVGUkVTSCwgInJlZnJlc2ggc2NvcGUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfQVJHVU1FTlRTLCAiYXJnICR7YW50X3RhcmdldDp0YXJnZXQxfSAke2FudF90YXJnZXQ6dGFyZ2V0Mn0iKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfU0hPV19MT0csICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19UT09MX0JMT0NLLCAiZmFsc2UiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfQlVJTERfVFlQRVMsICJidWlsZCBraW5kcyIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9ESVJFQ1RPUlksICJ3b3JraW5nIGRpciIpOwotCQlyZXR1cm4gYXJndW1lbnRzOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIG1pZ3JhdGlvbiBvZiBhcmd1bWVudHMgZnJvbSBhbiBFY2xpcHNlIDIuMCBBbnQgYnVpbGRmaWxlCi0JICogY29uZmlndXJhdGlvbiB0byBhIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDIwUHJvZ3JhbU1pZ3JhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTWFwIGFyZ3VtZW50TWFwPSBnZXQyMFByb2dyYW1Bcmd1bWVudE1hcCgpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5jb25maWdGcm9tQXJndW1lbnRNYXAoYXJndW1lbnRNYXApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbmZpZ3VyYXRpb24gdHlwZSIsIElFeHRlcm5hbFRvb2xDb25zdGFudHMuSURfUFJPR1JBTV9CVUlMREVSX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUsIGNvbmZpZy5nZXRUeXBlKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9ncmFtIHRvb2wiLCBjb25maWcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb2NhdGlvbiIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiIikpOwotCQlhc3NlcnRFcXVhbHMoInJlZnJlc2ggc2NvcGUiLCBjb25maWcuZ2V0QXR0cmlidXRlKFJlZnJlc2hUYWIuQVRUUl9SRUZSRVNIX1NDT1BFLCAiIikpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfQ0FQVFVSRV9PVVRQVVQsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjb25maWcuZ2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiYnVpbGQga2luZHMiLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9SVU5fQlVJTERfS0lORFMsICIiKSk7Ci0JCWFzc2VydEVxdWFscygiYXJnICR7YW50X3RhcmdldDp0YXJnZXQxfSAke2FudF90YXJnZXQ6dGFyZ2V0Mn0iLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9UT09MX0FSR1VNRU5UUywgIiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3b3JraW5nIGRpciIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1dPUktJTkdfRElSRUNUT1JZLCAiIikpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFyZ3VtZW50cyBmb3IgZXhlY3V0aW5nIGEgcHJvZ3JhbQotCSAqIHVzaW5nIEVjbGlwc2UgMi4wIGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIDIuMCBhcmd1bWVudHMgZm9yIGEgcHJvZ3JhbQotCSAqLwotCXByaXZhdGUgTWFwIGdldDIwUHJvZ3JhbUFyZ3VtZW50TWFwKCkgewotCQlIYXNoTWFwIGFyZ3VtZW50cz0gbmV3IEhhc2hNYXAoKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1ZFUlNJT04sICIyLjAiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfVFlQRSwgIm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMudHlwZS5wcm9ncmFtIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19UT09MX05BTUUsICJwcm9ncmFtIHRvb2wiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfTE9DQVRJT04sICJsb2NhdGlvbiIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9SRUZSRVNILCAicmVmcmVzaCBzY29wZSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9BUkdVTUVOVFMsICJhcmcgJHthbnRfdGFyZ2V0OnRhcmdldDF9ICR7YW50X3RhcmdldDp0YXJnZXQyfSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9TSE9XX0xPRywgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfQkxPQ0ssICJmYWxzZSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9CVUlMRF9UWVBFUywgImJ1aWxkIGtpbmRzIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19UT09MX0RJUkVDVE9SWSwgIndvcmtpbmcgZGlyIik7Ci0JCXJldHVybiBhcmd1bWVudHM7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIG1pZ3JhdGlvbiBvZiBhcmd1bWVudHMgZnJvbSBhbiBFY2xpcHNlIDIuMSBBbnQgYnVpbGRmaWxlCi0JICogY29uZmlndXJhdGlvbiB0byBhIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDIxQW50TWlncmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlNYXAgYXJndW1lbnRNYXA9IGdldDIxQW50QXJndW1lbnRNYXAoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcgPSBFeHRlcm5hbFRvb2xNaWdyYXRpb24uY29uZmlnRnJvbUFyZ3VtZW50TWFwKGFyZ3VtZW50TWFwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTWlncmF0aW9uIGZhaWxlZCIsIGNvbmZpZyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbmZpZyB0eXBlIiwgSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSURfQU5UX0JVSUxERVJfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRSwgY29uZmlnLmdldFR5cGUoKS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoImFudCBjb25maWciLCBjb25maWcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb2NhdGlvbiIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiIikpOwotCQlhc3NlcnRFcXVhbHMoIndvcmtpbmcgZGlyZWN0b3J5IiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksICIiKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9DQVBUVVJFX09VVFBVVCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1NIT1dfQ09OU09MRSwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1BST01QVF9GT1JfQVJHVU1FTlRTLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInJlZnJlc2ggc2NvcGUiLCBjb25maWcuZ2V0QXR0cmlidXRlKFJlZnJlc2hUYWIuQVRUUl9SRUZSRVNIX1NDT1BFLCAiIikpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY29uZmlnLmdldEF0dHJpYnV0ZShSZWZyZXNoVGFiLkFUVFJfUkVGUkVTSF9SRUNVUlNJVkUsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiYnVpbGQga2luZHMiLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9SVU5fQlVJTERfS0lORFMsICIiKSk7Ci0JCWFzc2VydEVxdWFscygiYXJnMSBhcmcyIiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfVE9PTF9BUkdVTUVOVFMsICIiKSk7Ci0JCVN0cmluZ1tdIHRhcmdldHM9IEFudFV0aWwuZ2V0VGFyZ2V0c0Zyb21Db25maWcoY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdGFyZ2V0cyIsIDIsIHRhcmdldHMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0YXJnZXQxIiwgdGFyZ2V0c1swXSk7Ci0JCWFzc2VydEVxdWFscygidGFyZ2V0MiIsIHRhcmdldHNbMV0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFyZ3VtZW50cyBmb3IgZXhlY3V0aW5nIGFuIEFudAotCSAqIGJ1aWxkZmlsZSB1c2luZyBFY2xpcHNlIDIuMSBhcmd1bWVudHMuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiAyLjEgYXJndW1lbnRzIGZvciBhbiBBbnQgYnVpbGRmaWxlCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0MjFBbnRBcmd1bWVudE1hcCgpIHsKLQkJSGFzaE1hcCBhcmd1bWVudHM9IG5ldyBIYXNoTWFwKCk7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19WRVJTSU9OLCAiMi4xIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19OQU1FLCAiYW50IGNvbmZpZyIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVFlQRSwgRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRPT0xfVFlQRV9BTlRfQlVJTEQpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfTE9DQVRJT04sICJsb2NhdGlvbiIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfV09SS19ESVIsICJ3b3JraW5nIGRpcmVjdG9yeSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfQ0FQVFVSRV9PVVRQVVQsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19TSE9XX0NPTlNPTEUsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19TSE9XX0NPTlNPTEUsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19SVU5fQktHUk5ELCAidHJ1ZSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfUFJPTVBUX0FSR1MsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19SRUZSRVNIX1NDT1BFLCAicmVmcmVzaCBzY29wZSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfUkVGUkVTSF9SRUNVUlNJVkUsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19SVU5fQlVJTERfS0lORFMsICJidWlsZCBraW5kcyIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfQVJHUywgImFyZzEgYXJnMiIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfRVhUUkFfQVRUUiwgRXh0ZXJuYWxUb29sTWlncmF0aW9uLlJVTl9UQVJHRVRTX0FUVFJJQlVURSArICI9dGFyZ2V0MSx0YXJnZXQyIik7Ci0JCXJldHVybiBhcmd1bWVudHM7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIG1pZ3JhdGlvbiBvZiBhcmd1bWVudHMgZnJvbSBhbiBFY2xpcHNlIDIuMSBwcm9ncmFtCi0JICogY29uZmlndXJhdGlvbiB0byBhIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDIxUHJvZ3JhbU1pZ3JhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTWFwIGFyZ3VtZW50TWFwPSBnZXQyMVByb2dyYW1Bcmd1bWVudE1hcCgpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5jb25maWdGcm9tQXJndW1lbnRNYXAoYXJndW1lbnRNYXApOwotCQlhc3NlcnROb3ROdWxsKCJNaWdyYXRpb24gZmFpbGVkIiwgY29uZmlnKTsKLQkJCi0JCWFzc2VydEVxdWFscygiV3JvbmcgY29uZmlnIHR5cGUiLCBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLklEX1BST0dSQU1fQlVJTERFUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFLCBjb25maWcuZ2V0VHlwZSgpLmdldElkZW50aWZpZXIoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvZ3JhbSBjb25maWciLCBjb25maWcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb2NhdGlvbiIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiIikpOwotCQlhc3NlcnRFcXVhbHMoIndvcmtpbmcgZGlyZWN0b3J5IiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksICIiKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9DQVBUVVJFX09VVFBVVCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1NIT1dfQ09OU09MRSwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1BST01QVF9GT1JfQVJHVU1FTlRTLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInJlZnJlc2ggc2NvcGUiLCBjb25maWcuZ2V0QXR0cmlidXRlKFJlZnJlc2hUYWIuQVRUUl9SRUZSRVNIX1NDT1BFLCAiIikpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY29uZmlnLmdldEF0dHJpYnV0ZShSZWZyZXNoVGFiLkFUVFJfUkVGUkVTSF9SRUNVUlNJVkUsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiYnVpbGQga2luZHMiLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9SVU5fQlVJTERfS0lORFMsICIiKSk7Ci0JCWFzc2VydEVxdWFscygiYXJnMSBhcmcyIiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfVE9PTF9BUkdVTUVOVFMsICIiKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYXJndW1lbnRzIGZvciBleGVjdXRpbmcgYSBwcm9ncmFtCi0JICogYnVpbGRmaWxlIHVzaW5nIEVjbGlwc2UgMi4xIGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIDIuMSBhcmd1bWVudHMgZm9yIGEgcHJvZ3JhbQotCSAqLwotCXByaXZhdGUgTWFwIGdldDIxUHJvZ3JhbUFyZ3VtZW50TWFwKCkgewotCQlIYXNoTWFwIGFyZ3VtZW50cz0gbmV3IEhhc2hNYXAoKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1ZFUlNJT04sICIyLjEiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX05BTUUsICJwcm9ncmFtIGNvbmZpZyIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVFlQRSwgSUV4dGVybmFsVG9vbENvbnN0YW50cy5UT09MX1RZUEVfUFJPR1JBTSk7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19MT0NBVElPTiwgImxvY2F0aW9uIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19XT1JLX0RJUiwgIndvcmtpbmcgZGlyZWN0b3J5Iik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19DQVBUVVJFX09VVFBVVCwgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1NIT1dfQ09OU09MRSwgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1NIT1dfQ09OU09MRSwgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1JVTl9CS0dSTkQsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19QUk9NUFRfQVJHUywgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1JFRlJFU0hfU0NPUEUsICJyZWZyZXNoIHNjb3BlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19SRUZSRVNIX1JFQ1VSU0lWRSwgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1JVTl9CVUlMRF9LSU5EUywgImJ1aWxkIGtpbmRzIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19BUkdTLCAiYXJnMSBhcmcyIik7Ci0JCXJldHVybiBhcmd1bWVudHM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9hYm91dC5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU1MDZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4zMHRoIEphbnVhcnksIDIwMDM8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGQucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2ZDc2ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0JCQkgICBwbHVnaW4ucHJvcGVydGllcyxcCi0JCQkgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RidWlsZGZpbGVzLyxcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIGxpYi8qLmphcixcCi0gICAgICAgICAgICAgICAqLmphcgotICAgICAgICAgICAgICAgCi1zb3VyY2UuYW50dGVzdHN1aS5qYXIgPSB0ZXN0IHBsdWdpbi8sXAotCQkJCQkJQW50IEVkaXRvciBUZXN0cy8sXAotCQkJCQkJRXh0ZXJuYWwgVG9vbHMvLFwKLQkJCQkJCUFudCBUZXN0cy8sXAotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRmaWxlcy8KLQkJCQkJCQotc291cmNlLmxpYi9hbnRVSVRlc3RzU3VwcG9ydC5qYXIgPSB0ZXN0IHN1cHBvcnQvCi1qYXJzLmNvbXBpbGUub3JkZXI9YW50dGVzdHN1aS5qYXIsbGliL2FudFVJVGVzdHNTdXBwb3J0LmphcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FiNzIzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iYnVpbGQgdGVzdHMgc3VwcG9ydCBqYXIiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLiI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iYm9vdGNsYXNzcGF0aCIgdmFsdWU9IiIvPgotCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVzY3JpcHRpb249IlJlbW92ZXMgYWxsIGJ1aWxkIGFydGlmYWN0cywgcmVjcmVhdGVzIHRoZSBzdXBwb3J0IGphciwgYW5kIHJlZnJlc2hlcyB0aGlzIHBsdWdpbidzIHJlc291cmNlcyIgZGVwZW5kcz0iY2xlYW4sIGxpYi9hbnRVSVRlc3RzU3VwcG9ydC5qYXIiLz4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uLnN1ZmZpeCIgdmFsdWU9Il8zLjAuMCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYW50X3ZlcnNpb24uc3VmZml4IiB2YWx1ZT0iXzEuNi4xIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0ibGliL2FudFVJVGVzdHNTdXBwb3J0LmphciIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ICJCdWlsZHMgdGhlIHN1cHBvcnQgSkFSIj4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9saWIvYW50VUlUZXN0c1N1cHBvcnQuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudFVJVGVzdHNTdXBwb3J0Lmphci5iaW4iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudFVJVGVzdHNTdXBwb3J0Lmphci5iaW4iLz4KLQkJPCEtLSBjb21waWxlIHRoZSBzb3VyY2UgY29kZSAtLT4KLQkJPGphdmFjIHRhcmdldD0iMS4xIiBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50VUlUZXN0c1N1cHBvcnQuamFyLmJpbiIgZmFpbG9uZXJyb3I9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9Im9uIiBpbmNsdWRlQW50UnVudGltZT0ieWVzIiBib290Y2xhc3NwYXRoPSIke2Jvb3RjbGFzc3BhdGh9IiAKLQkJCWNsYXNzcGF0aD0iJHtiYXNlZGlyfS8uLi9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvYmluOwotCQkJJHtlY2xpcHNlLmhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lJHt2ZXJzaW9uLnN1ZmZpeH0vcnVudGltZS5qYXI7Ci0JCQkke2Jhc2VkaXJ9L2JpbjsKLQkJCSR7ZWNsaXBzZS5ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5jb3JlJHt2ZXJzaW9uLnN1ZmZpeH0vYW50c3VwcG9ydC5qYXI7Ci0JCQkke2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLmFudC5jb3JlL2JpbiI+Ci0JCQk8c3JjIHBhdGg9InRlc3Qgc3VwcG9ydC8iLz4KLQkJPC9qYXZhYz4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIiLz4KLQkJPGphciBqYXJmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9hbnRVSVRlc3RzU3VwcG9ydC5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRVSVRlc3RzU3VwcG9ydC5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIvYW50VUlUZXN0c1N1cHBvcnQuamFyIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9pY29ucy9hbnQuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9pY29ucy9hbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGEzNjVjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvaWNvbnMvYW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvbGliLy5jdnNpZ25vcmUgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjkwODk4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hbnRVSVRlc3RzU3VwcG9ydC5qYXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzIyOGIyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUFudCBVSSBUZXN0IFBsdWdpbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9wbHVnaW4ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVkNjU2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQW50VUlUZXN0UGx1Z2luIj4KLSAgIAotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiLz4KLQkgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4gICAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW50LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuZGVidWciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbnQudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gCi08cnVudGltZT4KLSAgPGxpYnJhcnkgbmFtZT0iYW50dGVzdHN1aS5qYXIiID4KLSAgICAgPGV4cG9ydCBuYW1lID0gIioiLz4KLSAgPC9saWJyYXJ5PiAKLTwvcnVudGltZT4KLQotIDxleHRlbnNpb24KLSAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGVMaW5lVHJhY2tlcnMiPgotCSAgPGNvbnNvbGVMaW5lVHJhY2tlcgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkNvbnNvbGVMaW5lVHJhY2tlciIKLQkgICAgICAgIHByb2Nlc3NUeXBlPSJvcmcuZWNsaXBzZS5hbnQudWkuYW50UHJvY2VzcyIKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5Db25zb2xlTGluZVRyYWNrZXIiPgotCSAgPC9jb25zb2xlTGluZVRyYWNrZXI+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmV4dHJhQ2xhc3NwYXRoRW50cmllcyI+Ci0gICAgICA8ZXh0cmFDbGFzc3BhdGhFbnRyeQotICAgICAgICAgICAgbGlicmFyeT0ibGliL2FudFVJVGVzdHNTdXBwb3J0LmphciIKLSAgICAgICAgICAgIGVjbGlwc2VSdW50aW1lPSJmYWxzZSI+Ci0gICAgICA8L2V4dHJhQ2xhc3NwYXRoRW50cnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFRhc2tzIj4KLQkgICAgPGFudFRhc2sgCi0JICAgIAluYW1lPSJjb29sVUlUYXNrIiAKLQkgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50YXNrcy5BbnRUZXN0VGFzazIiCi0JICAgIAlsaWJyYXJ5PSJsaWIvYW50VUlUZXN0c1N1cHBvcnQuamFyIgotCSAgICAJZWNsaXBzZVJ1bnRpbWU9ImZhbHNlIj4KLQkgICAgPC9hbnRUYXNrPgotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUeXBlcyI+Ci0JICAgIDxhbnRUeXBlIAotCSAgICAJbmFtZT0iY29vbFVJVHlwZSIgCi0JICAgIAljbGFzcz0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudHlwZXMuQW50VGVzdFBhdGgiCi0JICAgIAlsaWJyYXJ5PSJsaWIvYW50VUlUZXN0c1N1cHBvcnQuamFyIgotCSAgICAJZWNsaXBzZVJ1bnRpbWU9ImZhbHNlIj4KLQkgICAgPC9hbnRUeXBlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRQcm9wZXJ0aWVzIj4KLSAgICAgIDxhbnRQcm9wZXJ0eQotICAgICAgICAgICAgbmFtZT0icHJvcGVydHkudWkudGVzdGluZyIKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvYW50UHJvcGVydHk+Ci0gICAgICAgPGFudFByb3BlcnR5Ci0gICAgICAgICAgICBuYW1lPSJwcm9wZXJ0eS51aS50ZXN0aW5nMiIKLSAgICAgICAgICAgIHZhbHVlPSJoZXkiCi0gICAgICAgICAgICAgZWNsaXBzZVJ1bnRpbWU9ImZhbHNlIj4KLSAgICAgIDwvYW50UHJvcGVydHk+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BYnN0cmFjdEFudFVJVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BYnN0cmFjdEFudFVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRjYWZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQWJzdHJhY3RBbnRVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5BbnRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuWE1MQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3Iuc3VwcG9ydC5UZXN0TG9jYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLnN1cHBvcnQuVGVzdFByb2JsZW1SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwudWkuRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5jb25zb2xlLkNvbnNvbGVEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLmNvbnNvbGUuSHlwZXJsaW5rUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwudWkudmlld3MuY29uc29sZS5TdHJlYW1QYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUNvbG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLm1vZGVsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFudFVJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIElEb2N1bWVudCBjdXJyZW50RG9jdW1lbnQ7Ci0KLQlwdWJsaWMgQWJzdHJhY3RBbnRVSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXRCdWlsZEZpbGUoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImJ1aWxkZmlsZXMiKS5nZXRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBidWlsZCBmaWxlIG5hbWVkOiAiICsgYnVpbGRGaWxlTmFtZSwgZmlsZS5leGlzdHMoKSk7Ci0JCXJldHVybiBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlICdBbnRVSVRlc3RzJyBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlc3QgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgZmlsZU5hbWUpIHsKLQkJRmlsZSBmaWxlID0gZ2V0QnVpbGRGaWxlKGZpbGVOYW1lKTsKLQkJSW5wdXRTdHJlYW0gaW47Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgaW5pdGlhbENvbnRlbnQ9IGdldFN0cmVhbUNvbnRlbnRBc1N0cmluZyhpbik7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnQoaW5pdGlhbENvbnRlbnQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyZWFtQ29udGVudEFzU3RyaW5nKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlcjsKLQkJdHJ5IHsKLQkJCXJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCkpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCUFudFVJUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUJ1ZmZlcmVkUmVhZGVyIHRlbXBCdWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOwotCi0JCXJldHVybiBnZXRSZWFkZXJDb250ZW50QXNTdHJpbmcodGVtcEJ1ZmZlcmVkUmVhZGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWFkZXJDb250ZW50QXNTdHJpbmcoQnVmZmVyZWRSZWFkZXIgdGVtcEJ1ZmZlcmVkUmVhZGVyKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZW1wUmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJU3RyaW5nIHRlbXBMaW5lPSB0ZW1wQnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQotCQkJd2hpbGUodGVtcExpbmUgIT0gbnVsbCkgewotCQkJCWlmKHRlbXBSZXN1bHQubGVuZ3RoKCkgIT0gMCkgewotCQkJCQl0ZW1wUmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0ZW1wUmVzdWx0LmFwcGVuZCh0ZW1wTGluZSk7Ci0JCQkJdGVtcExpbmUgPSB0ZW1wQnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJQW50VUlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdGVtcFJlc3VsdC50b1N0cmluZygpOwotCX0KLQkJCi0JcHJvdGVjdGVkIEFudE1vZGVsIGdldEFudE1vZGVsKFN0cmluZyBmaWxlTmFtZSkgewotCQljdXJyZW50RG9jdW1lbnQ9IGdldERvY3VtZW50KGZpbGVOYW1lKTsKLQkJQW50TW9kZWwgbW9kZWw9IG5ldyBBbnRNb2RlbChYTUxDb3JlLmdldERlZmF1bHQoKSwgY3VycmVudERvY3VtZW50LCBuZXcgVGVzdFByb2JsZW1SZXF1ZXN0b3IoKSwgbmV3IFRlc3RMb2NhdGlvblByb3ZpZGVyKGdldEJ1aWxkRmlsZShmaWxlTmFtZSkpKTsKLQkJbW9kZWwucmVjb25jaWxlKG51bGwpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldEN1cnJlbnREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGN1cnJlbnREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3VycmVudERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudERvY3VtZW50KElEb2N1bWVudCBjdXJyZW50RG9jdW1lbnQpIHsKLQkJdGhpcy5jdXJyZW50RG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIExhdW5jaGVzIHRoZSBBbnQgYnVpbGQgd2l0aCB0aGUgYnVpbGRmaWxlIG5hbWUgKG5vIGV4dGVuc2lvbikuCi0JICogCi0JICogQHBhcmFtIGJ1aWxkRmlsZU5hbWUgdGhlIGFudCBidWlsZGZpbGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxhdW5jaChTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgbG9jYXRlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciAiICsgYnVpbGRGaWxlTmFtZSwgY29uZmlnKTsKLQkJbGF1bmNoQW5kVGVybWluYXRlKGNvbmZpZywgMjAwMDApOwotCX0KLQkKLQkvKioKLQkgKiBMYXVuY2hlcyB0aGUgQW50IGJ1aWxkIHdpdGggdGhlIGJ1aWxkZmlsZSBuYW1lIChubyBleHRlbnNpb24pLgotCSAqIAotCSAqIEBwYXJhbSBidWlsZEZpbGVOYW1lIHRoZSBidWlsZGZpbGUKLQkgKiBAcGFyYW0gYXJndW1lbnRzIHRoZSBhbnQgYXJndW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF1bmNoKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgYXJndW1lbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oYnVpbGRGaWxlTmFtZSk7Ci0JCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBsb2NhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yICIgKyBidWlsZEZpbGVOYW1lLCBjb25maWcpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvcHk9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQljb3B5LnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfVE9PTF9BUkdVTUVOVFMsIGFyZ3VtZW50cyk7Ci0JCWxhdW5jaEFuZFRlcm1pbmF0ZShjb3B5LCAyMDAwMCk7Ci0JfQotCQotCS8qKgotCSogTGF1bmNoZXMgdGhlIEFudCBidWlsZCBpbiBkZWJ1ZyBtb2RlIHdpdGggdGhlIGJ1aWxkZmlsZSBuYW1lIChubyBleHRlbnNpb24pLgotCSogCi0JKiBAcGFyYW0gbWFpblR5cGVOYW1lIHRoZSBwcm9ncmFtIHRvIGxhdW5jaAotCSogQHJldHVybiB0aHJlYWQgaW4gd2hpY2ggdGhlIGZpcnN0IHN1c3BlbmQgZXZlbnQgb2NjdXJyZWQKLQkqLwotCXByb3RlY3RlZCB2b2lkIGxhdW5jaEluRGVidWcoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGxvY2F0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgIiArIGJ1aWxkRmlsZU5hbWUsIGNvbmZpZyk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weT0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0JCWNvcHkuc2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9UT09MX0FSR1VNRU5UUywgIi1kZWJ1ZyIpOwotCQlsYXVuY2hBbmRUZXJtaW5hdGUoY29weSwgMTAwMDApOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGJ1aWxkZmlsZQotCSAqIAotCSAqIEBwYXJhbSBidWlsZEZpbGVOYW1lIGJ1aWxkZmlsZSB0byBsYXVuY2gKLQkgKiBAc2VlIFByb2plY3RDcmVhdGlvbkRlY29yYXRvcgotCSAqLwotCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKFN0cmluZyBidWlsZEZpbGVOYW1lKSB7Ci0JCUlGaWxlIGZpbGUgPSBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoImxhdW5jaENvbmZpZ3VyYXRpb25zIikuZ2V0RmlsZShidWlsZEZpbGVOYW1lICsgIi5sYXVuY2giKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb24oZmlsZSk7Ci0JCWFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciAiICsgYnVpbGRGaWxlTmFtZSwgY29uZmlnLmV4aXN0cygpKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUNvbnRlbnRBc1N0cmluZyhGaWxlIGFGaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhRmlsZSk7Ci0JICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pOwotCSAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOwotCQotCSAgICBTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JICAgIHRyeSB7Ci0JICAgICAgICBTdHJpbmcgbGluZT0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkgICAgCi0JICAgICAgICB3aGlsZShsaW5lICE9IG51bGwpIHsKLQkgICAgICAgICAgICByZXN1bHQgKz0gIlxuIjsKLQkgICAgICAgICAgICByZXN1bHQgKz0gbGluZTsKLQkgICAgICAgICAgICBsaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkgICAgICAgIH0KLQkgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBTQVhQYXJzZXIgZ2V0U0FYUGFyc2VyKCkgewotCQlTQVhQYXJzZXIgcGFyc2VyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBzdHJlYW0sIFNBWFBhcnNlciBwYXJzZXIsIERlZmF1bHRIYW5kbGVyIGhhbmRsZXIsIEZpbGUgZWRpdGVkRmlsZSkgewotCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZT0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7Ci0JCWlmIChlZGl0ZWRGaWxlICE9IG51bGwpIHsKLQkJCS8vbmVlZGVkIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgZXh0ZXJuYWwgZW50aXRpZXMKLQkJCWlucHV0U291cmNlLnNldFN5c3RlbUlkKGVkaXRlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSwgaGFuZGxlcik7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXVuY2ggbWFuYWdlcgotCSAqIAotCSAqIEByZXR1cm4gbGF1bmNoIG1hbmFnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUxhdW5jaE1hbmFnZXIgZ2V0TGF1bmNoTWFuYWdlcigpIHsKLQkJcmV0dXJuIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlICdBbnRVSVRlc3RzJyBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlc3QgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoIGdldFByb2plY3QoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxhdW5jaEFuZFRlcm1pbmF0ZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcsIGludCB0aW1lb3V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURlYnVnRXZlbnRXYWl0ZXIgd2FpdGVyPSBuZXcgRGVidWdFbGVtZW50S2luZEV2ZW50V2FpdGVyKERlYnVnRXZlbnQuVEVSTUlOQVRFLCBJUHJvY2Vzcy5jbGFzcyk7Ci0JCXdhaXRlci5zZXRUaW1lb3V0KHRpbWVvdXQpOwotCi0JCU9iamVjdCB0ZXJtaW5hdGVlID0gbGF1bmNoQW5kV2FpdChjb25maWcsIHdhaXRlcik7CQkKLQkJYXNzZXJ0Tm90TnVsbCgiUHJvZ3JhbSBkaWQgbm90IHRlcm1pbmF0ZS4iLCB0ZXJtaW5hdGVlKTsKLQkJYXNzZXJ0VHJ1ZSgidGVybWluYXRlZSBpcyBub3QgYW4gSVByb2Nlc3MiLCB0ZXJtaW5hdGVlIGluc3RhbmNlb2YgSVByb2Nlc3MpOwotCQlJUHJvY2VzcyBwcm9jZXNzID0gKElQcm9jZXNzKSB0ZXJtaW5hdGVlOwotCQlhc3NlcnRUcnVlKCJwcm9jZXNzIGlzIG5vdCB0ZXJtaW5hdGVkIiwgcHJvY2Vzcy5pc1Rlcm1pbmF0ZWQoKSk7Ci0JfQotCQotCS8qKgotCSAqIExhdW5jaGVzIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGFuZCB3YWl0cyBmb3IgYW4gZXZlbnQuIFJldHVybnMgdGhlCi0JICogc291cmNlIG9mIHRoZSBldmVudC4gSWYgdGhlIGV2ZW50IGlzIG5vdCByZWNlaXZlZCwgdGhlIGxhdW5jaCBpcwotCSAqIHRlcm1pbmF0ZWQgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gbGF1bmNoCi0JICogQHBhcmFtIHdhaXRlciB0aGUgZXZlbnQgd2FpdGVyIHRvIHVzZQotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhlIGV2ZW50IGlzIG5ldmVyIHJlY2VpdmVkLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbGF1bmNoQW5kV2FpdChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBEZWJ1Z0V2ZW50V2FpdGVyIHdhaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoIGxhdW5jaCA9IGNvbmZpZ3VyYXRpb24ubGF1bmNoKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBudWxsKTsKLQkJT2JqZWN0IHN1c3BlbmRlZT0gd2FpdGVyLndhaXRGb3JFdmVudCgpOwotCQlpZiAoc3VzcGVuZGVlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbGF1bmNoLnRlcm1pbmF0ZSgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlmYWlsKCJQcm9ncmFtIGRpZCBub3Qgc3VzcGVuZCwgYW5kIHVuYWJsZSB0byB0ZXJtaW5hdGUgbGF1bmNoLiIpOwotCQkJfQotCQl9Ci0JCWFzc2VydE5vdE51bGwoIlByb2dyYW0gZGlkIG5vdCBzdXNwZW5kLCBsYXVuY2ggdGVybWluYXRlZC4iLCBzdXNwZW5kZWUpOwotCQlyZXR1cm4gc3VzcGVuZGVlOwkJCi0JfQotCQotCXByb3RlY3RlZCBJQ29uc29sZUh5cGVybGluayBnZXRIeXBlcmxpbmsoaW50IG9mZnNldCwgSURvY3VtZW50IGRvYykgewotCQlpZiAob2Zmc2V0ID49IDAgJiYgZG9jICE9IG51bGwpIHsKLQkJCVBvc2l0aW9uW10gcG9zaXRpb25zID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcG9zaXRpb25zID0gZG9jLmdldFBvc2l0aW9ucyhIeXBlcmxpbmtQb3NpdGlvbi5IWVBFUl9MSU5LX0NBVEVHT1JZKTsKLQkJCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBubyBsaW5rcyBoYXZlIGJlZW4gYWRkZWQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkJaWYgKG9mZnNldCA+PSBwb3NpdGlvbi5nZXRPZmZzZXQoKSAmJiBvZmZzZXQgPD0gKHBvc2l0aW9uLmdldE9mZnNldCgpICsgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCXJldHVybiAoKEh5cGVybGlua1Bvc2l0aW9uKXBvc2l0aW9uKS5nZXRIeXBlckxpbmsoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xvciBnZXRDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUNvbnNvbGVEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gKENvbnNvbGVEb2N1bWVudFBhcnRpdGlvbmVyKWRvY3VtZW50LmdldERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCWlmIChwYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQkJSUNvbnNvbGVDb2xvclByb3ZpZGVyIGNvbG9yUHJvdmlkZXIgPSBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25zb2xlRG9jdW1lbnRNYW5hZ2VyKCkuZ2V0Q29sb3JQcm92aWRlcihJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9BTlRfUFJPQ0VTU19UWVBFKTsKLQkJCQlJVHlwZWRSZWdpb25bXSByZWdpb25zPSBwYXJ0aXRpb25lci5jb21wdXRlUGFydGl0aW9uaW5nKG9mZnNldCwgZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KS5nZXRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmVhbVBhcnRpdGlvbiBwYXJ0aXRpb24gPSAoU3RyZWFtUGFydGl0aW9uKXJlZ2lvbnNbaV07Ci0JCQkJCXJldHVybiBjb2xvclByb3ZpZGVyLmdldENvbG9yKHBhcnRpdGlvbi5nZXRTdHJlYW1JZGVudGlmaWVyKCkpOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVRlc3RQbHVnaW4uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQW50VUlUZXN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjFiMWEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIEFudFVJVGVzdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCXByaXZhdGUgc3RhdGljIEFudFVJVGVzdFBsdWdpbiBkZWZsdDsKLQkKLQlwdWJsaWMgQW50VUlUZXN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlkZWZsdD0gdGhpczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBBbnRVSVRlc3RQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGRlZmx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlQXV0b2J1aWxkKGJvb2xlYW4gZW5hYmxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRpc2FibGUgYXV0byBidWlsZAotCQlJV29ya3NwYWNlIHdvcmtzcGFjZT0gQW50VUlUZXN0UGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzYz0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGVuYWJsZSk7Ci0JCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0RmlsZUluUGx1Z2luKElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0JCQlVUkwgaW5zdGFsbFVSTD0gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsKLQkJCVVSTCBsb2NhbFVSTD0gUGxhdGZvcm0uYXNMb2NhbFVSTChpbnN0YWxsVVJMKTsKLQkJCXJldHVybiBuZXcgRmlsZShsb2NhbFVSTC5nZXRGaWxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQW50VUlUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOGY3ODMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZwotICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCi0gKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkggLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkaXRpb25hbCB0ZXN0cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLkJ1aWxkVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5BbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuQ29kZUNvbXBsZXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbEZvcm1hdHRlclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5mb3JtYXR0ZXIuWG1sVGFnRm9ybWF0dGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXNUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbERvY3VtZW50Rm9ybWF0dGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZXh0ZXJuYWx0b29scy5NaWdyYXRpb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc2VwYXJhdGVWTS5TZXBhcmF0ZVZNVGVzdHM7Ci0KLS8qKgotICogVGVzdCBzdWl0ZSBmb3IgdGhlIEFudCBVSQotICovCi1wdWJsaWMgY2xhc3MgQW50VUlUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0KLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlPSBuZXcgQW50VUlUZXN0cygpOwotICAgICAgICBzdWl0ZS5zZXROYW1lKCJBbnQgVUkgVW5pdCBUZXN0cyIpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShCdWlsZFRlc3RzLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShTZXBhcmF0ZVZNVGVzdHMuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKENvZGVDb21wbGV0aW9uVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShBbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzLmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShNaWdyYXRpb25UZXN0cy5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoWG1sRG9jdW1lbnRGb3JtYXR0ZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShYbWxUYWdGb3JtYXR0ZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShYbWxGb3JtYXR0ZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0NvbnNvbGVMaW5lVHJhY2tlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Db25zb2xlTGluZVRyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkNjZhOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0NvbnNvbGVMaW5lVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlTGluZVRyYWNrZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci0KLS8qKgotICogU2ltcGxlIGNvbnNvbGUgbGluZSB0cmFja2VyIGV4dGVuc2lvbiBwb2ludCB0aGF0IGNvbGxlY3RzIHRoZSBsaW5lcwotICogYXBwZW5kZWQgdG8gdGhlIGNvbnNvbGUuIAotICovCi1wdWJsaWMgY2xhc3MgQ29uc29sZUxpbmVUcmFja2VyIGltcGxlbWVudHMgSUNvbnNvbGVMaW5lVHJhY2tlckV4dGVuc2lvbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnNvbGUgY29uc29sZTsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGxpbmVzPSBuZXcgQXJyYXlMaXN0KCk7IAotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29uc29sZUNsb3NlZD0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljb25zb2xlID0gbnVsbDsKLQkJbGluZXM9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNpbml0KG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGUpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluaXQoSUNvbnNvbGUgYykgewotCQlDb25zb2xlTGluZVRyYWNrZXIuY29uc29sZT0gYzsKLQkJbGluZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJY29uc29sZUNsb3NlZD0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlTGluZVRyYWNrZXIjbGluZUFwcGVuZGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaW5lQXBwZW5kZWQoSVJlZ2lvbiBsaW5lKSB7Ci0JCWxpbmVzLmFkZChsaW5lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtYmVyT2ZNZXNzYWdlcygpIHsKLQkJcmV0dXJuIGxpbmVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgbGluZXMuc2l6ZSgpKXsKLQkJCUlSZWdpb24gbGluZVJlZ2lvbj0gKElSZWdpb24pbGluZXMuZ2V0KGluZGV4KTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGNvbnNvbGUuZ2V0RG9jdW1lbnQoKS5nZXQobGluZVJlZ2lvbi5nZXRPZmZzZXQoKSwgbGluZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxNZXNzYWdlcygpIHsKLQkJTGlzdCBhbGw9IG5ldyBBcnJheUxpc3QobGluZXMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykgewotCQkJSVJlZ2lvbiBsaW5lUmVnaW9uPSAoSVJlZ2lvbilsaW5lcy5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCWFsbC5hZGQoY29uc29sZS5nZXREb2N1bWVudCgpLmdldChsaW5lUmVnaW9uLmdldE9mZnNldCgpLCBsaW5lUmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBjb25zb2xlLmdldERvY3VtZW50KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yQ29uc29sZSgpIHsKLQkJaWYgKGNvbnNvbGVDbG9zZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJc3luY2hyb25pemVkIChsaW5lcykgewotCQkJCWxpbmVzLndhaXQoMjAwMDApOwotCQkJfQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyRXh0ZW5zaW9uI2NvbnNvbGVDbG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnNvbGVDbG9zZWQoKSB7Ci0JCWNvbnNvbGVDbG9zZWQ9IHRydWU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKGxpbmVzKSB7Ci0JCQlsaW5lcy5ub3RpZnlBbGwoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9EZWJ1Z0VsZW1lbnRLaW5kRXZlbnRXYWl0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlYTI3YS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLQotLyoqCi0gKiBXYWl0cyBmb3IgYSB0eXBlIG9mIGV2ZW50IG9uIGEga2luZCBvZiBlbGVtZW50LiAgQ29tcGFyZSB0aGlzIHRvIFNwZWNpZmljRGVidWdFbGVtZW50RXZlbnRXYWl0ZXIgd2hpY2ggaXMKLSAqIHVzZWQgdG8gd2FpdCBmb3IgYSB0eXBlIG9mIGV2ZW50IG9uIGEgc3BlY2lmaWMgZGVidWcgZWxlbWVudCBvYmplY3QuCi0gKi8KLQotcHVibGljIGNsYXNzIERlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlciBleHRlbmRzIERlYnVnRXZlbnRXYWl0ZXIgewotCQotCXByb3RlY3RlZCBDbGFzcyBmRWxlbWVudENsYXNzOwotCQotCXB1YmxpYyBEZWJ1Z0VsZW1lbnRLaW5kRXZlbnRXYWl0ZXIoaW50IGV2ZW50S2luZCwgQ2xhc3MgZWxlbWVudENsYXNzKSB7Ci0JCXN1cGVyKGV2ZW50S2luZCk7Ci0JCWZFbGVtZW50Q2xhc3MgPSBlbGVtZW50Q2xhc3M7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQoZXZlbnQpICYmIGZFbGVtZW50Q2xhc3MuaXNJbnN0YW5jZShvKTsKLQl9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRXZlbnRXYWl0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vRGVidWdFdmVudFdhaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA2MzdlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vRGVidWdFdmVudFdhaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI7Ci0KLS8qKgotICogVGhlIDxjb2RlPkRlYnVnRXZlbnRXYWl0ZXI8L2NvZGU+IGlzCi0gKiB0byB3YWl0IGZvciBhIHNwZWNpZmljIGtpbmQgb2YgZGVidWcgZXZlbnQuCi0gKiA8cD4KLSAqIFdoZW4gYSA8Y29kZT5EZWJ1Z0V2ZW50V2FpdGVyPC9jb2RlPiBpcyBjcmVhdGVkLCBpdAotICogcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIHRoZSA8Y29kZT5EZWJ1Z1BsdWdpbjwvY29kZT4gYXMKLSAqIGFuIDxjb2RlPklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI8L2NvZGU+LgotICogPHA+Ci0gKiBOT1RFOiA8Y29kZT5EZWJ1Z0V2ZW50V2FpdGVyPC9jb2RlPiBvYmplY3RzIGFyZSBpbnRlbmRlZCBmb3IKLSAqIG9uZSB0aW1lIHVzZSBvbmx5IQotICovCi1wdWJsaWMgY2xhc3MgRGVidWdFdmVudFdhaXRlciBpbXBsZW1lbnRzIElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgewotCS8qKgotCSAqIFRoZSBraW5kIG9mIGV2ZW50IHRoZSB3YWl0ZXIgaXMgd2FpdGluZyBmb3IKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGZFdmVudFR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgd2FpdGVyIHdpbGwgd2FpdCBiZWZvcmUgdGltaW5nIG91dC4KLQkgKi8KLQlwcm90ZWN0ZWQgbG9uZyBmVGltZW91dDsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5JRGVidWdNb2RlbE1hbmFnZXI8L2NvZGU+IHRoaXMgd2FpdGVyIGlzIGxpc3RlbmluZyB0by4KLQkgKi8KLQlwcm90ZWN0ZWQgRGVidWdQbHVnaW4gZkRlYnVnUGx1Z2luOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPkRlYnVnRXZlbnQ8L2NvZGU+IHJlY2VpdmVkLgotCSAqLwotCXByb3RlY3RlZCBEZWJ1Z0V2ZW50IGZFdmVudDsKLQkKLQkvKioKLQkgKiBUaGUgZXZlbnQgc2V0IHRoYXQgd2FzIGFjY2VwdGVkCi0JICovCi0JcHJvdGVjdGVkIERlYnVnRXZlbnRbXSBmRXZlbnRTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB0aW1lb3V0IHZhbHVlIGlmIG5vbmUgaXMgZ2l2ZW4gKDIwMDAwKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9USU1FT1VUPSAxNTAwMDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGVidWdFdmVudFdhaXRlcjwvY29kZT4gd2hpY2gKLQkgKiB3YWl0cyBmb3IgZXZlbnRzIG9mIGEga2luZCA8Y29kZT5ldmVudFR5cGU8L2NvZGU+LgotCSAqIFRoZSB3YWl0IG1ldGhvZCB3aWxsIHdhaXQgdGhlIGRlZmF1bHQgdGltZW91dCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgRGVidWdFdmVudFdhaXRlcihpbnQgZXZlbnRUeXBlKSB7Ci0JCWZEZWJ1Z1BsdWdpbj0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlmRXZlbnRUeXBlPSBldmVudFR5cGU7Ci0JCWZUaW1lb3V0PSBERUZBVUxUX1RJTUVPVVQ7Ci0KLQkJZkRlYnVnUGx1Z2luLmFkZERlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIDxjb2RlPkRlYnVnRXZlbnQ8L2NvZGU+IGlzIGFjY2VwdGFibGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KERlYnVnRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGV2ZW50LmdldEtpbmQoKSA9PSBmRXZlbnRUeXBlICYmIGV2ZW50LmdldERldGFpbCgpICE9IERlYnVnRXZlbnQuRVZBTFVBVElPTl9JTVBMSUNJVDsKLQl9Ci0JLyoqCi0JICogQW5zd2VycyB0aGUgZXZlbnQgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWUoaW50IGZsYWcpIHsKLQkJc3dpdGNoIChmbGFnKSB7Ci0JCQljYXNlIERlYnVnRXZlbnQuQ1JFQVRFIDoKLQkJCQlyZXR1cm4gIkNyZWF0ZSI7Ci0JCQljYXNlIERlYnVnRXZlbnQuVEVSTUlOQVRFIDoKLQkJCQlyZXR1cm4gIlRlcm1pbmF0ZSI7Ci0JCQljYXNlIERlYnVnRXZlbnQuUkVTVU1FIDoKLQkJCQlyZXR1cm4gIlJlc3VtZSI7Ci0JCQljYXNlIERlYnVnRXZlbnQuU1VTUEVORCA6Ci0JCQkJcmV0dXJuICJTdXNwZW5kIjsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAiVU5LTk9XTiI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGRlYnVnIGV2ZW50cy4KLQkgKgotCSAqIEBzZWUgSURlYnVnRXZlbnRMaXN0ZW5lcgotCSAqIEBzZWUgI2FjY2VwdChEZWJ1Z0V2ZW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKSB7Ci0JCS8vcHJpbnRSZWNlaXZlZChldmVudHMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFjY2VwdChldmVudHNbaV0pKSB7Ci0JCQkJZkV2ZW50PSBldmVudHNbaV07Ci0JCQkJZkV2ZW50U2V0ID0gZXZlbnRzOwotCQkJCXVucmVnaXN0ZXIoKTsKLQkJCQlub3RpZnlBbGwoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBtZXNzYWdlIGluZGljYXRpbmcgd2hpY2ggZXZlbnQgd2FzIHJlY2VpdmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50UmVjZWl2ZWQoRGVidWdFdmVudFtdIGV2ZW50cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyIgZ290ICIgKyBldmVudHNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGlzIGNhbGxiYWNrCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIG1pbGxpc2Vjb25kcykgewotCQlmVGltZW91dD0gbWlsbGlzZWNvbmRzOwotCX0KLQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIHRoaXMgd2FpdGVyIGFzIGEgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKCkgewotCQlmRGVidWdQbHVnaW4ucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNvdXJjZSBvZiB0aGUgYWNjZXB0ZWQgZXZlbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm8gZXZlbnQgd2FzIGFjY2VwdGVkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHdhaXRGb3JFdmVudCgpIHsKLQkJaWYgKGZFdmVudCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXdhaXQoZlRpbWVvdXQpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkludGVycnVwdGVkIHdhaXRpbmcgZm9yIGV2ZW50Iik7Ci0JCQl9Ci0JCX0KLQkJdW5yZWdpc3RlcigpOwotCQlpZiAoZkV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZFdmVudC5nZXRTb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY2NlcHRlZCBldmVudCwgaWYgYW55LgotCSAqLwotCXB1YmxpYyBEZWJ1Z0V2ZW50IGdldEV2ZW50KCkgewotCQlyZXR1cm4gZkV2ZW50OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY2NlcHRlZCBldmVudCBzZXQsIGlmIGFueS4KLQkgKi8KLQlwdWJsaWMgRGVidWdFdmVudFtdIGdldEV2ZW50U2V0KCkgewotCQlyZXR1cm4gZkV2ZW50U2V0OwotCX0JCi19Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI0ZmZkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5JQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKLQotLyoqCi0gKiBUZXN0IHRvIGNsb3NlIHRoZSB3b3JrYmVuY2gsIHNpbmNlIGRlYnVnIHRlc3RzIGRvIG5vdCBydW4gaW4gdGhlIFVJCi0gKiB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7Ci0JCi0JcHVibGljIFByb2plY3RDcmVhdGlvbkRlY29yYXRvcihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gZGVsZXRlIGFueSBwcmUtZXhpc3RpbmcgcHJvamVjdAotCQkJSVByb2plY3QgcHJvID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKLQkJCWlmIChwcm8uZXhpc3RzKCkpIHsKLQkJCQlwcm8uZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJfQotCQkJLy8gY3JlYXRlIHByb2plY3QgYW5kIGltcG9ydCBidWlsZGZpbGVzIGFuZCBzdXBwb3J0IGZpbGVzCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdEhlbHBlci5jcmVhdGVQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKLQkJCUlGb2xkZXIgZm9sZGVyID0gUHJvamVjdEhlbHBlci5hZGRGb2xkZXIocHJvamVjdCwgImJ1aWxkZmlsZXMiKTsKLQkJCVByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsICJsYXVuY2hDb25maWd1cmF0aW9ucyIpOwotCQkJRmlsZSByb290ID0gQW50VUlUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRGaWxlSW5QbHVnaW4oUHJvamVjdEhlbHBlci5URVNUX0JVSUxERklMRVNfRElSKTsKLQkJCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQkJCQotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigiZWNob2luZyIpOwotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigiYnVpbGQiKTsKLQkJCWNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oImJhZCIpOwotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oImVjaG9pbmdTZXBWTSIpOwotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oImV4dGVuc2lvblBvaW50U2VwVk0iKTsKLQkJCWNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JTZXBhcmF0ZVZNKCJleHRlbnNpb25Qb2ludFRhc2tTZXBWTSIpOwotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oImV4dGVuc2lvblBvaW50VHlwZVNlcFZNIik7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2RvIG5vdCBzaG93IHRoZSBBbnQgYnVpbGQgZmFpbGVkIGVycm9yIGRpYWxvZwotCQkJQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQU5UX0VSUk9SX0RJQUxPRywgZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaGFyZWQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSBWTSB3aXRoIHRoZSBnaXZlbgotCSAqIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oU3RyaW5nIGxhdW5jaENvbmZpZ05hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgdHlwZSA9IGdldExhdW5jaE1hbmFnZXIoKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZShJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9BTlRfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRSk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnID0gdHlwZS5uZXdJbnN0YW5jZShnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoImxhdW5jaENvbmZpZ3VyYXRpb25zIiksIGxhdW5jaENvbmZpZ05hbWUpOwotCQkKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwgIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5hbnRzdXBwb3J0LkludGVybmFsQW50UnVubmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DTEFTU1BBVEhfUFJPVklERVIsICJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQljb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sICIke3dvcmtzcGFjZV9sb2M6LyIgKyBQcm9qZWN0SGVscGVyLlBST0pFQ1RfTkFNRSArICIvYnVpbGRmaWxlcy8iICsgbGF1bmNoQ29uZmlnTmFtZSArICIueG1sfSIpOwotCQljb25maWcuc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQsIHRydWUpOwotCQljb25maWcuc2V0QXR0cmlidXRlKERlYnVnUGx1Z2luLkFUVFJfUFJPQ0VTU19GQUNUT1JZX0lELCBJQW50VUlDb25zdGFudHMuUkVNT1RFX0FOVF9QUk9DRVNTX0ZBQ1RPUllfSUQpOwotCQkgCi0JCXNldFZNKGNvbmZpZyk7Ci0JCQkJCi0JCWNvbmZpZy5kb1NhdmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNoYXJlZCBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIFZNIHdpdGggdGhlIGdpdmVuCi0JICogbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uKFN0cmluZyBsYXVuY2hDb25maWdOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBnZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IHR5cGUubmV3SW5zdGFuY2UoZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsYXVuY2hDb25maWd1cmF0aW9ucyIpLCBsYXVuY2hDb25maWdOYW1lKTsKLQkKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIGdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiJHt3b3Jrc3BhY2VfbG9jOi8iICsgUHJvamVjdEhlbHBlci5QUk9KRUNUX05BTUUgKyAiL2J1aWxkZmlsZXMvIiArIGxhdW5jaENvbmZpZ05hbWUgKyAiLnhtbH0iKTsKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJRGVidWdVSUNvbnN0YW50cy5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5ELCB0cnVlKTsKLQkJCQotCQljb25maWcuZG9TYXZlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZNKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0JCUlWTUluc3RhbGwgdm0gPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0JCVN0cmluZyB2bU5hbWU9IHZtLmdldE5hbWUoKTsKLQkJU3RyaW5nIHZtVHlwZUlEPSB2bS5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKTsJCQkKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX05BTUUsIHZtTmFtZSk7Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fSU5TVEFMTF9UWVBFLCB2bVR5cGVJRCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Qcm9qZWN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjI1MDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Qcm9qZWN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvbjsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyB0byBzZXQgdXAgYW4gSVByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0SGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFRFU1RfQlVJTERGSUxFU19ESVI9IG5ldyBQYXRoKCJ0ZXN0YnVpbGRmaWxlcyIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9SRVNPVVJDRVNfRElSPSBuZXcgUGF0aCgidGVzdHJlc291cmNlcyIpOwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFRFU1RfTElCX0RJUj0gbmV3IFBhdGgoInRlc3RsaWIiKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUU9ICJBbnQgVUkgVGVzdHMiOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBJUHJvamVjdC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlUm9vdCByb290PSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUHJvamVjdCBwcm9qZWN0PSByb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQl9IGVsc2UgewotCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJfQotCQkKLQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCX0KLQkJCi0JCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2plY3QsIEphdmFDb3JlLk5BVFVSRV9JRCwgbnVsbCk7Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcz0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXM9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXT0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYW4gSVByb2plY3QuCi0JICovCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGRzIGEgZm9sZGVyIHRvIGFuIElQcm9qZWN0LgotCSAqLwkJCi0JcHVibGljIHN0YXRpYyBJRm9sZGVyIGFkZEZvbGRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29udGFpbmVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJCUlGb2xkZXIgZm9sZGVyPSBwcm9qZWN0LmdldEZvbGRlcihjb250YWluZXJOYW1lKTsKLQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCQotCQlyZXR1cm4gZm9sZGVyOwotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGltcG9ydEZpbGVzRnJvbURpcmVjdG9yeShGaWxlIHJvb3REaXIsIElQYXRoIGRlc3RQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CQkKLQkJSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyID0gRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFOwotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgxMDApOwotCQlhZGRGaWxlcyhyb290RGlyLCBmaWxlcyk7Ci0JCXRyeSB7Ci0JCQlJbXBvcnRPcGVyYXRpb24gb3A9IG5ldyBJbXBvcnRPcGVyYXRpb24oZGVzdFBhdGgsIHJvb3REaXIsIHN0cnVjdHVyZVByb3ZpZGVyLCBuZXcgSW1wb3J0T3ZlcndyaXRlUXVlcnkoKSwgZmlsZXMpOwotCQkJb3Auc2V0Q3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKGZhbHNlKTsKLQkJCW9wLnJ1bihtb25pdG9yKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRGaWxlcyhGaWxlIGRpciwgTGlzdCBjb2xsZWN0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCUxpc3Qgc3ViRGlycyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWxlc1tpXS5pc0ZpbGUoKSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGZpbGVzW2ldKTsKLQkJCX0gZWxzZSBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCXN1YkRpcnMuYWRkKGZpbGVzW2ldKTsKLQkJCX0KLQkJfQotCQlJdGVyYXRvciBpdGVyID0gc3ViRGlycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgc3ViRGlyID0gKEZpbGUpaXRlci5uZXh0KCk7Ci0JCQlhZGRGaWxlcyhzdWJEaXIsIGNvbGxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEltcG9ydE92ZXJ3cml0ZVF1ZXJ5IGltcGxlbWVudHMgSU92ZXJ3cml0ZVF1ZXJ5IHsKLQkJcHVibGljIFN0cmluZyBxdWVyeU92ZXJ3cml0ZShTdHJpbmcgZmlsZSkgewotCQkJcmV0dXJuIEFMTDsKLQkJfQkKLQl9CQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlN2IzM2EuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudGFza3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrIGV4dGVuZHMgVGFzayB7Ci0JCi0JcHVibGljIEFudFRlc3RUYXNrKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKTsKLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiN2JhZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudGFza3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrMiBleHRlbmRzIFRhc2sgewotCQotCVN0cmluZyBmTWVzc2FnZT0gIkRlZmF1bHQiOwotCVJlZmVyZW5jZSBmUmVmPSBudWxsOwotCQotCXB1YmxpYyBBbnRUZXN0VGFzazIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJRWNobyBlY2hvPSBuZXcgRWNobygpOwotCQllY2hvLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJZWNoby5zZXRNZXNzYWdlKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzazI6ICIgKyBmTWVzc2FnZSk7Ci0JCWVjaG8uZXhlY3V0ZSgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKENvb2wgYXR0cikgewotICAgICAgICBmTWVzc2FnZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlKFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgZlJlZj0gcmVmOwotICAgIH0KLQkKLQkvKioKLSAgICAgKiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgImNvb2wiLCAiY2hpbGxpbiIgYW5kICJhd2Vzb21lIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvb2wgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJjb29sIiwgImNoaWxsaW4iLCAiYXdlc29tZSJ9OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvTmVzdEVsZW1lbnRUYXNrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9OZXN0RWxlbWVudFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0MTA3Mi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9OZXN0RWxlbWVudFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50YXNrczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobzsKLQotcHVibGljIGNsYXNzIE5lc3RFbGVtZW50VGFzayBleHRlbmRzIFRhc2sgeyAgCi0JCi0JU3RyaW5nIG1lc3NhZ2U9ICJiYXIiOwotCU5lc3RlZEVsZW1lbnQgZTsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5lc3RlZEVsZW1lbnR7Ci0gICAgCUJvb2xlYW4gd29ya3M9IEJvb2xlYW4uRkFMU0U7Ci0gICAgCXB1YmxpYyBOZXN0ZWRFbGVtZW50KCkgewkKLSAgICAJfQotICAgIAkKLSAgICAgICAgcHVibGljIHZvaWQgc2V0V29ya3MoQm9vbGVhbiBib29sZWFuVmFsdWUpIHsKLSAgICAgICAgCXdvcmtzPSBib29sZWFuVmFsdWU7Ci0gICAgICAgIH0KLQotCQlwdWJsaWMgYm9vbGVhbiB3b3JrcygpIHsKLQkJCXJldHVybiB3b3Jrcy5ib29sZWFuVmFsdWUoKTsKLQkJfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBhZGROZXN0ZWRFbGVtZW50KE5lc3RlZEVsZW1lbnQgbmVzdGVkRWxlbWVudCkgewotICAgIAllPSBuZXN0ZWRFbGVtZW50OwotICAgIH0KLSAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWlmIChlLndvcmtzKCkpIHsKLQkJCWVjaG8uc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJfSBlbHNlIHsKLQkJCWVjaG8uc2V0TWVzc2FnZSgiYWNrIik7Ci0JCX0KLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDIyNDIwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1wdWJsaWMgY2xhc3MgQW50VGVzdFBhdGggZXh0ZW5kcyBQYXRoIHsKLQkKLQlTdHJpbmcgbWVzc2FnZTsKLQkKLQlwdWJsaWMgQW50VGVzdFBhdGgoUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHByb2plY3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZT0gbWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkZmY0My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pkdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amR0LWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQW50VUlUZXN0cyIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2FudFVJVGVzdHNTdXBwb3J0LmphciBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYW50VUlUZXN0c1N1cHBvcnQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRlZWM4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYW50VUlUZXN0c1N1cHBvcnQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9iYWQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9iYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM0ZDUxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkVjaG9pbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2dlPSJlY2hvMSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzIiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMiIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzMiIGRlc2NyaXB0aW9uPSAiQW4gZWNobzMhIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkcHJvamVjdC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2JhZHByb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGE3OWE4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTxwcm9qZWN0IG5kZWZhdWx0PSJtYWtlIj4KLQk8dGFyZ2V0IG5hbWU9Im1ha2UiPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQuQ3AxMjUxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQuQ3AxMjUxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmOTUzOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLkNwMTI1MS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ3aW5kb3dzLTEyNTEiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9ImluaXQiIGJhc2VkaXI9Ii4iPgotCi0gICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgICAgPCEtLSBkaXNwbGF5cyBIZWxsbyBpbiBSdXNzaWFuIC0tPgotICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9Isfk8ODi8fLi8+ny5SIvPgotICAgICA8L3RhcmdldD4KLQotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLlVURjgueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZC5VVEY4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlNDczMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLlVURjgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0iaW5pdCIgYmFzZWRpcj0iLiI+Ci0KLSAgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgICA8IS0tIGRpc3BsYXlzIEhlbGxvIGluIFJ1c3NpYW4gLS0+Ci0gICAgICAgICAgPGVjaG8gbWVzc2FnZT0i0JfQtNGA0LDQstE/0YLQstGD0LnRgtC1Ii8+Ci0gICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RkNjRkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRWNob2luZyIgZGVmYXVsdD0iZWNobzEiIGJhc2VkaXI9Ii4uIj4KLQotCTx0YXJnZXQgbmFtZT0iZWNobzEiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzIiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMiIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzMiIGRlc2NyaXB0aW9uPSAiQW4gZWNobzMhIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDdlYmUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXByb3AxPXZhbDEKLXByb3AyID0gdmFsMgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0MS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDQyZmYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0cHJvamVjdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+Ci0JPHByb3BlcnR5IG5hbWU9InByb3BEIiB2YWx1ZT0idmFsRCIgLz4KLSAgICA8cHJvcGVydHkgZmlsZT0iYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wViIgdmFsdWU9InZhbFYiIC8+Ci0gICAgPHRhcmdldCBuYW1lPSJtYWluIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5X2luX3RhcmdldCIgdmFsdWU9InZhbCIvPgotICAgICAgICA8ZWNobz4kezwvZWNobz4KLSAgICA8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InByZXRlc3QiPjwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0iIj4KLQkJPGVjaG8+ZGVwZW5kczwvZWNobz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3QyIj48L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3QzIj48L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3RJZiIgaWY9IiI+PC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ0ZXN0VW5sZXNzIiB1bmxlc3M9InByb3AiPjwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0idGVzdE1vcmVEZXBlbmRzIiBkZXBlbmRzPSJwcmV0ZXN0LCAiPgotCQk8ZWNobyBtZXNzYWdlPSIkIj48L2VjaG8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QyLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0Mi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlM2U1ZDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3Rwcm9qZWN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIj4KLQk8cHJvcGVydHkgbmFtZT0icHJvcEQiIHZhbHVlPSJ2YWxEIiAvPgotCTxwcm9wZXJ0eSBmaWxlPSJidWlsZHRlc3QxLnByb3BlcnRpZXMiIC8+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvY3VzdG9tQm9vbGVhbi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2N1c3RvbUJvb2xlYW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGQzN2EwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvY3VzdG9tQm9vbGVhbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImRlZmF1bHRUYXJnZXROYW1lIj4KLQk8dGFyZ2V0IG5hbWU9ImRlZmF1bHRUYXJnZXROYW1lIj4KLQkJPGVjbGlwc2UuYnVpbGRTY3JpcHQgcmVjdXJzaXZlZ2VuZXJhdGlvbj0iIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2RlcGVuZGVuY3l0ZXN0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZGVwZW5kZW5jeXRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZiYTU3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZGVwZW5kZW5jeXRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCEtLSBFaW4gdGVzdCBjYXNlIHNvbGx0ZSBkaWUgcHJvcGVydHkgcHJvcG9zYWxzIGluIG1haW4gICAgICAgLS0+Ci08IS0tIFVlYmVycHJ1ZWZlbiwgdW5kIG9iIGRpZSBkaXZlcnNlbiBwcm9wZXJ0aWVzIGVudHNwcmVjaGVuZCAtLT4KLTwhLS0gZGVyIGRlcGVuZGVuY2llcyBnZXNldHp0IHNpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCi08cHJvamVjdCBkZWZhdWx0PSJtYWluIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkb19pbml0IiB2YWx1ZT0idmFsIj48L3Byb3BlcnR5PgotCQotCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwcm9wX3Byb3AiIHZhbHVlPSJ2YWwiPjwvcHJvcGVydHk+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkb19ub3RfY29tcGlsZSIgdmFsdWU9InZhbCI+PC9wcm9wZXJ0eT4KLQkJPGVjaG8gbWVzc2FnZT0iZXhlY3V0aW5nIHByb3BlcnRpZXMiPjwvZWNobz4KLQk8L3RhcmdldD4KLQotCTwhLS0gc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkIHNpbmNlIHByb3BlcnR5IGlzIG5vdCBzZXQgICAgICAtLT4gCi0JPHRhcmdldCBuYW1lPSJhZGRpdGlvbmFsX3Byb3BlcnRpZXMiIGlmPSJkb19hZGRpdF9wcm9wcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhZGl0X3Byb3AiIHZhbHVlPSJ2YWwiIC8+Ci0JCTxlY2hvIG1lc3NhZ2U9ImV4ZWN1dGluZyBhZGRpdGlvbmFsX3Byb3BlcnRpZXMiPjwvZWNobz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGlmPSJkb2luaXQiIGRlcGVuZHM9InByb3BlcnRpZXMsYWRkaXRpb25hbF9wcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9ImluaXRfcHJvcCIgdmFsdWU9InZhbCI+PC9wcm9wZXJ0eT4KLQkJPGVjaG8gbWVzc2FnZT0iZXhlY3V0aW5nIGluaXQiPjwvZWNobz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIHNob3VsZCBuZXZlciBiZSBleGVjdXRlZCBzaW5jZSBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0ICAgLS0+Ci0JPCEtLSBieSBwcm9wZXJ0aWVzIGJlY2F1c2Ugb2YgZGVwZW5kZW5jaWVzIGJlZm9yZSAgICAgICAgICAgIC0tPiAKLQk8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIHVubGVzcz0iZG9fbm90X2NvbXBpbGUiPgotCQk8cHJvcGVydHkgbmFtZT0iY29tcGlsZV9wcm9wIiB2YWx1ZT0idmFsIj48L3Byb3BlcnR5PgotCQk8ZWNobyBtZXNzYWdlPSJleGVjdXRpbmcgY29tcGlsZSI+PC9lY2hvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJpbml0LCBjb21waWxlIj4KLQkJPHByb3BlcnR5IG5hbWU9Im1haW5fcHJvcCIgdmFsdWU9InZhbCI+PC9wcm9wZXJ0eT4KLQkJPGVjaG8gbWVzc2FnZT0iZXhlY3V0aW5nIG1haW4gJHt3ZWxsfSI+PC9lY2hvPgotCTwvdGFyZ2V0PgotCQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RkNjRkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFY2hvaW5nIiBkZWZhdWx0PSJlY2hvMSIgYmFzZWRpcj0iLi4iPgotCi0JPHRhcmdldCBuYW1lPSJlY2hvMSI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8xIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMiI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8yIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMyIgZGVzY3JpcHRpb249ICJBbiBlY2hvMyEiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lY2hvaW5nU2VwVk0ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lY2hvaW5nU2VwVk0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2I0OTg0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZWNob2luZ1NlcFZNLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkVjaG9pbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzEiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8yIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8zIiBkZXNjcmlwdGlvbj0gIkFuIGVjaG8zISI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8zIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJCdWc0Mjk4NCI+Ci0JCTxlY2hvIG1lc3NhZ2U9InVzZXIuZGlyOiAke3VzZXIuZGlyfSIvPgotCTwvdGFyZ2V0PgotCQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lbXB0eS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VtcHR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VtcHR5LnhtbAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50U2VwVk0ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFNlcFZNLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczNWVkMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50U2VwVk0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRXh0ZW5zaW9uIHBvaW50IHRlc3RpbmcgaW4gc2VwYXJhdGUgVk0iCi0gICAgICAgICBkZWZhdWx0PSJFeHRlbnNpb24gUG9pbnRzIgotICAgICAgICAgYmFzZWRpcj0iLiIKLSA+Ci0gICAgPHRhc2tkZWYgbmFtZT0ic2VwYXJhdGVWTVRhc2siIGNsYXNzbmFtZT0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudGFza3MuQW50VGVzdFRhc2siPgotICAgIDwvdGFza2RlZj4KLSAgICA8dGFyZ2V0IG5hbWU9IkV4dGVuc2lvbiBQb2ludHMiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0gIkVuc3VyZSB0aGF0IGFuIGV4dHJhIGNsYXNzcGF0aCBlbnRyeSBkZXNpZ25hdGVkIGFzIG5vdCByZXF1aXJpbmcgdGhlIEVjbGlwc2UgcnVudGltZSBzaG93cyB1cCBpbiBhIHNlcGFyYXRlIFZNIGJ1aWxkIgotICAgICA+Ci0gICAgICAgIDxzZXBhcmF0ZVZNVGFzay8+Ci0gICAgICAgICA8ZWNobz4ke3Byb3BlcnR5LnVpLnRlc3Rpbmd9PC9lY2hvPgotICAgICAgICA8ZWNobz4ke3Byb3BlcnR5LnVpLnRlc3RpbmcyfTwvZWNobz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFRhc2tTZXBWTS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTQ5NDUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFRhc2tTZXBWTS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUYXNrIiBkZWZhdWx0PSJFeHRlbnNpb24gUG9pbnQgVGFzayIgYmFzZWRpcj0iLiI+Ci0JPHRhcmdldCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVGFzayIgZGVzY3JpcHRpb249ICJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0YXNrIGlzIHByZXNlbnQiPgotCQk8Y29vbFVJVGFzayBtZXNzYWdlPSJjb29sIiByZWZlcmVuY2U9IiIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUeXBlU2VwVk0ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFR5cGVTZXBWTS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTk1NWUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFR5cGVTZXBWTS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVHlwZSIgZGVmYXVsdD0iRXh0ZW5zaW9uIFBvaW50IFR5cGUiIGJhc2VkaXI9Ii4iPgotCi0JPGNvb2xVSVR5cGUgaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0ibGliIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2Nvb2xVSVR5cGU+Ci0gICAgCi0JPHRhcmdldCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVHlwZSIgZGVzY3JpcHRpb249ICJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlIGlzIHByZXNlbnQiPgotCQk8ZWNobyBtZXNzYWdlPSJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlIGlzIHByZXNlbnQiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3Rfc291cmNlMDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTFmZjc4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJmb3JtYXRUZXN0Ij4KLQotPCEtLSA9ID0gPSA9ID0gPSAtLT48IS0tIGZvcm1hdFRlc3QgIC0tPjwhLS0gPSA9ID0gPSA9ID0gLS0+PHRhcmdldCBuYW1lPSJmb3JtYXRUZXN0IiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iLS0+IHRlc3QgdGFyZ2V0IG9uZSI+PCEtLSBoZWxsbyB3b3JsZCAtLT48Z3JlZXRpbmcgLz48L3RhcmdldD4KLQotPCEtLSAtIC0gLSAtIC0gLSAtLT4KLTwhLS0gaW5pdCAgICAgICAgLS0+Ci08IS0tIC0gLSAtIC0gLSAtIC0tPgotPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgPHByb3BlcnR5IG5hbWU9ImdyZWV0aW5nIiB2YWx1ZT0iaGkiIC8+Ci0gIDxwcmVzZXRkZWYgbmFtZT0iZ3JlZXRpbmciPjxlY2hvPiR7Z3JlZXRpbmd9PC9lY2hvPgotPC9wcmVzZXRkZWY+Ci0gICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTkyMjguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImZvcm1hdFRlc3QiPgotCi0gICA8IS0tID0gPSA9ID0gPSA9IC0tPgotICAgPCEtLSBmb3JtYXRUZXN0ICAtLT4KLSAgIDwhLS0gPSA9ID0gPSA9ID0gLS0+Ci0gICA8dGFyZ2V0IG5hbWU9ImZvcm1hdFRlc3QiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSItLT4gdGVzdCB0YXJnZXQgb25lIj4KLSAgICAgIDwhLS0gaGVsbG8gd29ybGQgLS0+Ci0gICAgICA8Z3JlZXRpbmcgLz4KLSAgIDwvdGFyZ2V0PgotCi0gICA8IS0tIC0gLSAtIC0gLSAtIC0tPgotICAgPCEtLSBpbml0ICAgICAgICAtLT4KLSAgIDwhLS0gLSAtIC0gLSAtIC0gLS0+Ci0gICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImdyZWV0aW5nIiB2YWx1ZT0iaGkiIC8+Ci0gICAgICA8cHJlc2V0ZGVmIG5hbWU9ImdyZWV0aW5nIj4KLSAgICAgICAgIDxlY2hvPiR7Z3JlZXRpbmd9PC9lY2hvPgotICAgICAgPC9wcmVzZXRkZWY+Ci0gICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAyLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMWFkOWMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImZvcm1hdFRlc3QiPgotCi0gICAgICAgPCEtLSA9ID0gPSA9ID0gPSAtLT4KLSAgICAgICA8IS0tIGZvcm1hdFRlc3QgIC0tPgotICAgICAgIDwhLS0gPSA9ID0gPSA9ID0gLS0+Ci0gICAgICAgPHRhcmdldCBuYW1lPSJmb3JtYXRUZXN0IiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iLS0+IHRlc3QgdGFyZ2V0IG9uZSI+Ci0gICAgICAgICAgICAgIDwhLS0gaGVsbG8gd29ybGQgLS0+Ci0gICAgICAgICAgICAgIDxncmVldGluZyAvPgotICAgICAgIDwvdGFyZ2V0PgotCi0gICAgICAgPCEtLSAtIC0gLSAtIC0gLSAtLT4KLSAgICAgICA8IS0tIGluaXQgICAgICAgIC0tPgotICAgICAgIDwhLS0gLSAtIC0gLSAtIC0gLS0+Ci0gICAgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImdyZWV0aW5nIiB2YWx1ZT0iaGkiIC8+Ci0gICAgICAgICAgICAgIDxwcmVzZXRkZWYgbmFtZT0iZ3JlZXRpbmciPgotICAgICAgICAgICAgICAgICAgICAgPGVjaG8+JHtncmVldGluZ308L2VjaG8+Ci0gICAgICAgICAgICAgIDwvcHJlc2V0ZGVmPgotICAgICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljZDk1My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0iZm9ybWF0VGVzdCI+Ci0KLQk8IS0tID0gPSA9ID0gPSA9IC0tPgotCTwhLS0gZm9ybWF0VGVzdCAgLS0+Ci0JPCEtLSA9ID0gPSA9ID0gPSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImZvcm1hdFRlc3QiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSItLT4gdGVzdCB0YXJnZXQgb25lIj4KLQkJPCEtLSBoZWxsbyB3b3JsZCAtLT4KLQkJPGdyZWV0aW5nIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIC0gLSAtIC0gLSAtIC0tPgotCTwhLS0gaW5pdCAgICAgICAgLS0+Ci0JPCEtLSAtIC0gLSAtIC0gLSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0iZ3JlZXRpbmciIHZhbHVlPSJoaSIgLz4KLQkJPHByZXNldGRlZiBuYW1lPSJncmVldGluZyI+Ci0JCQk8ZWNobz4ke2dyZWV0aW5nfTwvZWNobz4KLQkJPC9wcmVzZXRkZWY+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWUwMGMyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJqYXZhY0l0Ij4KLQk8dGFyZ2V0IG5hbWU9ImphdmFjSXQiPgotCQk8amF2YWMgaW5jbHVkZWphdmFydW50aW1lPSIiCi0JCQlmb2xsb3dzeW1saW5rcz0iIgotCQkJaW5jbHVkZWFudHJ1bnRpbWU9IiIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbWFjcm9kZWYueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9tYWNyb2RlZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MWYwMWIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9tYWNyb2RlZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJ0eXBlIj4KLQotCTxtYWNyb2RlZiBuYW1lPSJlY2xpcHNlTWFjcm8iPgotCQk8YXR0cmlidXRlIG5hbWU9InYiIGRlZmF1bHQ9Ik5PVCBTRVQiIC8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iZWNsaXBzZSIgZGVmYXVsdD0ieWVzIiBkZXNjcmlwdGlvbj0iVGVzdGluZyBFY2xpcHNlIi8+Ci0JCTxlbGVtZW50IG5hbWU9InNvbWUtdGFza3MiIG9wdGlvbmFsPSJ5ZXMiIC8+Ci0JCTxzZXF1ZW50aWFsPgotCQkJPGVjaG8+RWNsaXBzZSE6IEB7dn08L2VjaG8+Ci0JCTwvc2VxdWVudGlhbD4KLQk8L21hY3JvZGVmPgotCi0JPHRhcmdldCBuYW1lPSJ0eXBlIj4KLQkJPGVjbGlwc2VNYWNybyB2PSJUaGlzIGlzIHYiPgotCQkJCi0JCTwvZWNsaXBzZU1hY3JvPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9taXhlZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL21peGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4ZWRiYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL21peGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTxwcm9qZWN0Pjx0YXJnZXQ+PHNxbCBkcml2ZXI9IiIgcGFzc3dvcmQ9IiIgdXJsPSIiIHVzZXJpZD0iIj48L3NxbD48Y29uY2F0PjwvY29uY2F0PjwvdGFyZ2V0PjwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL25lc3RlZEVsZW1lbnRBdHRyaWJ1dGVzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbmVzdGVkRWxlbWVudEF0dHJpYnV0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjBkOTE5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbmVzdGVkRWxlbWVudEF0dHJpYnV0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJnbyI+Ci0JPHRhc2tkZWYgbmFtZT0ibmVzdGVkVGVzdCIgY2xhc3NuYW1lPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50YXNrcy5OZXN0RWxlbWVudFRhc2siIC8+Ci0JPHRhcmdldCBuYW1lPSJnbyI+Ci0JCTxuZXN0ZWRUZXN0PgotCQkJPG5lc3RlZGVsZW1lbnQgd29ya3M9IiIgLz4KLQkJPC9uZXN0ZWRUZXN0PgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvb3V0bGluZV9zZWxlY3RfdGVzdF9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL291dGxpbmVfc2VsZWN0X3Rlc3RfYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGYwZjVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvb3V0bGluZV9zZWxlY3RfdGVzdF9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5hbnQuZWRpdG9yIiBkZWZhdWx0PSJ6aXAucGx1Z2luIiBiYXNlZGlyPSIuIj4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCSAgICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIgLz4KLQkJPHByb3BlcnR5IG5hbWU9InZlcnNpb24uc3VmZml4IiB2YWx1ZT0iXzAuNC41IiAvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luc19kaXIiIHZhbHVlPSIke2VjbGlwc2VfZGlyfS9wbHVnaW5zIiAvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5hbnQuZWRpdG9yIiAvPgotCQk8cHJvcGVydHkgbmFtZT0iZnVsbC5uYW1lIiB2YWx1ZT0iJHtwbHVnaW59JHt2ZXJzaW9uLnN1ZmZpeH0iIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9IiAvPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0iIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzb3VyY2UuYW50RWRpdG9yLmphciIgdmFsdWU9InNyYy8iIC8+Ci0JCTxlY2hvIG1lc3NhZ2U9IlZhbHVlIGlzICR7cGx1Z2luc19kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcHJvamVjdE9ubHkueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9wcm9qZWN0T25seS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWNlNWIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9wcm9qZWN0T25seS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotCi0KLTxwcm9qZWN0ID48L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9yZWZpZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3JlZmlkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlYjU2Yy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3JlZmlkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9IjEiPgotCTxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249ImxpYi8iIC8+Ci0JCTxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0vIiAvPgotCQk8cGF0aGVsZW1lbnQgcGF0aD0iJHthZGRpdGlvbmFsLnBhdGh9IiAvPgotCTwvcGF0aD4KLQotCTx0YXJnZXQgbmFtZT0iMSI+Ci0JCTxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzLnBhdGgyIj4KLQkJCTxwYXRoIHJlZmlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiIC8+Ci0JCTwvcGF0aD4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3J1c3NpYW5idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3J1c3NpYW5idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTM1NjYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9ydXNzaWFuYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ3aW5kb3dzLTEyNTEiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9ImluaXQiIGJhc2VkaXI9Ii4iPgotCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPCEtLSBkaXNwbGF5cyBIZWxsbyBpbiBSdXNzaWFuIC0tPgotCQk8ZWNobyBtZXNzYWdlPSLDh8Okw7DDoMOiw7HDssOiw7PDqcOyw6UiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rhc2tkZWYueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90YXNrZGVmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhNjZhOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rhc2tkZWYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0idHlwZSI+Ci0KLQk8dGFza2RlZiBuYW1lPSJtaW5lIiBjbGFzc25hbWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIiBjbGFzc3BhdGg9ImFudFVJVGVzdHNTdXBwb3J0LmphciI+Ci0JPC90YXNrZGVmPgotCi0JPHRhcmdldCBuYW1lPSJ0eXBlIj4KLQotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0MS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2MGEzMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQotPGJsYT4KLSAgPGJsdWI+PC9ibHViPgotICA8a2xpY2s+Ci0gICAgPGd1cmdlbD48L2d1cmdlbD4KLSAgICA8aGFsCi0gICAgPGtsYWNrLz4KLSAgICA8aHVtcGYvPgotICA8L2tsaWNrPgotPC9ibGE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0Mi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhODc2NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGJsYT4KLSAgPGJsdWI+PC9ibHViPgotICA8a2xpY2s+Ci0gICAgPGd1cmdlbD48L2d1cmdlbD4KLSAgICA8aGFsPjwvaGFsPgotICAgIDxrbGFjay8+Ci0gICAgPGh1bXBmLz4KLSAgPC9rbGljaz4KLTwvYmxhPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0My54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDA4OGUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0My54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTxibGE+Ci0gIDxibHViPgotICA8L2JsdWI+Ci08LwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0NC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2MGY3OS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTx0YXJnZXQgbmFtZT0ibWFpbiI+PG1rClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0NS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5N2Q5NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPHByb2plY3QgbmFtZT0ibWFpbiI+Ci0JPHRhcmdldCBuYW1lPSJibGEiIC8+Ci0JPHByb3BlcnR5IG5hbWU9InByb3AxIiB2YWx1ZT0idmFsMSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJwcm9wMiIgdmFsdWU9InZhbDIiLz4KLQk8cHJvcGVydHkgbmFtZT0icHJvcDMiIHZhbHVlPSJ2YWwzIi8+Ci08ZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay8ucHJvamVjdCBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0OThjMi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zZGs8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQuaHRtbCBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI0MTFhLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBDUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0LmluaSBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYzExODkuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pDQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcw0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkNCi1hYm91dFRleHQ9JWJsdXJiDQotDQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQ0KLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkNCi0NCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpDQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYNCi0NCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkNCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5DQotDQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpDQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQ0KLQ0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQ0KLSMgb3B0aW9uYWwNCi0NCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlDQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLg0KLSMgb3B0aW9uYWwNCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQubWFwcGluZ3MgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMGNhODcuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0LnByb3BlcnRpZXMgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2NWIwOS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPUVjbGlwc2UgUHJvamVjdCBTREtcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2UKLQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2J1aWxkLnByb3BlcnRpZXMgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzYTRmMi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzPVwKLWFib3V0Lmh0bWwsXAotYWJvdXQuaW5pLFwKLWFib3V0Lm1hcHBpbmdzLFwKLWFib3V0LnByb3BlcnRpZXMsXAotZWNsaXBzZTMyLmdpZixcCi1wbHVnaW4ueG1sLFwKLXBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZTMyLmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzFhOGY2Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE1MmFhLi4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBsdWdpbk5hbWU9RWNsaXBzZSBQcm9qZWN0IFNESwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLWFjdGl2aXR5LmphdmE9SmF2YSBEZXZlbG9wbWVudAotYWN0aXZpdHkuamF2YS5kZXNjPURldmVsb3AgSmF2YSBhcHBsaWNhdGlvbnMuCi1hY3Rpdml0eS5wbHVnaW49UGx1Zy1pbiBEZXZlbG9wbWVudAotYWN0aXZpdHkucGx1Z2luLmRlc2M9RGV2ZWxvcCBwbHVnLWlucywgZnJhZ21lbnRzLCBhbmQgZmVhdHVyZXMgZm9yIEVjbGlwc2UuCi0KLWFjdGl2aXR5LnRlYW0uY3ZzPUNWUyBTdXBwb3J0Ci1hY3Rpdml0eS50ZWFtLmN2cy5kZXNjPVVzZSB0aGUgQ29uY3VycmVudCBWZXJzaW9ucyBTeXN0ZW0gKENWUykgdG8gbWFuYWdlIHJlc291cmNlcy4KLWFjdGl2aXR5LnRlYW09Q29yZSBUZWFtIFN1cHBvcnQKLWFjdGl2aXR5LnRlYW0uZGVzYz1TaGFyZSBwcm9qZWN0cyB1c2luZyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgc3lzdGVtcy4KLQotYWN0aXZpdHkuY2F0LmRldmVsb3BtZW50PURldmVsb3BtZW50Ci1hY3Rpdml0eS5jYXQuZGV2ZWxvcG1lbnQuZGVzYz1Vc2UgdGhlIEVjbGlwc2UgU0RLIHRvIGRldmVsb3AgYXBwbGljYXRpb25zLgotYWN0aXZpdHkuY2F0LnRlYW09VGVhbQotYWN0aXZpdHkuY2F0LnRlYW0uZGVzYz1Vc2UgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHN5c3RlbXMgdG8gbWFuYWdlIHJlc291cmNlcy4KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi54bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxYmExZC4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCi08cGx1Z2luDQotICAgaWQ9Im9yZy5lY2xpcHNlLnNkayINCi0gICBuYW1lPSIlcGx1Z2luTmFtZSINCi0gICB2ZXJzaW9uPSIzLjAuMCINCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4NCi0NCi0gICA8cmVxdWlyZXM+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+DQotICAgPC9yZXF1aXJlcz4NCi0NCi0NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMiPg0KLSAgDQotICAgICAgPGFjdGl2aXR5DQotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5LmphdmEiDQotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpdml0eS5qYXZhLmRlc2MiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmphdmFEZXZlbG9wbWVudCI+DQotICAgICAgPC9hY3Rpdml0eT4NCi0gICAgICANCi0gICAgICA8YWN0aXZpdHkNCi0gICAgICAgICAgICBuYW1lPSIlYWN0aXZpdHkucGx1Z2luIg0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlYWN0aXZpdHkucGx1Z2luLmRlc2MiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsdWdJbkRldmVsb3BtZW50Ij4NCi0gICAgICA8L2FjdGl2aXR5Pg0KLSAgICAgIA0KLSAgICAgIDxhY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZw0KLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnBsdWdJbkRldmVsb3BtZW50Ig0KLSAgICAgICAgICAgIHJlcXVpcmVkQWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UuamF2YURldmVsb3BtZW50Ij4NCi0gICAgICA8L2FjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nPg0KLSAgDQotICAgICAgPGFjdGl2aXR5DQotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5LnRlYW0uY3ZzIg0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlYWN0aXZpdHkudGVhbS5jdnMuZGVzYyINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMiPg0KLSAgICAgIDwvYWN0aXZpdHk+IA0KLSAgICAgIA0KLSAgICAgIDxhY3Rpdml0eQ0KLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eS50ZWFtIg0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlYWN0aXZpdHkudGVhbS5kZXNjIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtIj4NCi0gICAgICA8L2FjdGl2aXR5PiANCi0gICAgICANCi0gICAgICA8YWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cyINCi0gICAgICAgICAgICByZXF1aXJlZEFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnRlYW0iPg0KLSAgICAgIDwvYWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmc+DQotICAgICAgDQotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5qYXZhRGV2ZWxvcG1lbnQiDQotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC5qZHRcLmRlYnVnL2RlYnVnTW9kZWwiPg0KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4NCi0gICAgICANCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZw0KLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLmphdmFEZXZlbG9wbWVudCINCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLmpkdFwuLiovLioiPg0KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4NCi0gICAgICANCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZw0KLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLmphdmFEZXZlbG9wbWVudCINCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLmpkdFwuY29yZS9qYXZhbmF0dXJlIj4NCi0NCi0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+DQotICAgICAgDQotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5wbHVnSW5EZXZlbG9wbWVudCINCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLnBkZVwuLiovLioiPg0KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4NCi0gICAgICANCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZw0KLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnBsdWdJbkRldmVsb3BtZW50Ig0KLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwucGRlL1BsdWdpbk5hdHVyZSI+DQotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPg0KLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nDQotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudGVhbSINCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLnRlYW1cLnVpL29yZy4qIj4NCi0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+IA0KLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nDQotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudGVhbSINCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLmNvbXBhcmUvY29tcGFyZVdpdGhQYXRjaCI+DQotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPiAgICAgICAgICAgDQotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cyINCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLnRlYW1cLmN2c1wudWkvLioiPg0KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4NCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZw0KLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzIg0KLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwudGVhbVwuY3ZzXC5jb3JlLy4qY3ZzbmF0dXJlIj4NCi0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+DQotICAgICAgDQotICAgICAgPGNhdGVnb3J5DQotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5LmNhdC5kZXZlbG9wbWVudCINCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGl2aXR5LmNhdC5kZXZlbG9wbWVudC5kZXNjIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yaWVzLmRldmVsb3BtZW50Q2F0ZWdvcnkiPg0KLSAgICAgIDwvY2F0ZWdvcnk+DQotDQotIAkgIDxjYXRlZ29yeQ0KLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eS5jYXQudGVhbSINCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGl2aXR5LmNhdC50ZWFtLmRlc2MiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNhdGVnb3JpZXMudGVhbUNhdGVnb3J5Ij4NCi0NCi0gICAgICA8L2NhdGVnb3J5Pg0KLSAgICAgIA0KLSAgICAgIDxjYXRlZ29yeUFjdGl2aXR5QmluZGluZw0KLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLmphdmFEZXZlbG9wbWVudCINCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yaWVzLmRldmVsb3BtZW50Q2F0ZWdvcnkiPg0KLSAgICAgIDwvY2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmc+DQotICAgICAgDQotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nDQotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UucGx1Z0luRGV2ZWxvcG1lbnQiDQotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY2F0ZWdvcmllcy5kZXZlbG9wbWVudENhdGVnb3J5Ij4NCi0gICAgICA8L2NhdGVnb3J5QWN0aXZpdHlCaW5kaW5nPg0KLQ0KLSAgICAgIDxjYXRlZ29yeUFjdGl2aXR5QmluZGluZw0KLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnRlYW0iDQotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY2F0ZWdvcmllcy50ZWFtQ2F0ZWdvcnkiPg0KLSAgICAgIDwvY2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmc+ICAgICAgICANCi0gICAgICANCi0gICAgICA8Y2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cyINCi0gICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yaWVzLnRlYW1DYXRlZ29yeSI+DQotICAgICAgPC9jYXRlZ29yeUFjdGl2aXR5QmluZGluZz4NCi0gIA0KLSAgICAgIDwhLS0gYmluZCBhbGwgZWxlbWVudHMgdGhhdCBzdGFydCB3aXRoICJvcmciIC0tPiAgICAgIA0KLSAgICAgICANCi0gICAgICA8ZGVmYXVsdEVuYWJsZW1lbnQNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamF2YURldmVsb3BtZW50Ij4NCi0gICAgICA8L2RlZmF1bHRFbmFibGVtZW50Pg0KLSAgICAgIA0KLSAgICAgIDxkZWZhdWx0RW5hYmxlbWVudA0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbHVnSW5EZXZlbG9wbWVudCI+DQotICAgICAgPC9kZWZhdWx0RW5hYmxlbWVudD4NCi0gICAgICANCi0gICAgICA8ZGVmYXVsdEVuYWJsZW1lbnQNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbSI+DQotICAgICAgPC9kZWZhdWx0RW5hYmxlbWVudD4gICAgIA0KLSAgICAgIA0KLSAgICAgIDxkZWZhdWx0RW5hYmxlbWVudA0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cyI+DQotICAgICAgPC9kZWZhdWx0RW5hYmxlbWVudD4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPg0KLSAgICAgIDxwcmltYXJ5V2l6YXJkDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkphdmFQcm9qZWN0V2l6YXJkIj4NCi0gICAgICA8L3ByaW1hcnlXaXphcmQ+DQotICAgICAgPHByaW1hcnlXaXphcmQNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLnVpLk5ld1Byb2plY3RXaXphcmQiPg0KLSAgICAgIDwvcHJpbWFyeVdpemFyZD4NCi0gICAgICA8cHJpbWFyeVdpemFyZA0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdDbGFzc0NyZWF0aW9uV2l6YXJkIj4NCi0gICAgICA8L3ByaW1hcnlXaXphcmQ+DQotICAgICAgPHByaW1hcnlXaXphcmQNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3SW50ZXJmYWNlQ3JlYXRpb25XaXphcmQiPg0KLSAgICAgIDwvcHJpbWFyeVdpemFyZD4NCi0gICAgICA8cHJpbWFyeVdpemFyZA0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUudWkuTmV3U2NoZW1hRmlsZVdpemFyZCI+DQotICAgICAgPC9wcmltYXJ5V2l6YXJkPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRpb25BY3RpdmF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRpb25BY3RpdmF0b3IuamF2YQppbmRleCBjNTQyMjQ4Li4zZjAzZDk4IDEwMDY0NAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0aW9uQWN0aXZhdG9yLmphdmEKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQ29uZmlndXJhdGlvbkFjdGl2YXRvci5qYXZhCkBAIC00MjcsNiArNDI3LDcgQEAKIAkKIAlwcml2YXRlIGJvb2xlYW4gY2FuUnVuV2l0aENhY2hlZERhdGEoKSB7CiAJCXJldHVybiAgISJ0cnVlIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJvc2dpLmNoZWNrQ29uZmlndXJhdGlvbiIpKSAmJiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldCgib3NnaS5kZXYiKSA9PSBudWxsICYmIC8vJE5PTi1OTFMtMSQKIAkJCQlsYXN0VGltZVN0YW1wPT1jb25maWd1cmF0aW9uLmdldENoYW5nZVN0YW1wKCkgJiYKIAkJCQlsYXN0U3RhdGVUaW1lU3RhbXA9PVBsYXRmb3JtLmdldFBsYXRmb3JtQWRtaW4oKS5nZXRTdGF0ZShmYWxzZSkuZ2V0VGltZVN0YW1wKCk7CiAJfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvU2l0ZUVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9TaXRlRW50cnkuamF2YQppbmRleCBhNWU1MjE1Li43YTA4OTA1IDEwMDY0NAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9TaXRlRW50cnkuamF2YQorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9TaXRlRW50cnkuamF2YQpAQCAtNDcwLDcgKzQ3MCw5IEBACiAJCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaXRlRW50cnkuY29tcHV0ZVBsdWdpblN0YW1wIiwgcmVzb2x2ZWRVUkwudG9FeHRlcm5hbEZvcm0oKSkpOyAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gMDsKIAkJfQotCisJCWxvbmcgc3RhcnQgPSAwOworCQlpZiAoQ29uZmlndXJhdGlvbkFjdGl2YXRvci5ERUJVRykKKwkJCXN0YXJ0ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKIAkJLy8gY29tcHV0ZSBzdGFtcCBmb3IgdGhlIHBsdWdpbnMgZGlyZWN0b3J5CiAJCUZpbGUgcm9vdCA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7CiAJCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHJvb3QsIFBMVUdJTlMpOwpAQCAtNDc5LDcgKzQ4MSwzNiBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQlwbHVnaW5zQ2hhbmdlU3RhbXAgPSBwbHVnaW5zRGlyLmxhc3RNb2RpZmllZCgpOworCQkvLyBDb21wdXRlIHRoZSBwbHVnaW5zIGxpc3QKKwkJU3RyaW5nW10gcGx1Z2lucyA9IG51bGw7CisJCUlTaXRlUG9saWN5IHBvbGljeSA9IGdldFNpdGVQb2xpY3koKTsKKwkJaWYgKHBvbGljeS5nZXRUeXBlKCkgPT0gSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKQorCQkJcGx1Z2lucyA9IHBvbGljeS5nZXRMaXN0KCk7CisJCWVsc2UgaWYgKHBvbGljeS5nZXRUeXBlKCkgPT0gSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFKSB7CisJCQlGaWxlW10gZmlsZXMgPSBwbHVnaW5zRGlyLmxpc3RGaWxlcygpOworCQkJQXJyYXlMaXN0IGRldGVjdGVkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoZmlsZXMubGVuZ3RoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZihmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKQorCQkJCQlkZXRlY3RlZFBsdWdpbnMuYWRkKFBMVUdJTlMgKyAiLyIgKyBmaWxlc1tpXS5nZXROYW1lKCkgKyAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQllbHNlIGlmKGZpbGVzW2ldLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpKSAvLyROT04tTkxTLTEkCisJCQkJCWRldGVjdGVkUGx1Z2lucy5hZGQoUExVR0lOUyArICIvIiArIGZpbGVzW2ldLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0gCisJCQkKKwkJCVN0cmluZ1tdIGV4Y2x1ZGVkUGx1Z2lucyA9IHBvbGljeS5nZXRMaXN0KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVkUGx1Z2lucy5sZW5ndGg7IGkrKykgeworCQkJCWlmIChkZXRlY3RlZFBsdWdpbnMuY29udGFpbnMoZXhjbHVkZWRQbHVnaW5zW2ldKSkKKwkJCQkJZGV0ZWN0ZWRQbHVnaW5zLnJlbW92ZShleGNsdWRlZFBsdWdpbnNbaV0pOworCQkJfQorCQkJcGx1Z2lucyA9IChTdHJpbmdbXSlkZXRlY3RlZFBsdWdpbnMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKwkJfQorCisJCQorCQlsb25nIGRpclN0YW1wID0gcGx1Z2luc0Rpci5sYXN0TW9kaWZpZWQoKTsKKwkJcGx1Z2luc0NoYW5nZVN0YW1wID0gTWF0aC5tYXgoZGlyU3RhbXAsIGNvbXB1dGVTdGFtcChwbHVnaW5zKSk7CisJCWlmIChDb25maWd1cmF0aW9uQWN0aXZhdG9yLkRFQlVHKSB7CisJCQlsb25nIGVuZCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisJCQlVdGlscy5kZWJ1ZyhyZXNvbHZlZFVSTC50b1N0cmluZygpICsgIiBwbHVnaW4gc3RhbXA6ICIgKyBwbHVnaW5zQ2hhbmdlU3RhbXAgKyAiIGluICIgKyAoZW5kIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCisJCX0KIAkJcmV0dXJuIHBsdWdpbnNDaGFuZ2VTdGFtcDsKIAl9CiAKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDgyNDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4ZTJiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4PC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcjwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlPC9wcm9qZWN0Pg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI0MTFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBDUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkNDE0Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgb3MvLFwKLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gc3JjLyxcCi0gICAgICAgICAgICAgICBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2ZyYWdtZW50LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDA2ODQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQKLSAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eCIKLSAgIG5hbWU9IiVmcmFnbWVudE5hbWVMaW51eCIKLSAgIHZlcnNpb249IjMuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIHBsdWdpbi1pZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiCi0gICBwbHVnaW4tdmVyc2lvbj0iMy4wLjAiCi0gICBtYXRjaD0iY29tcGF0aWJsZSI+Ci0KLSAgIDxydW50aW1lPgotICAgPC9ydW50aW1lPgotCi0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvb3MvbGludXgveDg2L2xpYnVwZGF0ZS5zbyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9vcy9saW51eC94ODYvbGlidXBkYXRlLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzBhOWU5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9vcy9saW51eC94ODYvbGlidXBkYXRlLnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy9idWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0NGVhZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJidWlsZGxpYnJhcnkiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+IAotICAKLSAgPCEtLSBUaGUgcHJvcGVydGllcyAke2VjbGlwc2UtaG9tZX0gJHtqZGstcGF0aH0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPgotICA8cHJvcGVydHkgbmFtZT0iamRrLXBhdGgiIHZhbHVlPSIke2phdmEuaG9tZX0iLz4gIAotICA8cHJvcGVydHkgbmFtZT0iZGVzdGluYXRpb24iIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvb3MvbGludXgveDg2LyIvPgotICA8cHJvcGVydHkgbmFtZT0ib2JqLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjLyIvPgotICA8cHJvcGVydHkgbmFtZT0ic3JjLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjLyIvPiAgCi0gIAotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LW5hbWUiIHZhbHVlPSJsaWJ1cGRhdGUiLz4gIAotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1wbGF0Zm9ybSIgdmFsdWU9InNvIi8+ICAgIAotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtsaWJyYXJ5LW5hbWV9LiR7bGlicmFyeS1wbGF0Zm9ybX0iLz4KLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktZmlsZX0iLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktbmFtZX0ubyIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LWZpbGV9Ii8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LW5hbWV9Lm8iLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIAotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSBidWlsZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LGJ1aWxkLGNsZWFudXAiPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgYnVpbGQgdGhlIGxpYnJhcnkgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iYnVpbGQiPgotICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkaW5nICR7bGlicmFyeS1maWxlfSIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlci1wYXRoIiB2YWx1ZT0iJHtqZGstcGF0aH0vLi4vaW5jbHVkZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXItbGludXgtcGF0aCIgdmFsdWU9IiR7aGVhZGVyLXBhdGh9L2xpbnV4IiAvPgotCi0JPGVjaG8gbWVzc2FnZT0iZ2NjIC1vICAke2xpYnJhcnktZmlsZX0gLXNoYXJlZCAtSSR7c3JjLXBhdGh9IC1JJHtoZWFkZXItbGludXgtcGF0aH0gJHtsaWJyYXJ5LWZpbGV9IC1zdGF0aWMgLWxjIi8+Ci0KLSAgICA8YXBwbHkgZXhlY3V0YWJsZT0iZ2NjIiBkZXN0PSIke2VjbGlwc2UtaG9tZX0vIiBwYXJhbGxlbD0iZmFsc2UiPgotICAgICAgPGFyZyB2YWx1ZT0iLW8iLz4KLSAgICAgIDxhcmcgdmFsdWU9IiR7bGlicmFyeS1maWxlfSIvPgotICAgICAgPGFyZyB2YWx1ZT0iLXNoYXJlZCIvPgotICAgICAgPGFyZyB2YWx1ZT0iLUkke3NyYy1wYXRofSIvPgotICAgICAgPGFyZyB2YWx1ZT0iLUkke2hlYWRlci1wYXRofSIvPiAgICAgIAotICAgICAgPGFyZyB2YWx1ZT0iLUkke2hlYWRlci1saW51eC1wYXRofSIvPiAgCi0JICA8c3JjZmlsZS8+Ci0JICA8YXJnIHZhbHVlPSItc3RhdGljIi8+ICAgICAgICAgICAKLSAgICAgIDxhcmcgdmFsdWU9Ii1sYyIvPgkgIAotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy1wYXRofSIgaW5jbHVkZXM9IiouYyIvPgotICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqLmMiIHRvPSIqLm8iLz4KLSAgICA8L2FwcGx5PgotICAgIAotCTxtb3ZlIGZpbGU9IiR7bGlicmFyeS1maWxlfSIgdG9kaXI9IiR7ZGVzdGluYXRpb259Ii8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuYyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvdXBkYXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhY2IzYTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCi0jIGluY2x1ZGUgPHN5cy9zdGF0ZnMuaD4NCi0jIGluY2x1ZGUgPHVwZGF0ZS5oPg0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldEZyZWVTcGFjZQ0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUoNCi0gKi8NCi1KTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRGcmVlU3BhY2UoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgY2hhciAqIGxwRGlyZWN0b3J5TmFtZTsNCi0NCi0JLy8gTGludXggUGFyYW1ldGVycw0KLQlzdHJ1Y3Qgc3RhdGZzIGJ1ZmZlcjsNCi0NCi0JLy8gdGhlIHJlc3VsdA0KLQlqbG9uZyByZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dOOw0KLQ0KLQljbHMgPSAoKmpuaWVudikgLT4gR2V0T2JqZWN0Q2xhc3Moam5pZW52LCBmaWxlKTsNCi0JaWQgPSAoKmpuaWVudikgLT4gR2V0TWV0aG9kSUQoam5pZW52LCBjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCi0Jb2JqID0gKCpqbmllbnYpIC0+IENhbGxPYmplY3RNZXRob2Qoam5pZW52LCBmaWxlLCBpZCk7DQotCWxwRGlyZWN0b3J5TmFtZSA9ICgqam5pZW52KSAtPiBHZXRTdHJpbmdVVEZDaGFycyhqbmllbnYsIChqc3RyaW5nKSBvYmosIDApOw0KLQ0KLQkvLyBjYXN0IG9uZSBhcmd1bWVudCBhcyBqbG9uZyB0byBoYXZlIGEgamxvbmcgcmVzdWx0DQotCWludCBlcnIgPSBzdGF0ZnMobHBEaXJlY3RvcnlOYW1lLCZidWZmZXIpOw0KLQlpZiAoZXJyPT0wKXsNCi0JCWxvbmcgc2l6ZSA9IGJ1ZmZlci5mX2JzaXplOw0KLQkJamxvbmcgZnJlZSA9IGJ1ZmZlci5mX2JmcmVlOw0KLQkJcmVzdWx0ID0gc2l6ZSpmcmVlOw0KLQl9DQotDQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldExhYmVsDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspTGphdmEvbGFuZy9TdHJpbmc7DQotICovDQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRMYWJlbCgNCi0JSk5JRW52ICogam5pZW52LA0KLQlqY2xhc3MgamF2YUNsYXNzLA0KLQlqb2JqZWN0IGZpbGUpIHsNCi0NCi0JLy8gdG8gcmV0cml2ZSB0aGUgU3RyaW5nDQotCWpjbGFzcyBjbHM7DQotCWptZXRob2RJRCBpZDsNCi0Jam9iamVjdCBvYmo7DQotDQotCS8vIGphdmEuaW8uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQ0KLQljb25zdCBjaGFyICogbHBEaXJlY3RvcnlOYW1lOw0KLQ0KLQkvLyBvYnRhaW4gdGhlIFN0cmluZyBmcm9tIHRoZSBwYXJhbWV0ZXINCi0JY2xzID0gKCpqbmllbnYpIC0+IEdldE9iamVjdENsYXNzKGpuaWVudiwgZmlsZSk7DQotCWlkID0gKCpqbmllbnYpIC0+IEdldE1ldGhvZElEKGpuaWVudiwgY2xzLCAiZ2V0QWJzb2x1dGVQYXRoIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7DQotCW9iaiA9ICgqam5pZW52KSAtPiBDYWxsT2JqZWN0TWV0aG9kKGpuaWVudiwgZmlsZSwgaWQpOw0KLQlscERpcmVjdG9yeU5hbWUgPSAoKmpuaWVudikgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoam5pZW52LCAoanN0cmluZykgb2JqLCAwKTsNCi0NCi0JanN0cmluZyByZXN1bHQgPSBOVUxMOw0KLQ0KLQkvLyBMaW51eCBpbXBsZW1lbnRhdGlvbiBmb2xsb3dpbmcNCi0NCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0VHlwZQ0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUkNCi0gKi8NCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldFR5cGUoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgY2hhciAqIGxwRGlyZWN0b3J5TmFtZTsNCi0NCi0JLy8gb2J0YWluIHRoZSBTdHJpbmcgZnJvbSB0aGUgcGFyYW1ldGVyDQotCWNscyA9ICgqam5pZW52KSAtPiBHZXRPYmplY3RDbGFzcyhqbmllbnYsIGZpbGUpOw0KLQlpZCA9ICgqam5pZW52KSAtPiBHZXRNZXRob2RJRChqbmllbnYsIGNscywgImdldEFic29sdXRlUGF0aCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOw0KLQlvYmogPSAoKmpuaWVudikgLT4gQ2FsbE9iamVjdE1ldGhvZChqbmllbnYsIGZpbGUsIGlkKTsNCi0JbHBEaXJlY3RvcnlOYW1lID0gKCpqbmllbnYpIC0+IEdldFN0cmluZ1VURkNoYXJzKGpuaWVudiwgKGpzdHJpbmcpIG9iaiwgMCk7DQotDQotCWludCByZXN1bHQ7DQotCQ0KLQkvLyBMaW51eCBpbXBsZW1hbnRhdGlvbg0KLQ0KLQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSDsNCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICogU2lnbmF0dXJlOiAoKVtMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlTGlzdE1vdW50UG9pbnRzKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MpIHsNCi0NCi0JLy8NCi0JaW50IGRyaXZlOw0KLQljaGFyIGRyaXZlTmFtZVsxMDBdOw0KLQlqb2JqZWN0QXJyYXkgcmV0dXJuQXJyYXk7DQotCWludCBuRHJpdmUgPSAwOw0KLQ0KLQkvLyANCi0JamNsYXNzIHN0cmluZ0NsYXNzOw0KLQlqb2JqZWN0IGVtcHR5Ow0KLQlpbnQgaW5kZXggPSAwOw0KLQlqb2JqZWN0IHN0cjsNCi0NCi0JLy8gTGludXggaW1wbGVtZW50YXRpb24NCi0JLy8gZmluZCBtb3VudCBwb2ludHMNCi0NCi0JZHJpdmUgPSAwOw0KLQlzdHJpbmdDbGFzcyA9ICgqam5pZW52KSAtPiBGaW5kQ2xhc3Moam5pZW52LCAiamF2YS9sYW5nL1N0cmluZyIpOw0KLQllbXB0eSA9ICgqam5pZW52KSAtPiBOZXdTdHJpbmdVVEYoam5pZW52LCAiIik7DQotCS8vcmV0dXJuQXJyYXkgPSAoKmpuaWVudikgLT4gTmV3T2JqZWN0QXJyYXkoam5pZW52LCBuRHJpdmUsIHN0cmluZ0NsYXNzLCBlbXB0eSk7DQotDQotCS8vIGZvciBub3cgcmV0dXJuIG51bGwgYXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZA0KLQlyZXR1cm5BcnJheSA9IE5VTEw7DQotDQotCWludCBpOw0KLQlmb3IgKGkgPSAwOyBpIDwgZHJpdmU7IGkrKykgew0KLQkJLy8gTGludXggaW1wbGVtZW50YXRpb24sIGNyZWF0ZSBTdHJpbmcgZm9yIGVhY2ggbW91bnQgcG9pbnQNCi0NCi0JCXN0ciA9ICgqam5pZW52KSAtPiBOZXdTdHJpbmdVVEYoam5pZW52LCBkcml2ZU5hbWUpOw0KLQkJKCpqbmllbnYpIC0+IFNldE9iamVjdEFycmF5RWxlbWVudChqbmllbnYsIHJldHVybkFycmF5LCBpbmRleCwgc3RyKTsNCi0NCi0JCWluZGV4Kys7DQotCX0NCi0NCi0JcmV0dXJuIHJldHVybkFycmF5Ow0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL3VwZGF0ZS5oIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmMDM0Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL3VwZGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotIA0KLSNpbmNsdWRlIDxqbmkuaD4NCi0vKiBIZWFkZXIgZm9yIGNsYXNzIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbyAqLw0KLQ0KLSNpZm5kZWYgX0luY2x1ZGVkX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSNkZWZpbmUgX0luY2x1ZGVkX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZg0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dODQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dOIC0xTA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV04NCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfVU5LTk9XTiAtMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEgNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIIC0yTA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9WQUJMRQ0KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUgMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GSVhFRA0KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GSVhFRCAyTA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9URQ0KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVEUgM0wNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTQ0KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTSA0TA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JBTURJU0sNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkFNRElTSyA1TA0KLS8qIEluYWNjZXNzaWJsZSBzdGF0aWM6IGxpc3RlbmVycyAqLw0KLS8qIEluYWNjZXNzaWJsZSBzdGF0aWM6IGhhc05hdGl2ZXMgKi8NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRGcmVlU3BhY2UNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylKDQotICovDQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0RnJlZVNwYWNlDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0TGFiZWwNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldExhYmVsDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0VHlwZQ0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUkNCi0gKi8NCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldFR5cGUNCi0gIChKTklFbnYgKiwgamNsYXNzLCBqb2JqZWN0KTsNCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVMaXN0TW91bnRQb2ludHMNCi0gKiBTaWduYXR1cmU6ICgpW0xqYXZhL2xhbmcvU3RyaW5nOw0KLSAqLw0KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVMaXN0TW91bnRQb2ludHMNCi0gIChKTklFbnYgKiwgamNsYXNzKTsNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotDQotI2VuZGlmDQotI2VuZGlmDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzliMjhmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWNkNTU3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZyYWdtZW50LnhtbCxcCi0gICAgICAgICAgICAgICBvcy8sXAotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvZnJhZ21lbnQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2ZyYWdtZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkOGU3Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvZnJhZ21lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxmcmFnbWVudAotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyIgotICAgbmFtZT0iJWZyYWdtZW50TmFtZVdpbiIKLSAgIHZlcnNpb249IjMuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIHBsdWdpbi1pZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiCi0gICBwbHVnaW4tdmVyc2lvbj0iMy4wLjAiCi0gICBtYXRjaD0iY29tcGF0aWJsZSI+Ci0KLSAgIDxydW50aW1lPgotICAgPC9ydW50aW1lPgotCi0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvb3Mvd2luMzIveDg2L3VwZGF0ZS5kbGwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvb3Mvd2luMzIveDg2L3VwZGF0ZS5kbGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGU2MGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni91cGRhdGUuZGxsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9idWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyODZiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJidWlsZGxpYnJhcnkiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+IAotICAKLSAgPCEtLSBUaGUgcHJvcGVydGllcyAke2VjbGlwc2UtaG9tZX0gJHtqZGstcGF0aH0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFRoZSBQYXRoIHNob3VsZCBwb2ludCB0byB0aGUgYmluIGRpcmVjdG9yeSBvZiBCQ0M1NSAtLT4KLSAgPCEtLSBodHRwOi8vd3d3LmJvcmxhbmQuY29tL3Byb2R1Y3RzL2Rvd25sb2Fkcy9kb3dubG9hZF9jYnVpbGRlci5odG1sIC0tPgotICAKLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4iLz4KLSAgPHByb3BlcnR5IG5hbWU9Impkay1wYXRoIiB2YWx1ZT0iJHtqYXZhLmhvbWV9Ii8+ICAKLSAgPHByb3BlcnR5IG5hbWU9ImRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni8iLz4KLSAgPHByb3BlcnR5IG5hbWU9Im9iai1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYyIvPgotICA8cHJvcGVydHkgbmFtZT0ic3JjLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjLyIvPiAgCi0gIAotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LW5hbWUiIHZhbHVlPSJ1cGRhdGUiLz4gIAotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1wbGF0Zm9ybSIgdmFsdWU9ImRsbCIvPiAgICAKLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7bGlicmFyeS1uYW1lfS4ke2xpYnJhcnktcGxhdGZvcm19Ii8+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LWZpbGV9Ii8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LW5hbWV9Lm9iaiIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS50ZHMiLz4gICAgICAgICAgICAKLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gICAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1maWxlfSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS5vYmoiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktbmFtZX0udGRzIi8+ICAgICAgICAgICAgCi0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxidWlsZCxjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGJ1aWxkIHRoZSBkbGwgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iYnVpbGQiPgotICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkaW5nICR7bGlicmFyeS1maWxlfSIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlci1wYXRoIiB2YWx1ZT0iJHtqZGstcGF0aH0vaW5jbHVkZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXItd2luZG93cy1wYXRoIiB2YWx1ZT0iJHtoZWFkZXItcGF0aH0vd2luMzIiIC8+Ci0KLQk8ZWNobyBtZXNzYWdlPSJiY2MzMiAtSSR7c3JjLXBhdGh9IC1JJHtoZWFkZXItd2luZG93cy1wYXRofSAtV0QiLz4KLQotICAgIDxhcHBseSBleGVjdXRhYmxlPSJiY2MzMiIgZGVzdD0iJHtlY2xpcHNlLWhvbWV9LyIgcGFyYWxsZWw9ImZhbHNlIj4KLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtzcmMtcGF0aH0iLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItcGF0aH0iLz4gICAgICAKLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItd2luZG93cy1wYXRofSIvPiAKLSAgICAgIDwhLS0gYXJnIHZhbHVlPSItRFVOSUNPREUiIC0tPiAKLQkgIDxhcmcgdmFsdWU9Ii13LTgwNTciLz4gICAgICAgICAgIAotICAgICAgPGFyZyB2YWx1ZT0iLVdEIi8+Ci0JICA8c3JjZmlsZS8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLXBhdGh9IiBpbmNsdWRlcz0iKi5jcHAiLz4KLSAgICAgIDxtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5jcHAiIHRvPSIqLm9iaiIvPgotICAgIDwvYXBwbHk+Ci0gICAgCi0JPG1vdmUgZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiB0b2Rpcj0iJHtkZXN0aW5hdGlvbn0iLz4KLSAgPC90YXJnZXQ+Ci0gIAotICAKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3VwZGF0ZS5jcHAgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3VwZGF0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjdmZDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0jIGluY2x1ZGUgPHVwZGF0ZS5oPg0KLSMgaW5jbHVkZSA8d2luZG93cy5oPg0KLSMgaW5jbHVkZSA8d2luaW9jdGwuaD4gLy8gSU9DVEwgY29kZXM6IE1lZGlhVHlwZQ0KLQ0KLS8vIFdpbmRvd3MgVmVyc2lvbg0KLWludCBXSU45OCA9IDA7DQotaW50IFdJTk5UID0gMTsNCi1pbnQgV0lOTUUgPSAyOw0KLWludCBXSU4yMDAwID0gMzsNCi1pbnQgV0lOWFAgPSA0Ow0KLQ0KLS8vIHNldCB0byAxIGZvciBERUJVRw0KLWludCBERUJVRyA9IDA7DQotDQotLy8gc2V0IHRvIDAgdG8gcnVuIG9uIFdpbmRvd3MgOTUgKlVuc3VwcG9ydGVkKg0KLWludCBOT1dJTjk1ID0gMTsNCi0NCi0NCi0vLyBHTE9CQUwgTUVUSE9EUw0KLS8vIC0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8qDQotICoNCi0gKi8NCi1qc3RyaW5nIFdpbmRvd3NUb2pzdHJpbmcoIEpOSUVudiogam5pZW52LCBjaGFyKiBidWYgKQ0KLXsNCi0gIGpzdHJpbmcgcnRuID0gMDsNCi0gIHdjaGFyX3QqIGJ1ZmZlciA9IDA7DQotICBpbnQgYnVmZmVyTGVuID0gc3RybGVuKGJ1Zik7ICANCi0gIGlmKCBidWZmZXJMZW4gPT0gMCApew0KLSAgICBydG4gPSBqbmllbnYgLT5OZXdTdHJpbmdVVEYoYnVmKTsNCi0JaWYgKERFQlVHKQ0KLQkJcHJpbnRmKCJXaW5kb3dzVG9KU3RyaW5nIEJ1ZmZlciBpcyBlbXB0eVxuIik7ICAgIA0KLSAgfSBlbHNlIHsNCi0gICAgaW50IGxlbmd0aCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgKExQQ1NUUilidWYsIGJ1ZmZlckxlbiwgTlVMTCwgMCApOw0KLSAgICBidWZmZXIgPSAod2NoYXJfdCopbWFsbG9jKCBsZW5ndGgqMiArIDEgKTsNCi0gICAgaWYoaW50IGVycj1NdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIChMUENTVFIpYnVmLCBidWZmZXJMZW4sIChMUFdTVFIpYnVmZmVyLCBsZW5ndGggKSA+MCApew0KLSAgICAgIHJ0biA9IGpuaWVudi0+TmV3U3RyaW5nKChqY2hhciopYnVmZmVyLCBsZW5ndGggKTsNCi0gICAgfSBlbHNlIHsNCi0JCWlmIChERUJVRykNCi0JCQlwcmludGYoIk11bHRpQnl0ZVRvV2lkZUNoYXIgJWlcbiIsZXJyKTsgICAgDQotICAgIH0NCi0gIH0NCi0gIGlmKCBidWZmZXIgKQ0KLSAgIGZyZWUoIGJ1ZmZlciApOw0KLSAgcmV0dXJuIHJ0bjsNCi19DQotDQotDQotDQotLyoNCi0gKiBjYWxscyBHZXRWb2x1bWVJbmZvcm1hdGlvbiB0byByZXRyaXZlIHRoZSBsYWJlbCBvZiB0aGUgdm9sdW1lDQotICogUmV0dXJucyBOVUxMIGlmIGFuIGVycm9yIG9jY3Vycw0KLSAqIEBwYXJhbSBkcml2ZUxldHRlciBwYXRoIHRvIHRoZSBkcml2ZSAiYzpcXCINCi0gKiBAcHJhbWEgam5pZW52IEpOSUVudmlyb25tZW50DQotICovDQotanN0cmluZyBnZXRMYWJlbChUQ0hBUiBkcml2ZUxldHRlcltdLEpOSUVudiAqIGpuaWVudil7DQotDQotCWpzdHJpbmcgcmVzdWx0ID0gTlVMTDsNCi0JVENIQVIgYnVmWzEyOF07CQ0KLQkNCi0JLy8gYWx3YXlzIHJldHVybiBudWxsIGFzIFVOSUNPREUgaXMgbm90IGltcGxlbWVudGVkDQotCS8vIGhvdyBjYW4gd2UgZ2V0IHRoZSBsYWJlbCBvZiBhIHZvbHVtZSBhcyBVTklDT0RFIGNoYXIgPw0KLQlyZXR1cm4gcmVzdWx0Ow0KLQkNCi0JaW50IGVyciA9IEdldFZvbHVtZUluZm9ybWF0aW9uKA0KLQkJZHJpdmVMZXR0ZXIsDQotCQlidWYsDQotCQlzaXplb2YoYnVmKSAtIDEsDQotCQlOVUxMLA0KLQkJTlVMTCwNCi0JCU5VTEwsDQotCQlOVUxMLA0KLQkJMCk7DQotCWlmIChlcnIpew0KLQkJcmVzdWx0ID0gV2luZG93c1RvanN0cmluZyhqbmllbnYsIGJ1Zik7DQotCX0gZWxzZSB7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJFcnJvciBHZXRWb2x1bWVJbmZvcm1hdGlvbiAlaVxuIixlcnIpOwkJCQkNCi0gCX0NCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotDQotLyoNCi0gKiByZXR1cm5zIHRoZSBWZXJzaW9uIG9mIFdpbmRvd3MNCi0gKiBpbnQgMCBXSU45ODsNCi0gKiBpbnQgMSBXSU5OVDsNCi0gKiBpbnQgMiBXSU5NRTsNCi0gKiBpbnQgMyBXSU4yMDAwOw0KLSAqIGludCA0IFdJTlhQOw0KLSAqIHJldHVybnMgLTEgb3RoZXJ3aXNlDQotICovDQotaW50IGdldFdpbmRvd3NWZXJzaW9uKCl7DQotCU9TVkVSU0lPTklORk9FWCBvc3ZpOw0KLQlpbnQgVU5LTk9XTiA9IC0xOw0KLQkNCi0JWmVyb01lbW9yeSgmb3N2aSwgc2l6ZW9mKE9TVkVSU0lPTklORk9FWCkpOw0KLQlvc3ZpLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YoT1NWRVJTSU9OSU5GT0VYKTsNCi0JDQotCWlmKCEoR2V0VmVyc2lvbkV4KChPU1ZFUlNJT05JTkZPICopJm9zdmkpKSl7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJVTktOT1dOIFZFUlNJT046IENhbm5vdCBleGVjdXRlIEdldFZlcnNpb25FeFxuIik7DQotCQkvLyBpZiBPU1ZFUlNJT05FWCBkb2Vzbid0IHdvcmssIHRyeSBPU1ZFUlNJT05JTkZPDQotCQlvc3ZpLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YoT1NWRVJTSU9OSU5GTyk7CQkJIAkNCi0JCWlmKCEoR2V0VmVyc2lvbkV4KChPU1ZFUlNJT05JTkZPICopJm9zdmkpKSl7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJVTktOT1dOIFZFUlNJT046IENhbm5vdCBleGVjdXRlIEdldFZlcnNpb25FeFxuIik7DQotCQkJcmV0dXJuIFVOS05PV047DQotCQl9DQotCX0NCi0JDQotCXN3aXRjaChvc3ZpLmR3UGxhdGZvcm1JZCl7DQotCQljYXNlIFZFUl9QTEFURk9STV9XSU4zMl9OVDoNCi0JCQlpZiAoREVCVUcpDQotCQkJCXByaW50ZigiVkVSU0lPTiBOVDogTWFqICVpIE1pbiAlaVxuIixvc3ZpLmR3TWFqb3JWZXJzaW9uLG9zdmkuZHdNaW5vclZlcnNpb24pOwkJCQkgCQ0KLQkJCWlmKG9zdmkuZHdNYWpvclZlcnNpb248PTQpDQotCQkJCXJldHVybiBXSU5OVDsNCi0JCQlpZihvc3ZpLmR3TWFqb3JWZXJzaW9uPT01KXsNCi0JCQkJaWYgKG9zdmkuZHdNaW5vclZlcnNpb249PTApDQotCQkJCQlyZXR1cm4gV0lOMjAwMDsNCi0JCQkJaWYgKG9zdmkuZHdNaW5vclZlcnNpb249PTEpDQotCQkJCQlyZXR1cm4gV0lOWFA7DQotCQkJfSBlbHNlIHsNCi0JCQkJcmV0dXJuIFVOS05PV047DQotCQkJfTsNCi0JCQlicmVhazsNCi0JCWNhc2UgVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1M6DQotCQkJaWYgKERFQlVHKQ0KLQkJCQlwcmludGYoIlZFUlNJT04gTm9uIE5UOiBNYWogJWkgTWluICVpXG4iLG9zdmkuZHdNYWpvclZlcnNpb24sb3N2aS5kd01pbm9yVmVyc2lvbik7CQkJCSAJDQotCQkJaWYob3N2aS5kd01ham9yVmVyc2lvbj09NCl7DQotCQkJCWlmIChvc3ZpLmR3TWlub3JWZXJzaW9uPT0xMCkNCi0JCQkJCXJldHVybiBXSU45ODsNCi0JCQkJaWYgKG9zdmkuZHdNaW5vclZlcnNpb249PTkwKQ0KLQkJCQkJcmV0dXJuIFdJTk1FOw0KLQkJCX0gZWxzZSB7DQotCQkJCXJldHVybiBVTktOT1dOOw0KLQkJCX0NCi0JCQlicmVhazsNCi0JCWRlZmF1bHQ6DQotCQkJaWYgKERFQlVHKQ0KLQkJCQlwcmludGYoIlZFUlNJT04gVU5LTk9XTjogTWFqICVpIE1pbiAlaVxuIixvc3ZpLmR3TWFqb3JWZXJzaW9uLG9zdmkuZHdNaW5vclZlcnNpb24pOwkJCQkgCQ0KLQkJCXJldHVybiBVTktOT1dOOw0KLQl9DQotCXJldHVybiBVTktOT1dOOw0KLX0gDQotDQotLyoNCi0gKiBSZXR1cm5zIHRoZSB0eXBlIG9mIFJlbW92YWJsZSBEcml2ZSANCi0gKiBSZXR1cm5zIA0KLSAqIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzMNCi0gKiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV81DQotICogb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUNCi0gKi8NCi1qbG9uZyBnZXRGbG9wcHkoVENIQVIgZHJpdmVMZXR0ZXJbXSl7DQotDQotCVRDSEFSIGZsb3BweVBhdGhbOF07DQotCUhBTkRMRSBoYW5kbGU7DQotCURJU0tfR0VPTUVUUlkgZ2VvbWV0cnlbMjBdOw0KLQlEV09SRCBkdzsNCi0JamxvbmcgVU5LTk9XTiA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFOw0KLQ0KLQlzcHJpbnRmKGZsb3BweVBhdGgsICJcXFxcLlxcJWM6IiwgZHJpdmVMZXR0ZXJbMF0pOw0KLQlpZiAoREVCVUcpDQotCQlwcmludGYoIlBhdGggJXNcbiIsZmxvcHB5UGF0aCk7DQotCS8vIEJVRyAyNTcxOQ0KLSAgICBTZXRFcnJvck1vZGUoIFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMgKTsgCQkNCi0JaGFuZGxlPUNyZWF0ZUZpbGUoZmxvcHB5UGF0aCwwLEZJTEVfU0hBUkVfUkVBRCxOVUxMLE9QRU5fQUxXQVlTLDAsTlVMTCk7DQotCWlmIChoYW5kbGU9PUlOVkFMSURfSEFORExFX1ZBTFVFKXsNCi0JCWlmIChERUJVRykNCi0JCQlwcmludGYoIkludmFsaWQgSGFuZGxlICVzXG4iLGZsb3BweVBhdGgpOw0KLQkJcmV0dXJuIFVOS05PV047DQotCX0gZWxzZSB7DQotCQlpZihEZXZpY2VJb0NvbnRyb2woaGFuZGxlLA0KLQkJCUlPQ1RMX0RJU0tfR0VUX01FRElBX1RZUEVTLDAsMCwNCi0JCQlnZW9tZXRyeSxzaXplb2YoZ2VvbWV0cnkpLCZkdywwKSANCi0JCQkmJiBkdz4wKSB7DQotCQkJc3dpdGNoKGdlb21ldHJ5WzBdLk1lZGlhVHlwZSl7DQotCQkJIGNhc2UgRjVfMTYwXzUxMjoNCi0JCQkgY2FzZSBGNV8xODBfNTEyOg0KLQkJCSBjYXNlIEY1XzMyMF81MTI6DQotCQkJIGNhc2UgRjVfMzIwXzEwMjQ6DQotCQkJIGNhc2UgRjVfMzYwXzUxMjoNCi0JCQkgY2FzZSBGNV8xUHQyXzUxMjoNCi0JCQkJaWYgKERFQlVHKQ0KLQkJCQkJcHJpbnRmKCJGb3VuZCA1IDEvNCBEcml2ZVxuIik7CQkJCSAJDQotCQkJIAlyZXR1cm4gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfNTsNCi0JCQkgY2FzZSBGM183MjBfNTEyOgkJCSAJCQkJIAkJCQkgCQkJCSAJCQkJIA0KLQkJCSBjYXNlIEYzXzFQdDQ0XzUxMjoNCi0JCQkgY2FzZSBGM18yUHQ4OF81MTI6DQotCQkJIGNhc2UgRjNfMjBQdDhfNTEyOgkJCQkgCQkJCSAJCQkJIA0KLQkJCQlpZiAoREVCVUcpDQotCQkJCQlwcmludGYoIkZvdW5kIDMgMS8yIERyaXZlXG4iKTsJCQkJIAkNCi0JCQkgCXJldHVybiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV8zOw0KLQkJCSBkZWZhdWx0Og0KLQkJCSAJcmV0dXJuIFVOS05PV047DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXJldHVybiBVTktOT1dOOwkNCi19DQotDQotLyoNCi0gKiBSZXR1cm5zIHRoZSBVTkMgbmFtZSBvZiBhIHJlbW90ZSBkcml2ZQ0KLSAqIChcXE1hY2hpbmVccGF0aFxwYXRoMVxwYXRoMiQpDQotICogcmV0dXJucyBOVUxMIGlmIGFuIGVycm9yIG9jY3Vycw0KLSAqLw0KLSBqc3RyaW5nIGdldFJlbW90ZU5ldHdvcmtOYW1lKFRDSEFSIGRyaXZlTGV0dGVyW10sSk5JRW52ICogam5pZW52KXsNCi0gCQ0KLSAJdW5zaWduZWQgbG9uZyBzaXplID0yNTY7DQotIAlUQ0hBUiBidWZbMjU2XTsJDQotIAlUQ0hBUiBkcml2ZVBhdGhbMl07DQotIAlEV09SRCBlcnI7DQotIAlqc3RyaW5nIHJlc3VsdCA9IE5VTEw7DQotIAkNCi0gCS8vIGFsd2F5cyByZXR1cm4gTlVMTCBhcyBVTklDT0RFIG5vdCBpbXBsZW1lbnRlZA0KLQkvLyBob3cgY2FuIHdlIGdldCB0aGUgbGFiZWwgb2YgYSByZW1vdGUgbmV0d29yayBuYW1lIGFzIFVOSUNPREUgY2hhciA/IAkNCi0gCXJldHVybiByZXN1bHQ7DQotIAkNCi0Jc3ByaW50Zihkcml2ZVBhdGgsICIlYzoiLCBkcml2ZUxldHRlclswXSk7IAkNCi0gCWVyciA9IFdOZXRHZXRDb25uZWN0aW9uKGRyaXZlUGF0aCxidWYsJnNpemUpOw0KLSAJDQotIAlpZiAoZXJyPT1XTl9TVUNDRVNTKXsNCi0JCXJlc3VsdCA9IFdpbmRvd3NUb2pzdHJpbmcoam5pZW52LGJ1Zik7DQotCX0gZWxzZSB7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJFcnJvciBXTkV0R2V0Q29ubmVjdGlvbiAlaSIsZXJyKTsJCQkJDQotIAl9DQotCXJldHVybiByZXN1bHQ7DQotIH0NCi0NCi0NCi0vLyBKTkkgTUVUSE9EUw0KLS8vIC0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldEZyZWVTcGFjZQ0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUoNCi0gKi8NCi1KTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRGcmVlU3BhY2UoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgVENIQVIgKiBscERpcmVjdG9yeU5hbWU7DQotDQotCS8vIFdpbmRvd3MgUGFyYW1ldGVycw0KLQlfX2ludDY0IGk2NEZyZWVCeXRlc0F2YWlsYWJsZVRvQ2FsbGVyOw0KLQlfX2ludDY0IGk2NFRvdGFsTnVtYmVyT2ZCeXRlczsNCi0JX19pbnQ2NCBpNjRUb3RhbE51bWJlck9mRnJlZUJ5dGVzOw0KLQ0KLQkvLyB0aGUgcmVzdWx0DQotCWpsb25nIHJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19TSVpFX1VOS05PV047DQotDQotCS8vIGZpcnN0LCBvYnRhaW4gdGhlIFBhdGggZnJvbSB0aGUgamF2YS5pby5GaWxlIHBhcmFtZXRlcg0KLQljbHMgPSBqbmllbnYgLT4gR2V0T2JqZWN0Q2xhc3MoZmlsZSk7DQotCWlkID0gam5pZW52IC0+IEdldE1ldGhvZElEKGNscywgImdldEFic29sdXRlUGF0aCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOw0KLQlvYmogPSBqbmllbnYgLT4gQ2FsbE9iamVjdE1ldGhvZChmaWxlLCBpZCk7DQotCWxwRGlyZWN0b3J5TmFtZSA9IGpuaWVudiAtPiBHZXRTdHJpbmdVVEZDaGFycygoanN0cmluZykgb2JqLCAwKTsNCi0JaWYgKERFQlVHKQ0KLQkJcHJpbnRmKCJEaXJlY3Rvcnk6IFslc11cbiIsbHBEaXJlY3RvcnlOYW1lKTsNCi0NCi0JaWYgKGludCB3aW4gPSAoaW50KWdldFdpbmRvd3NWZXJzaW9uKCk8MCAmJiBOT1dJTjk1KXsNCi0JCS8vIHdpbmRvd3MgOTUgb3Igb3RoZXINCi0JCWlmIChERUJVRykNCi0JCQlwcmludGYoIlVuc3VwcG9ydGVkIFdpbmRvd3M6ICVpXG4iLHdpbik7CQkNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JaW50IGVyciA9IEdldERpc2tGcmVlU3BhY2VFeCgNCi0JCQkJbHBEaXJlY3RvcnlOYW1lLA0KLQkJCQkoUFVMQVJHRV9JTlRFR0VSKSAmIGk2NEZyZWVCeXRlc0F2YWlsYWJsZVRvQ2FsbGVyLA0KLQkJCQkoUFVMQVJHRV9JTlRFR0VSKSAmIGk2NFRvdGFsTnVtYmVyT2ZCeXRlcywNCi0JCQkJKFBVTEFSR0VfSU5URUdFUikgJiBpNjRUb3RhbE51bWJlck9mRnJlZUJ5dGVzKTsNCi0JCQkNCi0JaWYgKGVycikgew0KLQkJcmVzdWx0ID0gKGpsb25nKSBpNjRGcmVlQnl0ZXNBdmFpbGFibGVUb0NhbGxlcjsNCi0JfQ0KLQ0KLQlyZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRMYWJlbA0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOw0KLSAqLw0KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0TGFiZWwoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgVENIQVIgKiBscERpcmVjdG9yeU5hbWU7DQotDQotCS8vIG9idGFpbiB0aGUgU3RyaW5nIGZyb20gdGhlIHBhcmFtZXRlcg0KLQljbHMgPSBqbmllbnYgLT4gR2V0T2JqZWN0Q2xhc3MoZmlsZSk7DQotCWlkID0gam5pZW52IC0+IEdldE1ldGhvZElEKGNscywgImdldEFic29sdXRlUGF0aCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOw0KLQlvYmogPSBqbmllbnYgLT4gQ2FsbE9iamVjdE1ldGhvZChmaWxlLCBpZCk7DQotCWxwRGlyZWN0b3J5TmFtZSA9IGpuaWVudiAtPiBHZXRTdHJpbmdVVEZDaGFycygoanN0cmluZykgb2JqLCAwKTsNCi0JaWYgKERFQlVHKQ0KLQkJcHJpbnRmKCJEaXJlY3Rvcnk6IFslc11cbiIsbHBEaXJlY3RvcnlOYW1lKTsNCi0NCi0JLy8NCi0JanN0cmluZyByZXN1bHQgPSBOVUxMOw0KLQlpbnQgZmxvcHB5Ow0KLQkNCi0JaWYgKGludCB3aW4gPSAoaW50KWdldFdpbmRvd3NWZXJzaW9uKCk8MCAmJiBOT1dJTjk1KXsNCi0JCS8vIHdpbmRvd3MgOTUgb3Igb3RoZXINCi0JCWlmIChERUJVRykNCi0JCQlwcmludGYoIlVuc3VwcG9ydGVkIFdpbmRvd3M6ICVpXG4iLHdpbik7CQkNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0JCQ0KLQkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIFN0cmluZyBvZiB0aGUgRm9ybTogPGxldHRlcj46DQotCWlmICgnOicgPT0gbHBEaXJlY3RvcnlOYW1lWzFdKSB7DQotCQlUQ0hBUiBkcml2ZUxldHRlcls0XTsgLy8gaS5lLiAtPiBDOlxcDQotCQltZW1jcHkoZHJpdmVMZXR0ZXIsIGxwRGlyZWN0b3J5TmFtZSwgMik7DQotCQlzdHJjcHkoZHJpdmVMZXR0ZXIgKyAyLCAiXFwiKTsNCi0JCXN3aXRjaCAoR2V0RHJpdmVUeXBlKGRyaXZlTGV0dGVyKSkgew0KLQkJCWNhc2UgRFJJVkVfUkVNT1RFIDoNCi0JCQkJLy8gY2hlY2sgbmFtZSBvZiBtYWNoaW5lIGFuZCBwYXRoIG9mIHJlbW90ZQ0KLQkJCQlpZiAoREVCVUcpDQotCQkJCQlwcmludGYoIlJlbW90ZSBEcml2ZSIpOw0KLQkJCQlyZXN1bHQgPSBnZXRSZW1vdGVOZXR3b3JrTmFtZShkcml2ZUxldHRlcixqbmllbnYpOwkJCQkNCi0JCQkJYnJlYWs7DQotCQkJZGVmYXVsdCA6DQotCQkJCWlmIChERUJVRykNCi0JCQkJCXByaW50ZigiQW5vdGhlciBEcml2ZSBhdCAlcyIsIGRyaXZlTGV0dGVyKTsNCi0JCQkJcmVzdWx0ID0gZ2V0TGFiZWwoZHJpdmVMZXR0ZXIsam5pZW52KTsNCi0JCQkJYnJlYWs7DQotCQl9IA0KLQl9IA0KLQ0KLQlyZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRUeXBlDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSQ0KLSAqLw0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0VHlwZSgNCi0JSk5JRW52ICogam5pZW52LA0KLQlqY2xhc3MgamF2YUNsYXNzLA0KLQlqb2JqZWN0IGZpbGUpIHsNCi0NCi0JLy8gdG8gcmV0cml2ZSB0aGUgU3RyaW5nDQotCWpjbGFzcyBjbHM7DQotCWptZXRob2RJRCBpZDsNCi0Jam9iamVjdCBvYmo7DQotDQotCS8vIGphdmEuaW8uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQ0KLQljb25zdCBUQ0hBUiAqIGxwRGlyZWN0b3J5TmFtZTsNCi0NCi0JLy8gb2J0YWluIHRoZSBTdHJpbmcgZnJvbSB0aGUgcGFyYW1ldGVyDQotCWNscyA9IGpuaWVudiAtPiBHZXRPYmplY3RDbGFzcyhmaWxlKTsNCi0JaWQgPSBqbmllbnYgLT4gR2V0TWV0aG9kSUQoY2xzLCAiZ2V0QWJzb2x1dGVQYXRoIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7DQotCW9iaiA9IGpuaWVudiAtPiBDYWxsT2JqZWN0TWV0aG9kKGZpbGUsIGlkKTsNCi0JbHBEaXJlY3RvcnlOYW1lID0gam5pZW52IC0+IEdldFN0cmluZ1VURkNoYXJzKChqc3RyaW5nKSBvYmosIDApOw0KLQlpZiAoREVCVUcpDQotCQlwcmludGYoIkRpcmVjdG9yeTogWyVzXVxuIixscERpcmVjdG9yeU5hbWUpOw0KLQ0KLQlpbnQgcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dOOw0KLQlpZiAoaW50IHdpbiA9IChpbnQpZ2V0V2luZG93c1ZlcnNpb24oKTwwICYmIE5PV0lOOTUpew0KLQkJLy8gd2luZG93cyA5NSBvciBvdGhlcg0KLQkJaWYgKERFQlVHKQ0KLQkJCXByaW50ZigiVW5zdXBwb3J0ZWQgV2luZG93czogJWlcbiIsd2luKTsJCQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQkNCi0JLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBTdHJpbmcgb2YgdGhlIEZvcm06IDxsZXR0ZXI+Og0KLQlpZiAoJzonID09IGxwRGlyZWN0b3J5TmFtZVsxXSkgew0KLQkJVENIQVIgZHJpdmVMZXR0ZXJbNF07IC8vQzpcXA0KLQkJbWVtY3B5KGRyaXZlTGV0dGVyLCBscERpcmVjdG9yeU5hbWUsIDIpOw0KLQkJc3RyY3B5KGRyaXZlTGV0dGVyICsgMiwgIlxcIik7DQotDQotCQlzd2l0Y2ggKEdldERyaXZlVHlwZShkcml2ZUxldHRlcikpIHsNCi0JCQljYXNlIERSSVZFX1JFTU9WQUJMRSA6DQotCQkJCS8vIGNoZWNrIGlmIGZsb3BweSAzLjUsIGZsb3BweSA1LjI1CQ0KLQkJCQkvLyBvciBvdGhlciByZW1vdmFibGUgZGV2aWNlIChVU0IsUENNQ0lBIC4uLikNCi0JCQkJaWYgKERFQlVHKQ0KLQkJCQkJcHJpbnRmKCJSZW1vdmFibGUgRGV2aWNlIik7DQotCQkJCXJlc3VsdCA9IGdldEZsb3BweShkcml2ZUxldHRlcik7CQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBEUklWRV9DRFJPTSA6DQotCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST007DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgRFJJVkVfRklYRUQgOg0KLQkJCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZJWEVEOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIERSSVZFX1JFTU9URSA6DQotCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1RFOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIERSSVZFX05PX1JPT1RfRElSIDoNCi0JCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEg7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgRFJJVkVfUkFNRElTSyA6DQotCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkFNRElTSzsNCi0JCQkJYnJlYWs7CQkJDQotCQkJY2FzZSBEUklWRV9VTktOT1dOIDoNCi0JCQlkZWZhdWx0IDoNCi0JCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dOOw0KLQkJCQlicmVhazsNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIOw0KLQl9DQotDQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUxpc3RNb3VudFBvaW50cw0KLSAqIFNpZ25hdHVyZTogKClbTGphdmEvbGFuZy9TdHJpbmc7DQotICovDQotSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUxpc3RNb3VudFBvaW50cygNCi0JSk5JRW52ICogam5pZW52LA0KLQlqY2xhc3MgamF2YUNsYXNzKSB7DQotDQotCS8vDQotCURXT1JEIGxvZ0RyaXZlczsNCi0JVUlOVCBkcml2ZTsNCi0JVENIQVIgZHJpdmVOYW1lWzEwMF07DQotCWpvYmplY3RBcnJheSByZXR1cm5BcnJheTsNCi0JaW50IG5Ecml2ZSA9IDA7DQotDQotCS8vIA0KLQlqY2xhc3Mgc3RyaW5nQ2xhc3M7DQotCWpvYmplY3QgZW1wdHk7DQotCWludCBpbmRleCA9IDA7DQotCWpvYmplY3Qgc3RyOw0KLQ0KLQ0KLQlsb2dEcml2ZXMgPSBHZXRMb2dpY2FsRHJpdmVzKCk7DQotCWZvciAoZHJpdmUgPSAwOyBkcml2ZSA8IDMyOyBkcml2ZSsrKSB7DQotCQlpZiAobG9nRHJpdmVzICYgKDEgPDwgZHJpdmUpKSB7DQotCQkJbkRyaXZlKys7DQotCQl9DQotCX0NCi0NCi0Jc3RyaW5nQ2xhc3MgPSBqbmllbnYgLT4gRmluZENsYXNzKCJqYXZhL2xhbmcvU3RyaW5nIik7DQotCWVtcHR5ID0gam5pZW52IC0+IE5ld1N0cmluZ1VURigiIik7DQotCXJldHVybkFycmF5ID0gam5pZW52IC0+IE5ld09iamVjdEFycmF5KG5Ecml2ZSwgc3RyaW5nQ2xhc3MsIGVtcHR5KTsNCi0NCi0JaWYgKGludCB3aW4gPSAoaW50KWdldFdpbmRvd3NWZXJzaW9uKCk8MCAmJiBOT1dJTjk1KXsNCi0JCS8vIHdpbmRvd3MgOTUgb3Igb3RoZXINCi0JCWlmIChERUJVRykNCi0JCQlwcmludGYoIlVuc3VwcG9ydGVkIFdpbmRvd3M6ICVpXG4iLHdpbik7CQ0KLQkJcmV0dXJuIE5VTEw7DQotCX0NCi0NCi0JZm9yIChkcml2ZSA9IDA7IGRyaXZlIDwgMzI7IGRyaXZlKyspIHsNCi0JCWlmIChsb2dEcml2ZXMgJiAoMSA8PCBkcml2ZSkpIHsNCi0JCQlzcHJpbnRmKGRyaXZlTmFtZSwgIiVjOlxcIiwgZHJpdmUgKyAnQScpOw0KLQkJCXN0ciA9IGpuaWVudiAtPiBOZXdTdHJpbmdVVEYoZHJpdmVOYW1lKTsNCi0JCQlqbmllbnYgLT4gU2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldHVybkFycmF5LCBpbmRleCwgc3RyKTsNCi0JCQlpbmRleCsrOw0KLQkJfQ0KLQl9DQotDQotCXJldHVybiByZXR1cm5BcnJheTsNCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuaCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjczZDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qIERPIE5PVCBFRElUIFRISVMgRklMRSAtIGl0IGlzIG1hY2hpbmUgZ2VuZXJhdGVkICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxqbmkuaD4NCi0vKiBIZWFkZXIgZm9yIGNsYXNzIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbyAqLwotCi0jaWZuZGVmIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8KLSNkZWZpbmUgX0luY2x1ZGVkX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTgotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dOIC0xTA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dOIC0xTA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSAotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSCAtMkwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUgMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GSVhFRAotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZJWEVEIDJMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1RFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1RFIDNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0NEUk9NIDRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SQU1ESVNLCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkFNRElTSyA1TAotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfNSA2TAotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzMKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfMyA3TA0KLS8qIEluYWNjZXNzaWJsZSBzdGF0aWM6IGxpc3RlbmVycyAqLw0KLS8qIEluYWNjZXNzaWJsZSBzdGF0aWM6IGhhc05hdGl2ZXMgKi8NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRGcmVlU3BhY2UNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylKDQotICovDQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0RnJlZVNwYWNlDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7Ci0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRMYWJlbA0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOw0KLSAqLw0KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0TGFiZWwNCi0gIChKTklFbnYgKiwgamNsYXNzLCBqb2JqZWN0KTsKLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldFR5cGUNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylJDQotICovDQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRUeXBlDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7Ci0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVMaXN0TW91bnRQb2ludHMNCi0gKiBTaWduYXR1cmU6ICgpW0xqYXZhL2xhbmcvU3RyaW5nOw0KLSAqLw0KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVMaXN0TW91bnRQb2ludHMNCi0gIChKTklFbnYgKiwgamNsYXNzKTsKLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotCi0jZW5kaWYNCi0jZW5kaWYNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ4MjQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLm9wdGlvbnMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjYxOTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zz10cnVlDQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2FybmluZz1mYWxzZQ0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3BhcnNpbmc9ZmFsc2UNCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsPWZhbHNlDQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvY29uZmlndXJhdGlvbj1mYWxzZQ0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3R5cGU9ZmFsc2UNCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy93ZWI9ZmFsc2UNCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsaGFuZGxlcj1mYWxzZQ0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3JlY29uY2lsZXI9ZmFsc2UNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGM2YTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9wcm9qZWN0Pg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvU2NyYXBib29rLmpwYWdlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL1NjcmFwYm9vay5qcGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2MzNhZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvU2NyYXBib29rLmpwYWdlCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLQkJamF2YS51dGlsLkVudW1lcmF0aW9uIGVudW0gPSAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5rZXlzKCk7DQotCQlTdHJpbmcga2V5ID0gbnVsbDsNCi0JCXdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKXsNCi0JCQlrZXkgPSAoU3RyaW5nKWVudW0ubmV4dEVsZW1lbnQoKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50KGtleSk7DQotCQkJZm9yIChpbnQgaSA9MDtpPCgzMC1rZXkubGVuZ3RoKCkpO2krKylTeXN0ZW0ub3V0LnByaW50KCIgIik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItPiIrU3lzdGVtLmdldFByb3BlcnR5KGtleSkpOw0KLQkJfQ0KLQ0KLQ0KLW5ldyBqYXZhLm5ldC5VUkwoImZpbGU6Ly9DOi90ZW1wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyIikub3BlblN0cmVhbSgpDQotDQotKG5ldyBqYXZhLmlvLkZpbGUoIkM6XFxjaHJpcyBjaHJpc1xoZWxsb1xcIikpLm1rZGlycygpOw0KLQ0KLWphdmEubmV0LlVSTCBhID0gIG5ldyBqYXZhLm5ldC5VUkwoImh0dHAiLCJ3d3cub3RpLmNvbSIsIi9mZWF0dXJlL2JsYWguamFyIik7DQotamF2YS5uZXQuVVJMIGIgPSAgbmV3IGphdmEubmV0LlVSTCgiamFyIixudWxsLGEudG9FeHRlcm5hbEZvcm0oKSsiIS9oZWxsby50eHQiKTsNCi1iDQotDQotbmV3IGphdmEubmV0LlVSTCgiZmlsZSIsbnVsbCxTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOw0KLW5ldyBqYXZhLm5ldC5VUkwoImZpbGUiLG51bGwsU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSk7DQotDQotU3RyaW5nIHRlbXBEaXIgPSAiYzpcXFRFTVBcXGZlYXR1cmVzMi5qYXIiOw0KLWphdmEubmV0LlVSTCBURU1QX1NJVEUgPSBuZXcgamF2YS5uZXQuVVJMKCJmaWxlIixudWxsLHRlbXBEaXIpOw0KLWphdmEubmV0LlVSTCBmaWxlID0gbmV3IGphdmEubmV0LlVSTCgiamFyIixudWxsLFRFTVBfU0lURS50b0V4dGVybmFsRm9ybSgpKyIhL2ZlYXR1cmUueG1sIik7DQotZmlsZS5vcGVuU3RyZWFtKCk7DQotZmlsZQ0KLQ0KLWphdmEuaW8uRmlsZSBmID0gIG5ldyBqYXZhLmlvLkZpbGUoImM6XFx0ZW1wXFx4dGZcXGZpbGUuamFyIik7DQotZi5ta2RpcnMoKQ0KLQ0KLWphdmEudXRpbC5Mb2NhbGUuZ2V0RGVmYXVsdCgpDQotamF2YS51dGlsLlJlc291cmNlQnVuZGxlDQotDQotamF2YS5uZXQuVVJMIHVybCA9IG5ldyBqYXZhLm5ldC5VUkwoImZpbGUiLG51bGwsIkM6XFxwYXRoIitqYXZhLmlvLkZpbGUuc2VwYXJhdG9yKTsNCi11cmwuZ2V0UGF0aCgpLmVuZHNXaXRoKCIvIik7DQotdXJsDQotDQotamF2YS5uZXQuVVJMIHVybCA9IG5ldyBqYXZhLm5ldC5VUkwoImh0dHA6Ly9tYWNoaW5lOjgwODAvcGF0aCBzcGFjZS9maWxlLmFiYyNoZWxsbyIpOw0KLWphdmEubmV0LlVSTCB1cmwyID0gbmV3IGphdmEubmV0LlVSTCh1cmwsIi8gIik7DQotdXJsMi5nZXRQYXRoKCkNCi0NCi1qYXZhLmxhbmcuQ2xhc3NMb2FkZXIgbCA9IG5ldyBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcihuZXcgamF2YS5uZXQuVVJMW10ge25ldyBqYXZhLm5ldC5VUkwoImZpbGUiLG51bGwsImM6XFxvdGlcXHdzdzIwNVxcZWNsaXBzZVxcaW5zdGFsbFxcZmVhdHVyZXNcXG9yZy5lY2xpcHNlLmhlbHAuZmVhdHVyZV8xLjAuNC8iKSB9LCBudWxsKTsNCi1qYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gamF2YS51dGlsLlJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiZmVhdHVyZSIsIGphdmEudXRpbC5Mb2NhbGUuZ2V0RGVmYXVsdCgpLCBsKTsNCi1idW5kbGUNCi0NCi1TdHJpbmdbXSBzcyA9IHsiYSIsICJiIn07IA0KLWphdmEudXRpbC5MaXN0IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgwKTsNCi1saXN0LmFkZEFsbChqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChzcykpOyANCi1saXN0LmFkZCgiYyIpOw0KLWxpc3Quc2l6ZSgpOw0KLQ0KLWphdmEudXRpbC5MaXN0IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgwKTsNCi1saXN0LmFkZCgiMSIpOw0KLWxpc3QuYWRkKCIyIik7DQotbGlzdC5hZGQoIjMiKTsNCi1saXN0LmFkZCgiNCIpOw0KLWxpc3QuYWRkKCI1Iik7DQotbGlzdC5hZGQoIjYiKTsNCi1saXN0LmFkZCgiNyIpOw0KLXdoaWxlIChsaXN0LnNpemUoKT41KXsNCi0JbGlzdC5yZW1vdmUoMCk7DQotfQ0KLWxpc3QuZ2V0KDApDQotDQotDQotb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5LktleVN0b3JlcyBrID0gbmV3IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eS5LZXlTdG9yZXMoKTsNCi13aGlsZSAoay5oYXNOZXh0KCkpew0KLQlvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHkuS2V5c3RvcmVIYW5kbGUgaGFuZGxlID0gKG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eS5LZXlzdG9yZUhhbmRsZSkgay5uZXh0KCk7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiS2V5U3RvcmU6IitoYW5kbGUuZ2V0TG9jYXRpb24oKSsiOiIraGFuZGxlLmdldFR5cGUoKSk7DQotfQ0KLQ0KLWludCBpID0gKDEzLzMpOw0KLWkNCi0NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLU9MRCBGZWF0dXJlIENvZGUNCi0NCi0NCi0JLyoqDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgZG93bmxvYWRBcmNoaXZlc0xvY2FsbHkoSVNpdGUgdGVtcFNpdGUsIFN0cmluZ1tdIGFyY2hpdmVJRFRvSW5zdGFsbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gew0KLQ0KLQkJVVJMIHNvdXJjZVVSTDsNCi0JCVN0cmluZyBuZXdGaWxlOw0KLQkJVVJMIG5ld1VSTDsNCi0NCi0JCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQltb25pdG9yLmJlZ2luVGFzaygiRG93bmxvYWQgYXJjaGl2ZXMgYnVuZGxlcyB0byBUZW1wb3JhcnkgU3BhY2UiLCBhcmNoaXZlSURUb0luc3RhbGwubGVuZ3RoKTsNCi0JCX0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJjaGl2ZUlEVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7DQotDQotCQkJLy8gdHJhbnNmb3JtIHRoZSBpZCBieSBhc2tpbmcgdGhlIHNpdGUgdG8gbWFwIHRoZW0gdG8gcmVhbCBVUkwgaW5zaWRlIHRoZSBTSVRFDQotCQkJaWYgKGdldFNpdGUoKSAhPSBudWxsKSB7DQotCQkJCXNvdXJjZVVSTCA9IGdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkuZ2V0QXJjaGl2ZXNSZWZlcmVuY2VzKGFyY2hpdmVJRFRvSW5zdGFsbFtpXSk7DQotCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJCW1vbml0b3Iuc3ViVGFzaygiLi4uIiArIGFyY2hpdmVJRFRvSW5zdGFsbFtpXSk7DQotCQkJCX0NCi0JCQkJLy8gdGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gdGhlIHRlbXAgZGlyZWN0b3J5DQotCQkJCS8vIHNob3VsZCBiZSB0aGUgcmVndWxhciBwbHVnaW5zL3BsdWdpbklEX3ZlciBhcyB0aGUgVGVtcCBzaXRlIGlzIE9VUiBzaXRlDQotCQkJCW5ld0ZpbGUgPSBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBhcmNoaXZlSURUb0luc3RhbGxbaV07DQotCQkJCW5ld1VSTCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5yZXNvbHZlQXNMb2NhbChzb3VyY2VVUkwsIG5ld0ZpbGUsIG1vbml0b3IpOw0KLQ0KLQkJCQkvLyB0cmFuc2ZlciB0aGUgcG9zc2libGUgbWFwcGluZyB0byB0aGUgdGVtcCBzaXRlCQkJCQkJDQotCQkJCSAoKFNpdGUpIHRlbXBTaXRlKS5hZGRBcmNoaXZlKG5ldyBVUkxFbnRyeShhcmNoaXZlSURUb0luc3RhbGxbaV0sIG5ld1VSTCkpOw0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJCXRocm93IENBTkNFTF9FWENFUFRJT047DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQkvLyB0aGUgc2l0ZSBvZiB0aGlzIGZlYXR1cmUgbm93IGJlY29tZXMgdGhlIFRFTVAgZGlyZWN0b3J5DQotCQkvLyBGSVhNRTogbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG90aGVyIGlzc3VlDQotCQkvLyBsaWtlIGFza2luZyBmb3Igc3R1ZmYgdGhhdCBoYXNuJ3QgYmVlbiBjb3BpZWQNCi0JCS8vIG9yIHJldXNpbmcgdGhpcyBmZWF0dXJlDQotCQkvLyBvZiBoYXZpbmcgYW4gdW4tbWFuYWdlYWJsZSB0ZW1wIHNpdGUNCi0NCi0JCXRoaXMuc2V0U2l0ZSh0ZW1wU2l0ZSk7DQotDQotCX0NCi0NCi0JLyoqDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgZG93bmxvYWREYXRhTG9jYWxseShJRmVhdHVyZSB0YXJnZXRGZWF0dXJlLCBJTm9uUGx1Z2luRW50cnlbXSBkYXRhVG9JbnN0YWxsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7DQotDQotCQlVUkwgc291cmNlVVJMOw0KLQkJLy8gYW55IG90aGVyIGRhdGENCi0JCUlOb25QbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBnZXROb25QbHVnaW5FbnRyaWVzKCk7DQotCQlpZiAoZW50cmllcyAhPSBudWxsKSB7DQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQltb25pdG9yLmJlZ2luVGFzaygiSW5zdGFsbGluZyBPdGhlciBEYXRhIGluZm9ybWF0aW9uIiwgZGF0YVRvSW5zdGFsbC5sZW5ndGgpOw0KLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCXRocm93IENBTkNFTF9FWENFUFRJT047DQotCQkJCX0NCi0JCQl9DQotDQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7DQotCQkJCVN0cmluZyBuYW1lID0gZGF0YVRvSW5zdGFsbFtqXS5nZXRJZGVudGlmaWVyKCk7DQotCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJCW1vbml0b3Iuc3ViVGFzaygiLi4uIiArIG5hbWUpOw0KLQkJCQl9DQotDQotCQkJCS8vIHRoZSBpZCBpcyBVUkwgZm9ybWF0IHdpdGggIi8iDQotCQkJCVN0cmluZyBkYXRhRW50cnlJZCA9IFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEggKyBnZXRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArICIvIiArIG5hbWU7DQotCQkJCS8vIHRyYW5zZm9ybSB0aGUgaWQgYnkgYXNraW5nIHRoZSBzaXRlIHRvIG1hcCB0aGVtIHRvIHJlYWwgVVJMIGluc2lkZSB0aGUgU0lURQ0KLQkJCQlpZiAoZ2V0U2l0ZSgpICE9IG51bGwpIHsNCi0JCQkJCXNvdXJjZVVSTCA9IGdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkuZ2V0QXJjaGl2ZXNSZWZlcmVuY2VzKGRhdGFFbnRyeUlkKTsNCi0JCQkJCSgoU2l0ZSkgdGFyZ2V0RmVhdHVyZS5nZXRTaXRlKCkpLnN0b3JlRmVhdHVyZUluZm8oZ2V0SWRlbnRpZmllcigpLCBuYW1lLCBzb3VyY2VVUkwub3BlblN0cmVhbSgpKTsNCi0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQkJdGhyb3cgQ0FOQ0VMX0VYQ0VQVElPTjsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0vLyBnZXRTaXRlPT1udWxsDQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQkNCi0JCS8qKg0KLQkJICogTWV0aG9kIGluc3RhbGwuDQotCQkgKiBAcGFyYW0gdGFyZ2V0RmVhdHVyZQ0KLQkJICogQHBhcmFtIG1vbml0b3INCi0JCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkJICovDQotCXB1YmxpYyB2b2lkIG9sZF9pbnN0YWxsKElGZWF0dXJlIHRhcmdldEZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJSVBsdWdpbkVudHJ5W10gc291cmNlRmVhdHVyZVBsdWdpbkVudHJpZXMgPSBnZXRQbHVnaW5FbnRyaWVzKCk7DQotCQlJUGx1Z2luRW50cnlbXSB0YXJnZXRTaXRlUGx1Z2luRW50cmllcyA9IHRhcmdldEZlYXR1cmUuZ2V0U2l0ZSgpLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCVNpdGUgdGVtcFNpdGUgPSAoU2l0ZSkgU2l0ZU1hbmFnZXIuZ2V0VGVtcFNpdGUoKTsNCi0NCi0JCS8vIGRldGVybWluZSBsaXN0IG9mIHBsdWdpbnMgdG8gaW5zdGFsbA0KLQkJLy8gZmluZCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHR3byBhcnJheXMgb2YgSVBsdWdpbkVudHJ5Li4uDQotCQkvLyBUaGUgb25lIHRlaCBzaXRlIGNvbnRhaW5zIGFuZCB0ZWggb25lIHRoZSBmZWF0dXJlIGNvbnRhaW5zDQotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zVG9JbnN0YWxsID0gaW50ZXJzZWN0aW9uKHNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzLCB0YXJnZXRTaXRlUGx1Z2luRW50cmllcyk7DQotDQotCQkvLyBwcml2YXRlIGFic3RyYWN0IC0gRGV0ZXJtaW5lIGxpc3Qgb2YgY29udGVudCByZWZlcmVuY2VzIGlkIC9hcmNoaXZlcyBpZCAvYnVuZGxlcyBpZCB0aGF0IA0KLQkJLy8gbWFwIHRoZSBsaXN0IG9mIHBsdWdpbnMgdG8gaW5zdGFsbA0KLQkJU3RyaW5nW10gYXJjaGl2ZUlEVG9JbnN0YWxsID0gZ2V0Q29udGVudFJlZmVyZW5jZVRvSW5zdGFsbChwbHVnaW5zVG9JbnN0YWxsKTsNCi0NCi0JCXRyeSB7DQotCQkJLy8gZG93bmxvYWQgYW5kIGluc3RhbGwgZGF0YSBidW5kbGVzDQotCQkJLy8gYmVmb3JlIHdlIHNldCB0aGUgc2l0ZSBvZiB0ZWggZmVhdHVyZSB0byB0aGUgVEVNUCBzaXRlDQotCQkJSU5vblBsdWdpbkVudHJ5W10gZGF0YUVudHJpZXMgPSBnZXROb25QbHVnaW5FbnRyaWVzKCk7DQotCQkJaWYgKGRhdGFFbnRyaWVzLmxlbmd0aCA+IDApIHsNCi0JCQkJZG93bmxvYWREYXRhTG9jYWxseSh0YXJnZXRGZWF0dXJlLCBkYXRhRW50cmllcywgbW9uaXRvcik7DQotCQkJfQ0KLQ0KLQkJCS8vIG9wdG1pemF0aW9uLCBtYXkgYmUgcHJpdmF0ZSB0byBpbXBsZW1lbnRhdGlvbg0KLQkJCS8vIGNvcHkgKmJsb2JzL2NvbnRlbnQgcmVmZXJlbmNlcy9hcmNoaXZlcy9idW5kbGVzKiBpbiBURU1QIHNwYWNlDQotCQkJaWYgKCgoU2l0ZSkgZ2V0U2l0ZSgpKS5vcHRpbWl6ZSgpKSB7DQotCQkJCWlmIChhcmNoaXZlSURUb0luc3RhbGwgIT0gbnVsbCkgew0KLQkJCQkJZG93bmxvYWRBcmNoaXZlc0xvY2FsbHkodGVtcFNpdGUsIGFyY2hpdmVJRFRvSW5zdGFsbCwgbW9uaXRvcik7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gb2J0YWluIHRoZSBsaXN0IG9mICpTdHJlYW1hYmxlIFN0b3JhZ2UgVW5pdCoNCi0JCQkvLyBmcm9tIHRoZSBhcmNoaXZlDQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQlpbnQgdG90YWwgPSBwbHVnaW5zVG9JbnN0YWxsID09IG51bGwgPyAxIDogcGx1Z2luc1RvSW5zdGFsbC5sZW5ndGggKyAxOw0KLQkJCQltb25pdG9yLmJlZ2luVGFzaygiSW5zdGFsbCBmZWF0dXJlICIgKyBnZXRMYWJlbCgpLCB0b3RhbCk7DQotCQkJfQ0KLQkJCWlmIChwbHVnaW5zVG9JbnN0YWxsICE9IG51bGwpIHsNCi0JCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsNCi0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJCQltb25pdG9yLnN1YlRhc2soIkluc3RhbGxpbmcgcGx1Zy1pbjogIiArIHBsdWdpbnNUb0luc3RhbGxbaV0pOw0KLQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJCQl0aHJvdyBDQU5DRUxfRVhDRVBUSU9OOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0NCi0JCQkJCW9wZW4ocGx1Z2luc1RvSW5zdGFsbFtpXSk7DQotCQkJCQlTdHJpbmdbXSBuYW1lcyA9IGdldFN0b3JhZ2VVbml0TmFtZXMocGx1Z2luc1RvSW5zdGFsbFtpXSk7DQotCQkJCQlpZiAobmFtZXMgIT0gbnVsbCkgew0KLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmFtZXMubGVuZ3RoOyBqKyspIHsNCi0JCQkJCQkJaWYgKChpblN0cmVhbSA9IGdldElucHV0U3RyZWFtRm9yKHBsdWdpbnNUb0luc3RhbGxbaV0sIG5hbWVzW2pdKSkgIT0gbnVsbCkNCi0JCQkJCQkJCXRhcmdldEZlYXR1cmUuc3RvcmUocGx1Z2luc1RvSW5zdGFsbFtpXSwgbmFtZXNbal0sIGluU3RyZWFtKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQljbG9zZShwbHVnaW5zVG9JbnN0YWxsW2ldKTsNCi0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQkJdGhyb3cgQ0FOQ0VMX0VYQ0VQVElPTjsNCi0JCQkJCQl9DQotCQkJCQl9DQotDQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gaW5zdGFsbCB0aGUgRmVhdHVyZSBpbmZvDQotCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOw0KLQkJCVN0cmluZ1tdIG5hbWVzID0gZ2V0U3RvcmFnZVVuaXROYW1lcyh0aGlzKTsNCi0JCQlpZiAobmFtZXMgIT0gbnVsbCkgew0KLQkJCQlvcGVuRmVhdHVyZSgpOw0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQltb25pdG9yLnN1YlRhc2soIkluc3RhbGxpbmcgRmVhdHVyZSBpbmZvcm1hdGlvbiIpOw0KLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQkJdGhyb3cgQ0FOQ0VMX0VYQ0VQVElPTjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQ0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5hbWVzLmxlbmd0aDsgaisrKSB7DQotCQkJCQlpZiAoKGluU3RyZWFtID0gZ2V0SW5wdXRTdHJlYW1Gb3IodGhpcywgbmFtZXNbal0pKSAhPSBudWxsKQ0KLQkJCQkJCSAoKFNpdGUpIHRhcmdldEZlYXR1cmUuZ2V0U2l0ZSgpKS5zdG9yZUZlYXR1cmVJbmZvKGdldElkZW50aWZpZXIoKSwgbmFtZXNbal0sIGluU3RyZWFtKTsNCi0JCQkJfQ0KLQkJCQljbG9zZUZlYXR1cmUoKTsNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQl0aHJvdyBDQU5DRUxfRVhDRVBUSU9OOw0KLQkJCQkJfQ0KLQkJCQl9DQotDQotCQkJfQ0KLQ0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCVN0cmluZyBpZCA9IFVwZGF0ZU1hbmFnZXJQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsNCi0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgaWQsIElTdGF0dXMuT0ssICJFcnJvciBkdXJpbmcgSW5zdGFsbCIsIGUpOw0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7DQotCQl9IGZpbmFsbHkgew0KLQkJCS8vZG8gbm90IGNsZWFuIHVwIFRFTVAgZHJpdmUNCi0JCQkvLyBhcyBvdGhlciBmZWF0dXJlIG1heSBiZSB0aGVyZS4uLiBjbGVhbiB1cCB3aGVuIGV4aXRpbmcgdGhlIHBsdWdpbg0KLQkJfQ0KLQl9DQotCQ0KLQkNCi0JCS8qKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjc3RvcmUoSVBsdWdpbkVudHJ5LCBTdHJpbmcsIElucHV0U3RyZWFtKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcmUoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBTdHJpbmcgY29udGVudEtleSwgSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCS8vIGNoZWNrIGlmIHBsdWdpbkVudHJ5IGFscmVhZHkgZXhpc3RzIGJlZm9yZSBwYXNzaW5nIHRvIHRoZSBzaXRlDQotCQkvLyBhbnl0aGluZyBlbHNlID8NCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsNCi0JCWludCBpID0gMDsNCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBnZXRQbHVnaW5FbnRyaWVzKCk7DQotCQl3aGlsZSAoaSA8IGVudHJpZXMubGVuZ3RoICYmICFmb3VuZCkgew0KLQkJCWlmIChlbnRyaWVzW2ldLmVxdWFscyhwbHVnaW5FbnRyeSkpIHsNCi0JCQkJZm91bmQgPSB0cnVlOw0KLQkJCX0NCi0JCQlpKys7DQotCQl9DQotCQlpZiAoIWZvdW5kKSB7DQotCQkJU3RyaW5nIGlkID0gVXBkYXRlTWFuYWdlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpOw0KLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBpZCwgSVN0YXR1cy5PSywgIlRoZSBwbHVnaW46IiArIHBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKS50b1N0cmluZygpICsgIiBpcyBub3QgcGFydCBvZiB0aGUgcGx1Z2lucyBvZiB0aGUgZmVhdHVyZToiICsgdGhpcy5nZXRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSwgbnVsbCk7DQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsNCi0JCX0NCi0JCWdldFNpdGUoKS5zdG9yZShwbHVnaW5FbnRyeSwgY29udGVudEtleSwgaW5TdHJlYW0pOw0KLQl9DQotCQ0KLQkJLyoqDQotCSAqIHBlcmZvcm0gcHJlIHByb2Nlc3NpbmcgYmVmb3JlIG9wZW5pbmcgYSBwbHVnaW4gYXJjaGl2ZQ0KLQkgKiBAcGFyYW0gZW50cnkgdGhlIHBsdWdpbiBhYm91dCB0byBiZSBvcGVuZWQNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIG9wZW4oSVBsdWdpbkVudHJ5IGVudHJ5KSB7DQotCX07DQotDQotCS8qKg0KLQkgKiBwZXJmb3JtIHBvc3QgcHJvY2Vzc2luZyB0byBjbG9zZSBhIHBsdWdpbiBhcmNoaXZlDQotCSAqIEBwYXJhbSBlbnRyeSB0aGUgcGx1Z2luIGFib3V0IHRvIGJlIGNsb3NlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2UoSVBsdWdpbkVudHJ5IGVudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQl9Ow0KLQ0KLQkvKioNCi0JICogcGVyZm9ybSBwcmUgcHJvY2Vzc2luZyBiZWZvcmUgb3BlbmluZyB0aGUgZmVhdHVyZSBhcmNoaXZlDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRmVhdHVyZSgpIHsNCi0JfTsNCi0NCi0JLyoqDQotCSAqIHBlcmZvcm0gcG9zdCBwcm9jZXNzaW5nIHRvIGNsb3NlIGEgZmVhdHVyZSBhcmNoaXZlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjbG9zZUZlYXR1cmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQl9Ow0KLQkNCi0JDQotCQkvKioNCi0JICogcmV0dXJuIHRoZSBsaXN0IG9mIEZJTEUgdG8gYmUgdHJhbnNmZXJlZCBmb3IgYSBQbHVnaW4NCi0JICovDQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRTdG9yYWdlVW5pdE5hbWVzKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiByZXR1cm4gdGhlIGxpc3Qgb2YgRklMRSB0byBiZSB0cmFuc2ZlcmVkIGZyb20gd2l0aGluIHRoZSBGZWF0dXJlDQotCSAqLw0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3RvcmFnZVVuaXROYW1lcyhJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIHJldHVybiB0aGUgU3RyZWFtIG9mIHRoZSBGSUxFIHRvIGJlIHRyYW5zZmVyZWQgZm9yIGEgUGx1Z2luDQotCSAqLw0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW1Gb3IoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiByZXR1cm4gdGhlIFN0cmVhbSBvZiBGSUxFIHRvIGJlIHRyYW5zZmVyZWQgZnJvbSB3aXRoaW4gdGhlIEZlYXR1cmUNCi0JICovDQotCXByb3RlY3RlZCBhYnN0cmFjdCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbUZvcihJRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogcmV0dXJucyB0aGUgbGlzdCBvZiBhcmNoaXZlIHRvIHRyYW5zZmVyL2luc3RhbGwNCi0JICogaW4gb3JkZXIgdG8gaW5zdGFsbCB0aGUgbGlzdCBvZiBwbHVnaW5zDQotCSAqIA0KLQkgKiBAcGFyYW0gcGx1Z2luc1RvSW5zdGFsbCBsaXN0IG9mIHBsdWdpbiB0byBpbnN0YWxsIA0KLQkgKi8NCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldENvbnRlbnRSZWZlcmVuY2VUb0luc3RhbGwoSVBsdWdpbkVudHJ5W10gcGx1Z2luc1RvSW5zdGFsbCk7DQotCQ0KLQkNCi0JCS8qKg0KLQkgKiByZW1vdmUgbXlzZWxmLi4uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBvbGRfcmVtb3ZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gcmVtb3ZlIHRoZSBmZWF0dXJlIGFuZCB0aGUgcGx1Z2lucyBpZiB0aGV5IGFyZSBub3QgdXNlZCBhbmQgbm90IGFjdGl2YXRlZA0KLQ0KLQkJLy8gZ2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIGZlYXR1cmUNCi0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbnNUb1JlbW92ZSA9ICgoU2l0ZUxvY2FsKSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0RGVsdGFQbHVnaW5FbnRyaWVzKHRoaXMpOw0KLQ0KLQkJdHJ5IHsNCi0NCi0JCQkvLyBvYnRhaW4gdGhlIGxpc3Qgb2YgKlN0cmVhbWFibGUgU3RvcmFnZSBVbml0Kg0KLQkJCS8vIGZyb20gdGhlIGFyY2hpdmUNCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCWludCB0b3RhbCA9IHBsdWdpbnNUb1JlbW92ZSA9PSBudWxsID8gMSA6IHBsdWdpbnNUb1JlbW92ZS5sZW5ndGggKyAxOw0KLQkJCQltb25pdG9yLmJlZ2luVGFzaygiVW5pbnN0YWxsIGZlYXR1cmUgIiArIGdldExhYmVsKCksIHRvdGFsKTsNCi0JCQl9DQotCQkJaWYgKHBsdWdpbnNUb1JlbW92ZSAhPSBudWxsKSB7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQkJbW9uaXRvci5zdWJUYXNrKCJSZW1vdmluZyBwbHVnLWluOiAiICsgcGx1Z2luc1RvUmVtb3ZlW2ldKTsNCi0JCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQkJdGhyb3cgQ0FOQ0VMX0VYQ0VQVElPTjsNCi0JCQkJCQl9DQotCQkJCQl9DQotDQotCQkJCQlyZW1vdmUocGx1Z2luc1RvUmVtb3ZlW2ldKTsNCi0NCi0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQkJdGhyb3cgQ0FOQ0VMX0VYQ0VQVElPTjsNCi0JCQkJCQl9DQotCQkJCQl9DQotDQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gcmVtb3ZlIHRoZSBGZWF0dXJlIGluZm8NCi0JCQlTdHJpbmdbXSBuYW1lcyA9IGdldFN0b3JhZ2VVbml0TmFtZXModGhpcyk7DQotCQkJaWYgKG5hbWVzICE9IG51bGwpIHsNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQkJbW9uaXRvci5zdWJUYXNrKCJSZW1vdmluZyBGZWF0dXJlIGluZm9ybWF0aW9uIik7DQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQl0aHJvdyBDQU5DRUxfRVhDRVBUSU9OOw0KLQkJCQkJfQ0KLQkJCQl9DQotDQotCQkJCSgoU2l0ZSkgdGhpcy5nZXRTaXRlKCkpLnJlbW92ZUZlYXR1cmVJbmZvKGdldElkZW50aWZpZXIoKSk7DQotDQotCQkJCWNsb3NlRmVhdHVyZSgpOw0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJCXRocm93IENBTkNFTF9FWENFUFRJT047DQotCQkJCQl9DQotCQkJCX0NCi0NCi0JCQl9DQotDQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJU3RyaW5nIGlkID0gVXBkYXRlTWFuYWdlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpOw0KLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBpZCwgSVN0YXR1cy5PSywgIkVycm9yIGR1cmluZyBVbmluc3RhbGwiLCBlKTsNCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOw0KLQkJfQ0KLQl9DQotCQ0KLQlTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikoamF2YS5sYW5nLlN0cmluZykgL3RtcA0KLQkNCi0JdHJ1ZV5mYWxzZQ0KLQl0cnVlXnRydWUNCi0NCi0JDQotb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIHAxPSAobmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoKCIvcGF0aDEvcGF0aDIvKi50eHQiKSk7DQotb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIHAyPSAobmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoKCIvcGF0aDEvcGF0aDIvYS50eHQiKSk7DQotcDEuZXF1YWxzKHAyKTsNCi0NCi0NCi1vcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VUkxFbmNvZGVyLmVuY29kZShuZXcgamF2YS5uZXQuVVJMKCJodHRwOi8vd3d3Lm91cndlYnNpdGUuY29tL3NlcnZsZXQvdXBkYXRlP2phcj1zb21lZmVhdHVyZWphcmZpbGUiKSk7KGphdmEubmV0LlVSTCkgaHR0cDovL3d3dy5vdXJ3ZWJzaXRlLmNvbS9zZXJ2bGV0L3VwZGF0ZT9qYXI9c29tZWZlYXR1cmVqYXJmaWxlDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNDExYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTUzNWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSMgDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS51cGRhdGVjb3JlLmphciA9IHNyYy8NCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgKi5qYXIsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwNCi0gICAgICAgICAgICAgICBvcy8NCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBzY2hlbWEvDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTQzMmVmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotIyANCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotcGx1Z2luTmFtZT0gSW5zdGFsbC9VcGRhdGUgQ29yZQ0KLXByb3ZpZGVyTmFtZT0gRWNsaXBzZS5vcmcNCi1mcmFnbWVudE5hbWVXaW49IEluc3RhbGwvVXBkYXRlIENvcmUgZm9yIFdpbmRvd3MNCi1mcmFnbWVudE5hbWVMaW51eD0gSW5zdGFsbC9VcGRhdGUgQ29yZSBmb3IgTGludXgNCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOThmM2UzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQotPHBsdWdpbg0KLSAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSINCi0gICBuYW1lPSIlcGx1Z2luTmFtZSINCi0gICB2ZXJzaW9uPSIzLjAuMCINCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIg0KLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlIj4NCi0NCi0gICA8cnVudGltZT4NCi0gICAgICA8bGlicmFyeSBuYW1lPSJ1cGRhdGVjb3JlLmphciI+DQotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgICAgICAgPHBhY2thZ2VzIHByZWZpeGVzPSJvcmcuZWNsaXBzZS51cGRhdGUiLz4NCi0gICAgICA8L2xpYnJhcnk+DQotICAgPC9ydW50aW1lPg0KLSAgIDxyZXF1aXJlcz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiLz4NCi0gICA8L3JlcXVpcmVzPg0KLQ0KLQ0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImZlYXR1cmVUeXBlcyIgbmFtZT0iSW5zdGFsbC9VcGRhdGUgQ29uY3JldGUgRmVhdHVyZSBUeXBlIEltcGxlbWVudGF0aW9uIEZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL2ZlYXR1cmVUeXBlcy5leHNkIi8+DQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2l0ZVR5cGVzIiBuYW1lPSJJbnN0YWxsL1VwZGF0ZSBDb25jcmV0ZSBTaXRlIFR5cGUgSW1wbGVtZW50YXRpb24gRmFjdG9yeSIgc2NoZW1hPSJzY2hlbWEvc2l0ZVR5cGVzLmV4c2QiLz4NCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnN0YWxsSGFuZGxlcnMiIG5hbWU9Ikluc3RhbGwvVXBkYXRlIEdsb2JhbCBJbnN0YWxsIEhhbmRsZXJzIiBzY2hlbWE9InNjaGVtYS9pbnN0YWxsSGFuZGxlcnMuZXhzZCIvPg0KLSAgIDwhLS0gVGhlIGRlbHRhSGFuZGxlciBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZC4gRG8gbm90IHVzZSBpdCAtLT4NCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkZWx0YUhhbmRsZXIiIG5hbWU9Ikluc3RhbGwvVXBkYXRlIERlbHRhIEhhbmRsZXIiLz4NCi0NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InByZWZlcmVuY2VJbml0aWFsaXplciINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4NCi0gICAgICA8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InBhY2thZ2VkIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXMiPg0KLSAgICAgIDxmZWF0dXJlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZVBhY2thZ2VkRmFjdG9yeSI+DQotICAgICAgPC9mZWF0dXJlLWZhY3Rvcnk+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJpbnN0YWxsZWQiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmVUeXBlcyI+DQotICAgICAgPGZlYXR1cmUtZmFjdG9yeQ0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkiPg0KLSAgICAgIDwvZmVhdHVyZS1mYWN0b3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iaHR0cCINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc2l0ZVR5cGVzIj4NCi0gICAgICA8c2l0ZS1mYWN0b3J5DQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlNpdGVVUkxGYWN0b3J5Ij4NCi0gICAgICA8L3NpdGUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9ImZpbGUiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnNpdGVUeXBlcyI+DQotICAgICAgPHNpdGUtZmFjdG9yeQ0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5TaXRlRmlsZUZhY3RvcnkiPg0KLSAgICAgIDwvc2l0ZS1mYWN0b3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iRGVmYXVsdEluc3RhbGxIYW5kbGVyIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5pbnN0YWxsSGFuZGxlcnMiPg0KLSAgICAgIDxpbnN0YWxsLWhhbmRsZXINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRGVmYXVsdEluc3RhbGxIYW5kbGVyIj4NCi0gICAgICA8L2luc3RhbGwtaGFuZGxlcj4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9IkRlbHRhSW5zdGFsbEhhbmRsZXIiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmluc3RhbGxIYW5kbGVycyI+DQotICAgICAgPGluc3RhbGwtaGFuZGxlcg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5EZWx0YUluc3RhbGxIYW5kbGVyIj4NCi0gICAgICA8L2luc3RhbGwtaGFuZGxlcj4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InN0YW5kYWxvbmVVcGRhdGUiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPg0KLSAgICAgIDxhcHBsaWNhdGlvbj4NCi0gICAgICAgICA8cnVuDQotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLlN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbiI+DQotICAgICAgICAgPC9ydW4+DQotICAgICAgPC9hcHBsaWNhdGlvbj4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvcHJlZmVyZW5jZXMuaW5pIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3ByZWZlcmVuY2VzLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzNmU3Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvcHJlZmVyZW5jZXMuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIFRoZSBwb3J0IG51bWJlciBvbiB3aGljaCB0aGUgc2V2ZXIgbGlzdGVucyBmb3IgaHR0cCByZXF1ZXN0cy4KLSMgSWYgdGhlIHBvcnQgaXMgMCBhbmQgYXJiaXRyYXJ5IHBvcnQgaXMgcGlja2VkIGJ5IHRoZSBzeXN0ZW0uCi0KLSMgRGVmaW5lcyB0aGUgcG9saWN5IHVybCB0aGF0IGNvbnRhaW5zIGRpcmVjdGl2ZXMgZm9yIHJlZGlyZWN0aW5nIAotIyB1cGRhdGVzIHRvIGRpZmZlcmVudCB1cGRhdGUgc2l0ZXMuCi0jdXBkYXRlUG9saWN5VVJMPQotCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvZmVhdHVyZVR5cGVzLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2ZlYXR1cmVUeXBlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTI5YTZhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvZmVhdHVyZVR5cGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiIGlkPSJmZWF0dXJlVHlwZXMiIG5hbWU9IkZlYXR1cmUgVHlwZSBGYWN0b3J5Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBwbGF0Zm9ybSB1cGRhdGUgbWVjaGFuaXNtIHN1cHBvcnRzIHBsdWdnYWJsZSBmZWF0dXJlIHR5cGUKLWltcGxlbWVudGF0aW9ucy4gQSBuZXcgZmVhdHVyZSB0eXBlIGNhbiBiZSByZWdpc3RlcmVkIGluIG9yZGVyCi10byBzdXBwb3J0Ci1hbHRlcm5hdGUgcGFja2FnaW5nIGFuZCB2ZXJpZmljYXRpb24gc2NoZW1lcy4KLSZsdDtwJmd0OwotVGhlICZsdDtjb2RlJmd0O2ZlYXR1cmVUeXBlcyZsdDsvY29kZSZndDsKLWV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWx0ZXJuYXRlIGZlYXR1cmUgaW1wbGVtZW50YXRpb25zIHRvIGJlCi1yZWdpc3RlcmVkIHVzaW5nIGEgc3ltYm9saWMgdHlwZSBpZGVudGlmaWVyLiBXaGVuZXZlciB0aGUgCi10eXBlIGlzIHJlZmVyZW5jZWQgdXNpbmcgdGhpcyBpZGVudGlmaWVyLCB0aGUgc3VwcGxpZWQgZmFjdG9yeQotaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNvcnJlY3QgY29uY3JldGUgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbi4KLSZsdDsvcCZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZlYXR1cmUtZmFjdG9yeSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBtdXN0IGJlIHNwZWNpZmllZCBhcyAmbHQ7YiZndDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXMmbHQ7L2ImZ3Q7DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkLiBJZGVudGlmaWVzIHRoZSBuZXcgZmVhdHVyZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBuZXcgZmVhdHVyZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmZWF0dXJlLWZhY3RvcnkiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBmYWN0b3J5IGNsYXNzIGZvciB0aGUgaWRlbnRpZmllZCBmZWF0dXJlIHR5cGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsRGVsdGFIYW5kbGVyIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBuZXcgZmVhdHVyZSB0eXBlIHJlZ2lzdHJhdGlvbjoKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgIGlkPSZxdW90O2N1c3RvbSZxdW90OwotICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZVR5cGVzJnF1b3Q7Ci0gICAgICBuYW1lPSZxdW90O0N1c3RvbSBwYWNrYWdlZCBmZWF0dXJlJnF1b3Q7Jmd0OwotICAgICAgJmx0O2ZlYXR1cmUtZmFjdG9yeQotICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXoudXBkYXRlLkN1c3RvbUZlYXR1cmVGYWN0b3J5JnF1b3Q7Jmd0OwotICAgICAgJmx0Oy9mZWF0dXJlLWZhY3RvcnkmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFJlZ2lzdGVyZWQgZmFjdG9yeSBjbGFzc2VzIG11c3QgaW1wbGVtZW50IAotJmx0O2NvZGUmZ3Q7Jmx0O2ImZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVGYWN0b3J5Jmx0Oy9iJmd0OyZsdDsvY29kZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIHBsYXRmb3JtIHN1cHBsaWVzIHR3byBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgb2YgZmVhdHVyZQotdHlwZXMuIE9uZSByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgcGFja2FnZWQgZmVhdHVyZSB0eXBlLCBhbmQKLXRoZSBvdGhlciByZXByZXNlbnRpbmcgYW4gaW5zdGFsbGVkIGZlYXR1cmUgdHlwZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sJmx0Oy9hJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvaW5zdGFsbEhhbmRsZXJzLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2luc3RhbGxIYW5kbGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGRkODMyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvaW5zdGFsbEhhbmRsZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiIGlkPSJpbnN0YWxsSGFuZGxlcnMiIG5hbWU9Ikdsb2JhbCBJbnN0YWxsIEhhbmRsZXJzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCBmb3IgcmVnaXN0ZXJpbmcgZ2xvYmFsIGluc3RhbGwgaGFuZGxlcnMuIEdsb2JhbAotaW5zdGFsbCBoYW5kbGVycyBjYW4gYmUgcmVmZXJlbmNlZCBieSBmZWF0dXJlcyAKLSh1c2luZyB0aGUgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmZWF0dXJlJmFtcDtndDsgJmFtcDtsdDtpbnN0YWxsLWhhbmRsZXImYW1wO2d0OyZsdDsvY29kZSZndDsKLXRhZ3MpIHdpdGhvdXQgaGF2aW5nIHRvIGluY2x1ZGUgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIGNvZGUgYXMKLXBhcnQgb2YgdGhlIGRvd25sb2FkYWJsZSBmZWF0dXJlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW5zdGFsbC1oYW5kbGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkIGFzICZsdDtiJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmluc3RhbGxIYW5kbGVycyZsdDsvYiZndDsNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzcGVjaWZpZWQuIElkZW50aWZpZXMgdGhlIG5ldyBpbnN0YWxsIGhhbmRsZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIG5ldyBpbnN0YWxsIGhhbmRsZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Imluc3RhbGwtaGFuZGxlciI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBpZGVudGlmaWVkCi1pbnN0YWxsIGhhbmRsZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIG5ldyBnbG9iYWwgaW5zdGFsbCBoYW5kbGVyIHJlZ2lzdHJhdGlvbjoKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgaWQ9JnF1b3Q7Y3VzdG9tJnF1b3Q7Ci0gICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmluc3RhbGxIYW5kbGVycyZxdW90OwotICAgICAgICBuYW1lPSZxdW90O0N1c3RvbSBpbnN0YWxsIGhhbmRsZXImcXVvdDsmZ3Q7Ci0gICAgICZsdDtpbnN0YWxsLWhhbmRsZXIKLSAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei51cGRhdGUuQ3VzdG9tSW5zdGFsbEhhbmRsZXImcXVvdDsmZ3Q7Ci0gICAgICZsdDsvaW5zdGFsbC1oYW5kbGVyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBSZWdpc3RlcmVkIGluc3RhbGwgaGFuZGxlciBjbGFzc2VzIG11c3QgaW1wbGVtZW50IAotJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyJmx0Oy9jb2RlJmd0OyBpbnRlcmZhY2UuCi1JbXBsZW1lbnRlcnMgc2hvdWxkIGV4dGVuZCBiYXNlIGNsYXNzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VJbnN0YWxsSGFuZGxlciZsdDsvY29kZSZndDsuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBwbGF0Zm9ybSBzdXBwbGllcyBhIHNpbXBsZSBpbnN0YWxsIGhhbmRsZXIgdGhhdCBpcyByZWdpc3RlcmVkIGFzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkRlZmF1bHRJbnN0YWxsSGFuZGxlciZsdDsvY29kZSZndDsuIElmIHVzZWQsIGl0IHdpbGwgY29weSBhbnkgbm9uLXBsdWctaW4gZGF0YSBlbnRyaWVzIHByb3ZpZGVkIHdpdGggdGhlIGZlYXR1cmUgaW50byB0aGUgZmVhdHVyZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NjaGVtYS9zaXRlVHlwZXMuZXhzZCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvc2l0ZVR5cGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDg5NTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NjaGVtYS9zaXRlVHlwZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIgaWQ9InNpdGVUeXBlcyIgbmFtZT0iU2l0ZSBUeXBlIEZhY3RvcnkiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIHBsYXRmb3JtIHVwZGF0ZSBtZWNoYW5pc20gc3VwcG9ydHMgcGx1Z2dhYmxlIHNpdGUgdHlwZQotaW1wbGVtZW50YXRpb25zLiBBIG5ldyBzaXRlIHR5cGUgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gb3JkZXIKLXRvIHN1cHBvcnQgYWx0ZXJuYXRlIHNpdGUgbGF5b3V0IHNjaGVtZXMuCi0mbHQ7cCZndDsKLVRoZSAmbHQ7Y29kZSZndDtzaXRlVHlwZXMmbHQ7L2NvZGUmZ3Q7Ci1leHRlbnNpb24gcG9pbnQgYWxsb3dzIGFsdGVybmF0ZSBzaXRlIGltcGxlbWVudGF0aW9ucyB0byBiZQotcmVnaXN0ZXJlZCB1c2luZyBhIHN5bWJvbGljIHR5cGUgaWRlbnRpZmllci4gV2hlbmV2ZXIgdGhlIAotdHlwZSBpcyByZWZlcmVuY2VkIHVzaW5nIHRoaXMgaWRlbnRpZmllciwgdGhlIHN1cHBsaWVkIGZhY3RvcnkKLWlzIHVzZWQgdG8gY3JlYXRlIHRoZSBjb3JyZWN0IGNvbmNyZXRlIHNpdGUgaW1wbGVtZW50YXRpb24uCi0mbHQ7L3AmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzaXRlLWZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzcGVjaWZpZWQgYXMgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc2l0ZVR5cGVzJmx0Oy9iJmd0Ow0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBtdXN0IGJlIHNwZWNpZmllZC4gSWRlbnRpZmllcyB0aGUgbmV3IHNpdGUgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgbmV3IHNpdGUgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2l0ZS1mYWN0b3J5Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZmFjdG9yeSBjbGFzcyBmb3IgdGhlIGlkZW50aWZpZWQKLXNpdGUgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgbmV3IHNpdGUgdHlwZSByZWdpc3RyYXRpb24uCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgIGlkPSZxdW90O2N1c3RvbSZxdW90OwotICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zaXRlVHlwZXMmcXVvdDsKLSAgICAgICAgbmFtZT0mcXVvdDtDdXN0b20gc2l0ZSZxdW90OyZndDsKLSAgICAgICZsdDtzaXRlLWZhY3RvcnkKLSAgICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LnVwZGF0ZS5DdXN0b21TaXRlRmFjdG9yeSZxdW90OyZndDsKLSAgICAgICZsdDsvc2l0ZS1mYWN0b3J5Jmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBSZWdpc3RlcmVkIGZhY3RvcnkgY2xhc3NlcyBtdXN0IGltcGxlbWVudCAKLSZsdDtjb2RlJmd0OyZsdDtiJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmFjdG9yeSZsdDsvYiZndDsmbHQ7L2NvZGUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBwbGF0Zm9ybSBzdXBwbGllcyB0d28gc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zIG9mIHNpdGUKLXR5cGVzLiBPbmUgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHVwZGF0ZSBzZXJ2ZXIgdHlwZSwgYW5kCi10aGUgb3RoZXIgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBzaXRlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JQWN0aXZpdHkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzE1MmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBJbnN0YWxsIGFjdGl2aXR5LgotICogUmVwcmVzZW50cyBhIHJlY29yZCBvZiBhbiBpbnN0YWxsYXRpb24gYWN0aW9uIHBlcmZvcm1lZAotICogb24gYSBwYXJ0aWN1bGFyIGluc3RhbGxhdGlvbiBjb25maWd1cmF0aW9uLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpdml0eSBleHRlbmRzIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogSW5kaWNhdGVzIGZlYXR1cmUgaW5zdGFsbGF0aW9uIGFjdGlvbgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fRkVBVFVSRV9JTlNUQUxMID0gMTsKLQotCS8qKgotCSAqIEluZGljYXRlcyBmZWF0dXJlIHJlbW92YWwgKHVuaW5zdGFsbGF0aW9uKSBhY3Rpb24KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0ZFQVRVUkVfUkVNT1ZFID0gMjsKLQotCS8qKgotCSAqIEluZGljYXRlcyBhbiBhZGRpdGlvbiBvZiBhIHNpdGUgdG8gYSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TSVRFX0lOU1RBTEwgPSAzOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHJlbW92YWwgb2YgYSBzaXRlIGZyb20gYSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TSVRFX1JFTU9WRSA9IDQ7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgZmVhdHVyZSB1bmNvbmZpZ3VyYXRpb24gYWN0aW9uCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9VTkNPTkZJR1VSRSA9IDU7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgZmVhdHVyZSBjb25maWd1cmF0aW9uIGFjdGlvbgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ09ORklHVVJFID0gNjsKLQotCS8qKgotCSAqIEluZGljYXRlcyByZXZlcnRpbmcgdG8gYSBwcmlvciBjb25maWd1cmF0aW9uIHN0YXRlCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9SRVZFUlQgPSA3OwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHJlY29uY2lsbGlhdGlvbiB3aXRoIGNoYW5nZXMgbWFkZSBkaXJlY3RseSB0byB0aGUgc2l0ZQotCSAqIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1JFQ09OQ0lMSUFUSU9OID0gODsKLQotCS8qKgotCSAqIEluZGljYXRlcyBhZGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYSBwcmVzZXJ2ZWQgc3RhdGUKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0FERF9QUkVTRVJWRUQgPSA5OwotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgYWN0aW9uIGNvbXBsZXRlZCBjdXNzZXNzZnVsbHkKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX09LID0gMDsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgYWN0aW9uIGRpZCBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5Ci0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT0sgPSAxOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aW9uIGNvZGUgZm9yIHRoaXMgYWN0aXZpdHkKLQkgKiAKLQkgKiBAc2VlICNBQ1RJT05fRkVBVFVSRV9JTlNUQUxMCi0JICogQHNlZSAjQUNUSU9OX0ZFQVRVUkVfUkVNT1ZFCi0JICogQHNlZSAjQUNUSU9OX1NJVEVfSU5TVEFMTAotCSAqIEBzZWUgI0FDVElPTl9TSVRFX1JFTU9WRQotCSAqIEBzZWUgI0FDVElPTl9VTkNPTkZJR1VSRQotCSAqIEBzZWUgI0FDVElPTl9DT05GSUdVUkUKLQkgKiBAc2VlICNBQ1RJT05fUkVWRVJUCi0JICogQHNlZSAjQUNUSU9OX1JFQ09OQ0lMSUFUSU9OCi0JICogQHJldHVybiBhY3Rpb24gY29kZSwgYXMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhpcyBhY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGRpcGxheWFibGUgbGFiZWwgZm9yIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNyZWF0aW9uIGRhdGUgb2YgdGhpcyBhY3Rpdml0eQotCSAqIAotCSAqIEByZXR1cm4gYWN0aXZpdHkgZGF0ZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBEYXRlIGdldERhdGUoKTsKLQotCS8qKiAKLQkgKiBSZXR1cm5zIHRoZSBhY3Rpdml0eSBjb21wbGV0aW9uIHN0YXR1cwotCSAqIAotCSAqIEBzZWUgI1NUQVRVU19PSwotCSAqIEBzZWUgI1NUQVRVU19OT0sKLQkgKiBAcmV0dXJuIGNvbXBsZXRpb24gc3RhdHVzLCBhcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGxhdGlvbiBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHRoZSByZXN1bHQgb2YgCi0JICogdGhpcyBhY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGluc3RhbGxhdGlvbiBjb25maWd1cmF0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lDb25maWd1cmVkU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JQ29uZmlndXJlZFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkMDA0ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lDb25maWd1cmVkU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIENvbmZpZ3VyZWQgU2l0ZS4KLSAqIFJlcHJlc2VudHMgYW4gaW5zdGFsbGF0aW9uIHNpdGUgImZpbHRlcmVkIiBieSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICogQ29uZmlndXJlZCBzaXRlIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGZlYXR1cmUgdXBkYXRlIG9wZXJhdGlvbnMgKGluc3RhbGwKLSAqIGZlYXR1cmUsIHJlbW92ZSBmZWF0dXJlLCBjb25maWd1cmUgZmVhdHVyZSwgdW5jb25maWd1cmUgZmVhdHVyZSkuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmVkU2l0ZSBleHRlbmRzIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5kZXJseWluZyAidW5maWx0ZXJlZCIgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIHNpdGUgCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElTaXRlIGdldFNpdGUoKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHVwZGF0ZXMgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIHNpdGUuCi0JICogCi0JICogPGNvZGU+SVN0YXR1cy5pc09rKCk8L2NvZGU+IHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBzaXRlIGNhbiBiZSB1cGRhdGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIElmIHVwZGF0ZXMgY2Fubm90IGJlIGFwbGllZCwgdGhlIHN0YXR1cyBjb250YWlucyB0aGUgZXJyb3IgbWVzc2FnZSwgYW5kCi0JICogdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbi4gCi0JICogCi0JICogQHNlZSBJU3RhdHVzCi0JICogQHJldHVybiBhbiBJU3RhdHVzCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElTdGF0dXMgdmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB1cGRhdGVzIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBzaXRlLgotCSAqIAotCSAqIEEgY29uZmlndXJhdGlvbiBzaXRlIGlzIHRhZ2dlZCBhIG5vbi11cGRhdGFibGUgYnkgcmVhZGluZwotCSAqIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHNpdGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2l0ZSBjYW4gYmUgdXBkYXRlZCwgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBJbnN0YWxsIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBvbiB0aGlzIHNpdGUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgZmVhdHVyZSB0byBpbnN0YWxsCi0JICogQHBhcmFtIHZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbiBsaXN0ZW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIGZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEluc3RhbGwgdGhlIHNwZWNpZmllZCBmZWF0dXJlIG9uIHRoaXMgc2l0ZS4KLQkgKiBPbmx5IHRoZSBzcGVjaWZpZWQgb3B0aW9uYWwgZmVhdHVyZXMgd2lsbCBiZSBpbnN0YWxsZWQKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZSBmZWF0dXJlIHRvIGluc3RhbGwKLQkgKiBAcGFyYW0gb3B0aW9uYWxGZWF0dXJlcyBvcHRpb25hbCBmZWF0dXJlcyB0byBpbnN0YWxsCi0JICogQHBhcmFtIHZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbiBsaXN0ZW5lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIGZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBSZW1vdmUgKHVuaW5zdGFsbCkgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGZyb20gdGhpcyBzaXRlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgZmVhdHVyZSB0byByZW1vdmUKLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBpcyAiYnJva2VuIi4gQSBmZWF0dXJlIGlzIGNvbnNpZGVyZWQKLQkgKiB0byBiZSBicm9rZW4gaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBzaXRlLCBpZiBzb21lIG9mIHRoZSBwbHVnLWlucwotCSAqIHJlZmVyZW5jZWQgYnkgdGhlIGZlYXR1cmUgYXJlIG5vdCBpbnN0YWxsZWQgb24gdGhpcyBzaXRlLgotCSAqIAotCSAqIFRoZSBzdGF0dXMgY29kZSBpcyA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBjb25zaWRlcmVkCi0JICogYnJva2VuLiBUaGUgU3RhdHVzIG1heSBjb250YWluIHRoZSByZWFzb24gd2h5IHRoZSBmZWF0dXJlIGlzIGJyb2tlbi4KLQkgKiBUaGUgc3RhdHVzIGNvZGUgaXMgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IGNvbnNpZGVyZWQKLQkgKiBicm9rZW4uCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUKLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgZm9yIHRoaXMgZmVhdHVyZSBvbiB0aGlzIGNvbmZpZ3VyZWQgc2l0ZQotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0QnJva2VuU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBpcyBjb25maWd1cmVkIG9uIHRoaXMgc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZlYXR1cmUgaXMgY29uZmlndXJlZCwKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSk7Ci0KLQkvKioKLQkgKiBDb25maWd1cmUgdGhlIHNwZWNpZmllZCBmZWF0dXJlIG9uIHRoaXMgc2l0ZS4gVGhlIGNvbmZpZ3VyZWQKLQkgKiBmZWF0dXJlIHdpbGwgYmUgaW5jbHVkZWQgb24gbmV4dCBzdGFydHVwLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVW5jb25maWd1cmUgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGZyb20gdGhpcyBzaXRlLiBUaGUgdW5jb25maWd1cmVkCi0JICogZmVhdHVyZSB3aWxsIGJlIG9taXR0ZWQgb24gdGhlIG5leHQgc3RhcnR1cC4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHJlZmVyZW5jZXMgdG8gZmVhdHVyZXMgY29uZmlndXJlZCBvbiB0aGlzIHNpdGUuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBmZWF0dXJlcyBpbnN0YWxsZWQgb24gdGhpcyBzaXRlIChjb25maWd1cmVkIGFzIHdlbGwKLQkgKiBhcyB1bmNvbmZpZ3VyZWQpLiBOb3RlLCB0aGF0IGlmIHRoZSBzaXRlIHJlcXVpcmVzIHJlY29uY2lsaWF0aW9uLAotCSAqIHRoZSByZXN1bHQgbWF5IG5vdCBtYXRjaCB0aGUgcmVzdWx0IG9mIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZAotCSAqIG9uIHRoZSB1bmRlcmx5aW5nIHNpdGUuCi0JICogCi0JICogQHNlZSBJU2l0ZSNnZXRGZWF0dXJlUmVmZXJlbmNlcygpCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzaXRlIGZlYXR1cmUgcmVmZXJlbmNlcywgb3IgYW4gZW1wdHkgYXJyYXkuCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgY29uZmlndXJhdGlvbiBvYmplY3QgdGhpcyBzaXRlIGlzIHBhcnQgb2YuCi0JICogCi0JICogQHJldHVybiBpbnN0YWxsIGNvbmZpZ3VyYXRpb24gb2JqZWN0Ci0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyIHRvIHRoZSBjb25maWd1cmVkIHNpdGUuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBhZGQKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoZSBjb25maWd1cmVkIHNpdGUuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byByZW1vdmUKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBzaXRlIGlzIGFuIGV4dGVuc2lvbiBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNpdGUgaXMgYW4gZXh0ZW5zaW9uIHNpdGUsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25TaXRlKCk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGhlIHNpdGUgaXMgYSBwcm9kdWN0IHNpdGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2l0ZSBpcyBhIHByb2R1Y3Qgc2l0ZSwKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2R1Y3RTaXRlKCk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGhlIHNpdGUgaXMgYSBwcml2YXRlIHNpdGUuCi0JICogVGhpcyBkb2VzIG5vdCBjaGVjayBpZiB0aGlzIHByaXZhdGUgc2l0ZSBiZWxvbmdzIHRvIHRoZQotCSAqIHByb2R1Y3QgdGhhdCBpcyBydW5uaW5nLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNpdGUgaXMgYSBwcml2YXRlIHNpdGUsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICogQGRlcHJlY2F0ZWQgcHJpdmF0ZSBzaXRlIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGFzIGV4dGVuc2lvbiBzaXRlICgzLjApCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlU2l0ZSgpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBzaXRlIGhhcyBiZWVuIGxpbmtlZCBieSBhIG5hdGl2ZQotCSAqIGluc3RhbGxlci4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzaXRlIGlzIGEgbmF0aXZlbHkgbGlua2VkIHNpdGUsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOYXRpdmVseUxpbmtlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2V0cyBpZiB0aGUgc2l0ZSBpcyBlbmFibGVkCi0JICogCi0JICogQHBhcmVtIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzaXRlIGlzIGVuYWJsZSwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICogQHNpbmNlIDIuMQotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBzaXRlIGlzIGVuYWJsZWQuIAotCSAqIElmIGEgc2l0ZSBpcyBub3QgZW5hYmxlLCBhbGwgdGVoIGZlYXR1cmVzIGFyZSBjb25zaWRlcmVkIGRpc2FibGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNpdGUgaXMgZW5hYmxlLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMi4xCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNjM0YzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gY2hhbmdlIGxpc3RlbmVyLiAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgewotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgd2FzIGluc3RhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGZlYXR1cmVJbnN0YWxsZWQoSUZlYXR1cmUgZmVhdHVyZSk7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSB3YXMgcmVtb3ZlZCAodW5pbnN0YWxsZWQpCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKTsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIHNwZWNpZmllZCBmZWF0dXJlIHdhcyBjb25maWd1cmVkLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSk7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSB3YXMgdW5jb25maWd1cmVkLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JSW5zdGFsbENvbmZpZ3VyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUluc3RhbGxDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMGEzN2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JSW5zdGFsbENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogSW5zdGFsbGF0aW9uIGNvbmZpZ3VyYXRpb24uCi0gKiBSZXByZXNlbnRzIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvZiBhIG51bWJlciBvZiBzaXRlcyBhcyBhIHBvaW50Ci0gKiBpbiB0aW1lLiBNYWludGFpbnMgYSByZWNvcmQgb2YgdGhlIHNwZWNpZmljIGFjdGl2aXRpZXMgdGhhdCByZXN1bHRlZAotICogaW4gdGhpcyBjb25maWd1cmF0aW9uLiBDdXJyZW50IGluc3RhbGxhdGlvbiBjb25maWd1cmF0aW9uIGlzCi0gKiB0aGUgY29uZmlndXJhdGlvbiB0aGUgcGxhdGZvcm0gd2FzIHN0YXJ0ZWQgd2l0aC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbGxDb25maWd1cmF0aW9uIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGhpcyBpcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24sCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXRlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbmZpZ3VyZWQgc2l0ZXMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGVbXSBnZXRDb25maWd1cmVkU2l0ZXMoKTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YWxsYXRpb24gc2l0ZSwgYmFzZWQgb24gYSBsb2NhbCBmaWxlIAotCSAqIHN5c3RlbSBkaXJlY3RvcnkuIE5vdGUsIHRoZSBzaXRlIGlzIG5vdCBhZGRlZCB0byB0aGUKLQkgKiBjb25maWd1cmF0aW9uIGFzIGEgcmVzdWx0IG9mIHRoaXMgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyZWN0b3J5IGZpbGUgZGlyZWN0b3J5Ci0JICogQHJldHVybiBuZXcgc2l0ZQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgY3JlYXRlQ29uZmlndXJlZFNpdGUoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGxpbmtlZCBzaXRlLCBiYXNlZCBvbiBhIGxvY2FsIGZpbGUgCi0JICogc3lzdGVtIGRpcmVjdG9yeS4gTm90ZSwgdGhlIHNpdGUgaXMgbm90IGFkZGVkIHRvIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gYXMgYSByZXN1bHQgb2YgdGhpcyBjYWxsLgotCSAqIFRoZSBsaW5rZWQgc2l0ZSBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlIGRpcmVjdG9yeSBpcyBhbgotCSAqIGFscmVhZHkgZXhpc3RpbmcgZXh0ZW5zaW9uIHNpdGUgYW5kIGlmIGl0IGlzIG5vdCBhbHJlYWR5Ci0JICogbmF0aXZlbHkgbGlua2VkIHRvIHRoZSBsb2NhbCBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBkaXJlY3RvcnkgZmlsZSBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIG5ldyBsaW5rZWQgc2l0ZQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgY3JlYXRlTGlua2VkQ29uZmlndXJlZFNpdGUoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQWRkcyB0aGUgc3BlY2lmaWVkIHNpdGUgdG8gdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaXRlIG5ldyBzaXRlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHNpdGUgZnJvbSB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHNpdGUgc2l0ZSB0byByZW1vdmUKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmVkU2l0ZShJQ29uZmlndXJlZFNpdGUgc2l0ZSk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UgbGlzdGVuZXIuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UgbGlzdGVuZXIuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgYWN0aXZpdGllcyB0aGF0IHJlc3VsdGVkIGluIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiBUaGVyZSBpcyBhbHdheXMgYXQgbGVhc3Qgb25lIGFjdGl2aXR5Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBhY3Rpdml0aWVzCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElBY3Rpdml0eVtdIGdldEFjdGl2aXRpZXMoKTsKLQotCS8qKgotCSAqIFJldHJ1biB0aGUgZGF0ZSB0aGUgY29uZmlndXJhdGlvbiB3YXMgY3JlYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGNyZWF0ZSBkYXRlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIERhdGUgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gbGFiZWwuCi0JICogCi0JICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbiBsYWJlbC4gSWYgdGhlIGNvbmZpZ3VyYXRpb24gbGFiZWwgd2FzIG5vdAotCSAqIGV4cGxpY2l0bHkgc2V0LCBhIGRlZmF1bHQgbGFiZWwgaXMgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBjcmVhdGlvbgotCSAqIGRhdGUKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb25maWd1cmF0aW9uIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnRlZ2VyIHRoYXQgcmVwcmVzZW50cyBhIHRpbWUgc3RhbXAgY3JlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IGNvbmZpZ3VyYXRpb24gdGltZSBsaW5lLgotCSAqIFRpbWUgbGluZSBpcyBzdGFydGVkIHdoZW4gY29uZmlndXJhdGlvbiBzdGF0ZSBpcyBjcmVhdGVkIGJ5IGEgZnVsbCBmaWxlIHN5c3RlbSByZWNvbmNpbGlhdGlvbi4gQWxsIGNvbmZpZ3VyYXRpb25zCi0JICogc3Vic2VxdWVudGx5IGNyZWF0ZWQgd2lsbCBoYXZlIHRoZSBzYW1lIHRpbWUgbGluZSB1bnRpbCB0aGUgbmV4dCBmdWxsIHJlY29uY2lsaWF0aW9uLiBDZXJ0YWluIG9wZXJhdGlvbnMKLSAJICogKGUuZy4gcmV2ZXJ0KSBtYWtlIHNlbnNlIG9ubHkgYmV0d2VlbiBvYmplY3RzIHRoYXQgYmVsb25nIHRvIHRoZSBzYW1lIHRpbWUgbGluZS4KLSAJICogCi0JICogQHNpbmNlIDIuMC4yCi0JICogQHJldHVybiB0aGUgdGltZSBzdGFtcCBvZiB0aGUgZnVsbCBzeXN0ZW0gcmVjb25jaWxpYXRpb24KLQkgKiAKLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGxvbmcgZ2V0VGltZWxpbmUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MGE4NzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBjaGFuZ2UgbGlzdGVuZXIuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBzcGVjaWZpZWQgc2l0ZSB3YXMgYWRkZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gc2l0ZSB0aGUgc2l0ZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXZvaWQgaW5zdGFsbFNpdGVBZGRlZChJQ29uZmlndXJlZFNpdGUgc2l0ZSk7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBzcGVjaWZpZWQgc2l0ZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIHNpdGUgdGhlIHNpdGUKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQl2b2lkIGluc3RhbGxTaXRlUmVtb3ZlZChJQ29uZmlndXJlZFNpdGUgc2l0ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUluc3RhbGxEZWx0YUhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUluc3RhbGxEZWx0YUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjYjE3OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lJbnN0YWxsRGVsdGFIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEluc3RhbGwgRGVsdGEgSGFuZGxlci4KLSAqIFByZXNlbnRzIHRoZSBjaGFuZ2VzIHRoZSByZWNvbmNpbGVyIGZvdW5kIHRvIHRoZSB1c2VyCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4gVGhlIGV4dGVuc2lvbiBwb2ludCBkZWx0YUhhbmRsZXIgaGFzIGJlZW4gZGVwcmVjYXRlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zdGFsbERlbHRhSGFuZGxlcnsKLQotCS8qKgotCSAqIFNldHMgdGhlIGxpc3Qgb2Ygc2Vzc2lvbiBkZWx0YSB0byBwcmVzZW50IHRvIHRoZSB1c2VyCi0JICogCi0JICogQHBhcmFtIGRlbHRhcyBhbiBBcnJheSBvZiA8Y29kZT5JU2Vzc2lvbkRlbHRhPC9jb2RlPgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVNlc3Npb25EZWx0YVtdIGRlbHRhcyk7Ci0KLQkvKioKLQkgKiBQcm9tcHQgdGhlIHVzZXIgdG8gY29uZmlndXJlIG9yIHVuY29uZmlndXJlCi0JICogbmV3IGZlYXR1cmVzIGZvdW5kIGR1cmluZyByZWNvbmNpbGlhdGlvbgotCSAqIAotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW4oKTsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JTG9jYWxTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lMb2NhbFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjYWMxNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lMb2NhbFNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBMb2NhbCBTaXRlLgotICogUmVwcmVzZW50cyB0aGUgbG9jYWwgaW5zdGFsbGF0aW9uLiBJdCBjb25zaXN0cyBvZiB0aGUgY3VycmVudAotICogY29uZmlndXJhdGlvbiBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gaGlzdG9yeS4gQSBsb2NhbCBzaXRlCi0gKiBtYW5hZ2VzIHRoZSBudW1iZXIgb2YgY29uZmlndXJhdGlvbiBoaXN0b3JpZXMga2VwdC4gSXQgYWxzbyBhbGxvd3MKLSAqIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaGlzdG9yaWVzIHRvIGJlIHNhdmVkLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4gCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvY2FsU2l0ZSBleHRlbmRzIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBjdXJyZW50IGNvbmZpZ3VyYXRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiBjb25maWd1cmF0aW9uIGhpc3RvcnkuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb25maWd1cmF0aW9ucywgb3IgYW4gZW1wdHkgYXJyYXkuCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbltdIGdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXZlcnRzIHRoZSBsb2NhbCBzaXRlIHRvIHVzZSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uCi0JICogVGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiBpcyBhIG5ldyBjb25maWd1cmF0aW9uIHRoYXQKLQkgKiBjb250YWlucyB0aGUgc2FtZSBjb25maWd1cmVkIGZlYXR1cmVzIGFzIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KLQkgKiBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gYmVjb21lcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gc3RhdGUgdG8gcmV2ZXJ0IHRvCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBwYXJhbSBoYW5kbGVyIHByb2JsZW0gaGFuZGxlcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHJldmVydFRvKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQlJUHJvYmxlbUhhbmRsZXIgaGFuZGxlcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbmZpZ3VyYXRpb24gY29udGFpbmluZyB0aGUgc2FtZSBzdGF0ZSBhcyB0aGUgCi0JICogc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uIFRoZSBuZXcgY29uZmlndXJhdGlvbiBpcyBub3QgYWRkZWQgdG8KLQkgKiB0aGlzIGxpY2FsIHNpdGUuCi0JICogCi0JICogQHJldHVybiBjbG9uZWQgY29uZmlndXJhdGlvbgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQWRkcyB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdG8gdGhpcyBsb2NhbCBzaXRlLgotCSAqIFRoZSBuZXcgY29uZmlndXJhdGlvbiBiZWNvbWVzIHRoZSBjdXJyZW50IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbihJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIFNhdmVzIHRoZSBsb2NhbCBzaXRlIHN0YXRlCi0JICogCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICogQHJldHVybiB0cnVlIGlmIGEgcmVzdGFydCBpcyBuZWVkZWQuIFRoaXMgcmV0dXJuIGNvZGUgd2FzIGFkZGVkIGluIDMuMC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaG93IG1hbnkgY29uZmlndXJhdGlvbiBoaXN0b3JpZXMgc2hvdWxkIGJlIG1haW50YWluZWQuCi0JICogSGlzdG9yaWVzIGJleW9uZCB0aGUgc3BlY2lmaWVkIGNvdW50IGFyZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuCi0JICogCi0JICogQHJldHVybiBudW1iZXIgb2YgcGFzdCBjb25maWd1cmF0aW9ucyB0byBrZWVwIGFzIGhpc3RvcnkKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heGltdW1IaXN0b3J5Q291bnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiBwYXN0IGNvbmZpZ3VyYXRpb25zIHRvIGtlZXAgaW4gaGlzdG9yeQotCSAqIAotCSAqIEBwYXJhbSBoaXN0b3J5IG51bWJlciBvZiBjb25maWd1cmF0aW9uIHRvIGtlZXAKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXhpbXVtSGlzdG9yeUNvdW50KGludCBoaXN0b3J5KTsKLQotCS8qKgotCSAqIEFkZHMgYSBzaXRlIGNoYW5nZSBsaXN0ZW5lcgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgc2l0ZSBsaXN0ZW5lcgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4gU2F2ZWQgY29uZmlndXJhdGlvbnMgYXJlIAotCSAqIG5vdCBkZWxldGVkIGJhc2VkIG9uIHRoZSBoaXN0b3J5IGNvdW50LiBUaGV5IG11c3QgYmUgZXhwbGljaXRseQotCSAqIHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gc2F2ZQotCSAqIEByZXR1cm4gdGhlIHByZXNlcnZlZCBjb25maWd1cmF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb25maWd1cmF0aW9uIHRvIHNhdmUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGFkZFRvUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgbGlzdCBvZiBwcmV2aW91c2x5Ci0JICogc2F2ZWQgY29uZmlndXJhdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gcmVtb3ZlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVByZXNlcnZlZENvbmZpZ3VyYXRpb25zKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBzYXZlZCBjb25maWd1cmF0aW9ucwotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29uZmlndXJhdGlvbnMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9ucygpOwotCQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgJ3N0YXRlJyBvZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgYW5kIGl0cyBjaGlsZHJlbiBmZWF0dXJlcy4KLQkgKiAKLQkgKiBBIGZlYXR1cmUgaXMgY29uc2lkZXJlZCB0byBiZSAndW5oYXBweScgaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBzaXRlLAotCSAqIGlmIHNvbWUgb2YgdGhlIHBsdWctaW5zIHJlZmVyZW5jZWQgYnkgdGhlIGZlYXR1cmUsIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4sCi0JICogIGFyZSBub3QgaW5zdGFsbGVkIG9uIHRoaXMgc2l0ZS4KLQkgKiAKLQkgKiBBIGZlYXR1cmUgaXMgY29uc2lkZXJlZCB0byBiZSAnaGFwcHknIGluIHRoZSBjb250ZXh0IG9mIGEgbG9jYWwgc2l0ZQotCSAqIGlmIGFsbCB0aGUgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieSB0aGUgZmVhdHVyZSwgb3IgYW55IG9mIGl0cyBjaGlsZHJlbiwKLQkgKiBhcmUgaW5zdGFsbGVkIG9uIHRoZSBzaXRlIGFuZCBubyBvdGhlciB2ZXJzaW9uIG9mIGFueSBvZiB0aGUgcGx1Zy1pbnMKLQkgKiBhcmUgaW5zdGFsbGVkIG9uIGFueSBvdGhlciBzaXRlIG9mIHRoZSBsb2NhbCBzaXRlLgotCSAqIAotCSAqIEEgZmVhdHVyZSBpcyBjb25zaWRlcmVkIHRvIGJlICdhbWJpZ3VvdXMnIGluIHRoZSBjb250ZXh0IG9mIGEgbG9jYWwgc2l0ZQotCSAqIGlmIGFsbCB0aGUgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieSB0aGUgZmVhdHVyZSwgb3IgYW55IG9mIGl0cyBjaGlsZHJlbiwKLQkgKiBhcmUgaW5zdGFsbGVkIG9uIHRoZSBzaXRlIGFuZCBvdGhlciB2ZXJzaW9uIG9mIGFueSBvZiB0aGUgcGx1Zy1pbnMKLQkgKiBhcmUgaW5zdGFsbGVkIG9uIGFueSBvdGhlciBzaXRlIG9mIHRoZSBsb2NhbCBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlCi0JICogQHNlZSBJRmVhdHVyZSNTVEFUVVNfSEFQUFkKLQkgKiBAc2VlIElGZWF0dXJlI1NUQVRVU19VTkhBUFBZCi0JICogQHNlZSBJRmVhdHVyZSNTVEFUVVNfQU1CSUdVT1VTCi0JICogQHJldHVybiB0aGUgc3RhdGUgb2YgdGhlIGZlYXR1cmUKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldEZlYXR1cmVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gOwkKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxMTYyYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogTG9jYWwgc2l0ZSBjaGFuZ2UgbGlzdGVuZXIuIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgY3VycmVudCBjdW5maWd1cmF0aW9uCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgY3VycmVudEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbik7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB3YXMgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxDb25maWd1cmF0aW9uUmVtb3ZlZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbik7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lMb2NhbFN5c3RlbUluZm9MaXN0ZW5lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JTG9jYWxTeXN0ZW1JbmZvTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhYjYyYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lMb2NhbFN5c3RlbUluZm9MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb247DQotIA0KLQ0KLQ0KLS8qKg0KLSAqIExvY2FsIHN5c3RlbSBjaGFuZ2UgbGlzdGVuZXIgaW50ZXJmYWNlLg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNhZGRJbmZvTGlzdGVuZXIoSUxvY2FsU3lzdGVtSW5mb0xpc3RlbmVyKQ0KLSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI3JlbW92ZUluZm9MaXN0ZW5lcihJTG9jYWxTeXN0ZW1JbmZvTGlzdGVuZXIpDQotICogQHNlZSBMb2NhbFN5c3RlbUluZm8jZmlyZVN5c3RlbUluZm9DaGFuZ2VkKElWb2x1bWUsaW50KQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElMb2NhbFN5c3RlbUluZm9MaXN0ZW5lciB7DQotCQ0KLQkvKioNCi0JICogVm9sdW1lIGNoYW5nZSBub3RpZmljYXRpb24uDQotCSAqIENhbGxlZCBlYWNoIHRpbWUgdGhlcmUgYXJlIHJlbGV2YW50IHZvbHVtZSBjaGFuZ2VzDQotCSAqIGRldGVjdGVkLiBUaGlzIHNwZWNpZmljYWxseSBpbmNsdWRlcyBjaGFuZ2VzIHRvIHRoZQ0KLQkgKiBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUgYXMgYSByZXN1bHQgb2YgcmVtb3ZhYmxlIGRyaXZlLyBtZWRpYQ0KLQkgKiBvcGVyYXRpb25zIChlZy4gQ0QgaW5zZXJ0aW9uKSwgYW5kIGNoYW5nZXMgdG8gdm9sdW1lIA0KLQkgKiBtb3VudCBzdHJ1Y3R1cmUuDQotCSAqIEBwYXJhbSB2b2x1bWUgdm9sdW1lIG9mIHRoZSBjaGFuZ2VkIGZpbGUNCi0JICogc3lzdGVtIHN0cnVjdHVyZS4gQW55IGN1cnJlbnQgcGF0aHMgYmV5b25kDQotCSAqIHRoZSBzcGVjaWZpZWQgJ3Jvb3QnIGZpbGUgb2YgdGhlIHZvbHVtZSBhcmUgYXNzdW1lZCB0byBiZSBpbnZhbGlkYXRlZC4NCi0JICogQHBhcmFtIGNoYW5nZVR5cGUgdHlwZSBvZiB0aGUgY2hhbmdlIHRoYXQgb2NjdXJlZC4NCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX0FEREVEDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9SRU1PVkVEDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9DSEFOR0VEDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzeXN0ZW1JbmZvQ2hhbmdlZChJVm9sdW1lIHZvbHVtZSwgaW50IGNoYW5nZVR5cGUpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lQcm9ibGVtSGFuZGxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JUHJvYmxlbUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxZTllOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lQcm9ibGVtSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbjsKLSAKLS8qKgotICogR2VuZXJpYyBwcm9ibGVtIGhhbmRsZXIuIFVzZWQgdG8gcmVwb3J0IHN0YXR1cyBmcm9tIHNwZWNpZmljCi0gKiBpbnN0YWxsIG9wZXJhdGlvbnMuIFRoZSBtZXRob2RzIGltcGxlbWVudGVkIGJ5IHRoaXMgaW50ZXJmYWNlCi0gKiBhcmUgY2FsbGJhY2tzIGZyb20gdGhlIHVwZGF0ZSBzdXBwb3J0IHRvIHRoZSBjYWxsZXIgb2YgdGhlIHVwZGF0ZQotICogbWV0aG9kcy4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2JsZW1IYW5kbGVyIHsKLQotCS8qKgotCSAqIFJlcG9ydCBwcm9ibGVtLgotCSAqIAotCSAqIEBwYXJhbSBwcm9ibGVtVGV4dCBwcm9ibGVtIHRleHQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvcGVyYXRpb24gc2hvdWxkIGNvbnRpbnVlLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYW5jZWxsZWQKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlib29sZWFuIHJlcG9ydFByb2JsZW0oU3RyaW5nIHByb2JsZW1UZXh0KTsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JU2Vzc2lvbkRlbHRhLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lTZXNzaW9uRGVsdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmMDRkMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lTZXNzaW9uRGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEluc3RhbGxhdGlvbiBDaGFuZ2UuCi0gKiBSZXByZXNlbnRzIHRoZSBjaGFuZ2VzIHRoZSByZWNvbmNpbGVyIGZvdW5kLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2Vzc2lvbkRlbHRhIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgYSBwcm9jZXNzaW5nIHR5cGUgdG8gZW5hYmxlIHRoZSBmZWF0dXJlcwotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IEVOQUJMRSA9IDE7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgYSBwcm9jZXNzaW5nIHR5cGUgdG8gZGlzYWJsZSB0aGUgZmVhdHVyZXMKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0gCXB1YmxpYyBpbnQgRElTQUJMRSA9IDI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIEZlYXR1cmVzIGZvdW5kIGR1cmluZyByZWNvbmNpbGlhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRlIHRoZSByZWNvbmNpbGlhdGlvbiBvY2N1cmVkCi0JICogCi0JICogQHJldHVybiB0aGUgZGF0ZSBvZiB0aGUgcmVjb25jaWxpYXRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBwcm9jZXNzaW5nIHR5cGUKLQkgKiB0aGF0IHdpbGwgYWZmZWN0IGFsbCB0aGUgYXNzb2NpYXRlZCBmZWF0dXJlcy4gCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvY2Vzc2luZyB0eXBlCi0JICogQHNlZSBJU2Vzc2lvbkRlbHRhI0VOQUJMRQotCSAqIEBzZWUgSVNlc3Npb25EZWx0YSNESVNBQkxFCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFByb2Nlc3MgYWxsIHRoZSBmZWF0dXJlIHJlZmVyZW5jZXMgb2YgdGhlIAotCSAqIFNlc3Npb24gRGVsdGEuIAotCSAqIFJlbW92ZXMgdGhlIFNlc3Npb24gRGVsdGEgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gYWZ0ZXIgcHJvY2Vzc2luZyBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4gCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcHJvY2VzcyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBzZWxlY3RlZCBmZWF0dXJlIHJlZmVyZW5jZXMgb2YgdGhlIFNlc3Npb24gRGVsdGEuCi0JICogUmVtb3ZlcyB0aGUgU2Vzc2lvbiBEZWx0YSBmcm9tIHRoZSBmaWxlIHN5c3RlbSBhZnRlciBwcm9jZXNzaW5nIGl0LgotCSAqCi0JICogQHBhcmFtIHNlbGVjdGVkIGxpc3Qgb2Ygc2VsZWN0ZWQgZmVhdHVyZSByZWZlcmVuY2VzIHRvIGJlIHByb2Nlc3NlZAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3MoSUZlYXR1cmVSZWZlcmVuY2UgW10gc2VsZWN0ZWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgU2Vzc2lvbiBEZWx0YSBmcm9tIHRoZSBmaWxlIHN5c3RlbSB3aXRob3V0IHByb2Nlc3NpbmcgaXQuCi0JICogCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKCk7CQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JVm9sdW1lLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lWb2x1bWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmZDJhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lWb2x1bWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogTG9jYWwgVm9sdW1lIEluZm8uCi0gKiBSZXByZXNlbnRzIGxvY2FsIGZpbGUgc3lzdGVtIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHZvbHVtZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5Mb2NhbFN5c3RlbUluZm8KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVm9sdW1lIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdmFpbGFibGUgZnJlZSBzcGFjZSBvbiB0aGlzIHZvbHVtZS4KLQkgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgZnJlZSBzcGFjZSBhdmFpbGFibGUgdG8gdGhpcwotCSAqIHVzZXIgb24gdGhlIHZvbHVtZS4gVGhlCi0JICogbWV0aG9kIHRha2VzIGludG8gYWNjb3VudCBhbnkgc3BhY2UgcXVvdGFzIG9yIG90aGVyCi0JICogbmF0aXZlIG1lY2hhbmlzbXMgdGhhdCBtYXkgcmVzdHJpY3Qgc3BhY2UgdXNhZ2UKLQkgKiBvbiBhIGdpdmVuIHZvbHVtZS4KLQkgKiBAcmV0dXJuIHRoZSBhbW91bnQgb2YgZnJlZSBzcGFjZSBhdmFpbGFibGUgKGluIHVuaXRzCi0JICogb2YgS2J5dGUpLCBvciBhbiBpbmRpY2F0aW9uIHRoZSBzaXplIGlzIG5vdCBrbm93biAKLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNTSVpFX1VOS05PV04KLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBsb25nIGdldEZyZWVTcGFjZSgpOwotCQotCS8qKgotCSAqIHJldHVybnMgdm9sdW1lIGxhYmVsLgotCSAqIFJldHVybnMgdGhlIGxhYmVsIG9mIHRoZSB2b2x1bWUuCi0JICogQHJldHVybiB2b2x1bWUgbGFiZWwgKGFzIHN0cmluZyksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhlIGxhYmVsIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdm9sdW1lIHR5cGUuCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdm9sdW1lLgotCSAqIEByZXR1cm4gdm9sdW1lIHR5cGUKLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfVU5LTk9XTgotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9JTlZBTElEX1BBVEgKLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfUkVNT1ZBQkxFCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX0ZJWEVECi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX1JFTU9URQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9DRFJPTQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9GTE9QUFlfMwotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9GTE9QUFlfNQotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdm9sdW1lIHBhdGguCi0JICogUmV0dXJucyB0aGUgcGF0aCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vdW50IHBvaW50IG9mIHRoZSB2b2x1bWUuCi0JICogQHJldHVybiBtb3VudCBwb2ludCBmaWxlCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0xvY2FsU3lzdGVtSW5mby5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9Mb2NhbFN5c3RlbUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxNmQ5Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0xvY2FsU3lzdGVtSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOw0KLSANCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi0gDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyBwcm92aWRpbmcgbG9jYWwgZmlsZSBzeXN0ZW0gaW5mb3JtYXRpb24uDQotICogVGhlIGNsYXNzIGF0dGVtcHRzIHRvIGxvYWQgYSBuYXRpdmUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbg0KLSAqIG9mIGl0cyBtZXRob2RzLiBJZiBzdWNjZXNzZnVsLCB0aGUgbWV0aG9kIGNhbGxzIGFyZSBkZWxlZ2F0ZWQNCi0gKiB0byB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uLiBPdGhlcndpc2UgYSBkZWZhdWx0IG5vbi1uYXRpdmUNCi0gKiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkLiAgKiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBJTG9jYWxTeXN0ZW1JbmZvTGlzdGVuZXINCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIExvY2FsU3lzdGVtSW5mbyB7DQotCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIGZyZWUgc3BhY2UgaXMgbm90IGtub3duDQotCSAqIA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNnZXRGcmVlU3BhY2UoRmlsZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFNJWkVfVU5LTk9XTiA9IC0xOw0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyB0aGUgdm9sdW1lIHR5cGUgaXMgbm90IGtub3duDQotCSAqIA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNnZXRUeXBlKEZpbGUpDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9VTktOT1dOID0gLTE7DQotCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHRoZSB2b2x1bWUgY291bGQgbm90IGJlIGRldGVybWluZWQgZnJvbSBwYXRoDQotCSAqIA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNnZXRUeXBlKEZpbGUpDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9JTlZBTElEX1BBVEggPSAtMjsNCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgdGhlIHZvbHVtZSBpcyByZW1vdmFibGUgKG90aGVyIHRoYW4gZmxvcHB5IGRpc2spDQotCSAqIA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNnZXRUeXBlKEZpbGUpDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9SRU1PVkFCTEUgPSAxOw0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyB0aGUgdm9sdW1lIGlzIGZpeGVkIChoYXJkIGRyaXZlKQ0KLQkgKiANCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jZ2V0VHlwZShGaWxlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfRklYRUQgPSAyOw0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyBhIHJlbW90ZSAobmV0d29yaykgdm9sdW1lDQotCSAqIA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNnZXRUeXBlKEZpbGUpDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9SRU1PVEUgPSAzOw0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyBhIGNkcm9tIHZvbHVtZSAoY29tcGFjdCBkaXNjKQ0KLQkgKiANCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jZ2V0VHlwZShGaWxlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfQ0RST00gPSA0OwkNCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgYSByYW1kaXNrIHZvbHVtZSAobWVtb3J5KQ0KLQkgKiANCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jZ2V0VHlwZShGaWxlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfUkFNRElTSyA9IDU7CQ0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHRoZSB2b2x1bWUgaXMgcmVtb3ZhYmxlIChmbG9wcHkgZGlzayA1IDEvNCkNCi0JICogDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI2dldFR5cGUoRmlsZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX0ZMT1BQWV81ID0gNjsJDQotCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHRoZSB2b2x1bWUgaXMgcmVtb3ZhYmxlIChmbG9wcHkgZGlzayAzIDEvMikNCi0JICogDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI2dldFR5cGUoRmlsZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX0ZMT1BQWV8zID0gNzsNCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgYSBuZXcgdm9sdW1lIGhhcyBiZWVuIGFkZGVkDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9BRERFRCA9IDA7DQotCQkJDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgYSB2b2x1bWUgaGFzIGJlZW4gcmVtb3ZlZA0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfUkVNT1ZFRCA9IDE7DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgYSB2b2x1bWUgaGFzIGJlZW4gY2hhbmdlZA0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfQ0hBTkdFRCA9IDI7DQotDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwkNCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNOYXRpdmVzID0gZmFsc2U7CQ0KLQlzdGF0aWMgew0KLQkJdHJ5IHsNCi0JCQlTeXN0ZW0ubG9hZExpYnJhcnkoInVwZGF0ZSIpOyAvLyROT04tTkxTLTEkDQotCQkJaGFzTmF0aXZlcyA9IHRydWU7DQotCQl9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gbG9hZCBuYXRpdmUgbGlicmFyeSAndXBkYXRlJy4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWhhc05hdGl2ZXMgPSBmYWxzZTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERldGVybWluZXMgYXZhaWxhYmxlIGZyZWUgc3BhY2Ugb24gYSB2b2x1bWUuDQotCSAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBmcmVlIHNwYWNlIGF2YWlsYWJsZSB0byB0aGlzDQotCSAqIHVzZXIgb24gdGhlIHZvbHVtZSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgcGF0aC4gVGhlDQotCSAqIG1ldGhvZCB0YWtlcyBpbnRvIGFjY291bnQgYW55IHNwYWNlIHF1b3RhcyBvciBvdGhlcg0KLQkgKiBuYXRpdmUgbWVjaGFuaXNtcyB0aGF0IG1heSByZXN0cmljdCBzcGFjZSB1c2FnZQ0KLQkgKiBvbiBhIGdpdmVuIHZvbHVtZS4NCi0JICogQHBhcmFtIHBhdGggZmlsZSBwYXRoLiBNYXkgY29udGFpbiBwYXRoIGVsZW1lbnRzIGJleW9uZA0KLQkgKiB0aGUgdm9sdW1lICJyb290Ig0KLQkgKiBAcmV0dXJuIHRoZSBhbW91bnQgb2YgZnJlZSBzcGFjZSBhdmFpbGFibGUgKGluIHVuaXRzDQotCSAqIG9mIEtieXRlKSwgb3IgYW4gaW5kaWNhdGlvbiB0aGUgc2l6ZSBpcyBub3Qga25vd24gDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1NJWkVfVU5LTk9XTg0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBsb25nIGdldEZyZWVTcGFjZShGaWxlIHBhdGgpIHsNCi0JCWlmIChoYXNOYXRpdmVzKSB7DQotCQkJdHJ5IHsNCi0JCQkJbG9uZyBieXRlcyA9IG5hdGl2ZUdldEZyZWVTcGFjZShwYXRoKTsNCi0JCQkJcmV0dXJuIChieXRlcyE9MCk/Ynl0ZXMvMTAyNDowOw0KLQkJCX0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUpIHsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gU0laRV9VTktOT1dOOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBMaXN0cyB0aGUgZmlsZSBzeXN0ZW0gdm9sdW1lLg0KLQkgKiBAcmV0dXJuIGFycmF5IG9mIHZvbHVtZSByZXByZXNlbnRpbmcgbW91bnQNCi0JICogcG9pbnRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGZvdW5kDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWb2x1bWVbXSBnZXRWb2x1bWVzKCkgew0KLQkJU3RyaW5nW10gbW91bnRQb2ludHMgPSBsaXN0TW91bnRQb2ludHMoKTsNCi0JCVZvbHVtZVtdIHZvbCA9IG5ldyBWb2x1bWVbMF07DQotCQlpZiAobW91bnRQb2ludHMhPW51bGwpew0KLQkJCXZvbCA9IG5ldyBWb2x1bWVbbW91bnRQb2ludHMubGVuZ3RoXTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1vdW50UG9pbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJCUZpbGUgcm9vdCA9IG5ldyBGaWxlKG1vdW50UG9pbnRzW2ldKTsNCi0JCQkJU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwocm9vdCk7DQotCQkJCWludCB0eXBlID0gZ2V0VHlwZShyb290KTsNCi0JCQkJbG9uZyBzaXplID0gZ2V0RnJlZVNwYWNlKHJvb3QpOw0KLQkJCQl2b2xbaV0gPSBuZXcgVm9sdW1lKHJvb3QsbGFiZWwsdHlwZSxzaXplKTsNCi0JCQkJdm9sW2ldLm1hcmtSZWFkT25seSgpOw0KLQkJCX0NCi0JCX0gZWxzZSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gZmluZCBtb3VudCBwb2ludHMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCS8vIGZhbGxiYWNrDQotCQkJRmlsZSBbXSByb290cyA9IEZpbGUubGlzdFJvb3RzKCk7DQotCQkJaWYgKHJvb3RzLmxlbmd0aCA9PSAxKSB7DQotCQkJCS8vIGp1c3Qgb25lIHJvb3QgLSBza2lwIGl0DQotCQkJCUZpbGUgcm9vdCA9IHJvb3RzWzBdOw0KLQkJCQlyb290cyA9IHJvb3QubGlzdEZpbGVzKCk7DQotCQkJfQ0KLQkJCXZvbCA9IG5ldyBWb2x1bWVbcm9vdHMubGVuZ3RoXTsJCQkNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7DQotCQkJCXZvbFtpXSA9IG5ldyBWb2x1bWUocm9vdHNbaV0sbnVsbCxMb2NhbFN5c3RlbUluZm8uVk9MVU1FX1VOS05PV04sTG9jYWxTeXN0ZW1JbmZvLlNJWkVfVU5LTk9XTik7DQotCQkJCXZvbFtpXS5tYXJrUmVhZE9ubHkoKTsNCi0JCQl9CQkJDQotCQl9DQotCQlyZXR1cm4gdm9sOw0KLQl9DQotDQotCQ0KLQkvKioNCi0JICogQWRkIGxvY2FsIHN5c3RlbSBjaGFuZ2UgbGlzdGVuZXIuDQotCSAqIEFsbG93cyBhIGxpc3RlbmVyIHRvIGJlIGFkZGVkIGZvciBtb25pdG9yaW5nIGNoYW5nZXMNCi0JICogaW4gdGhlIGxvY2FsIHN5c3RlbSBpbmZvcm1hdGlvbi4gVGhlIGxpc3RlbmVyIGlzIG5vdGlmaWVkDQotCSAqIGVhY2ggdGltZSB0aGVyZSBhcmUgcmVsZXZhbnQgdm9sdW1lIGNoYW5nZXMNCi0JICogZGV0ZWN0ZWQuIFRoaXMgc3BlY2lmaWNhbGx5IGluY2x1ZGVzIGNoYW5nZXMgdG8gdGhlDQotCSAqIGxpc3Qgb2Ygdm9sdW1lcyBhcyBhIHJlc3VsdCBvZiByZW1vdmFibGUgZHJpdmUvIG1lZGlhDQotCSAqIG9wZXJhdGlvbnMgKGVnLiBDRCBpbnNlcnRpb24sIHJlbW92YWwpLCBhbmQgY2hhbmdlcyB0byB2b2x1bWUgDQotCSAqIG1vdW50IHN0cnVjdHVyZS4NCi0JICogQHBhcmFtIGxpc3RlbmVyIGNoYW5nZSBsaXN0ZW5lcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEluZm9MaXN0ZW5lcihJTG9jYWxTeXN0ZW1JbmZvTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkNCi0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZSBsb2NhbCBzeXN0ZW0gY2hhbmdlIGxpc3RlbmVyDQotCSAqIEBwYXJhbSBsaXN0ZW5lciBjaGFuZ2UgbGlzdGVuZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmZvTGlzdGVuZXIoSUxvY2FsU3lzdGVtSW5mb0xpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsNCi0JfQ0KLQkJDQotCS8qKg0KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGNoYW5nZS4NCi0JICogDQotCSAqIEBwYXJhbSB2b2x1bWUgdGhlIHZvbHVtZSByZXByZXNlbnRpbmcgdGhlDQotCSAqIGNoYW5nZSBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUuIEFueSBjdXJyZW50IHBhdGhzIGJleW9uZA0KLQkgKiB0aGUgc3BlY2lmaWVkICJyb290IiBmaWxlIG9mIHRoZSB2b2x1bWUgYXJlIGFzc3VtZWQgdG8gYmUgaW52YWxpZGF0ZWQuDQotCSAqIEBwYXJhbSBjaGFuZ2VUeXBlIHR5cGUgb2YgdGhlIGNoYW5nZSB0aGF0IG9jY3VyZWQuDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9BRERFRA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfUkVNT1ZFRA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfQ0hBTkdFRA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXJlU3lzdGVtSW5mb0NoYW5nZWQoSVZvbHVtZSB2b2x1bWUsIGludCBjaGFuZ2VUeXBlKSB7DQotCQlmb3IgKGludCBpPTA7IGk8IGxpc3RlbmVycy5zaXplKCk7IGkrKykgew0KLQkJCSgoSUxvY2FsU3lzdGVtSW5mb0xpc3RlbmVyKWxpc3RlbmVycy5nZXQoaSkpLnN5c3RlbUluZm9DaGFuZ2VkKHZvbHVtZSxjaGFuZ2VUeXBlKTsNCi0JCX0NCi0JfQ0KLQkJDQotCS8qDQotCSAqIERldGVybWluZXMgdm9sdW1lIGxhYmVsLg0KLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBvZiB0aGUgdm9sdW1lIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZA0KLQkgKiBwYXRoLg0KLQkgKiBAcGFyYW0gcGF0aCBmaWxlIHBhdGguIE1heSBjb250YWluIHBhdGggZWxlbWVudHMgYmV5b25kDQotCSAqIHRoZSB2b2x1bWUgInJvb3QiDQotCSAqIEByZXR1cm4gdm9sdW1lIGxhYmVsIChhcyBzdHJpbmcpLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZg0KLQkgKiB0aGUgbGFiZWwgY2Fubm90IGJlIGRldGVybWluZWQuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYWJlbChGaWxlIHBhdGgpIHsNCi0JCWlmIChoYXNOYXRpdmVzKSB7DQotCQkJdHJ5IHsNCi0JCQkJcmV0dXJuIG5hdGl2ZUdldExhYmVsKHBhdGgpOw0KLQkJCX0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUpIHsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoNCi0JICogRGV0ZXJtaW5lcyB2b2x1bWUgdHlwZS4NCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdm9sdW1lIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZA0KLQkgKiBwYXRoLg0KLQkgKiBAcGFyYW0gcGF0aCBmaWxlIHBhdGguIE1heSBjb250YWluIHBhdGggZWxlbWVudHMgYmV5b25kDQotCSAqIHRoZSB2b2x1bWUgInJvb3QiDQotCSAqIEByZXR1cm4gdm9sdW1lIHR5cGUNCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX1VOS05PV04NCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX0lOVkFMSURfUEFUSA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfUkVNT1ZBQkxFDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9GSVhFRA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfUkVNT1RFDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9DRFJPTQ0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfRkxPUFBZXzMNCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX0ZMT1BQWV81DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByaXZhdGUgc3RhdGljIGludCBnZXRUeXBlKEZpbGUgcGF0aCkgew0KLQkJaWYgKGhhc05hdGl2ZXMpIHsNCi0JCQl0cnkgew0KLQkJCQlyZXR1cm4gbmF0aXZlR2V0VHlwZShwYXRoKTsNCi0JCQl9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIFZPTFVNRV9VTktOT1dOOw0KLQl9DQotCQ0KLQkvKg0KLQkgKiBMaXN0cyB0aGUgZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnRzLg0KLQkgKiBAcmV0dXJuIGFycmF5IG9mIGFic29sdXRlIGZpbGUgcGF0aHMgcmVwcmVzZW50aW5nIG1vdW50DQotCSAqIHBvaW50cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBmb3VuZA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBsaXN0TW91bnRQb2ludHMoKSB7DQotCQlpZiAoaGFzTmF0aXZlcykgew0KLQkJCXRyeSB7DQotCQkJCVN0cmluZ1tdIG1vdW50UG9pbnRzID0gbmF0aXZlTGlzdE1vdW50UG9pbnRzKCk7DQotCQkJCXJldHVybiBtb3VudFBvaW50czsNCi0JCQl9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JCQ0KLQkvKg0KLQkgKiBOYXRpdmUgaW1wbGVtZW50YXRpb25zLg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgbmF0aXZlR2V0RnJlZVNwYWNlKEZpbGUgcGF0aCk7DQotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmcgbmF0aXZlR2V0TGFiZWwoRmlsZSBwYXRoKTsNCi0JcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZXRUeXBlKEZpbGUgcGF0aCk7DQotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBTdHJpbmdbXSBuYXRpdmVMaXN0TW91bnRQb2ludHMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2YmUwMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+DQotPGh0bWw+DQotPGhlYWQ+DQotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPg0KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcyIFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4NCi0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotUHJvdmlkZXMgc3VwcG9ydCBmb3IgYWNjZXNzaW5nIGxvY2FsIGluc3RhbGxhdGlvbg0KLWluZm9ybWF0aW9uLg0KLTxoMj4NCi1QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPg0KLVRoaXMgcGFja2FnZSBjb250YWlucyBpbnRlcmZhY2VzIGZvciBhY2Nlc3NpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGUgbG9jYWwNCi1zeXN0ZW0gaW5zdGFsbGF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiBJbiBnZW5lcmFsLCB1c2VycyBleHRlbmRpbmcNCi10aGUgdXBkYXRlIHN1cHBvcnQmbmJzcDsgYnkgd3JpdGluZyBhZGRpdGlvbmFsIGZlYXR1cmUgYW5kIHNpdGUgaW1wbGVtZW50YXRpb24NCi1kbyBub3QgbmVlZCB0byBtYWtlIHVzZSBvZiBpbnRlcmZhY2VzIGRlZmluZWQgaW4gdGhpcyBwYWNrYWdlLg0KLTxwPg0KLTxiPk5vdGU6PC9iPiBUaGlzIHBhY2thZ2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLWNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLWZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi08L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0FyY2hpdmVSZWZlcmVuY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQXJjaGl2ZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTdjNGJlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQXJjaGl2ZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotLyoqDQotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgYSBzaXRlIGFyY2hpdmUuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4NCi0gKiA8L3A+IA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklBcmNoaXZlUmVmZXJlbmNlDQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5BcmNoaXZlUmVmZXJlbmNlTW9kZWwNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIEFyY2hpdmVSZWZlcmVuY2UNCi0JZXh0ZW5kcyBBcmNoaXZlUmVmZXJlbmNlTW9kZWwNCi0JaW1wbGVtZW50cyBJQXJjaGl2ZVJlZmVyZW5jZSB7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJjaGl2ZVJlZmVyZW5jZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgQXJjaGl2ZVJlZmVyZW5jZSgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCVN0cmluZyByZXN1bHQgPSAiSUFyY2hpdmVSZWZlcmVuY2U6ICI7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdCA9DQotCQkJcmVzdWx0DQotCQkJCSsgKChnZXRQYXRoKCkgPT0gbnVsbCkNCi0JCQkJCT8gZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKQ0KLQkJCQkJOiBnZXRQYXRoKCkgKyAiIDogIiArIGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQmFzZUZlYXR1cmVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0Jhc2VGZWF0dXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRiYzg5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQmFzZUZlYXR1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLQ0KLS8qKg0KLSAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgYSBmZWF0dXJlIGZhY3RvcnkuDQotICogVGhlIGZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGNvbnN0cnVjdGluZyB0aGUgY29ycmVjdA0KLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3RzIGZvciBlYWNoIHBhcnRpY3VsYXINCi0gKiBmZWF0dXJlIHR5cGUuIFRoaXMgY2xhc3MgY3JlYXRlcyBtb2RlbCBvYmplY3RzIHRoYXQgY29ycmVzcG9uZA0KLSAqIHRvIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIHByb3ZpZGVkIGluIHRoaXMgcGFja2FnZS4NCi0gKiBUaGUgYWN0dWFsIGZlYXR1cmUgY3JlYXRpb24gbWV0aG9kIGlzIHN1YmNsYXNzIHJlc3BvbnNpYmlsaXR5Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlRmFjdG9yeQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsRmFjdG9yeQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUZlYXR1cmVGYWN0b3J5IGV4dGVuZHMgRmVhdHVyZU1vZGVsRmFjdG9yeSBpbXBsZW1lbnRzIElGZWF0dXJlRmFjdG9yeSB7DQotDQotCS8qKg0KLQkgKiANCi0JICogQGRlcHJlY2F0ZWQgaW1wbGVtZW50IGNyZWF0ZUZlYXR1cmUoVVJMLCBJU2l0ZSwgSVByb2dyZXNzTW9uaXRvcikgaW5zdGVhZA0KLQkgKiBAc2VlIElGZWF0dXJlRmFjdG9yeSNjcmVhdGVGZWF0dXJlKFVSTCxJU2l0ZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoVVJMIHVybCwgSVNpdGUgc2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGNyZWF0ZUZlYXR1cmUodXJsLCBzaXRlLCBudWxsKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGZlYXR1cmUuIEltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJvdmlkZWQgYnkgDQotCSAqIHN1YmNsYXNzDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlRmFjdG9yeSNjcmVhdGVGZWF0dXJlKFVSTCxJU2l0ZSxJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShVUkwgdXJsLCBJU2l0ZSBzaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgZmVhdHVyZSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgRmVhdHVyZQ0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEZlYXR1cmVNb2RlbCBjcmVhdGVGZWF0dXJlTW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IEZlYXR1cmUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgaW5jbHVkZWQgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZQ0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgbW9kZWwNCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGNyZWF0ZUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgaW5zdGFsbCBoYW5kbGVyIG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBJbnN0YWxsSGFuZGxlckVudHJ5DQotCSAqIEByZXR1cm4gaW5zdGFsbCBoYW5kbGVyIGVudHJ5IG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwgY3JlYXRlSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBJbnN0YWxsSGFuZGxlckVudHJ5KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGltcG9ydCBkZXBlbmRlbmN5IG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBJbXBvcnQNCi0JICogQHJldHVybiBpbXBvcnQgZGVwZW5kZW5jeSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSW1wb3J0TW9kZWwgY3JlYXRlSW1wb3J0TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IEltcG9ydCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBwbHVnLWluIGVudHJ5IG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBQbHVnaW5FbnRyeQ0KLQkgKiBAcmV0dXJuIHBsdWctaW4gZW50cnkgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFBsdWdpbkVudHJ5TW9kZWwgY3JlYXRlUGx1Z2luRW50cnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgUGx1Z2luRW50cnkoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Ygbm9uLXBsdWctaW4gZW50cnkgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIE5vblBsdWdpbkVudHJ5DQotCSAqIEByZXR1cm4gbm9uLXBsdWctaW4gZW50cnkgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIE5vblBsdWdpbkVudHJ5TW9kZWwgY3JlYXRlTm9uUGx1Z2luRW50cnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgTm9uUGx1Z2luRW50cnkoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgYW5ub3RhdGVkIFVSTCBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgVVJMRW50cnkNCi0JICogQHJldHVybiBhbm5vdGF0ZWQgVVJMIG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkxFbnRyeU1vZGVsIGNyZWF0ZVVSTEVudHJ5TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IFVSTEVudHJ5KCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9CYXNlSW5zdGFsbEhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQmFzZUluc3RhbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDkyMGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9CYXNlSW5zdGFsbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBpbnN0YWxsIGhhbmRsZXIuCi0gKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgYW4gaW5zdGFsbCBoYW5kbGVyIHdpdGgKLSAqIG51bGwgaW1wbGVtZW50YXRpb24gb2YgaXRzIG1ldGhvZHMuIEl0IGFsbG93cyBzdWJjbGFzc2VzIHRvIHNlbGVjdGl2ZWx5Ci0gKiBpbXBsZW1lbnQgb25seSB0aGUgbWV0aG9kcyByZXF1aXJlZCBmb3IgdGhlaXIgaW5zdGFsbGF0aW9uIHRhc2tzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+IAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4gCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlcgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBjbGFzcyBCYXNlSW5zdGFsbEhhbmRsZXIgaW1wbGVtZW50cyBJSW5zdGFsbEhhbmRsZXIgewotCi0JLyoqCi0JICogVXBkYXRlIGFjdGlvbiB0eXBlCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjSEFORExFUl9BQ1RJT05fSU5TVEFMTAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI0hBTkRMRVJfQUNUSU9OX0NPTkZJR1VSRQotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI0hBTkRMRVJfQUNUSU9OX1VOQ09ORklHVVJFCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjSEFORExFUl9BQ1RJT05fVU5JTlNUQUxMCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBpbnQgdHlwZTsKLQotCS8qKgotCSAqIFRoZSB0YXJnZXQgb2YgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSUZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIE1vZGVsIGVudHJ5IHRoYXQgZGVmaW5lcyB0aGlzIGhhbmRsZXIKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIElJbnN0YWxsSGFuZGxlckVudHJ5IGVudHJ5OwotCi0JLyoqIAotCSAqIE9wdGlvbmFsIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSW5zdGFsbE1vbml0b3IgbW9uaXRvcjsKLQotCS8qKgotCSAqIFBsdWctaW4gZW50cmllcyBkb3dubG9hZGVkCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjSEFORExFUl9BQ1RJT05fSU5TVEFMTAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllczsKLQotCS8qKgotCSAqIE5vbi1wbHVnLWluIGVudHJpZXMgZG93bmxvYWRlZAotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI0hBTkRMRVJfQUNUSU9OX0lOU1RBTEwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIElOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkVudHJpZXM7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgaGFuZGxlciBoYXMgYmVlbiBpbml0aWFsaXplZAotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgaW5zdGFsbCBoYW5kbGVyLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2luaXRpYWxpemUoaW50LCBJRmVhdHVyZSwgSUluc3RhbGxIYW5kbGVyRW50cnksIEluc3RhbGxNb25pdG9yKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKAotCQlpbnQgdHlwZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUluc3RhbGxIYW5kbGVyRW50cnkgZW50cnksCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAodGhpcy5pbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQkJdGhpcy5lbnRyeSA9IGVudHJ5OwotCQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJCXRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5zdGFsbCBhY3Rpb24uCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjaW5zdGFsbEluaXRpYXRlZAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhZnRlciBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHBsdWctaW4gZW50cmllcyBoYXZlIGJlZW4gZG93bmxvYWRlZCwKLQkgKiBidXQgYmVmb3JlIHRoZXkgYXJlIGFjdHVsbHkgdW5wYWNrZWQgYW5kIGluc3RhbGxlZC4KLQkgKiAKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNwbHVnaW5zRG93bmxvYWRlZChJUGx1Z2luRW50cnlbXSkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgcGx1Z2luc0Rvd25sb2FkZWQoSVBsdWdpbkVudHJ5W10gcGx1Z2lucykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCXRoaXMucGx1Z2luRW50cmllcyA9IHBsdWdpbnM7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gbm9uLXBsdWctaW4gZW50cmllcyBoYXZlIGJlZW4gCi0JICogZG93bmxvYWRlZC4KLQkgKiAKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNub25QbHVnaW5EYXRhRG93bmxvYWRlZChJTm9uUGx1Z2luRW50cnlbXSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBub25QbHVnaW5EYXRhRG93bmxvYWRlZCgKLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRGF0YSwKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5ub25QbHVnaW5FbnRyaWVzID0gbm9uUGx1Z2luRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgdGhlIGZlYXR1cmUgZmlsZXMgYW5kIGFueSBkb3dubG9hZGVkIHBsdWctaW5zIGhhdmUKLQkgKiBiZWVuIGluc3RhbGxlZC4gCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjY29tcGxldGVJbnN0YWxsKElGZWF0dXJlQ29udGVudENvbnN1bWVyKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdGFsbCBhY3Rpb24uCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjaW5zdGFsbENvbXBsZXRlZChib29sZWFuKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGNvbmZpZ3VyZSBhY3Rpb24uCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjY29uZmlndXJlSW5pdGlhdGVkKCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgZmVhdHVyZSBoYXMgYmVlbiBjb25maWd1cmVkLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlQ29uZmlndXJlKCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVDb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGNvbmZpZ3VyZSBhY3Rpb24uCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4pCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB1bmNvbmZpZ3VyZSBhY3Rpb24uCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5jb25maWd1cmVJbml0aWF0ZWQoKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZUluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgdGhlIGZlYXR1cmUgaGFzIGJlZW4gdW5jb25maWd1cmVkLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlVW5jb25maWd1cmUoKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZVVuY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSB1bmNvbmZpZ3VyZSBhY3Rpb24uCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5jb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdW5pbnN0YWxsIGFjdGlvbi4KLQkgKiAKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciN1bmluc3RhbGxJbml0aWF0ZWQoKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGxJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIHRoZSBmZWF0dXJlIGhhcyBiZWVuIHVuaW5zdGFsbGVkLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlVW5pbnN0YWxsKCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVVbmluc3RhbGwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIHVuaW5zdGFsbCBhY3Rpb24uCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5pbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4pCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbENvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0Jhc2VTaXRlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9CYXNlU2l0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkNmNhNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0Jhc2VTaXRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLSANCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogQmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHNpdGUgZmFjdG9yeS4NCi0gKiBUaGUgZmFjdG9yeSBpcyByZXNwb25zaWJsZSBmb3IgY29uc3RydWN0aW5nIHRoZSBjb3JyZWN0DQotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdHMgZm9yIGVhY2ggcGFydGljdWxhcg0KLSAqIHNpdGUgdHlwZS4gVGhpcyBjbGFzcyBjcmVhdGVzIG1vZGVsIG9iamVjdHMgdGhhdCBjb3JyZXNwb25kDQotICogdG8gdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgcHJvdmlkZWQgaW4gdGhpcyBwYWNrYWdlLg0KLSAqIFRoZSBhY3R1YWwgc2l0ZSBjcmVhdGlvbiBtZXRob2QgaXMgc3ViY2xhc3MgcmVzcG9uc2liaWxpdHkuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtdXN0IGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGYWN0b3J5DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5TaXRlTW9kZWxGYWN0b3J5DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2l0ZUZhY3RvcnkgZXh0ZW5kcyBTaXRlTW9kZWxGYWN0b3J5IGltcGxlbWVudHMgSVNpdGVGYWN0b3J5IHsNCi0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBzaXRlLiBJbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IA0KLQkgKiBzdWJjbGFzcw0KLQkgKiANCi0JICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGFjY2VzcyByZXNvdWNlIGJ1bmRsZSBmb3Igc2l0ZS4gVGhlIGRlZmF1bHQgDQotCSAqIGltcGxlbWVudGF0aW9uIGF0dGVtcHRzIHRvIGxvYWQgdGhlIGFwcHJvcHJpYXRlbHkgbG9jYWxpemVkIA0KLQkgKiBzaXRlLnByb3BlcnRpZXMgZmlsZS4NCi0JICogDQotCSAqIEBwYXJhbSB1cmwgYmFzZSBVUkwgdXNlZCB0byBsb2FkIHRoZSByZXNvdXJjZSBidW5kbGUuDQotCSAqIEByZXR1cm4gcmVzb3VyY2UgYnVuZGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKFVSTCB1cmwpIHsNCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7DQotDQotCQl0cnkgew0KLQkJCXVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5hc0RpcmVjdG9yeVVSTCh1cmwpOw0KLQkJCUNsYXNzTG9hZGVyIGwgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgdXJsIH0sIG51bGwpOw0KLQkJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShTaXRlLlNJVEVfRklMRSwgTG9jYWxlLmdldERlZmF1bHQoKSwgbCk7DQotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICI6IiArIHVybC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oUG9saWN5LmJpbmQoIkJhc2VTaXRlRmFjdG9yeS5DYW5ub3RSZXRyaXZlUGFyZW50RGlyZWN0b3J5IiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpKTsgIC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiBidW5kbGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHNpdGUgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIFNpdGUNCi0JICogQHJldHVybiBzaXRlIG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTaXRlTW9kZWwgY3JlYXRlU2l0ZU1hcE1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBTaXRlKCk7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBGZWF0dXJlUmVmZXJlbmNlDQotCSAqIEByZXR1cm4gZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgQXJjaGl2ZVJlZmVyZW5jZQ0KLQkgKiBAcmV0dXJuIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBBcmNoaXZlUmVmZXJlbmNlTW9kZWwgY3JlYXRlQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBBcmNoaXZlUmVmZXJlbmNlKCk7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGFubm90YXRlZCBVUkwgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIFVSTEVudHJ5DQotCSAqIEByZXR1cm4gYW5ub3RhdGVkIFVSTCBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMRW50cnlNb2RlbCBjcmVhdGVVUkxFbnRyeU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBVUkxFbnRyeSgpOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBjYXRlZ29yeSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgQ2F0ZWdvcnkNCi0JICogQHJldHVybiBjYXRlZ29yeSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgQ2F0ZWdvcnlNb2RlbCBjcmVhdGVTaXRlQ2F0ZWdvcnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgQ2F0ZWdvcnkoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogT3BlbiBhIHN0cmVhbSBvbiBhIFVSTC4NCi0JICogbWFuYWdlcyBhIHRpbWUgb3V0IGlmIHRoZSBjb25uZWN0aW9uIGlzIGxvY2tlZCBvciBmYWlscw0KLQkgKiANCi0JICogQHBhcmFtIHJlc29sdmVkVVJMDQotCSAqIEByZXR1cm4gSW5wdXRTdHJlYW0NCi0JICovDQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBvcGVuU3RyZWFtKFVSTCByZXNvbHZlZFVSTCkgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlSZXNwb25zZSByZXNwb25zZSA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0KHJlc29sdmVkVVJMKTsNCi0JCXJldHVybiByZXNwb25zZS5nZXRJbnB1dFN0cmVhbSgpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjYzEyZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0NhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi0NCi0vKioNCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBmZWF0dXJlIGNhdGVnb3J5IGRlZmluaXRpb24uDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4NCi0gKiA8L3A+IA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklDYXRlZ29yeQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ2F0ZWdvcnlNb2RlbA0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnkgZXh0ZW5kcyBDYXRlZ29yeU1vZGVsIGltcGxlbWVudHMgSUNhdGVnb3J5IHsNCi0NCi0JLyoqDQotCSAqIERlZmF1bHQgQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBDYXRlZ29yeSgpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBDYXRlZ29yeShTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsKSB7DQotCQlzZXROYW1lKG5hbWUpOw0KLQkJc2V0TGFiZWwobGFiZWwpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSB0aGUgZGV0YWlsZWQgY2F0ZWdvcnkgZGVzY3JpcHRpb24NCi0JICogQHNlZSBJQ2F0ZWdvcnkjZ2V0RGVzY3JpcHRpb24oKQ0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsNCi0JCXJldHVybiAoSVVSTEVudHJ5KSBnZXREZXNjcmlwdGlvbk1vZGVsKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9Db250ZW50UmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0NvbnRlbnRSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhMzlmYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0NvbnRlbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VUkxFbmNvZGVyOw0KLQ0KLS8qKg0KLSAqIENvbnRlbnQgcmVmZXJlbmNlIGltcGxlbWVudHMgYSBnZW5lcmFsIGFjY2VzcyB3cmFwcGVyIA0KLSAqIHRvIGZlYXR1cmUgYW5kIHNpdGUgY29udGVudC4gVGhlIHJlZmVyZW5jZSBzcGVjaWZpZXMNCi0gKiBhICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyIGZvciB0aGUgY29udGVudCwgYW5kIHRoZSBhY3R1YWwNCi0gKiByZWZlcmVuY2UgYXMgYSBmaWxlLCBvciBhIFVSTC4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLg0KLSAqIDwvcD4gDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyRW50cnlDb250ZW50UmVmZXJlbmNlDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDb250ZW50UmVmZXJlbmNlIHsNCi0NCi0JLyoqDQotCSAqIFVua25vd24gc2l6ZSBpbmRpY2F0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVTktOT1dOX1NJWkUgPSAtMTsNCi0NCi0JLyoqDQotCSAqIERlZmF1bHQgZXhlY3V0YWJsZSBwZXJtaXNzaW9uIHdoZW4gaW5zdGFsbGluZyBhIGNvbnRlbnQgcmVmZXJlbmNlDQotCSAqIFdpbGwgYWRkIGV4ZWN1dGFibGUgYml0IGlmIG5lY2Vzc2FyeQ0KLQkgKiANCi0JICogQHNpbmNlIDIuMC4xDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VYRUNVVEFCTEVfUEVSTUlTU0lPTiA9IC0xOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9VUkxfUFJPVE9DT0wgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7DQotCXByaXZhdGUgVVJMIHVybDsgLy8gcmVmZXJlbmNlIGlzIGVpdGhlciBVUkwgcmVmZXJlbmNlICpPUioNCi0JcHJpdmF0ZSBGaWxlIGZpbGU7IC8vICAgIGxvY2FsIGZpbGUgcmVmZXJlbmNlDQotCXByaXZhdGUgUmVzcG9uc2UgcmVzcG9uc2U7DQotCXByaXZhdGUgaW50IHBlcm1pc3Npb247IA0KLQlwcml2YXRlIGxvbmcgbGVuZ3RoOw0KLQkNCi0JLy8gPHRydWU+IGlmIGEgY29weSBvZiBhIENvbnRlbnRyZWZlcmVuZWMgaW4gYSB0ZW1wIGxvY2FsIGRpcmVjdG9yeQ0KLQlwcml2YXRlIGJvb2xlYW4gdGVtcExvY2FsID0gZmFsc2U7DQotCQ0KLQlwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkOw0KLQ0KLQkvKg0KLQkgKiBkbyBub3QgYWxsb3cgZGVmYXVsdCBjb250cnVjdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlKCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgY29udGVudCByZWZlcmVuY2UgZnJvbSBVUkwuDQotCSAqIA0KLQkgKiBAcGFyYW0gaWQgInN5bWJvbGljIiBwYXRoIGlkZW50aWZpZXINCi0JICogQHBhcmFtIHVybCBhY3R1YWwgcmVmZXJlbmNlZCBVUkwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UoU3RyaW5nIGlkLCBVUkwgdXJsKSB7DQotCQl0aGlzLmlkID0gKGlkID09IG51bGwgPyAiIiA6IGlkKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy51cmwgPSB1cmw7IC8vIGNhbiBiZSBudWxsDQotCQl0aGlzLmZpbGUgPSBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgY29udGVudCByZWZlcmVuY2UgZnJvbSBmaWxlLg0KLQkgKiANCi0JICogQHBhcmFtIGlkICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCSAqIEBwYXJhbSBmaWxlIGFjdHVhbCByZWZlcmVuY2VkIGZpbGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UoU3RyaW5nIGlkLCBGaWxlIGZpbGUpIHsNCi0JCXRoaXMuaWQgPSAoaWQgPT0gbnVsbCA/ICIiIDogaWQpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmZpbGUgPSBmaWxlOyAvLyBjYW4gYmUgbnVsbA0KLQkJdGhpcy51cmwgPSBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIGNvbnRlbnQgcmVmZXJlbmNlIG9mDQotCSAqIHRoZSBzYW1lIHR5cGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gaWQgInN5bWJvbGljIiBwYXRoIGlkZW50aWZpZXINCi0JICogQHBhcmFtIGZpbGUgYWN0dWFsIHJlZmVyZW5jZWQgZmlsZQ0KLQkgKiBAcmV0dXJuIGNvbnRlbnQgcmVmZXJlbmNlIG9mIHRoZSBzYW1lIHR5cGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgY3JlYXRlQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQsIEZpbGUgZmlsZSkgew0KLQkJcmV0dXJuIG5ldyBDb250ZW50UmVmZXJlbmNlKGlkLCBmaWxlLHRydWUpOw0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQsIEZpbGUgZmlsZSwgYm9vbGVhbiBiKSB7DQotCQl0aGlzKGlkLGZpbGUpOw0KLQkJc2V0VGVtcExvY2FsKGIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgdGhlICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyIGZvciB0aGUgcmVmZXJlbmNlLg0KLQkgKiANCi0JICogQHJldHVybiAic3ltYm9saWMiIHBhdGggaWRlbnRpZmllcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7DQotCQlyZXR1cm4gaWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5wdXQgc3RyZWFtIGZvciB0aGUgcmVmZXJlbmNlLg0KLQkgKiANCi0JICogQHJldHVybiBpbnB1dCBzdHJlYW0NCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiB1bmFibGUgdG8gY3JlYXRlIHN0cmVhbQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJaWYgKGZpbGUgIT0gbnVsbCkNCi0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsNCi0JCWVsc2UgaWYgKHVybCAhPSBudWxsKSB7DQotCQkJaWYgKHJlc3BvbnNlID09IG51bGwpIHsNCi0JCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsNCi0JCQkJcmVzcG9uc2UgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChyZXNvbHZlZFVSTCk7DQotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja0Nvbm5lY3Rpb25SZXN1bHQocmVzcG9uc2UscmVzb2x2ZWRVUkwpOw0KLQkJCX0NCi0JCQlJbnB1dFN0cmVhbSBpcz1yZXNwb25zZS5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJCWxlbmd0aD1yZXNwb25zZS5nZXRDb250ZW50TGVuZ3RoKCk7DQotCQkJcmV0dXJuIGlzOw0KLQkJfSBlbHNlDQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJDb250ZW50UmVmZXJlbmNlLlVuYWJsZVRvQ3JlYXRlSW5wdXRTdHJlYW0iLCB0aGlzLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGlucHV0IHN0cmVhbSBmb3IgdGhlIHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEByZXR1cm4gaW5wdXQgc3RyZWFtDQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gdW5hYmxlIHRvIGNyZWF0ZSBzdHJlYW0NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JSW5wdXRTdHJlYW0gZ2V0UGFydGlhbElucHV0U3RyZWFtKGxvbmcgb2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJaWYgKHVybCAhPSBudWxsICYmICJodHRwIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOw0KLQkJCXJlc3BvbnNlID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQocmVzb2x2ZWRVUkwpOw0KLQkJCWlmKHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKQ0KLQkJCQkoKEh0dHBSZXNwb25zZSlyZXNwb25zZSkuc2V0T2Zmc2V0KG9mZnNldCk7DQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNoZWNrQ29ubmVjdGlvblJlc3VsdChyZXNwb25zZSxyZXNvbHZlZFVSTCk7DQotCQkJSW5wdXRTdHJlYW0gaXMgPSByZXNwb25zZS5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJCWxlbmd0aD1vZmZzZXQgKyByZXNwb25zZS5nZXRDb250ZW50TGVuZ3RoKCk7DQotCQkJcmV0dXJuIGlzOw0KLQkJfSBlbHNlDQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJDb250ZW50UmVmZXJlbmNlLlVuYWJsZVRvQ3JlYXRlSW5wdXRTdHJlYW0iLCB0aGlzLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcmVmZXJlbmNlZCBpbnB1dCwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGlucHV0IHNpemUsIG9yIEBzZWUgI1VOS05PV05fU0laRSBpZiBzaXplIGNhbm5vdCBiZSBkZXRlcm1pbmVkLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnB1dFNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJaWYgKGxlbmd0aD4wKQ0KLQkJCXJldHVybiBsZW5ndGg7DQotCQlpZiAoZmlsZSAhPSBudWxsKQ0KLQkJCXJldHVybiBmaWxlLmxlbmd0aCgpOw0KLQkJZWxzZSBpZiAodXJsICE9IG51bGwpIHsNCi0JCQlpZiAocmVzcG9uc2UgPT0gbnVsbCkgew0KLQkJCQlVUkwgcmVzb2x2ZWRVUkwgPSBudWxsOw0KLQkJCQl0cnkgew0KLQkJCQkJcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOw0KLQkJCQkJcmVzcG9uc2UgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChyZXNvbHZlZFVSTCk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCXJldHVybiBDb250ZW50UmVmZXJlbmNlLlVOS05PV05fU0laRTsNCi0JCQkJfQ0KLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tDb25uZWN0aW9uUmVzdWx0KHJlc3BvbnNlLHJlc29sdmVkVVJMKTsJCQkNCi0JCQl9DQotCQkJbG9uZyBzaXplID0gcmVzcG9uc2UuZ2V0Q29udGVudExlbmd0aCgpOw0KLQkJCXJldHVybiBzaXplID09IC0xID8gQ29udGVudFJlZmVyZW5jZS5VTktOT1dOX1NJWkUgOiBzaXplOw0KLQkJfSBlbHNlDQotCQkJcmV0dXJuIENvbnRlbnRSZWZlcmVuY2UuVU5LTk9XTl9TSVpFOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVmZXJlbmNlIGlzIGEgbG9jYWwgZmlsZSByZWZlcmVuY2UuDQotCSAqIA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWZlcmVuY2UgaXMgbG9jYWwsIA0KLQkgKiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTG9jYWxSZWZlcmVuY2UoKSB7DQotCQkvKmlmIChmaWxlICE9IG51bGwpDQotCQkJcmV0dXJuIHRydWU7DQotCQllbHNlIGlmICh1cmwgIT0gbnVsbCkNCi0JCQlyZXR1cm4gRklMRV9VUkxfUFJPVE9DT0wuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKTsNCi0JCWVsc2UNCi0JCQlyZXR1cm4gZmFsc2U7Ki8NCi0JCS8vIG9ubHkgdGVtcCBmaWxlcyBhcmUgY29uc2lkZXJlZCBsb2NhbA0KLQkJcmV0dXJuIHRlbXBMb2NhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY29udGVudCByZWZlcmVuY2UgYXMgYSBmaWxlLiBOb3RlLCB0aGF0IHRoaXMgbWV0aG9kDQotCSAqIDxiPmRvZXMgbm90PC9iPiBjYXVzZSB0aGUgZmlsZSB0byBiZSBkb3dubG9hZGVkIGlmIGl0DQotCSAqIGlzIG5vdCBhbHJlYWR5IGxvY2FsLg0KLQkgKiANCi0JICogQHJldHVybiByZWZlcmVuY2UgYXMgZmlsZQ0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIHJlZmVyZW5jZSBjYW5ub3QgYmUgcmV0dXJuZWQgYXMgZmlsZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgRmlsZSBhc0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJaWYgKGZpbGUgIT0gbnVsbCkNCi0JCQlyZXR1cm4gZmlsZTsNCi0NCi0JCWlmICh1cmwgIT0gbnVsbCAmJiBGSUxFX1VSTF9QUk9UT0NPTC5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7DQotCQkJRmlsZSByZXN1bHQgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsNCi0JCQlpZiAocmVzdWx0LmV4aXN0cygpKQ0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCWVsc2UgDQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihQb2xpY3kuYmluZCgiQ29udGVudFJlZmVyZW5jZS5GaWxlRG9lc05vdEV4aXN0IiwgdGhpcy50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQgCQkJDQotCQl9DQotDQotCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oUG9saWN5LmJpbmQoIkNvbnRlbnRSZWZlcmVuY2UuVW5hYmxlVG9SZXR1cm5SZWZlcmVuY2VBc0ZpbGUiLCB0aGlzLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJCANCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY29udGVudCByZWZlcmVuY2UgYXMgYSBVUkwuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHJlZmVyZW5jZSBhcyBVUkwNCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiByZWZlcmVuY2UgY2Fubm90IGJlIHJldHVybmVkIGFzIFVSTA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMIGFzVVJMKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWlmICh1cmwgIT0gbnVsbCkNCi0JCQlyZXR1cm4gdXJsOw0KLQ0KLQkJaWYgKGZpbGUgIT0gbnVsbCkNCi0JCQlyZXR1cm4gZmlsZS50b1VSTCgpOw0KLQ0KLQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJDb250ZW50UmVmZXJlbmNlLlVuYWJsZVRvUmV0dXJuUmVmZXJlbmNlQXNVUkwiLCB0aGlzLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmVmZXJlbmNlLg0KLQkgKiANCi0JICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChmaWxlICE9IG51bGwpDQotCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7DQotCQllbHNlDQotCQkJcmV0dXJuIHVybC50b0V4dGVybmFsRm9ybSgpOw0KLQl9DQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBwZXJtaXNzaW9uIGZvciB0aGlzIGZpbGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IHJlZmVyZW5jZSBwZXJtaXNzaW9uDQotCSAqIEBzZWUgI0RFRkFVTFRfRVhFQ1VUQUJMRV9QRVJNSVNTSU9ODQotCSAqIEBzaW5jZSAyLjAuMQ0KLQkgKi8NCi0JcHVibGljIGludCBnZXRQZXJtaXNzaW9uKCkgew0KLQkJcmV0dXJuIHBlcm1pc3Npb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHBlcm1pc3Npb24gb2YgdGhpcyBjb250ZW50IHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEBwYXJhbSBwZXJtaXNzaW9uIFRoZSBwZXJtaXNzaW9uIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UGVybWlzc2lvbihpbnQgcGVybWlzc2lvbikgew0KLQkJdGhpcy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyBpZiBhIGNvbnRlbnQgcmVmZXJlbmNlIGlzIGNvbnNpZGVyZWQgbG9jYWwgDQotCSAqIA0KLQkgKiBAcGFyYW0gdGVtcExvY2FsIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIGlzIGNvbnNpZGVyZWQgbG9jYWwNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHNldFRlbXBMb2NhbChib29sZWFuIHRlbXBMb2NhbCkgew0KLQkJdGhpcy50ZW1wTG9jYWwgPSB0ZW1wTG9jYWw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB0aW1lc3RhbXAgdGhlIGNvbnRlbnQgd2FzIGxhc3QgbW9kaWZpZWQuDQotCSAqIEBwYXJhbSB0aW1lc3RhbXANCi0JICogQHNpbmNlIDMuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgdGltZXN0YW1wKSB7DQotCQl0aGlzLmxhc3RNb2RpZmllZCA9IHRpbWVzdGFtcDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBjb250ZW50IHdhcyBsYXN0IG1vZGlmaWVkDQotCSAqIEByZXR1cm4NCi0JICogQHNpbmNlIDMuMA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgew0KLQkJaWYgKGxhc3RNb2RpZmllZCA9PSAwKSB7DQotCQkJaWYgKGZpbGUgIT0gbnVsbCkgDQotCQkJCWxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7DQotCQkJZWxzZSBpZiAodXJsICE9IG51bGwpIHsNCi0JCQkJaWYgKHJlc3BvbnNlID09IG51bGwpIHsNCi0JCQkJCXRyeSB7DQotCQkJCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsNCi0JCQkJCQlyZXNwb25zZSA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0KHJlc29sdmVkVVJMKTsNCi0JCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJLy8gcmV0dXJuIDANCi0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQkvLyByZXR1cm4gMA0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWxhc3RNb2RpZmllZCA9IHJlc3BvbnNlLmdldExhc3RNb2RpZmllZCgpOw0KLQkJCX0gDQotCQl9DQotCQlyZXR1cm4gbGFzdE1vZGlmaWVkOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvRmVhdHVyZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTE0YTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgYSBmZWF0dXJlLg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4gDQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlIGV4dGVuZHMgRmVhdHVyZU1vZGVsIGltcGxlbWVudHMgSUZlYXR1cmUgew0KLQ0KLQkvKioNCi0JICogU2ltcGxlIGZpbGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBmZWF0dXJlIG1hbmlmZXN0IGZpbGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9GSUxFID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBGaWxlIGV4dGVuc2lvbiBvZiB0aGUgZGVmYXVsdCBmZWF0dXJlIG1hbmlmZXN0IGZpbGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9YTUwgPSBGRUFUVVJFX0ZJTEUgKyAiLnhtbCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBJU2l0ZSBzaXRlOyAvLyBmZWF0dXJlIHNpdGUNCi0JcHJpdmF0ZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBmZWF0dXJlQ29udGVudFByb3ZpZGVyOyAvLyBjb250ZW50IHByb3ZpZGVyDQotCXByaXZhdGUgTGlzdCAvKm9mIElGZWF0dXJlUmVmZXJlbmNlKi8NCi0JaW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlczsNCi0NCi0JLy9QRVJGOiBuZXcgaW5zdGFuY2UgdmFyaWFibGUNCi0JcHJpdmF0ZSBWZXJzaW9uZWRJZGVudGlmaWVyIHZlcnNpb25JZDsNCi0NCi0JcHJpdmF0ZSBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiBhYm9ydGVkRXhjZXB0aW9uID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIEZlYXR1cmUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEZlYXR1cmUoKSB7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbXBhcmVzIHR3byBmZWF0dXJlcyBmb3IgZXF1YWxpdHkNCi0JICogDQotCSAqIEBwYXJhbSBvYmplY3QgZmVhdHVyZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBmZWF0dXJlcyBhcmUgZXF1YWwsIA0KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBJRmVhdHVyZSkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJSUZlYXR1cmUgZiA9IChJRmVhdHVyZSkgb2JqZWN0Ow0KLQkJcmV0dXJuIGdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2dldFZlcnNpb25lZElkZW50aWZpZXIoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgew0KLQkJaWYgKHZlcnNpb25JZCAhPSBudWxsKQ0KLQkJCXJldHVybiB2ZXJzaW9uSWQ7DQotDQotCQlTdHJpbmcgaWQgPSBnZXRGZWF0dXJlSWRlbnRpZmllcigpOw0KLQkJU3RyaW5nIHZlciA9IGdldEZlYXR1cmVWZXJzaW9uKCk7DQotCQlpZiAoaWQgIT0gbnVsbCAmJiB2ZXIgIT0gbnVsbCkgew0KLQkJCXRyeSB7DQotCQkJCXZlcnNpb25JZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLCB2ZXIpOw0KLQkJCQlyZXR1cm4gdmVyc2lvbklkOw0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCVVwZGF0ZUNvcmUud2FybigNCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIHZlcnNpb25lZCBpZGVudGlmaWVyOiIgKyBpZCArICI6IiArIHZlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCX0NCi0JCX0NCi0NCi0JCXZlcnNpb25JZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCksIG51bGwpOw0KLQkJcmV0dXJuIHZlcnNpb25JZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2l0ZSB0aGlzIGZlYXR1cmUgaXMgYXNzb2NpYXRlZCB3aXRoLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRTaXRlKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7DQotCQlyZXR1cm4gc2l0ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBVUkwuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2dldFVSTCgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgew0KLQkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJY29udGVudFByb3ZpZGVyID0gZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJObyBjb250ZW50IFByb3ZpZGVyIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpID8gY29udGVudFByb3ZpZGVyLmdldFVSTCgpIDogbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBpbmZvcm1hdGlvbiBlbnRyeSByZWZlcmVuY2luZyB0aGUgbG9jYXRpb24gb2YgdGhlDQotCSAqIGZlYXR1cmUgdXBkYXRlIHNpdGUuIA0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRVcGRhdGVTaXRlRW50cnkoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldFVwZGF0ZVNpdGVFbnRyeSgpIHsNCi0JCXJldHVybiAoSVVSTEVudHJ5KSBnZXRVcGRhdGVTaXRlRW50cnlNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgaW5mb3JtYXRpb24gZW50cmllcyByZWZlcmVuY2luZyBsb2NhdGlvbnMgb2Ygb3RoZXINCi0JICogdXBkYXRlIHNpdGVzLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXREaXNjb3ZlcnlTaXRlRW50cmllcygpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnlbXSBnZXREaXNjb3ZlcnlTaXRlRW50cmllcygpIHsNCi0JCVVSTEVudHJ5TW9kZWxbXSByZXN1bHQgPSBnZXREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbHMoKTsNCi0JCWlmIChyZXN1bHQubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJVVJMRW50cnlbMF07DQotCQllbHNlDQotCQkJcmV0dXJuIChJVVJMRW50cnlbXSkgcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuZCBvcHRpb25hbCBjdXN0b20gaW5zdGFsbCBoYW5kbGVyIGVudHJ5Lg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbnN0YWxsSGFuZGxlckVudHJ5KCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElJbnN0YWxsSGFuZGxlckVudHJ5IGdldEluc3RhbGxIYW5kbGVyRW50cnkoKSB7DQotCQlyZXR1cm4gKElJbnN0YWxsSGFuZGxlckVudHJ5KSBnZXRJbnN0YWxsSGFuZGxlck1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgZGVzY3JpcHRpb24uDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2dldERlc2NyaXB0aW9uKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsNCi0JCXJldHVybiAoSVVSTEVudHJ5KSBnZXREZXNjcmlwdGlvbk1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvcHlyaWdodCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2dldENvcHlyaWdodCgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0Q29weXJpZ2h0KCkgew0KLQkJcmV0dXJuIChJVVJMRW50cnkpIGdldENvcHlyaWdodE1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGxpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRMaWNlbnNlKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXRMaWNlbnNlKCkgew0KLQkJcmV0dXJuIChJVVJMRW50cnkpIGdldExpY2Vuc2VNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gb3B0aW9uYWwgaW1hZ2UgZm9yIHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbWFnZSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0SW1hZ2UoKSB7DQotCQlyZXR1cm4gZ2V0SW1hZ2VVUkwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIGEgbGlzdCBvZiBwbHVnLWluIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRSYXdJbXBvcnRzKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElJbXBvcnRbXSBnZXRSYXdJbXBvcnRzKCkgew0KLQkJSW1wb3J0TW9kZWxbXSByZXN1bHQgPSBnZXRJbXBvcnRNb2RlbHMoKTsNCi0JCWlmIChyZXN1bHQubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJSW1wb3J0WzBdOw0KLQkJZWxzZQ0KLQkJCXJldHVybiAoSUltcG9ydFtdKSByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluc3RhbGwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmVhdHVyZSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZlYXR1cmUuDQotCSAqIFRoaXMgbWV0aG9kIGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmZWF0dXJlIGluc3RhbGxhdGlvbg0KLQkgKiBwcm90b2NvbC4gT3RoZXIgY29uY3JldGUgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbiB0aGF0IG92ZXJyaWRlIHRoaXMNCi0JICogbWV0aG9kIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgcHJvdG9jb2wuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2luc3RhbGwoSUZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoDQotCQlJRmVhdHVyZSB0YXJnZXRGZWF0dXJlLA0KLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLA0KLQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykNCi0JCXRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7DQotCQkvLyBjYWxsIG90aGVyIEFQSSB3aXRoIGFsbCBvcHRpb25hbCBmZWF0dXJlcywgb3Igc2V0dXAgdmFyaWFibGUgbWVhbmluZyBpbnN0YWxsIGFsbA0KLQkJcmV0dXJuIGluc3RhbGwodGFyZ2V0RmVhdHVyZSwgbnVsbCwgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIHByb2dyZXNzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5zdGFsbCB0aGUgY29udGVudHMgb2YgdGhpcyBmZWF0dXJlIGludG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgZmVhdHVyZS4NCi0JICogVGhpcyBtZXRob2QgaXMgYSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZlYXR1cmUgaW5zdGFsbGF0aW9uDQotCSAqIHByb3RvY29sLiBPdGhlciBjb25jcmV0ZSBmZWF0dXJlIGltcGxlbWVudGF0aW9uIHRoYXQgb3ZlcnJpZGUgdGhpcw0KLQkgKiBtZXRob2QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBwcm90b2NvbC4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjaW5zdGFsbChJRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbCgNCi0JCUlGZWF0dXJlIHRhcmdldEZlYXR1cmUsDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsDQotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsDQotCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQ0KLQkJdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vREVCVUcNCi0JCWRlYnVnKCJJbnN0YWxsaW5nLi4uOiIgKyBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJA0KLQkJRXJyb3JSZWNvdmVyeUxvZyByZWNvdmVyeUxvZyA9IEVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCk7DQotDQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBJbnN0YWxsTW9uaXRvcgkJDQotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yOw0KLQkJaWYgKHByb2dyZXNzID09IG51bGwpDQotCQkJbW9uaXRvciA9IG5ldyBJbnN0YWxsTW9uaXRvcihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCWVsc2UgaWYgKHByb2dyZXNzIGluc3RhbmNlb2YgSW5zdGFsbE1vbml0b3IpDQotCQkJbW9uaXRvciA9IChJbnN0YWxsTW9uaXRvcikgcHJvZ3Jlc3M7DQotCQllbHNlDQotCQkJbW9uaXRvciA9IG5ldyBJbnN0YWxsTW9uaXRvcihwcm9ncmVzcyk7DQotDQotCQkvLyBTZXR1cCBvcHRpb25hbCBpbnN0YWxsIGhhbmRsZXINCi0JCUluc3RhbGxIYW5kbGVyUHJveHkgaGFuZGxlciA9DQotCQkJbmV3IEluc3RhbGxIYW5kbGVyUHJveHkoDQotCQkJCUlJbnN0YWxsSGFuZGxlci5IQU5ETEVSX0FDVElPTl9JTlNUQUxMLA0KLQkJCQl0aGlzLA0KLQkJCQl0aGlzLmdldEluc3RhbGxIYW5kbGVyRW50cnkoKSwNCi0JCQkJbW9uaXRvcik7DQotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsNCi0JCVRocm93YWJsZSBvcmlnaW5hbEV4Y2VwdGlvbiA9IG51bGw7DQotCQlhYm9ydGVkRXhjZXB0aW9uID0gbnVsbDsNCi0NCi0JCS8vIEdldCBzb3VyY2UgZmVhdHVyZSBwcm92aWRlciBhbmQgdmVyaWZpZXIuDQotCQkvLyBJbml0aWFsaXplIHRhcmdldCB2YXJpYWJsZXMuDQotCQlJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKTsNCi0JCUlWZXJpZmllciB2ZXJpZmllciA9IHByb3ZpZGVyLmdldFZlcmlmaWVyKCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZSByZXN1bHQgPSBudWxsOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgYWxyZWFkeUluc3RhbGxlZEZlYXR1cmUgPSBudWxsOw0KLQkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIgPSBudWxsOw0KLQkJSVBsdWdpbkVudHJ5W10gdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMgPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQkvLyBkZXRlcm1pbmUgbGlzdCBvZiBwbHVnaW5zIHRvIGluc3RhbGwNCi0JCQkvLyBmaW5kIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgcGx1Z2luIGVudHJpZXMgYWxyZWFkeSBjb250YWluZWQNCi0JCQkvLyBvbiB0aGUgdGFyZ2V0IHNpdGUsIGFuZCBwbHVnaW4gZW50cmllcyBwYWNrYWdlZCBpbiBzb3VyY2UgZmVhdHVyZQ0KLQkJCUlQbHVnaW5FbnRyeVtdIHNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzID0gZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJCUlTaXRlIHRhcmdldFNpdGUgPSB0YXJnZXRGZWF0dXJlLmdldFNpdGUoKTsNCi0JCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKSB7DQotCQkJCWRlYnVnKCJUaGUgc2l0ZSB0byBpbnN0YWxsIGluIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl0YXJnZXRTaXRlUGx1Z2luRW50cmllcyA9IG5ldyBJUGx1Z2luRW50cnlbMF07DQotCQkJfSBlbHNlIHsNCi0JCQkJdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMgPSB0YXJnZXRTaXRlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQl9DQotCQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luc1RvSW5zdGFsbCA9DQotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5kaWZmKA0KLQkJCQkJc291cmNlRmVhdHVyZVBsdWdpbkVudHJpZXMsDQotCQkJCQl0YXJnZXRTaXRlUGx1Z2luRW50cmllcyk7DQotCQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luc1RvSW5zdGFsbCA9IGdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0NCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCWlmIChvcHRpb25hbGZlYXR1cmVzICE9IG51bGwpIHsNCi0JCQkJY2hpbGRyZW4gPQ0KLQkJCQkJVXBkYXRlTWFuYWdlclV0aWxzLm9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwoDQotCQkJCQkJY2hpbGRyZW4sDQotCQkJCQkJb3B0aW9uYWxmZWF0dXJlcyk7DQotCQkJfQ0KLQ0KLQkJCS8vIGRldGVybWluZSBudW1iZXIgb2YgbW9uaXRvciB0YXNrcw0KLQkJCS8vICAgMiB0YXNrcyBmb3IgdGhlIGZlYXR1cmUgamFyIChkb3dubG9hZC92ZXJpZnkgKyBpbnN0YWxsKQ0KLQkJCS8vICsgMipuIHRhc2tzIGZvciBwbHVnaW4gZW50cmllcyAoZG93bmxvYWQvdmVyaWZ5ICsgaW5zdGFsbCBmb3IgZWFjaCkNCi0JCQkvLyArIDEqbSB0YXNrcyBwZXIgbm9uLXBsdWdpbiBkYXRhIGVudHJ5IChkb3dubG9hZCBmb3IgZWFjaCkNCi0JCQkvLyArIDEgdGFzayBmb3IgY3VzdG9tIG5vbi1wbHVnaW4gZW50cnkgaGFuZGxpbmcgKDEgZm9yIGFsbCBjb21iaW5lZCkNCi0JCQkvLyArIDUqeCB0YXNrcyBmb3IgY2hpbGRyZW4gZmVhdHVyZXMgKDUgc3VidGFza3MgcGVyIGluc3RhbGwpDQotCQkJaW50IHRhc2tDb3VudCA9DQotCQkJCTINCi0JCQkJCSsgMiAqIHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoDQotCQkJCQkrIG5vblBsdWdpbnNUb0luc3RhbGwubGVuZ3RoDQotCQkJCQkrIDENCi0JCQkJCSsgNSAqIGNoaWxkcmVuLmxlbmd0aDsNCi0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgdGFza0NvdW50KTsgLy8kTk9OLU5MUy0xJA0KLQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbnVsbDsNCi0NCi0JCQkvLyBzdGFydCBsb2cNCi0JCQlyZWNvdmVyeUxvZy5vcGVuKEVycm9yUmVjb3ZlcnlMb2cuU1RBUlRfSU5TVEFMTF9MT0cpOw0KLQ0KLQkJCS8vIFN0YXJ0IHRoZSBpbnN0YWxsYXRpb24gdGFza3MJCQkNCi0JCQloYW5kbGVyLmluc3RhbGxJbml0aWF0ZWQoKTsNCi0NCi0JCQkvLyBEb3dubG9hZCBhbmQgdmVyaWZ5IGZlYXR1cmUgYXJjaGl2ZShzKQ0KLQkJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0NCi0JCQkJcHJvdmlkZXIuZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobW9uaXRvcik7DQotCQkJdmVyaWZ5UmVmZXJlbmNlcygNCi0JCQkJdmVyaWZpZXIsDQotCQkJCXJlZmVyZW5jZXMsDQotCQkJCW1vbml0b3IsDQotCQkJCXZlcmlmaWNhdGlvbkxpc3RlbmVyLA0KLQkJCQl0cnVlKTsNCi0JCQltb25pdG9yV29yayhtb25pdG9yLCAxKTsNCi0JCQkNCi0JCQkvLyBEb3dubG9hZCBhbmQgdmVyaWZ5IHBsdWdpbiBhcmNoaXZlcw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luc1RvSW5zdGFsbC5sZW5ndGg7IGkrKykgew0KLQkJCQlyZWZlcmVuY2VzID0gcHJvdmlkZXIuZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygNCi0JCQkJCQlwbHVnaW5zVG9JbnN0YWxsW2ldLCBtb25pdG9yKTsNCi0JCQkJdmVyaWZ5UmVmZXJlbmNlcyh2ZXJpZmllciwgcmVmZXJlbmNlcywgbW9uaXRvciwNCi0JCQkJCQkJCXZlcmlmaWNhdGlvbkxpc3RlbmVyLCBmYWxzZSk7DQotCQkJCW1vbml0b3JXb3JrKG1vbml0b3IsIDEpOw0KLQkJCX0NCi0JCQkNCi0JCQloYW5kbGVyLnBsdWdpbnNEb3dubG9hZGVkKHBsdWdpbnNUb0luc3RhbGwpOw0KLQ0KLQkJCS8vIERvd25sb2FkIG5vbi1wbHVnaW4gYXJjaGl2ZXMuIFZlcmlmaWNhdGlvbiBoYW5kbGVkIGJ5IG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcg0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uUGx1Z2luc1RvSW5zdGFsbC5sZW5ndGg7IGkrKykgew0KLQkJCQlyZWZlcmVuY2VzID0NCi0JCQkJCXByb3ZpZGVyLmdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoDQotCQkJCQkJbm9uUGx1Z2luc1RvSW5zdGFsbFtpXSwNCi0JCQkJCQltb25pdG9yKTsNCi0JCQkJbW9uaXRvcldvcmsobW9uaXRvciwgMSk7DQotCQkJfQ0KLQkJCWhhbmRsZXIubm9uUGx1Z2luRGF0YURvd25sb2FkZWQoDQotCQkJCW5vblBsdWdpbnNUb0luc3RhbGwsDQotCQkJCXZlcmlmaWNhdGlvbkxpc3RlbmVyKTsNCi0NCi0JCQkvLyBBbGwgYXJjaGl2ZXMgYXJlIGRvd25sb2FkZWQgYW5kIHZlcmlmaWVkLiBHZXQgcmVhZHkgdG8gaW5zdGFsbA0KLQkJCWNvbnN1bWVyID0gdGFyZ2V0RmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudENvbnN1bWVyKCk7DQotDQotCQkJLy8gaW5zdGFsbCB0aGUgY2hpbGRyZW4gZmVhdHVyZQ0KLQkJCS8vIGNoZWNrIGlmIHRoZXkgYXJlIG9wdGlvbmFsLCBhbmQgaWYgdGhleSBzaG91bGQgYmUgaW5zdGFsbGVkIFsyLjAuMV0NCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IG51bGw7DQotCQkJCXRyeSB7DQotCQkJCQljaGlsZEZlYXR1cmUgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQkJfQ0KLQkJCQlpZiAoY2hpbGRGZWF0dXJlICE9IG51bGwpIHsNCi0JCQkJCXN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDUpOw0KLQkJCQkJKChTaXRlKSB0YXJnZXRTaXRlKS5pbnN0YWxsKC8vIG5lZWQgdG8gY2FzdA0KLQkJCQkJY2hpbGRGZWF0dXJlLA0KLQkJCQkJCW9wdGlvbmFsZmVhdHVyZXMsDQotCQkJCQkJY29uc3VtZXIsDQotCQkJCQkJdmVyaWZpZXIsDQotCQkJCQkJdmVyaWZpY2F0aW9uTGlzdGVuZXIsDQotCQkJCQkJc3ViTW9uaXRvcik7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gSW5zdGFsbCBwbHVnaW4gZmlsZXMNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsNCi0JCQkJLy8gaWYgYW5vdGhlciBmZWF0dXJlIGhhcyBhbHJlYWR5IGluc3RhbGxlZCB0aGlzIHBsdWdpbiwgc2tpcCBpdA0KLQkJCQlpZiAoSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuaXNQbHVnaW5KdXN0SW5zdGFsbGVkKHBsdWdpbnNUb0luc3RhbGxbaV0pKSB7DQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCUlDb250ZW50Q29uc3VtZXIgcGx1Z2luQ29uc3VtZXIgPQ0KLQkJCQkJY29uc3VtZXIub3BlbihwbHVnaW5zVG9JbnN0YWxsW2ldKTsNCi0JCQkJLy8gVE9ETyBjb25zdW1lci5vcGVuIHJldHVybnMgZWl0aGVyDQotCQkJCS8vIFNpdGVGaWxlUGFja2VkUGx1Z2luQ29udGVudENvbnN1bWVyIG9yIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyDQotCQkJCS8vIGFuZCB0aGV5IGFyZSBmZWQgZWl0aGVyDQotCQkJCS8vIFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZSBvciBQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzDQotCQkJCS8vIGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIG9uZSB0aGF0IGlzIGdpdmVuIFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZQ0KLQkJCQkvLyBidXQgaXQgd291bGQgYnJlYWsgZXh0ZXJuYWwgSUNvbnRlbnRDb25zdW1lcnMNCi0NCi0JCQkJaWYocGx1Z2luc1RvSW5zdGFsbFtpXSBpbnN0YW5jZW9mIFBsdWdpbkVudHJ5TW9kZWwgJiYgISgoUGx1Z2luRW50cnlNb2RlbClwbHVnaW5zVG9JbnN0YWxsW2ldKS5pc1VucGFjaygpKXsNCi0JCQkJCS8vIHBsdWdpbiBjYW4gcnVuIGZyb20gYSBqYXINCi0JCQkJCXJlZmVyZW5jZXMgPSBwcm92aWRlci5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKA0KLQkJCQkJCQlwbHVnaW5zVG9JbnN0YWxsW2ldLCBtb25pdG9yKTsNCi0JCQkJfSBlbHNlew0KLQkJCQkJLy8gcGx1Z2luIG11c3QgYmUgdW5wYWNrZWQNCi0JCQkJCXJlZmVyZW5jZXMgPQ0KLQkJCQkJCXByb3ZpZGVyLmdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoDQotCQkJCQkJCXBsdWdpbnNUb0luc3RhbGxbaV0sDQotCQkJCQkJCW1vbml0b3IpOw0KLQkJCQl9DQotDQotCQkJCVN0cmluZyBtc2cgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQlzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKTsNCi0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBwbHVnaW5WZXJJZCA9DQotCQkJCQlwbHVnaW5zVG9JbnN0YWxsW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0JCQkJU3RyaW5nIHBsdWdpbklEID0NCi0JCQkJCShwbHVnaW5WZXJJZCA9PSBudWxsKSA/ICIiIDogcGx1Z2luVmVySWQuZ2V0SWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkDQotCQkJCW1zZyA9IFBvbGljeS5iaW5kKCJGZWF0dXJlLlRhc2tJbnN0YWxsUGx1Z2luRmlsZXMiLCBwbHVnaW5JRCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZlcmVuY2VzLmxlbmd0aDsgaisrKSB7DQotCQkJCQlzZXRNb25pdG9yVGFza05hbWUoDQotCQkJCQkJc3ViTW9uaXRvciwNCi0JCQkJCQltc2cgKyByZWZlcmVuY2VzW2pdLmdldElkZW50aWZpZXIoKSk7DQotCQkJCQlwbHVnaW5Db25zdW1lci5zdG9yZShyZWZlcmVuY2VzW2pdLCBzdWJNb25pdG9yKTsNCi0JCQkJfQ0KLQ0KLQkJCQlJbnN0YWxsUmVnaXN0cnkucmVnaXN0ZXJQbHVnaW4ocGx1Z2luc1RvSW5zdGFsbFtpXSk7DQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkNCi0JCQkJCWFib3J0KCk7DQotCQkJfQ0KLQ0KLQkJCS8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gaW5zdGFsbCBmZWF0dXJlIGZpbGVzIFsxNjcxOF0JDQotCQkJLy8gc3RvcmUgd2lsbCB0aHJvdyBDb3JlRXhjZXB0aW9uIGlmIGFub3RoZXIgZmVhdHVyZSBpcyBhbHJlYWR5DQotCQkJLy8gaW5zdGFsbGVkIGluIHRoZSBzYW1lIHBsYWNlDQotCQkJYWxyZWFkeUluc3RhbGxlZEZlYXR1cmUgPSBmZWF0dXJlQWxyZWFkeUluc3RhbGxlZCh0YXJnZXRTaXRlKTsNCi0JCQkvLyAxODg2Nw0KLQkJCWlmIChhbHJlYWR5SW5zdGFsbGVkRmVhdHVyZSA9PSBudWxsKSB7DQotCQkJCS8vSW5zdGFsbCBmZWF0dXJlIGZpbGVzDQotCQkJCXJlZmVyZW5jZXMgPSBwcm92aWRlci5nZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhtb25pdG9yKTsNCi0NCi0JCQkJU3RyaW5nIG1zZyA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCXN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpOw0KLQkJCQltc2cgPSBQb2xpY3kuYmluZCgiRmVhdHVyZS5UYXNrSW5zdGFsbEZlYXR1cmVGaWxlcyIpOyAvLyROT04tTkxTLTEkDQotDQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgew0KLQkJCQkJc2V0TW9uaXRvclRhc2tOYW1lKA0KLQkJCQkJCXN1Yk1vbml0b3IsDQotCQkJCQkJbXNnICsgIiAiICsgcmVmZXJlbmNlc1tpXS5nZXRJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkDQotCQkJCQljb25zdW1lci5zdG9yZShyZWZlcmVuY2VzW2ldLCBzdWJNb25pdG9yKTsNCi0JCQkJfQ0KLQkJCQlJbnN0YWxsUmVnaXN0cnkucmVnaXN0ZXJGZWF0dXJlKHRoaXMpOw0KLQkJCX0gZWxzZSB7DQotCQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCX0NCi0NCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpDQotCQkJCWFib3J0KCk7DQotDQotCQkJLy8gY2FsbCBoYW5kbGVyIHRvIGNvbXBsZXRlIGluc3RhbGxhdGlvbiAoZWcuIGhhbmRsZSBub24tcGx1Z2luIGVudHJpZXMpDQotCQkJaGFuZGxlci5jb21wbGV0ZUluc3RhbGwoY29uc3VtZXIpOw0KLQkJCW1vbml0b3JXb3JrKG1vbml0b3IsIDEpOw0KLQ0KLQkJCS8vIGluZGljYXRlIGluc3RhbGwgc3VjY2Vzcw0KLQkJCXN1Y2Nlc3MgPSB0cnVlOw0KLQ0KLQkJfSBjYXRjaCAoSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gZSkgew0KLQkJCWFib3J0ZWRFeGNlcHRpb24gPSBlOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJb3JpZ2luYWxFeGNlcHRpb24gPSBlOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlFeGNlcHRpb24gbmV3RXhjZXB0aW9uID0gbnVsbDsNCi0JCQl0cnkgew0KLQkJCQlpZiAoY29uc3VtZXIgIT0gbnVsbCkgew0KLQkJCQkJaWYgKHN1Y2Nlc3MpIHsNCi0JCQkJCQlyZXN1bHQgPSBjb25zdW1lci5jbG9zZSgpOw0KLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KLQkJCQkJCQlyZXN1bHQgPSBhbHJlYWR5SW5zdGFsbGVkRmVhdHVyZTsgLy8gMTg4NjcNCi0JCQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsDQotCQkJCQkJCQkmJiBvcHRpb25hbGZlYXR1cmVzICE9IG51bGwNCi0JCQkJCQkJCSYmIG9wdGlvbmFsZmVhdHVyZXMubGVuZ3RoID4gMCkgew0KLQkJCQkJCQkJLy8gcmVpbml0aWFsaXplIGFzIG5ldyBvcHRpb25hbCBjaGlsZHJlbiBtYXkgaGF2ZSBiZWVuIGluc3RhbGxlZA0KLQkJCQkJCQkJcmVpbml0aWFsaXplRmVhdHVyZShyZXN1bHQpOw0KLQkJCQkJCQl9DQotCQkJCQkJfQ0KLQkJCQkJCS8vIGNsb3NlIHRoZSBsb2cNCi0JCQkJCQlyZWNvdmVyeUxvZy5jbG9zZShFcnJvclJlY292ZXJ5TG9nLkVORF9JTlNUQUxMX0xPRyk7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCWNvbnN1bWVyLmFib3J0KCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJaGFuZGxlci5pbnN0YWxsQ29tcGxldGVkKHN1Y2Nlc3MpOw0KLQkJCQkvLyBpZiBhYm9ydCBpcyBkb25lLCBubyBuZWVkIGZvciB0aGUgbG9nIHRvIHN0YXkNCi0JCQkJcmVjb3ZlcnlMb2cuZGVsZXRlKCk7DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCW5ld0V4Y2VwdGlvbiA9IGU7DQotCQkJfQ0KLQ0KLQkJCS8vIG9yaWdpbmFsIGV4Y2VwdGlvbiB3aW5zIHVubGVzcyBpdCBpcyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbg0KLQkJCS8vIGFuZCBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyBhYm9ydA0KLQkJCWlmIChvcmlnaW5hbEV4Y2VwdGlvbiAhPSBudWxsKSB7DQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQkJUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLmVycm9yIiwgdGhpcy5nZXRMYWJlbCgpKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJb3JpZ2luYWxFeGNlcHRpb24pOw0KLQkJCX0NCi0NCi0JCQlpZiAobmV3RXhjZXB0aW9uICE9IG51bGwpDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQkJUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLmVycm9yIiwgdGhpcy5nZXRMYWJlbCgpKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJbmV3RXhjZXB0aW9uKTsNCi0NCi0JCQlpZiAoYWJvcnRlZEV4Y2VwdGlvbiAhPSBudWxsKSB7DQotCQkJCXRocm93IGFib3J0ZWRFeGNlcHRpb247DQotCQkJfQ0KLQ0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBwbHVnLWluIGVudHJpZXMgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0UGx1Z2luRW50cmllcygpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRSYXdQbHVnaW5FbnRyaWVzKCkgew0KLQkJUGx1Z2luRW50cnlNb2RlbFtdIHJlc3VsdCA9IGdldFBsdWdpbkVudHJ5TW9kZWxzKCk7DQotCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSVBsdWdpbkVudHJ5WzBdOw0KLQkJZWxzZQ0KLQkJCXJldHVybiAoSVBsdWdpbkVudHJ5W10pIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBNZXRob2QgZmlsdGVyLg0KLQkgKiBAcGFyYW0gcmVzdWx0DQotCSAqIEByZXR1cm4gSVBsdWdpbkVudHJ5W10NCi0JICovDQotCXByaXZhdGUgSVBsdWdpbkVudHJ5W10gZmlsdGVyUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5W10gYWxsKSB7DQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlpZiAoYWxsICE9IG51bGwpIHsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykgew0KLQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLmlzVmFsaWRFbnZpcm9ubWVudChhbGxbaV0pKQ0KLQkJCQkJbGlzdC5hZGQoYWxsW2ldKTsNCi0JCQl9DQotCQl9DQotDQotCQlJUGx1Z2luRW50cnlbXSByZXN1bHQgPSBuZXcgSVBsdWdpbkVudHJ5W2xpc3Quc2l6ZSgpXTsNCi0JCWlmICghbGlzdC5pc0VtcHR5KCkpIHsNCi0JCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsNCi0JCX0NCi0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvdW50IG9mIHJlZmVyZW5jZWQgcGx1Zy1pbiBlbnRyaWVzLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRQbHVnaW5FbnRyeUNvdW50KCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCkgew0KLQkJcmV0dXJuIGdldFBsdWdpbkVudHJpZXMoKS5sZW5ndGg7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLXBsdWctaW4gZW50cmllcyByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZQ0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXROb25QbHVnaW5FbnRyaWVzKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElOb25QbHVnaW5FbnRyeVtdIGdldFJhd05vblBsdWdpbkVudHJpZXMoKSB7DQotCQlOb25QbHVnaW5FbnRyeU1vZGVsW10gcmVzdWx0ID0gZ2V0Tm9uUGx1Z2luRW50cnlNb2RlbHMoKTsNCi0JCWlmIChyZXN1bHQubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJTm9uUGx1Z2luRW50cnlbMF07DQotCQllbHNlDQotCQkJcmV0dXJuIChJTm9uUGx1Z2luRW50cnlbXSkgcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiByZWZlcmVuY2VkIG5vbi1wbHVnLWluIGVudHJpZXMuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2dldE5vblBsdWdpbkVudHJ5Q291bnQoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldE5vblBsdWdpbkVudHJ5Q291bnQoKSB7DQotCQlyZXR1cm4gZ2V0Tm9uUGx1Z2luRW50cnlNb2RlbHMoKS5sZW5ndGg7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2VzIGluY2x1ZGVkIGJ5IHRoaXMgZmVhdHVyZQ0KLQkgKiANCi0JICogQHJldHVybiBhbiBlcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKGluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbCkNCi0JCQlpbml0aWFsaXplSW5jbHVkZWRSZWZlcmVuY2VzKCk7DQotDQotCQlpZiAoaW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcy5zaXplKCkgPT0gMCkNCi0JCQlyZXR1cm4gbmV3IEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVswXTsNCi0NCi0JCXJldHVybiAoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdKSBpbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzLnRvQXJyYXkoDQotCQkJYXJyYXlUeXBlRm9yKGluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMpKTsNCi0JfQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZG93bmxvYWQgc2l6ZSBvZiB0aGUgZmVhdHVyZSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2dldERvd25sb2FkU2l6ZSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZSgpIHsNCi0JCXRyeSB7DQotCQkJU2V0IGFsbFBsdWdpbkVudHJpZXMgPSBuZXcgSGFzaFNldCgpOw0KLQkJCVNldCBhbGxOb25QbHVnaW5FbnRyaWVzID0gbmV3IEhhc2hTZXQoKTsNCi0NCi0JCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zID0gZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJCWFsbFBsdWdpbkVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocGx1Z2lucykpOw0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbnMgPSBnZXROb25QbHVnaW5FbnRyaWVzKCk7DQotCQkJYWxsTm9uUGx1Z2luRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChub25QbHVnaW5zKSk7DQotDQotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IGdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJCXBsdWdpbnMgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQkJYWxsUGx1Z2luRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwbHVnaW5zKSk7DQotCQkJCW5vblBsdWdpbnMgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpLmdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0JCQkJYWxsTm9uUGx1Z2luRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChub25QbHVnaW5zKSk7DQotCQkJfQ0KLQ0KLQkJCUlQbHVnaW5FbnRyeVtdIHRvdGFsUGx1Z2lucyA9DQotCQkJCW5ldyBJUGx1Z2luRW50cnlbYWxsUGx1Z2luRW50cmllcy5zaXplKCldOw0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIHRvdGFsTm9uUGx1Z2lucyA9DQotCQkJCW5ldyBJTm9uUGx1Z2luRW50cnlbYWxsTm9uUGx1Z2luRW50cmllcy5zaXplKCldOw0KLQkJCWlmIChhbGxQbHVnaW5FbnRyaWVzLnNpemUoKSAhPSAwKSB7DQotCQkJCWFsbFBsdWdpbkVudHJpZXMudG9BcnJheSh0b3RhbFBsdWdpbnMpOw0KLQkJCX0NCi0JCQlpZiAoYWxsTm9uUGx1Z2luRW50cmllcy5zaXplKCkgIT0gMCkgew0KLQkJCQlhbGxOb25QbHVnaW5FbnRyaWVzLnRvQXJyYXkodG90YWxOb25QbHVnaW5zKTsNCi0JCQl9DQotDQotCQkJcmV0dXJuIGdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXREb3dubG9hZFNpemVGb3IoDQotCQkJCXRvdGFsUGx1Z2lucywNCi0JCQkJdG90YWxOb25QbHVnaW5zKTsNCi0NCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQlyZXR1cm4gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIHNpemUgb2YgdGhlIGZlYXR1cmUsIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbnN0YWxsU2l6ZSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplKCkgew0KLQkJdHJ5IHsNCi0JCQlTZXQgYWxsUGx1Z2luRW50cmllcyA9IG5ldyBIYXNoU2V0KCk7DQotCQkJU2V0IGFsbE5vblBsdWdpbkVudHJpZXMgPSBuZXcgSGFzaFNldCgpOw0KLQ0KLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbnMgPSBnZXRQbHVnaW5FbnRyaWVzKCk7DQotCQkJYWxsUGx1Z2luRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwbHVnaW5zKSk7DQotCQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2lucyA9IGdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0JCQlhbGxOb25QbHVnaW5FbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KG5vblBsdWdpbnMpKTsNCi0NCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCi0JCQkJcGx1Z2lucyA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCkuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJCQlhbGxQbHVnaW5FbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHBsdWdpbnMpKTsNCi0JCQkJbm9uUGx1Z2lucyA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCkuZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQkJCQlhbGxOb25QbHVnaW5FbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KG5vblBsdWdpbnMpKTsNCi0JCQl9DQotDQotCQkJSVBsdWdpbkVudHJ5W10gdG90YWxQbHVnaW5zID0NCi0JCQkJbmV3IElQbHVnaW5FbnRyeVthbGxQbHVnaW5FbnRyaWVzLnNpemUoKV07DQotCQkJSU5vblBsdWdpbkVudHJ5W10gdG90YWxOb25QbHVnaW5zID0NCi0JCQkJbmV3IElOb25QbHVnaW5FbnRyeVthbGxOb25QbHVnaW5FbnRyaWVzLnNpemUoKV07DQotCQkJaWYgKGFsbFBsdWdpbkVudHJpZXMuc2l6ZSgpICE9IDApIHsNCi0JCQkJYWxsUGx1Z2luRW50cmllcy50b0FycmF5KHRvdGFsUGx1Z2lucyk7DQotCQkJfQ0KLQkJCWlmIChhbGxOb25QbHVnaW5FbnRyaWVzLnNpemUoKSAhPSAwKSB7DQotCQkJCWFsbE5vblBsdWdpbkVudHJpZXMudG9BcnJheSh0b3RhbE5vblBsdWdpbnMpOw0KLQkJCX0NCi0NCi0JCQlyZXR1cm4gZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldEluc3RhbGxTaXplRm9yKA0KLQkJCQl0b3RhbFBsdWdpbnMsDQotCQkJCXRvdGFsTm9uUGx1Z2lucyk7DQotDQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQkJcmV0dXJuIENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhpcyBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlQ29udGVudFByb3ZpZGVyIGdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKGZlYXR1cmVDb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQlQb2xpY3kuYmluZCgNCi0JCQkJCSJGZWF0dXJlLk5vQ29udGVudFByb3ZpZGVyIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLA0KLQkJCQludWxsKTsJDQotCQl9DQotCQlyZXR1cm4gdGhpcy5mZWF0dXJlQ29udGVudFByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IGNvbnN1bWVyIGZvciB0aGlzIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2dldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc2l0ZSBmb3IgdGhpcyBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNzZXRTaXRlKElTaXRlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmICh0aGlzLnNpdGUgIT0gbnVsbCkgew0KLQkJCVN0cmluZyBmZWF0dXJlVVJMU3RyaW5nID0NCi0JCQkJKGdldFVSTCgpICE9IG51bGwpID8gZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSA6ICIiOyAvLyROT04tTkxTLTEkDQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCVBvbGljeS5iaW5kKCJGZWF0dXJlLlNpdGVBbHJlYWR5U2V0IiwgZmVhdHVyZVVSTFN0cmluZyksIC8vJE5PTi1OTFMtMSQNCi0JCQkJbnVsbCk7DQotCQl9DQotCQl0aGlzLnNpdGUgPSBzaXRlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGlzIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI3NldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoSUZlYXR1cmVDb250ZW50UHJvdmlkZXIpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgZmVhdHVyZUNvbnRlbnRQcm92aWRlcikgew0KLQkJdGhpcy5mZWF0dXJlQ29udGVudFByb3ZpZGVyID0gZmVhdHVyZUNvbnRlbnRQcm92aWRlcjsNCi0JCWZlYXR1cmVDb250ZW50UHJvdmlkZXIuc2V0RmVhdHVyZSh0aGlzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmZXRhdXJlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgYXMgc3RyaW5nDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlTdHJpbmcgVVJMU3RyaW5nID0NCi0JCQkoZ2V0VVJMKCkgPT0gbnVsbCkNCi0JCQkJPyBQb2xpY3kuYmluZCgiRmVhdHVyZS5Ob1VSTCIpIC8vJE5PTi1OTFMtMSQNCi0JCQkJOiBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpOw0KLQ0KLQkJU3RyaW5nIHZlclN0cmluZyA9DQotCQkJUG9saWN5LmJpbmQoDQotCQkJCSJGZWF0dXJlLkZlYXR1cmVWZXJzaW9uVG9TdHJpbmciLCAvLyROT04tTkxTLTEkDQotCQkJCVVSTFN0cmluZywNCi0JCQkJZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwoKSA9PSBudWxsID8gIiIgOiBnZXRMYWJlbCgpOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gdmVyU3RyaW5nICsgIiBbIiArIGxhYmVsICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBJbnN0YWxsYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLCBhYm9ydCBhbmQgcmV2ZXJ0DQotCSAqLw0KLQlwcml2YXRlIHZvaWQgYWJvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIkZlYXR1cmUuSW5zdGFsbGF0aW9uQ2FuY2VsbGVkIik7IC8vJE5PTi1OTFMtMSQNCi0JCXRocm93IG5ldyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbihtc2csIG51bGwpOw0KLQl9DQotDQotCS8qDQotCSAqIEluaXRpYWxpemVzIGluY2x1ZGVzIGZlYXR1cmUgcmVmZXJlbmNlcw0KLQkgKiBJZiB0aGUgaW5jbHVkZWQgZmVhdHVyZSByZWZlcmVuY2UgaXMgZm91bmQgb24gdGhlIHNpdGUsIGFkZCBpdCB0byB0aGUgTGlzdA0KLQkgKiBPdGhlcndpc2UgYXR0ZW1wdCB0byBpbnN0YW5jaWF0ZSBpdCB1c2luZyB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgZmVhdHVyZSBhbmQNCi0JICogdXNpbmcgdGhlIGRlZmF1bHQgbG9jYXRpb24gb24gdGhlIHNpdGUuDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUluY2x1ZGVkUmVmZXJlbmNlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gbmVzdGVkRmVhdHVyZXMgPSBnZXRGZWF0dXJlSW5jbHVkZWQoKTsNCi0JCWlmIChuZXN0ZWRGZWF0dXJlcy5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm47DQotDQotCQlJU2l0ZSBzaXRlID0gZ2V0U2l0ZSgpOw0KLQkJaWYgKHNpdGUgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpbmNsdWRlID0gbmVzdGVkRmVhdHVyZXNbaV07DQotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYgPQ0KLQkJCQlnZXRQZXJmZWN0SW5jbHVkZUZlYXR1cmUoc2l0ZSwgaW5jbHVkZSk7DQotCQkJaW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcy5hZGQobmV3UmVmKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBnZXRQZXJmZWN0SW5jbHVkZUZlYXR1cmUoDQotCQlJU2l0ZSBzaXRlLA0KLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpbmNsdWRlKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gWzIwMzY3XSBubyBzaXRlLCBjYW5ub3QgaW5pdGlhbGl6ZSBuZXN0ZWQgcmVmZXJlbmNlcw0KLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCVZlcnNpb25lZElkZW50aWZpZXIgaWRlbnRpZmllciA9IGluY2x1ZGUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOw0KLQ0KLQkJLy8gdG9vIGxvbmcgdG8gY29tcHV0ZSBpZiBub3QgYSBmaWxlIHN5c3RlbQ0KLQkJLy8gb3RoZXIgc29sdXRpb24gd291bGQgYmUgdG8gcGFyc2UgZmVhdHVyZS54bWwNCi0JCS8vIHdoZW4gcGFyc2luZyBmaWxlIHN5c3RlbSB0byBjcmVhdGUgYXJjaGl2ZSBmZWF0dXJlcy9GZWF0dXJlSWRfVmVyLmphcg0KLQkJaWYgKCJmaWxlIi5lcXVhbHMoc2l0ZS5nZXRVUkwoKS5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkDQotCQkJLy8gY2hlY2sgaWYgZGVjbGFyZWQgb24gdGhlIFNpdGUNCi0JCQlpZiAocmVmcyAhPSBudWxsKSB7DQotCQkJCWZvciAoaW50IHJlZiA9IDA7IHJlZiA8IHJlZnMubGVuZ3RoOyByZWYrKykgew0KLQkJCQkJaWYgKHJlZnNbcmVmXSAhPSBudWxsKSB7DQotCQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZCA9DQotCQkJCQkJCXJlZnNbcmVmXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQkJCQkJaWYgKGlkZW50aWZpZXIuZXF1YWxzKGlkKSkgew0KLQkJCQkJCQkvLyBmb3VuZCBhIElTaXRlRmVhdHVyZVJlZmVyZW5jZSB0aGF0IG1hdGNoZXMgb3VyIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UNCi0JCQkJCQkJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIG5ld1JlZiA9DQotCQkJCQkJCQluZXcgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKHJlZnNbcmVmXSk7DQotCQkJCQkJCW5ld1JlZi5pc09wdGlvbmFsKGluY2x1ZGUuaXNPcHRpb25hbCgpKTsNCi0JCQkJCQkJaWYgKGluY2x1ZGUgaW5zdGFuY2VvZiBGZWF0dXJlUmVmZXJlbmNlTW9kZWwpDQotCQkJCQkJCQluZXdSZWYuc2V0TGFiZWwoDQotCQkJCQkJCQkJKChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGluY2x1ZGUpDQotCQkJCQkJCQkJCS5nZXRMYWJlbCgpKTsNCi0JCQkJCQkJbmV3UmVmLnNldFNlYXJjaExvY2F0aW9uKA0KLQkJCQkJCQkJaW5jbHVkZS5nZXRTZWFyY2hMb2NhdGlvbigpKTsNCi0JCQkJCQkJcmV0dXJuIG5ld1JlZjsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQkvLyBpbnN0YW5jaWF0ZSBieSBtYXBwaW5nIGl0IGJhc2VkIG9uIHRoZSBzaXRlLnhtbA0KLQkJLy8gaW4gZnV0dXJlIHdlIG1heSBhc2sgZm9yIGEgZmFjdG9yeSB0byBjcmVhdGUgdGhlIGZlYXR1cmUgcmVmDQotCQlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgbmV3UmVmID0gbmV3IEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZShpbmNsdWRlKTsNCi0JCW5ld1JlZi5zZXRTaXRlKGdldFNpdGUoKSk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZSBwYXJlbnRSZWYgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZSh0aGlzKTsNCi0JCWlmIChwYXJlbnRSZWYgaW5zdGFuY2VvZiBGZWF0dXJlUmVmZXJlbmNlKSB7DQotCQkJbmV3UmVmLnNldFR5cGUoKChGZWF0dXJlUmVmZXJlbmNlKSBwYXJlbnRSZWYpLmdldFR5cGUoKSk7DQotCQl9DQotCQlTdHJpbmcgZmVhdHVyZUlEID0NCi0JCQlTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIICsgaWRlbnRpZmllci50b1N0cmluZygpICsgIi5qYXIiOyAvLyROT04tTkxTLTEkDQotCQlVUkwgZmVhdHVyZVVSTCA9DQotCQkJZ2V0U2l0ZSgpLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKS5nZXRBcmNoaXZlUmVmZXJlbmNlKGZlYXR1cmVJRCk7DQotCQluZXdSZWYuc2V0VVJMKGZlYXR1cmVVUkwpOw0KLQkJbmV3UmVmLnNldEZlYXR1cmVJZGVudGlmaWVyKGlkZW50aWZpZXIuZ2V0SWRlbnRpZmllcigpKTsNCi0JCW5ld1JlZi5zZXRGZWF0dXJlVmVyc2lvbihpZGVudGlmaWVyLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsNCi0JCXRyeSB7DQotCQkJbmV3UmVmLnJlc29sdmUoZ2V0U2l0ZSgpLmdldFVSTCgpLCBudWxsKTsNCi0JCQkvLyBubyBuZWVkIHRvIGdldCB0aGUgYnVuZGxlDQotCQkJcmV0dXJuIG5ld1JlZjsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCVBvbGljeS5iaW5kKA0KLQkJCQkJIkZlYXR1cmUuVW5hYmxlVG9Jbml0aWFsaXplRmVhdHVyZVJlZmVyZW5jZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCWlkZW50aWZpZXIudG9TdHJpbmcoKSksDQotCQkJCWUpOw0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGRlYnVnKFN0cmluZyB0cmFjZSkgew0KLQkJLy9ERUJVRw0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lOU1RBTEwpIHsNCi0JCQlVcGRhdGVDb3JlLmRlYnVnKHRyYWNlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCBzZXRNb25pdG9yVGFza05hbWUoDQotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsDQotCQlTdHJpbmcgdGFza05hbWUpIHsNCi0JCWlmIChtb25pdG9yICE9IG51bGwpDQotCQkJbW9uaXRvci5zZXRUYXNrTmFtZSh0YXNrTmFtZSk7DQotCX0NCi0NCi0JLyoNCi0JICoNCi0JICovDQotCXByaXZhdGUgdm9pZCBtb25pdG9yV29yayhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCW1vbml0b3Iud29ya2VkKHRpY2spOw0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQlhYm9ydCgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZWZlcmVuY2VzKA0KLQkJSVZlcmlmaWVyIHZlcmlmaWVyLA0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMsDQotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yLA0KLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLA0KLQkJYm9vbGVhbiBpc0ZlYXR1cmUpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJVmVyaWZpY2F0aW9uUmVzdWx0IHZyID0gbnVsbDsNCi0JCWlmICh2ZXJpZmllciAhPSBudWxsKSB7DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZlcmVuY2VzLmxlbmd0aDsgaisrKSB7DQotCQkJCXZyID0gdmVyaWZpZXIudmVyaWZ5KHRoaXMsIHJlZmVyZW5jZXNbal0sIGlzRmVhdHVyZSwgbW9uaXRvcik7DQotCQkJCWlmICh2ciAhPSBudWxsKSB7DQotCQkJCQlpZiAodmVyaWZpY2F0aW9uTGlzdGVuZXIgPT0gbnVsbCkNCi0JCQkJCQlyZXR1cm47DQotDQotCQkJCQlpbnQgcmVzdWx0ID0gdmVyaWZpY2F0aW9uTGlzdGVuZXIucHJvbXB0KHZyKTsNCi0NCi0JCQkJCWlmIChyZXN1bHQgPT0gSVZlcmlmaWNhdGlvbkxpc3RlbmVyLkNIT0lDRV9BQk9SVCkgew0KLQkJCQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiSmFyVmVyaWZpY2F0aW9uU2VydmljZS5DYW5jZWxJbnN0YWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCQlFeGNlcHRpb24gZSA9IHZyLmdldFZlcmlmaWNhdGlvbkV4Y2VwdGlvbigpOw0KLQkJCQkJCXRocm93IG5ldyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbihtc2csIGUpOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKHJlc3VsdCA9PSBJVmVyaWZpY2F0aW9uTGlzdGVuZXIuQ0hPSUNFX0VSUk9SKSB7DQotCQkJCQkJdGhyb3cgVXRpbGl0aWVzDQotCQkJCQkJCS5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQkJCQkJUG9saWN5LmJpbmQoDQotCQkJCQkJCQkJIkphclZlcmlmaWNhdGlvblNlcnZpY2UuVW5zdWNlc3NmdWxWZXJpZmljYXRpb24iKSwJLy8kTk9OLU5MUy0xJA0KLQkJCQkJCXZyLmdldFZlcmlmaWNhdGlvbkV4Y2VwdGlvbigpKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiByZXR1cm5zIHJlZmVyZW5jZSBpZiB0aGUgc2FtZSBmZWF0dXJlIGlzIGluc3RhbGxlZCBvbiB0aGUgc2l0ZQ0KLQkgKiBbMTg4NjddDQotCSAqLw0KLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVBbHJlYWR5SW5zdGFsbGVkKElTaXRlIHRhcmdldFNpdGUpIHsNCi0NCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSB0YXJnZXRTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZSBjdXJyZW50UmVmZXJlbmNlID0gbnVsbDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgew0KLQkJCWN1cnJlbnRSZWZlcmVuY2UgPSByZWZlcmVuY2VzW2ldOw0KLQkJCS8vIGRvIG5vdCBjb21wYXJlIFVSTA0KLQkJCXRyeSB7DQotCQkJCWlmICh0aGlzLmVxdWFscyhjdXJyZW50UmVmZXJlbmNlLmdldEZlYXR1cmUobnVsbCkpKQ0KLQkJCQkJcmV0dXJuIGN1cnJlbnRSZWZlcmVuY2U7IC8vIDE4ODY3DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQl9DQotCQl9DQotDQotCQlVcGRhdGVDb3JlLndhcm4oDQotCQkJIlZhbGlkYXRlQWxyZWFkeUluc3RhbGxlZDpGZWF0dXJlICIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrIHRoaXMNCi0JCQkJKyAiIG5vdCBmb3VuZCBvbiBzaXRlOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrIHRoaXMuZ2V0VVJMKCkpOw0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogcmUgaW5pdGlhbGl6ZSBjaGlsZHJlbiBvZiB0aGUgZmVhdHVyZSwgaW52YWxpZGF0ZSB0aGUgY2FjaGUNCi0JICogQHBhcmFtIHJlc3VsdCBGZWF0dXJlUmVmZXJlbmNlIHRvIHJlaW5pdGlhbGl6ZS4NCi0JICovDQotCXByaXZhdGUgdm9pZCByZWluaXRpYWxpemVGZWF0dXJlKElGZWF0dXJlUmVmZXJlbmNlIHJlZmVyZW5jZVRvUmVpbml0aWFsaXplKSB7DQotDQotCQlpZiAocmVmZXJlbmNlVG9SZWluaXRpYWxpemUgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikNCi0JCQlVcGRhdGVDb3JlLmRlYnVnKA0KLQkJCQkiUmUgaW5pdGlhbGl6ZSBmZWF0dXJlIHJlZmVyZW5jZToiICsgcmVmZXJlbmNlVG9SZWluaXRpYWxpemUpOyAvLyROT04tTkxTLTEkDQotDQotCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJZmVhdHVyZSA9IHJlZmVyZW5jZVRvUmVpbml0aWFsaXplLmdldEZlYXR1cmUobnVsbCk7DQotCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlIGluc3RhbmNlb2YgRmVhdHVyZSkgew0KLQkJCQkoKEZlYXR1cmUpIGZlYXR1cmUpLmluaXRpYWxpemVJbmNsdWRlZFJlZmVyZW5jZXMoKTsNCi0JCQl9DQotCQkJLy8gYnVnIDI0OTgxIC0gcmVjdXJzaXZlbHkgZ28gaW50byBoaWVyYXJjaHkNCi0JCQkvLyBvbmx5IGlmIHNpdGUgaWYgZmlsZSANCi0JCQlJU2l0ZSBzaXRlID0gcmVmZXJlbmNlVG9SZWluaXRpYWxpemUuZ2V0U2l0ZSgpOw0KLQkJCWlmIChzaXRlID09IG51bGwpDQotCQkJCXJldHVybjsNCi0JCQlVUkwgdXJsID0gc2l0ZS5nZXRVUkwoKTsNCi0JCQlpZiAodXJsID09IG51bGwpDQotCQkJCXJldHVybjsNCi0JCQlpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGluY2x1ZGVkID0NCi0JCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlyZWluaXRpYWxpemVGZWF0dXJlKGluY2x1ZGVkW2ldKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gZmlsdGVyRmVhdHVyZXMoZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBNZXRob2QgZmlsdGVyRmVhdHVyZXMuDQotCSAqIEFsc28gaW1wbGVtZW50ZWQgaW4gU2l0ZQ0KLQkgKiANCi0JICogQHBhcmFtIGxpc3QNCi0JICogQHJldHVybiBMaXN0DQotCSAqLw0KLQlwcml2YXRlIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBmaWx0ZXJGZWF0dXJlcyhJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gYWxsSW5jbHVkZWQpIHsNCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWlmIChhbGxJbmNsdWRlZCAhPSBudWxsKSB7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxJbmNsdWRlZC5sZW5ndGg7IGkrKykgew0KLQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGluY2x1ZGVkID0gYWxsSW5jbHVkZWRbaV07DQotCQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuaXNWYWxpZEVudmlyb25tZW50KGluY2x1ZGVkKSkNCi0JCQkJCWxpc3QuYWRkKGluY2x1ZGVkKTsNCi0JCQkJZWxzZSB7DQotCQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfV0FSTklOR1MpIHsNCi0JCQkJCQlVcGRhdGVDb3JlLndhcm4oDQotCQkJCQkJCSJGaWx0ZXJlZCBvdXQgZmVhdHVyZSByZWZlcmVuY2U6IiArIGluY2x1ZGVkKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIHJlc3VsdCA9DQotCQkJbmV3IElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbbGlzdC5zaXplKCldOw0KLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgew0KLQkJCWxpc3QudG9BcnJheShyZXN1bHQpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdOb25QbHVnaW5FbnRyaWVzKCkNCi0JICovDQotCXB1YmxpYyBJTm9uUGx1Z2luRW50cnlbXSBnZXROb25QbHVnaW5FbnRyaWVzKCkgew0KLQkJcmV0dXJuIGZpbHRlck5vblBsdWdpbkVudHJ5KGdldFJhd05vblBsdWdpbkVudHJpZXMoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIE1ldGhvZCBmaWx0ZXJQbHVnaW5FbnRyeS4NCi0JICogQHBhcmFtIGFsbA0KLQkgKiBAcmV0dXJuIElOb25QbHVnaW5FbnRyeVtdDQotCSAqLw0KLQlwcml2YXRlIElOb25QbHVnaW5FbnRyeVtdIGZpbHRlck5vblBsdWdpbkVudHJ5KElOb25QbHVnaW5FbnRyeVtdIGFsbCkgew0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJaWYgKGFsbCAhPSBudWxsKSB7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHsNCi0JCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5pc1ZhbGlkRW52aXJvbm1lbnQoYWxsW2ldKSkNCi0JCQkJCWxpc3QuYWRkKGFsbFtpXSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJSU5vblBsdWdpbkVudHJ5W10gcmVzdWx0ID0gbmV3IElOb25QbHVnaW5FbnRyeVtsaXN0LnNpemUoKV07DQotCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7DQotCQkJbGlzdC50b0FycmF5KHJlc3VsdCk7DQotCQl9DQotDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2dldFJhd1BsdWdpbkVudHJpZXMoKQ0KLQkgKi8NCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKSB7DQotCQlyZXR1cm4gZmlsdGVyUGx1Z2luRW50cnkoZ2V0UmF3UGx1Z2luRW50cmllcygpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRJbXBvcnRzKCkNCi0JICovDQotCXB1YmxpYyBJSW1wb3J0W10gZ2V0SW1wb3J0cygpIHsNCi0JCXJldHVybiBmaWx0ZXJJbXBvcnRzKGdldFJhd0ltcG9ydHMoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIE1ldGhvZCBmaWx0ZXJJbXBvcnRzLg0KLQkgKiBAcGFyYW0gYWxsDQotCSAqIEByZXR1cm4gSUltcG9ydFtdDQotCSAqLw0KLQlwcml2YXRlIElJbXBvcnRbXSBmaWx0ZXJJbXBvcnRzKElJbXBvcnRbXSBhbGwpIHsNCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWlmIChhbGwgIT0gbnVsbCkgew0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7DQotCQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuaXNWYWxpZEVudmlyb25tZW50KGFsbFtpXSkpDQotCQkJCQlsaXN0LmFkZChhbGxbaV0pOw0KLQkJCX0NCi0JCX0NCi0NCi0JCUlJbXBvcnRbXSByZXN1bHQgPSBuZXcgSUltcG9ydFtsaXN0LnNpemUoKV07DQotCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7DQotCQkJbGlzdC50b0FycmF5KHJlc3VsdCk7DQotCQl9DQotDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9GZWF0dXJlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTg2YTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9GZWF0dXJlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgYSBmZWF0dXJlIGNvbnRlbnQgcHJvdmlkZXIuIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzZXQKLSAqIG9mIGhlbHBlciBtZXRob2RzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGZlYXR1cmUgY29udGVudCBwcm92aWRlcnMuIEluCi0gKiBwYXJ0aWN1bGFyLCBtZXRob2RzIGRlYWxpbmcgd2l0aCBkb3dubG9hZGluZyBhbmQgY2FjaGluZyBvZiBmZWF0dXJlIGZpbGVzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG11c3QgYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50UHJvdmlkZXIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVDb250ZW50UHJvdmlkZXIKLQlpbXBsZW1lbnRzIElGZWF0dXJlQ29udGVudFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1dJVENIX0NPUFlfTE9DQUwgPSB0cnVlOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBjbGFzcyBGaWxlRmlsdGVyIHsKLQotCQlwcml2YXRlIElQYXRoIGZpbHRlclBhdGggPSBudWxsOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvciBmb3IgRmlsZUZpbHRlci4KLQkJICovCi0JCXB1YmxpYyBGaWxlRmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmZpbHRlclBhdGggPSBuZXcgUGF0aChmaWx0ZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZSBtYXRjaGVzIHRoZSBydWxlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIG5hbWUpIHsKLQotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIG5vICcqJyBwYXR0ZXJuIG1hdGNoaW5nCi0JCQkvLyBtdXN0IGJlIGVxdWFscwotCQkJSVBhdGggbmFtZVBhdGggPSBuZXcgUGF0aChuYW1lKTsKLQkJCWlmIChmaWx0ZXJQYXRoLmxhc3RTZWdtZW50KCkuaW5kZXhPZignKicpID09IC0xKSB7Ci0JCQkJcmV0dXJuIGZpbHRlclBhdGguZXF1YWxzKG5hbWVQYXRoKTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgc2FtZSBmaWxlIGV4dGVuc2lvbiBpZiBleHRlbnNpb24gZXhpc3RzIChhLnR4dC8qLnR4dCkKLQkJCS8vIG9yIHNhbWUgZmlsZSBuYW1lIChhLnR4dCxhLiopCi0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gZmlsdGVyUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlpZiAoIWV4dGVuc2lvbi5lcXVhbHMoIioiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShuYW1lUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCUlQYXRoIG5vRXh0ZW5zaW9uID0gZmlsdGVyUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJU3RyaW5nIGZpbGVOYW1lID0gbm9FeHRlbnNpb24ubGFzdFNlZ21lbnQoKTsKLQkJCQlpZiAoIWZpbGVOYW1lLmVxdWFscygiKiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKCFuYW1lUGF0aC5sYXN0U2VnbWVudCgpLnN0YXJ0c1dpdGgoZmlsZU5hbWUpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gY2hlY2sgc2FtZSBwYXRoCi0JCQlJUGF0aCBwMSA9IG5hbWVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCUlQYXRoIHAyID0gZmlsdGVyUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlyZXR1cm4gcDEuZXF1YWxzKHAyKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBVUkwgYmFzZTsKLQlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7Ci0JcHJpdmF0ZSBGaWxlIHRtcERpcjsgLy8gbG9jYWwgd29yayBhcmVhIGZvciBlYWNoIHByb3ZpZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVEVOU0lPTiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfUEVSTUlTU0lPTlMgPSAicGVybWlzc2lvbnMucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ1VUQUJMRVMgPSAicGVybWlzc2lvbnMuZXhlY3V0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGxvY2sKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLQotCS8vIGhhc2h0YWJsZSBvZiBsb2NrcwotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBsb2NrcyA9IG5ldyBIYXNodGFibGUoKTsKLQotCS8qKgotCSAqIEZlYXR1cmUgY29udGVudCBwcm92aWRlciBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICBmZWF0dXJlIFVSTC4gVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgVVJMIGlzIHNwZWNpZmljIHRvCi0JICogICAgICAgICAgICBlYWNoIGNvbnRlbnQgcHJvdmlkZXIuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBGZWF0dXJlQ29udGVudFByb3ZpZGVyKFVSTCBiYXNlKSB7Ci0JCXRoaXMuYmFzZSA9IGJhc2U7Ci0JCXRoaXMuZmVhdHVyZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSB1cmwuCi0JICogCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRVUkwoKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlyZXR1cm4gYmFzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuCi0JICogCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlKCkKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZW50IHByb3ZpZGVyLgotCSAqIAotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjc2V0RmVhdHVyZShJRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgcmVmZXJlbmNlIGFzIGEgbG9jYWwgZmlsZSBzeXN0ZW0gcmVmZXJlbmNlLiBJZgotCSAqIHJlcXVpcmVkLCB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgcmVmZXJlbmNlIGlzCi0JICogZmlyc3QgZG93bmxvYWRlZCB0byB0aGUgbG9jYWwgc3lzdGVtCi0JICogCi0JICogQHBhcmFtIHJlZgotCSAqICAgICAgICAgICAgY29udGVudCByZWZlcmVuY2UKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgcHJvZ3Jlc3MgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBhc0xvY2FsUmVmZXJlbmNlKAotCQlDb250ZW50UmVmZXJlbmNlIHJlZiwKLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbHJlYWR5IGEgbG9jYWwgcmVmZXJlbmNlCi0JCWlmIChyZWYuaXNMb2NhbFJlZmVyZW5jZSgpKQotCQkJcmV0dXJuIHJlZjsKLQotCQkvLyBjaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgbG9jYWwgZmlsZSBmb3IgdGhpcyByZWZlcmVuY2UKLQkJU3RyaW5nIGtleSA9IHJlZi50b1N0cmluZygpOwotCi0JCS8vIG5lZWQgdG8gc3luY2ggYXMgYW5vdGhlciB0aHJlYWQgbXkgaGF2ZSBjcmVhdGVkIHRoZSBmaWxlIGJ1dAotCQkvLyBpcyBzdGlsbCBjb3B5aW5nIGludG8gaXQKLQkJRmlsZSBsb2NhbEZpbGUgPSBudWxsOwotCQlGaWxlRnJhZ21lbnQgbG9jYWxGaWxlRnJhZ21lbnQgPSBudWxsOwotCQlPYmplY3Qga2V5TG9jayA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJaWYgKGxvY2tzLmdldChrZXkpID09IG51bGwpCi0JCQkJbG9ja3MucHV0KGtleSwga2V5KTsKLQkJCWtleUxvY2sgPSBsb2Nrcy5nZXQoa2V5KTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCAoa2V5TG9jaykgewotCQkJbG9jYWxGaWxlID0gVXRpbGl0aWVzLmxvb2t1cExvY2FsRmlsZShrZXkpOwotCQkJaWYgKGxvY2FsRmlsZSAhPSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGhlIGNhY2hlZCBmaWxlIGlzIHN0aWxsIHZhbGlkIChubyBuZXdlciB2ZXJzaW9uIG9uCi0JCQkJLy8gc2VydmVyKQotCQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMKLQkJCQkJLmlzU2FtZVRpbWVzdGFtcChyZWYuYXNVUkwoKSwgbG9jYWxGaWxlLmxhc3RNb2RpZmllZCgpKSkKLQkJCQkJcmV0dXJuIHJlZi5jcmVhdGVDb250ZW50UmVmZXJlbmNlKAotCQkJCQkJcmVmLmdldElkZW50aWZpZXIoKSwKLQkJCQkJCWxvY2FsRmlsZSk7Ci0JCQl9Ci0KLQkJCWlmIChsb2NhbEZpbGUgPT0gbnVsbCkgewotCQkJCWxvY2FsRmlsZUZyYWdtZW50ID0KLQkJCQkJVXBkYXRlTWFuYWdlclV0aWxzLmxvb2t1cExvY2FsRmlsZUZyYWdtZW50KGtleSk7Ci0JCQl9Ci0JCQkvLyAKLQkJCS8vIGRvd25sb2FkIHRoZSByZWZlcmVuY2VkIGZpbGUgaW50byBsb2NhbCB0ZW1wb3JhcnkgYXJlYQotCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJCWxvbmcgYnl0ZXNDb3BpZWQgPSAwOwotCQkJbG9uZyBpbnB1dExlbmd0aCA9IDA7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNhdmVTdGF0ZSgpOwotCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoCi0JCQkJCVBvbGljeS5iaW5kKCJGZWF0dXJlQ29udGVudFByb3ZpZGVyLkRvd25sb2FkaW5nIikpOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvci5zdWJUYXNrKHJlZi5nZXRJZGVudGlmaWVyKCkgKyAiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvci5zZXRUb3RhbENvdW50KHJlZi5nZXRJbnB1dFNpemUoKSk7Ci0JCQkJbW9uaXRvci5zaG93Q29weURldGFpbHModHJ1ZSk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKGxvY2FsRmlsZUZyYWdtZW50ICE9IG51bGwKLQkJCQkJJiYgImh0dHAiLmVxdWFscyhyZWYuYXNVUkwoKS5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2FsRmlsZSA9IGxvY2FsRmlsZUZyYWdtZW50LmdldEZpbGUoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIGdldCBwYXJ0aWFsIGlucHV0IHN0cmVhbQotCQkJCQkJaXMgPQotCQkJCQkJCXJlZi5nZXRQYXJ0aWFsSW5wdXRTdHJlYW0oCi0JCQkJCQkJCWxvY2FsRmlsZUZyYWdtZW50LmdldFNpemUoKSk7Ci0JCQkJCQlpbnB1dExlbmd0aCA9IHJlZi5nZXRJbnB1dFNpemUoKS1sb2NhbEZpbGVGcmFnbWVudC5nZXRTaXplKCk7IAotCQkJCQkJLy8gZ2V0IG91dHB1dCBzdHJlYW0gdG8gYXBwZW5kIHRvIGZpbGUgZnJhZ21lbnQKLQkJCQkJCW9zID0KLQkJCQkJCQluZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCi0JCQkJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvY2FsRmlsZSwgdHJ1ZSkpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQkJCQlpcy5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCQl9Ci0JCQkJCQlpcyA9IG51bGw7Ci0JCQkJCQlvcyA9IG51bGw7Ci0JCQkJCQlsb2NhbEZpbGVGcmFnbWVudCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGlzID09IG51bGwpIHsKLQkJCQkJLy8gbXVzdCBkb3dubG9hZCBmcm9tIHNjcmF0Y2gKLQkJCQkJbG9jYWxGaWxlID0KLQkJCQkJCVV0aWxpdGllcy5jcmVhdGVMb2NhbEZpbGUoZ2V0V29ya2luZ0RpcmVjdG9yeSgpLCBudWxsKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlzID0gcmVmLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQlpbnB1dExlbmd0aCA9IHJlZi5nZXRJbnB1dFNpemUoKTsgCi0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJCQkiRmVhdHVyZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb1JldHJpZXZlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQluZXcgT2JqZWN0W10geyByZWYgfSksCi0JCQkJCQkJZSk7Ci0JCQkJCX0KLQotCQkJCQl0cnkgewotCQkJCQkJb3MgPQotCQkJCQkJCW5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKLQkJCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0obG9jYWxGaWxlKSk7Ci0JCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJCQlQb2xpY3kuYmluZCgKLQkJCQkJCQkJIkZlYXR1cmVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9DcmVhdGUiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCW5ldyBPYmplY3RbXSB7IGxvY2FsRmlsZSB9KSwKLQkJCQkJCQllKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCURhdGUgc3RhcnQgPSBuZXcgRGF0ZSgpOwotCQkJCWlmIChsb2NhbEZpbGVGcmFnbWVudCAhPSBudWxsKSB7Ci0JCQkJCWJ5dGVzQ29waWVkID0gbG9jYWxGaWxlRnJhZ21lbnQuZ2V0U2l6ZSgpOwotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQltb25pdG9yLmluY3JlbWVudENvdW50KGJ5dGVzQ29waWVkKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFRyYW5zZmVyIGFzIG1hbnkgYnl0ZXMgYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQgc3RyZWFtCi0JCQkJbG9uZyBvZmZzZXQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuY29weShpcywgb3MsIG1vbml0b3IsIGlucHV0TGVuZ3RoKTsKLQkJCQlpZiAob2Zmc2V0ICE9IC0xKSB7Ci0JCQkJCWJ5dGVzQ29waWVkICs9IG9mZnNldDsKLQkJCQkJaWYgKGJ5dGVzQ29waWVkID4gMCkgewotCQkJCQkJLy8gcHJlc2VydmUgcGFydGlhbGx5IGRvd25sb2FkZWQgZmlsZQotCQkJCQkJVXBkYXRlTWFuYWdlclV0aWxzLm1hcExvY2FsRmlsZUZyYWdtZW50KAotCQkJCQkJCQlrZXksCi0JCQkJCQkJCW5ldyBGaWxlRnJhZ21lbnQobG9jYWxGaWxlLCBieXRlc0NvcGllZCkpOwotCQkJCQl9Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJGZWF0dXJlLkluc3RhbGxhdGlvbkNhbmNlbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl0aHJvdyBuZXcgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24obXNnLCBudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBGZWF0dXJlRG93bmxvYWRFeGNlcHRpb24oCi0JCQkJCQkJUG9saWN5LmJpbmQoCi0JCQkJCQkJCSJGZWF0dXJlQ29udGVudFByb3ZpZGVyLkV4Y2VwdGlvbkRvd25sb2FkaW5nIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQluZXcgT2JqZWN0W10geyBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpfSksCi0JCQkJCQkJbmV3IElPRXhjZXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJVXBkYXRlTWFuYWdlclV0aWxzLnVuTWFwTG9jYWxGaWxlRnJhZ21lbnQoa2V5KTsKLQkJCQl9Ci0KLQkJCQlEYXRlIHN0b3AgPSBuZXcgRGF0ZSgpOwotCQkJCWxvbmcgdGltZUluc2Vjb25kcyA9IChzdG9wLmdldFRpbWUoKSAtIHN0YXJ0LmdldFRpbWUoKSkgLyAxMDAwOwotCQkJCS8vIHRpbWUgaW4gbWlsbGlzZWNvbmRzIC8xMDAwID0gdGltZSBpbiBzZWNvbmRzCi0JCQkJSW50ZXJuYWxTaXRlTWFuYWdlci5kb3dubG9hZGVkKAotCQkJCQlyZWYuZ2V0SW5wdXRTaXplKCksCi0JCQkJCSh0aW1lSW5zZWNvbmRzKSwKLQkJCQkJcmVmLmFzVVJMKCkpOwotCi0JCQkJc3VjY2VzcyA9IHRydWU7Ci0KLQkJCQkvLyBmaWxlIGlzIGRvd25sb2FkZWQgc3VjY2VzZnVsbHksIG1hcCBpdAotCQkJCVV0aWxpdGllcy5tYXBMb2NhbEZpbGUoa2V5LCBsb2NhbEZpbGUpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJUG9saWN5LmJpbmQoCi0JCQkJCQkiRmVhdHVyZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb0NyZWF0ZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW5ldyBPYmplY3RbXSB7IGxvY2FsRmlsZSB9KSwKLQkJCQkJZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vRG8gbm90IGNsb3NlIElTIGlmIHVzZXIgY2FuY2VsLAotCQkJCS8vY2xvc2luZyBJUyB3aWxsIHJlYWQgdGhlIGVudGlyZSBTdHJlYW0gdW50aWwgdGhlIGVuZAotCQkJCWlmIChzdWNjZXNzICYmIGlzICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlpcy5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQlpZiAob3MgIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCW9zLmNsb3NlKCk7IC8vIHNob3VsZCBmbHVzaCBidWZmZXIgc3RyZWFtCi0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCi0JCQkJaWYgKHN1Y2Nlc3MgfHwgYnl0ZXNDb3BpZWQgPiAwKSB7Ci0JCQkJCS8vIHNldCB0aGUgdGltZXN0YW1wIG9uIHRoZSB0ZW1wIGZpbGUgdG8gbWF0Y2ggdGhlIHJlbW90ZQotCQkJCQkvLyB0aW1lc3RhbXAKLQkJCQkJbG9jYWxGaWxlLnNldExhc3RNb2RpZmllZChyZWYuZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQkJCX0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCQltb25pdG9yLnJlc3RvcmVTdGF0ZSgpOwotCQkJfQotCQkJbG9ja3MucmVtb3ZlKGtleSk7Ci0JCX0gLy8gZW5kIGxvY2sKLQkJQ29udGVudFJlZmVyZW5jZSByZWZlcmVuY2UgPQotCQkJcmVmLmNyZWF0ZUNvbnRlbnRSZWZlcmVuY2UocmVmLmdldElkZW50aWZpZXIoKSwgbG9jYWxGaWxlKTsKLQkJcmV0dXJuIHJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgcmVmZXJlbmNlIGFzIGEgbG9jYWwgZmlsZS4gSWYgcmVxdWlyZWQsIHRoZSBmaWxlCi0JICogcmVwcmVzZW50ZWQgYnkgdGhlIHNwZWNpZmllZCBjb250ZW50IHJlZmVyZW5jZSBpcyBmaXJzdCBkb3dubG9hZGVkIHRvCi0JICogdGhlIGxvY2FsIHN5c3RlbQotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgcmVmZXJlbmNlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEZpbGUgYXNMb2NhbEZpbGUoQ29udGVudFJlZmVyZW5jZSByZWYsIEluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUZpbGUgZmlsZSA9IHJlZi5hc0ZpbGUoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAhU1dJVENIX0NPUFlfTE9DQUwpCi0JCQlyZXR1cm4gZmlsZTsKLQkJQ29udGVudFJlZmVyZW5jZSBsb2NhbFJlZiA9IGFzTG9jYWxSZWZlcmVuY2UocmVmLCBtb25pdG9yKTsKLQkJZmlsZSA9IGxvY2FsUmVmLmFzRmlsZSgpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGlzIGNvbnRlbnQgcHJvdmlkZXIKLQkgKiAKLQkgKiBAcmV0dXJuIHdvcmtpbmcgZGlyZWN0b3J5Ci0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRmlsZSBnZXRXb3JraW5nRGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHRtcERpciA9PSBudWxsKQotCQkJdG1wRGlyID0gVXRpbGl0aWVzLmNyZWF0ZVdvcmtpbmdEaXJlY3RvcnkoKTsKLQkJcmV0dXJuIHRtcERpcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIGFsbCBhcmNoaXZlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmllZAotCSAqIHBsdWctaW4gYW5kIG5vbi1wbHVnLWluIGVudHJpZXMgKHRoZSAicGFja2FnaW5nIiB2aWV3KS4KLQkgKiAKLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldERvd25sb2FkU2l6ZUZvcihJUGx1Z2luRW50cnlbXSwKLQkgKiAgICAgIElOb25QbHVnaW5FbnRyeVtdKQotCSAqLwotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZUZvcigKLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcywKLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRW50cmllcykgewotCQlsb25nIHJlc3VsdCA9IDA7Ci0KLQkJLy8gaWYgYm90aCBhcmUgbnVsbCBvciBlbXB0eSwgcmV0dXJuIFVOS05PV04gc2l6ZQotCQlpZiAoKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKQotCQkJJiYgKG5vblBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBub25QbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsKLQkJfQotCi0JCS8vIGxvb3Agb24gcGx1Z2luIGVudHJpZXMKLQkJbG9uZyBzaXplID0gMDsKLQkJaWYgKHBsdWdpbkVudHJpZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCXNpemUgPSAoKFBsdWdpbkVudHJ5TW9kZWwpIHBsdWdpbkVudHJpZXNbaV0pLmdldERvd25sb2FkU2l6ZSgpOwotCQkJCWlmIChzaXplID09IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkgewotCQkJCQlyZXR1cm4gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFOwotCQkJCX0KLQkJCQlyZXN1bHQgKz0gc2l6ZTsKLQkJCX0KLQotCQkvLyBsb29wIG9uIG5vbiBwbHVnaW4gZW50cmllcwotCQlpZiAobm9uUGx1Z2luRW50cmllcyAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25QbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2l6ZSA9Ci0JCQkJCSgoTm9uUGx1Z2luRW50cnlNb2RlbCkgbm9uUGx1Z2luRW50cmllc1tpXSkKLQkJCQkJCS5nZXREb3dubG9hZFNpemUoKTsKLQkJCQlpZiAoc2l6ZSA9PSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpIHsKLQkJCQkJcmV0dXJuIENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsKLQkJCQl9Ci0JCQkJcmVzdWx0ICs9IHNpemU7Ci0JCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIGFsbCBmaWxlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmllZCBwbHVnLWluCi0JICogYW5kIG5vbi1wbHVnLWluIGVudHJpZXMgKHRoZSAibG9naWNhbCIgdmlldykuCi0JICogCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRJbnN0YWxsU2l6ZUZvcihJUGx1Z2luRW50cnlbXSwKLQkgKiAgICAgIElOb25QbHVnaW5FbnRyeVtdKQotCSAqLwotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplRm9yKAotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5FbnRyaWVzLAotCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5FbnRyaWVzKSB7Ci0JCWxvbmcgcmVzdWx0ID0gMDsKLQotCQkvLyBpZiBib3RoIGFyZSBudWxsIG9yIGVtcHR5LCByZXR1cm4gVU5LTk9XTiBzaXplCi0JCWlmICgocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApCi0JCQkmJiAobm9uUGx1Z2luRW50cmllcyA9PSBudWxsIHx8IG5vblBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFOwotCQl9Ci0KLQkJLy8gbG9vcCBvbiBwbHVnaW4gZW50cmllcwotCQlsb25nIHNpemUgPSAwOwotCQlpZiAocGx1Z2luRW50cmllcyAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2l6ZSA9ICgoUGx1Z2luRW50cnlNb2RlbCkgcGx1Z2luRW50cmllc1tpXSkuZ2V0SW5zdGFsbFNpemUoKTsKLQkJCQlpZiAoc2l6ZSA9PSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpIHsKLQkJCQkJcmV0dXJuIENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsKLQkJCQl9Ci0JCQkJcmVzdWx0ICs9IHNpemU7Ci0JCQl9Ci0KLQkJLy8gbG9vcCBvbiBub24gcGx1Z2luIGVudHJpZXMKLQkJaWYgKG5vblBsdWdpbkVudHJpZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uUGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCXNpemUgPQotCQkJCQkoKE5vblBsdWdpbkVudHJ5TW9kZWwpIG5vblBsdWdpbkVudHJpZXNbaV0pCi0JCQkJCQkuZ2V0SW5zdGFsbFNpemUoKTsKLQkJCQlpZiAoc2l6ZSA9PSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpIHsKLQkJCQkJcmV0dXJuIENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsKLQkJCQl9Ci0JCQkJcmVzdWx0ICs9IHNpemU7Ci0JCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIGlkZW50aWZpZXIgZm9yIGEgcGx1Z2luIGVudHJ5LiA8Y29kZT5wbHVnaW5zLyZsdDtwbHVnaW5JZD5fJmx0O3BsdWdpblZlcnNpb24+LmphcjwvY29kZT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIGlkZW50aWZpZXIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhdGhJRChJUGx1Z2luRW50cnkgZW50cnkpIHsKLQkJcmV0dXJuIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSAotCQkJKyBlbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKQotCQkJKyBKQVJfRVhURU5TSU9OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggaWRlbnRpZmVyIGZvciBhIG5vbiBwbHVnaW4gZW50cnkuIDxjb2RlPmZlYXR1cmVzLyZsdDtmZWF0dXJlSWQ+XyZsdDtmZWF0dXJlVmVyc2lvbj4vJmx0O2RhdGFJZD48L2NvZGU+Ci0JICogCi0JICogQHJldHVybiB0aGUgcGF0aCBpZGVudGlmaWVyCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoSUQoSU5vblBsdWdpbkVudHJ5IGVudHJ5KSB7Ci0JCVN0cmluZyBub25QbHVnaW5CYXNlSUQgPQotCQkJU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSAotCQkJCSsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKQotCQkJCSsgIi8iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBub25QbHVnaW5CYXNlSUQgKyBlbnRyeS5nZXRJZGVudGlmaWVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGVybWlzc2lvbiBvZiBhbGwgdGhlIENvbnRlbnRSZWZlcmVuY2VzIENoZWNrIGZvciB0aGUKLQkgKiAucGVybWlzc2lvbnMgY29udGVudFJlZmVyZW5jZSBhbmQgdXNlIGl0IHRvIHNldCB0aGUgcGVybWlzc2lvbnMgb2Ygb3RoZXIKLQkgKiBDb250ZW50UmVmZXJlbmNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQZXJtaXNzaW9ucyhDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcykgewotCi0JCWlmIChyZWZlcmVuY2VzID09IG51bGwgfHwgcmVmZXJlbmNlcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlNYXAgcGVybWlzc2lvbnMgPSBnZXRQZXJtaXNzaW9ucyhyZWZlcmVuY2VzKTsKLQkJaWYgKHBlcm1pc3Npb25zLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbaV07Ci0JCQlTdHJpbmcgaWQgPSBjb250ZW50UmVmZXJlbmNlLmdldElkZW50aWZpZXIoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCQlpZiAoKHZhbHVlID0gbWF0Y2hlc09uZVJ1bGUoaWQsIHBlcm1pc3Npb25zKSkgIT0gbnVsbCkgewotCQkJCUludGVnZXIgcGVybWlzc2lvbiA9IChJbnRlZ2VyKSB2YWx1ZTsKLQkJCQljb250ZW50UmVmZXJlbmNlLnNldFBlcm1pc3Npb24ocGVybWlzc2lvbi5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBtYXRjaGluZyBydWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBmb3VuZC4gQSBydWxlIGlzIG1hdGNoZWQgaWYgdGhlIGlkIGlzIGVxdWFscyB0byBhIGtleSwgb3IgaWYgdGhlIGlkIGlzCi0JICogcmVzb2x2ZWQgYnkgYSBrZXkuIGlmIHRoZSBpZCBpcyA8Y29kZT4vcGF0aC9maWxlLnR4dDwvY29kZT4gaXQgaXMKLQkgKiByZXNvbHZlZCBieSA8Y29kZT4vcGF0aC8qPC9jb2RlPiBvciA8Y29kZT4vcGF0aC8qLnR4dDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyCi0JICogQHBhcmFtIHBlcm1pc3Npb25zCi0JICogICAgICAgICAgICBsaXN0IG9mIHJ1bGVzCi0JICogQHJldHVybiBPYmplY3QgdGhlIHZhbHVlIG9mIHRoZSBtYXRjaW5nIHJ1bGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBtYXRjaGVzT25lUnVsZShTdHJpbmcgaWQsIE1hcCBwZXJtaXNzaW9ucykgewotCi0JCVNldCBrZXlTZXQgPSBwZXJtaXNzaW9ucy5rZXlTZXQoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGtleVNldC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUZpbGVGaWx0ZXIgcnVsZSA9IChGaWxlRmlsdGVyKSBpdGVyLm5leHQoKTsKLQkJCWlmIChydWxlLmFjY2VwdChpZCkpIHsKLQkJCQlyZXR1cm4gcGVybWlzc2lvbnMuZ2V0KHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiByZXR1cm5zIHRoZSBwZXJtaXNzaW9uIE1BUAotCSAqLwotCXByaXZhdGUgTWFwIGdldFBlcm1pc3Npb25zKENvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzKSB7Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIHNlYXJjaCBmb3IgLnBlcm1pc3Npb25zCi0JCWJvb2xlYW4gbm90Zm91bmQgPSB0cnVlOwotCQlDb250ZW50UmVmZXJlbmNlIHBlcm1pc3Npb25SZWZlcmVuY2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoICYmIG5vdGZvdW5kOyBpKyspIHsKLQkJCUNvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbaV07Ci0JCQlpZiAoRE9UX1BFUk1JU1NJT05TLmVxdWFscyhjb250ZW50UmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQlub3Rmb3VuZCA9IGZhbHNlOwotCQkJCXBlcm1pc3Npb25SZWZlcmVuY2UgPSBjb250ZW50UmVmZXJlbmNlOwotCQkJfQotCQl9Ci0JCWlmIChub3Rmb3VuZCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJUHJvcGVydGllcyBwcm9wID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJdHJ5IHsKLQkJCXByb3AubG9hZChwZXJtaXNzaW9uUmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgZXhlY3V0YWJsZXMgPSBwcm9wLmdldFByb3BlcnR5KEVYRUNVVEFCTEVTKTsKLQkJaWYgKGV4ZWN1dGFibGVzID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4ZWN1dGFibGVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCUludGVnZXIgZGVmYXVsdEV4ZWN1dGFibGVQZXJtaXNzaW9uID0KLQkJCW5ldyBJbnRlZ2VyKENvbnRlbnRSZWZlcmVuY2UuREVGQVVMVF9FWEVDVVRBQkxFX1BFUk1JU1NJT04pOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcih0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJcmVzdWx0LnB1dChmaWx0ZXIsIGRlZmF1bHRFeGVjdXRhYmxlUGVybWlzc2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvRmVhdHVyZVJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9GZWF0dXJlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTJhYzguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9GZWF0dXJlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgYSBmZWF0dXJlIHJlZmVyZW5jZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4gCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlUmVmZXJlbmNlTW9kZWwKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVSZWZlcmVuY2UgZXh0ZW5kcyBGZWF0dXJlUmVmZXJlbmNlTW9kZWwgaW1wbGVtZW50cyBJRmVhdHVyZVJlZmVyZW5jZSwgSVBsYXRmb3JtRW52aXJvbm1lbnQgewotCi0JcHJpdmF0ZSBWZXJzaW9uZWRJZGVudGlmaWVyIHZlcnNpb25JZDsKLQotCS8vUEVSRjogbmV3IGluc3RhbmNlIHZhcmlhYmxlCi0JcHJpdmF0ZSBJRmVhdHVyZSBleGFjdEZlYXR1cmU7Ci0KLQkvKioKLQkgKiBGZWF0dXJlIHJlZmVyZW5jZSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEZlYXR1cmVSZWZlcmVuY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgRmVhdHVyZVJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gcmVmIHRoZSByZWZlcmVuY2UgdG8gY29weQotCSAqLwotCXB1YmxpYyBGZWF0dXJlUmVmZXJlbmNlKElGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQlzdXBlcigoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSByZWYpOwotCQl0cnkgewotCQkJc2V0VVJMKHJlZi5nZXRVUkwoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgRmVhdHVyZVJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gcmVmIHRoZSByZWZlcmVuY2UgdG8gY29weQotCSAqLwotCXB1YmxpYyBGZWF0dXJlUmVmZXJlbmNlKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCByZWYpIHsKLQkJc3VwZXIocmVmKTsKLQkJdHJ5IHsKLQkJCXNldFVSTChyZWYuZ2V0VVJMKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgdGhpcyByZWZlcmVuY2UgcG9pbnRzIHRvIAotCSAqIEByZXR1cm4gdGhlIGZlYXR1cmUgb24gdGhlIFNpdGUKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RmVhdXJlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRGZWF0dXJlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgdGhpcyByZWZlcmVuY2UgcG9pbnRzIHRvIAotCSAqICBAcmV0dXJuIHRoZSBmZWF0dXJlIG9uIHRoZSBTaXRlCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGV4YWN0RmVhdHVyZSAhPSBudWxsKQotCQkJcmV0dXJuIGV4YWN0RmVhdHVyZTsKLQkJZXhhY3RGZWF0dXJlID0gZ2V0RmVhdHVyZSh0aGlzLG1vbml0b3IpOwotCQlyZXR1cm4gZXhhY3RGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgdGhlIHJlZmVyZW5jZSBwb2ludHMgdG8gCi0JICogQHBhcmFtIHJlZiB0aGUgZmVhdHVyZSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuIHRoZSBmZWF0dXJlIG9uIHRoZSBTaXRlCi0JICovCi0JcHJvdGVjdGVkIElGZWF0dXJlIGdldEZlYXR1cmUoSUZlYXR1cmVSZWZlcmVuY2UgcmVmLElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOwotCQlVUkwgcmVmVVJMID0gcmVmLmdldFVSTCgpOwotCQlmZWF0dXJlID0gY3JlYXRlRmVhdHVyZShyZWZVUkwsbW9uaXRvcik7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qCi0JICogY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgY29uY3JldGUgZmVhdHVyZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmVmZXJlbmNlCi0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0VHlwZSgpOwotCQlJU2l0ZSBzaXRlID0gZ2V0U2l0ZSgpOwotCQkvLyBpZiB0aGUgc2l0ZSBleGlzdHMsIHVzZSB0aGUgc2l0ZSBmYWN0b3J5Ci0JCWlmIChzaXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBzaXRlLmNyZWF0ZUZlYXR1cmUodHlwZSwgdXJsLCBtb25pdG9yKTsKLQkJfQotCQkKLQkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3J5KHR5cGUpOwotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVGZWF0dXJlKHVybCwgc2l0ZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXBkYXRlIHNpdGUgZm9yIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUKLQkgKiAKLQkgKiBAc2VlIElGZWF0dXJlUmVmZXJlbmNlI2dldFNpdGUoKQotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7Ci0JCXJldHVybiAoSVNpdGUpIGdldFNpdGVNb2RlbCgpOwotCX0KLQotCS8qKiAKLQkgKiBTZXRzIHRoZSBmZWF0dXJlIHJlZmVyZW5jZSBVUkwuCi0JICogVGhpcyBpcyB0eXBpY2FsbHkgcGVyZm9ybWVkIGFzIHBhcnQgb2YgdGhlIGZlYXR1cmUgcmVmZXJlbmNlIGNyZWF0aW9uCi0JICogb3BlcmF0aW9uLiBPbmNlIHNldCwgdGhlIHVybCBzaG91bGQgbm90IGJlIHJlc2V0LgotCSAqIAotCSAqIEBzZWUgSUZlYXR1cmVSZWZlcmVuY2Ujc2V0VVJMKFVSTCkKLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJc2V0VVJMU3RyaW5nKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCXRyeSB7Ci0JCQkJcmVzb2x2ZSh1cmwsIG51bGwpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRmVhdHVyZVJlZmVyZW5jZS5VbmFibGVUb1Jlc29sdmVVUkwiLCB1cmwudG9FeHRlcm5hbEZvcm0oKSksIGUpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGVzIGEgc2l0ZSB3aXRoIHRoZSBmZWF0dXJlIHJlZmVyZW5jZS4KLQkgKiBUaGlzIGlzIHR5cGljYWxseSBwZXJmb3JtZWQgYXMgcGFydCBvZiB0aGUgZmVhdHVyZSByZWZlcmVuY2UgY3JlYXRpb24KLQkgKiBvcGVyYXRpb24uIE9uY2Ugc2V0LCB0aGUgc2l0ZSBzaG91bGQgbm90IGJlIHJlc2V0LgotCSAqIAotCSAqIEBzZWUgSUZlYXR1cmVSZWZlcmVuY2Ujc2V0U2l0ZShJU2l0ZSkKLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpdGUoSVNpdGUgc2l0ZSkgewotCQlzZXRTaXRlTW9kZWwoKFNpdGVNb2RlbCkgc2l0ZSk7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIuCi0JKiAKLQkqIEBzZWUgSUZlYXR1cmVSZWZlcmVuY2UjZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JKiBAc2luY2UgMi4wCi0JKi8KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgewotCi0JCWlmICh2ZXJzaW9uSWQgIT0gbnVsbCkKLQkJCXJldHVybiB2ZXJzaW9uSWQ7Ci0KLQkJU3RyaW5nIGlkID0gZ2V0RmVhdHVyZUlkZW50aWZpZXIoKTsKLQkJU3RyaW5nIHZlciA9IGdldEZlYXR1cmVWZXJzaW9uKCk7Ci0JCWlmIChpZCAhPSBudWxsICYmIHZlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXZlcnNpb25JZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLCB2ZXIpOwotCQkJCXJldHVybiB2ZXJzaW9uSWQ7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGNyZWF0ZSB2ZXJzaW9uZWQgaWRlbnRpZmllcjoiICsgaWQgKyAiOiIgKyB2ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JCS8vIHdlIG5lZWQgdGhlIGV4YWN0IG1hdGNoIG9yIHdlIG1heSBoYXZlIGFuIGluZmluaXRlIGxvb3AKLQkJdmVyc2lvbklkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSwgbnVsbCk7Ci0JCXRyeSB7Ci0JCQl2ZXJzaW9uSWQgPSBnZXRGZWF0dXJlKG51bGwpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHZlcnNpb25JZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHN1cGVyLmdldExhYmVsKCkgIT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5nZXRMYWJlbCgpOwotCQl0cnkgewotCQkJcmV0dXJuIGdldEZlYXR1cmUobnVsbCkuZ2V0TGFiZWwoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9TKCkgewotCQlpZiAoc3VwZXIuZ2V0T1MoKSA9PSBudWxsICYmIGdldFVSTCgpIT1udWxsKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKS5nZXRPUygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCXJldHVybiBzdXBlci5nZXRPUygpOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb25hbCB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotCSAqCi0JICogQHJldHVybiB0aGUgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V1MoKSB7Ci0JCWlmIChzdXBlci5nZXRXUygpID09IG51bGwgJiYgZ2V0VVJMKCkhPW51bGwpCi0JCQl0cnkgewotCQkJCXJldHVybiBnZXRGZWF0dXJlKG51bGwpLmdldFdTKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJcmV0dXJuIHN1cGVyLmdldFdTKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbmFsIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPU0FyY2goKSB7Ci0JCWlmIChzdXBlci5nZXRPU0FyY2goKSA9PSBudWxsICYmIGdldFVSTCgpIT1udWxsKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKS5nZXRPU0FyY2goKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0T1NBcmNoKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbmFsIGxvY2FsZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7Ci0JCWlmIChzdXBlci5nZXROTCgpID09IG51bGwgJiYgZ2V0VVJMKCkhPW51bGwpCi0JCQl0cnkgewotCQkJCXJldHVybiBnZXRGZWF0dXJlKG51bGwpLmdldE5MKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJcmV0dXJuIHN1cGVyLmdldE5MKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZlYXR1cmUgaXMgcGF0Y2hpbmcgYW5vdGhlciBmZWF0dXJlLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhdGNoKCkgewotCQlpZiAoc3VwZXIuZ2V0UGF0Y2goKSA9PSBudWxsKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKS5pc1BhdGNoKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCXJldHVybiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShzdXBlci5nZXRQYXRjaCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JQXJjaGl2ZVJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JQXJjaGl2ZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTc3N2M3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUFyY2hpdmVSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogU2l0ZSBhcmNoaXZlIGludGVyZmFjZS4KLSAqIFNpdGUgYXJjaGl2ZSBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgcGFja2FnZWQgYXJjaGl2ZSAoZmlsZSkgbG9jYXRlZAotICogb24gYW4gdXBkYXRlIHNpdGUuIEl0IGFsbG93cyBhICJzeW1ib2xpYyIgcGF0aCB1c2VkIHRvIGlkZW50aWZ5Ci0gKiBhIHBsdWctaW4gb3Igbm9uLXBsdWctaW4gZmVhdHVyZSBlbnRyeSB0byBiZSBleHBsaWNpdGx5IG1hcHBlZAotICogdG8gYSBzcGVjaWZpYyBVUkwuIAotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAqIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkFyY2hpdmVSZWZlcmVuY2UKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJjaGl2ZVJlZmVyZW5jZSBleHRlbmRzIElBZGFwdGFibGUgewotCi0JLyoqIAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFyY2hpdmUgInN5bWJvbGljIiBwYXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgc2l0ZSBhcmNoaXZlIFVSTCAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcmNoaXZlIFVSTCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmNDY0NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLQ0KLS8qKg0KLSAqIEZlYXR1cmUgY2F0ZWdvcnkgZGVmaW5pdGlvbi4NCi0gKiBBIHNpdGUgY2FuIG9yZ2FuaXplIGl0cyBmZWF0dXJlcyBpbnRvIGNhdGVnb3JpZXMuIENhdGVnb3JpZXMNCi0gKiBjYW4gYmUgZnVydGhlciBvcmdhbml6ZWQgaW50byBoaWVyYXJjaGllcy4gRWFjaCBjYXRlZ29yeSBuYW1lDQotICogaXMgYSBjb21wb3NlZCBvZiB0aGUgbmFtZSBvZiBpdHMgcGFyZW50IGFuZCBhIHNpbXBsZSBpZGVudGlmaWVyDQotICogc2VwYXJhdGVkIGJ5IGEgc2xhc2ggKCIvIikuIEZvciBleGFtcGxlIDxjb2RlPnRvb2xzL3V0aWxpdGllcy9wcmludDwvY29kZT4NCi0gKiBkZWZpbmVzIGEgY2F0ZWdvcnkgdGhhdCBpcyBhIGNoaWxkIG9mIDxjb2RlPnRvb2xzL3V0aWxpdGllczwvY29kZT4gYW5kDQotICogZ3JhbmRjaGlsZCBvZiA8Y29kZT50b29sczwvY29kZT4uDQotICogPHA+DQotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgc2hvdWxkIA0KLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIA0KLSAqIGludGVyZmFjZS4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ2F0ZWdvcnkNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJQ2F0ZWdvcnkgIGV4dGVuZHMgSUFkYXB0YWJsZXsNCi0NCi0JLyoqIA0KLQkgKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkuIFRoZSBuYW1lIGNhbiBiZSBhIHNpbXBsZQ0KLQkgKiB0b2tlbiAocm9vdCBjYXRlZ29yeSkgb3IgYSBudW1iZXIgb2Ygc2xhc2gtc2VwYXJhdGVkICgiLyIpIA0KLQkgKiB0b2tlbnMuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBjYXRlZ29yeSBuYW1lDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIHRoZSBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGNhdGVnb3J5DQotCSAqIA0KLQkgKiBAcmV0dXJuIGRpc3BsYXlhYmxlIGNhdGVnb3J5IGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOw0KLQ0KLQkvKiogDQotCSAqIFJldHJpZXZlIHRoZSBkZXRhaWxlZCBjYXRlZ29yeSBkZXNjcmlwdGlvbg0KLQkgKiANCi0JICogQHJldHVybiBjYXRlZ29yeSBkZXNjcmlwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lDb250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1YmY0ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lDb250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi0NCi0vKioNCi0gKiBHZW5lcmljIGNvbnRlbnQgY29uc3VtZXIuDQotICogQSBnZW5lcmljIGNvbnRlbnQgY29uc3VtZXIgaXMgdXNlZCB0byBzdG9yZSBwbHVnLWluIGFuZCBub24tcGx1Zy1pbiBmaWxlcw0KLSAqIGZvciBhIGZlYXR1cmUuDQotICogPHA+DQotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgDQotICogd2lsbCBvbmx5IHVzZSB0aGUgY29udGVudCBjb25zdW1lciBwcm92aWRlZCBieSB0aGUgZmVhdHVyZSB0eXBlKHMpDQotICogaW1wbGVtZW50ZWQgYnkgdGhlIHBsYXRmb3JtLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRDb25zdW1lcg0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50Q29uc3VtZXIgew0KLQ0KLQkvKioNCi0JICogU3RvcmVzIGEgZmlsZS4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjb3BlbihJUGx1Z2luRW50cnkpDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjb3BlbihJTm9uUGx1Z2luRW50cnkpDQotCSAqIEBwYXJhbSBjb250ZW50UmVmZXJlbmNlIHJlZmVyZW5jZSB0byB0aGUgZmlsZSB0byBzdG9yZQ0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgc3RvcmUgb3BlcmF0aW9ucyBmb3IgdGhpcw0KLQkgKiBjb25zdW1lcg0KLQkgKiANCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDE3Y2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi0NCi0vKioNCi0gKiBGZWF0dXJlIGRlZmluZXMgdGhlIHBhY2thZ2luZyAiY29udGFpbmVyIiBmb3IgYSBncm91cCBvZiByZWxhdGVkIHBsdWctaW5zLA0KLSAqIHBsdWctaW4gZnJhZ21lbnRzLCBhbmQgb3B0aW9uYWxseSBub24tcGx1Zy1pbiBmaWxlcy4gDQotICogPHA+DQotICogRmVhdHVyZXMgYXJlIHRyZWF0ZWQgcHVyZWx5IGFzIGFuIGluc3RhbGxhdGlvbiBhbmQgcGFja2FnaW5nIGNvbnN0cnVjdC4gDQotICogVGhleSBkbyBub3QgcGxheSBhIHJvbGUgZHVyaW5nIEVjbGlwc2UgcGx1Zy1pbiBleGVjdXRpb24uDQotICogVGhleSBhcmUgc2ltcGx5IGFuIGluY2x1c2l2ZSAibWFuaWZlc3QiIG9mIHRoZSBwbHVnLWlucywgZnJhZ21lbnRzIA0KLSAqIGFuZCBvdGhlciBmaWxlcyB0aGF0IG1ha2UgdXAgdGhhdCBmZWF0dXJlLiBJZiBmZWF0dXJlcyBhcmUgbG9naWNhbGx5IG1hZGUgDQotICogdXAgb2YgcGx1Zy1pbnMgZnJvbSAic3ViLWZlYXR1cmVzIiwgdGhlIHRvcC1sZXZlbCBmZWF0dXJlICJtYW5pZmVzdCINCi0gKiBtdXN0IGJlIGZ1bGx5IHJlc29sdmVkIGF0IHBhY2thZ2luZyB0aW1lLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgDQotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgDQotICogaW50ZXJmYWNlLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUZlYXR1cmUgZXh0ZW5kcyBJQWRhcHRhYmxlLCBJUGxhdGZvcm1FbnZpcm9ubWVudCB7DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgYSAnaGFwcHknIGZlYXR1cmUNCi0JICogQSBmZWF0dXJlIGlzIGNvbnNpZGVyZWQgdG8gYmUgJ2hhcHB5JyBpbiB0aGUgY29udGV4dCBvZiBhIGxvY2FsIHNpdGUNCi0JICogaWYgYWxsIHRoZSBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IHRoZSBmZWF0dXJlIGFyZSBpbnN0YWxsZWQgb24gdGhlIHNpdGUgYW5kIG5vIG90aGVyDQotCSAqIHZlcnNpb24gb2YgYW55IG9mIHRoZSBwbHVnLWlucyBhcmUgaW5zdGFsbGVkIG9uIGFueSBvdGhlciBzaXRlIG9mIHRoZSBsb2NhbCBzaXRlLg0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGUjZ2V0QnJva2VuU3RhdHVzKElGZWF0dXJlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfSEFQUFkgPSAwOw0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIGEgJ2hhcHB5JyBmZWF0dXJlDQotCSAqIEEgZmVhdHVyZSBpcyBjb25zaWRlcmVkIHRvIGJlICdhbWJpZ3VvdXMnIGluIHRoZSBjb250ZXh0IG9mIGEgbG9jYWwgc2l0ZQ0KLQkgKiBpZiBhbGwgdGhlIHBsdWctaW5zIHJlZmVyZW5jZWQgYnkgdGhlIGZlYXR1cmUgYXJlIGluc3RhbGxlZCBvbiB0aGUgc2l0ZSBhbmQgb3RoZXINCi0JICogdmVyc2lvbiBvZiBhbnkgb2YgdGhlIHBsdWctaW5zIGFyZSBpbnN0YWxsZWQgb24gYW55IG90aGVyIHNpdGUgb2YgdGhlIGxvY2FsIHNpdGUuDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZSNnZXRCcm9rZW5TdGF0dXMoSUZlYXR1cmUpDQotCSAqLwkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0FNQklHVU9VUyA9IDE7DQotCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIGFuICd1bmhhcHB5JyBmZWF0dXJlDQotCSAqIEEgZmVhdHVyZSBpcyBjb25zaWRlcmVkIHRvIGJlICd1bmhhcHB5JyBpbiB0aGUgY29udGV4dCBvZiB0aGlzIHNpdGUsDQotCSAqIGlmIHNvbWUgb2YgdGhlIHBsdWctaW5zIHJlZmVyZW5jZWQgYnkgdGhlIGZlYXR1cmUgYXJlIG5vdCBpbnN0YWxsZWQgb24gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGUjZ2V0QnJva2VuU3RhdHVzKElGZWF0dXJlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLwkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1VOSEFQUFkgPSAyOw0KLQkNCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgYSBkaXNhYmxlIGZlYXR1cmUNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlI2dldEJyb2tlblN0YXR1cyhJRmVhdHVyZSkNCi0JICogQHNpbmNlIDIuMC4yDQotCSAqLwkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0RJU0FCTEVEID0gLTE7DQotCQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyB0aGUgb25lLWNsaWNrIHVwZGF0ZSB3aWxsIHNlYXJjaCB0aGUgDQotCSAqIGxvY2F0aW9uIG9mIHRoZSBuZXN0aW5nIHJvb3QgZmVhdHVyZS4NCi0JICogDQotCSAqIEBzaW5jZSAyLjAuMQ0KLQkgKi8JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQVJDSF9MT0NBVElPTl9ERUZBVUxUID0gMDsJDQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgdGhlIG9uZS1jbGljayB1cGRhdGUgd2lsbCBzZWFyY2ggdGhlIA0KLQkgKiBsb2NhdGlvbiBkZWZpbmVkIGJ5IHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNpbmNlIDIuMC4xDQotCSAqLwkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VBUkNIX0xPQ0FUSU9OX0ZFQVRVUkUgPSAxOwkNCi0NCi0JLyoqDQotCSAqIEluZGljYXRlcyB0aGUgb25lLWNsaWNrIHVwZGF0ZSB3aWxsIHNlYXJjaCBib3RoIHRoZSANCi0JICogbG9jYXRpb24gb2YgdGhlIG5lc3Rpbmcgcm9vdCBmZWF0dXJlIGFuZCB0aGUgDQotCSAqIGxvY2F0aW9uIGRlZmluZWQgYnkgdGhlIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wLjENCi0JICovCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hfTE9DQVRJT05fQk9USCA9IDI7CQ0KLQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgaWRlbnRpZmllci4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGZlYXR1cmUgaWRlbnRpZmllci4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpdGUgdGhpcyBmZWF0dXJlIGlzIGFzc29jaWF0ZWQgd2l0aC4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIHNpdGUgZm9yIHRoaXMgZmVhdHVyZQ0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElTaXRlIGdldFNpdGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIGxhYmVsIG9mIHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgVVJMLg0KLQkgKiBUaGlzIGlzIHRoZSBVUkwgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIGZlYXR1cmUuIFRoZSBpbnRlcnByZXRhdGlvbg0KLQkgKiBvZiB0aGUgVVJMIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uY3JldGUgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbi4gICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSBVUkwNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGluZm9ybWF0aW9uIGVudHJ5IHJlZmVyZW5jaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUNCi0JICogZmVhdHVyZSB1cGRhdGUgc2l0ZS4gVGhlIHVwZGF0ZSBzaXRlIGNhbiBiZSBhY2Nlc3NlZCB0byBvYnRhaW4NCi0JICogZmVhdHVyZSB1cGRhdGVzIGZvciB0aGlzIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHVwZGF0ZSBzaXRlIGVudHJ5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0VXBkYXRlU2l0ZUVudHJ5KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgaW5mb3JtYXRpb24gZW50cmllcyByZWZlcmVuY2luZyBsb2NhdGlvbnMgb2Ygb3RoZXINCi0JICogdXBkYXRlIHNpdGVzLiBUaGlzIG1lY2hhbmlzbSBjYW4gYmUgdXNlZCBieSBmZWF0dXJlcyB0byBkaXN0cmlidXRlDQotCSAqIGxvY2F0aW9uIGluZm9ybWF0aW9uIGFib3V0IGdlbmVyYWwgdXBkYXRlIHNpdGVzIHRvIGNsaWVudHMuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNpdGUgZW50cmllcywgb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5W10gZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBkaXNwbGF5YWJsZSBsYWJlbCBpZGVudGlmeWluZyB0aGUgcHJvdmlkZXIgb2YgdGhpcyBmZWF0dXJlDQotCSAqIA0KLQkgKiBAcmV0dXJuIHByb3ZpZGVyIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXIoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW5kIG9wdGlvbmFsIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgZW50cnkuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbGwgaGFuZGxlciBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYNCi0JICogbm9uZSB3YXMgc3BlY2lmaWVkDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJSW5zdGFsbEhhbmRsZXJFbnRyeSBnZXRJbnN0YWxsSGFuZGxlckVudHJ5KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGRlc2NyaXB0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIHJlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvcHlyaWdodCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvcHlyaWdodCBpbmZvcm1hdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldENvcHlyaWdodCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgbGljZW5zZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldExpY2Vuc2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybiBvcHRpb25hbCBpbWFnZSBmb3IgdGhlIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBVUkwgcG9pbnRpbmcgdG8gdGhlIGltYWdlLCAsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRJbWFnZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJuIGEgbGlzdCBvZiBwbHVnLWluIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBmZWF0dXJlLiBBIHBsdWctaW4NCi0JICogZGVwZW5kZW5jeSBpcyBhIHJlZmVyZW5jZSB0byBhIHBsdWctaW4gcmVxdWlyZWQgZm9yIGZlYXR1cmUgZXhlY3V0aW9uDQotCSAqIHRoYXQgaXMgbm90IHBhY2thZ2VkIGFzIHBhcnQgb2YgdGhlIGZlYXR1cmUuDQotCSAqIGZpbHRlcmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCB3aW5kb3dpbmcgc3lzdGVtIGFuZCBhcmNoaXRlY3R1cmUgc3lzdGVtDQotCSAqIHNldCBpbiA8Y29kZT5TaXRlbWFuYWdlcjwvY29kZT4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgcGx1Zy1pbiBkZXBlbmRlbmNpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElJbXBvcnRbXSBnZXRJbXBvcnRzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHBsdWctaW4gZGVwZW5kZW5jaWVzIGZvciB0aGlzIGZlYXR1cmUuIEEgcGx1Zy1pbg0KLQkgKiBkZXBlbmRlbmN5IGlzIGEgcmVmZXJlbmNlIHRvIGEgcGx1Zy1pbiByZXF1aXJlZCBmb3IgZmVhdHVyZSBleGVjdXRpb24NCi0JICogdGhhdCBpcyBub3QgcGFja2FnZWQgYXMgcGFydCBvZiB0aGUgZmVhdHVyZS4NCi0gCSAqIE5vIGZpbHRlcmluZyBvY2N1cnMNCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgcGx1Zy1pbiBkZXBlbmRlbmNpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgSUltcG9ydFtdIGdldFJhd0ltcG9ydHMoKTsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIGlkZW50aWZpZXIgb2YgdGhlIHByaW1hcnkgcGx1Z2luIGFzc29jaWF0ZWQgdG8gdGhpcyBmZWF0dXJlDQotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBhIHByaW1hcnkgZmVhdHVyZS4NCi0JICogSWYgdGhlIHByaW1hcnkgcGx1Z2luIGlkIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBmZWF0dXJlIGlzIGEgcHJpbWFyeQ0KLQkgKiBmZWF0dXJlLCByZXR1cm5zIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NvY2lhdGVkIHByaW1hcnkgcGx1Z2luIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjEgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlQbHVnaW5JRCgpOw0KLQ0KLQ0KLQkvKioNCi0JICogSW5zdGFsbCB0aGUgY29udGVudHMgb2YgdGhpcyBmZWF0dXJlIGludG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgZmVhdHVyZS4NCi0JICogQWxsIG9wdGlvbmFsIGZlYXR1cmVzIHdpbGwgYmUgaW5zdGFsbGVkDQotCSAqIA0KLQkgKiBAcGFyYW0gdGFyZ2V0RmVhdHVyZQ0KLQkgKiBAcGFyYW0gdmVyaWZpY2F0aW9uTGlzdGVuZXINCi0JICogQHBhcmFtIG1vbml0b3INCi0JICogQGV4Y2VwdGlvbiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGluc3RhbGwNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKA0KLQkJSUZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwNCi0JCUlWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwNCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbixDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogSW5zdGFsbCB0aGUgY29udGVudHMgb2YgdGhpcyBmZWF0dXJlIGludG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgZmVhdHVyZS4NCi0JICogT25seSB0aGUgbGlzdGVkIG9wdGlvbmFsIGZlYXR1cmVzIHdpbGwgYmUgaW5zdGFsbGVkLg0KLQkgKiANCi0JICogQHBhcmFtIHRhcmdldEZlYXR1cmUNCi0JICogQHBhcmFtIG9wdGlvbmFsRmVhdHVyZXMgdGhlIG9wdGlvbmFsIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZA0KLQkgKiBAcGFyYW0gdmVyaWZpY2F0aW9uTGlzdGVuZXINCi0JICogQHBhcmFtIG1vbml0b3INCi0JICogQGV4Y2VwdGlvbiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGluc3RhbGwNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAuMQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoDQotCQlJRmVhdHVyZSB0YXJnZXRGZWF0dXJlLA0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzLA0KLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLA0KLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlcyBpbmNsdWRlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogZmlsdGVyZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIHdpbmRvd2luZyBzeXN0ZW0gYW5kIGFyY2hpdGVjdHVyZSBzeXN0ZW0NCi0JICogc2V0IGluIDxjb2RlPlNpdGVtYW5hZ2VyPC9jb2RlPg0KLQkgKiANCi0JICogQHJldHVybiBhbiBlcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2VzIGluY2x1ZGVkIGJ5IHRoaXMgZmVhdHVyZQ0KLQkgKiBObyBmaWx0ZXJpbmcgb2NjdXJzDQotCSAqIA0KLQkgKiBAcmV0dXJuIGFuIGVycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlcywgb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBwbHVnLWluIGVudHJpZXMgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogZmlsdGVyZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIHdpbmRvd2luZyBzeXN0ZW0gYW5kIGFyY2hpdGVjdHVyZSBzeXN0ZW0NCi0JICogc2V0IGluIDxjb2RlPlNpdGVtYW5hZ2VyPC9jb2RlPg0KLQkgKiANCi0JICogQHJldHVybiBhbiBlcnJheSBvZiBwbHVnLWluIGVudHJpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBwbHVnLWluIGVudHJpZXMgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogTm8gZmlsdGVyaW5nIG9jY3Vycw0KLQkgKiANCi0JICogQHJldHVybiBhbiBlcnJheSBvZiBwbHVnLWluIGVudHJpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UmF3UGx1Z2luRW50cmllcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY291bnQgb2YgcmVmZXJlbmNlZCBwbHVnLWluIGVudHJpZXMuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHBsdWctaW4gZW50cnkgY291bnQNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1wbHVnLWluIGVudHJpZXMgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogZmlsdGVyZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIHdpbmRvd2luZyBzeXN0ZW0gYW5kIGFyY2hpdGVjdHVyZSBzeXN0ZW0NCi0JICogc2V0IGluIDxjb2RlPlNpdGVtYW5hZ2VyPC9jb2RlPg0KLQkgKiANCi0JICogQHJldHVybiBhbiBlcnJheSBvZiBub24tcGx1Zy1pbiBlbnRyaWVzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElOb25QbHVnaW5FbnRyeVtdIGdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLXBsdWctaW4gZW50cmllcyByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZQ0KLQkgKiBObyBmaWx0ZXJpbmcgb2NjdXJzDQotCSAqIA0KLQkgKiBAcmV0dXJuIGFuIGVycmF5IG9mIG5vbi1wbHVnLWluIGVudHJpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgSU5vblBsdWdpbkVudHJ5W10gZ2V0UmF3Tm9uUGx1Z2luRW50cmllcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY291bnQgb2YgcmVmZXJlbmNlZCBub24tcGx1Zy1pbiBlbnRyaWVzLg0KLQkgKiANCi0JICogQHJldHVybiBub24tcGx1Zy1pbiBlbnRyeSBjb3VudA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldE5vblBsdWdpbkVudHJ5Q291bnQoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRvd25sb2FkIHNpemUgb2YgdGhlIGZlYXR1cmUsIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLg0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Db250ZW50RW50cnlNb2RlbCNVTktOT1dOX1NJWkUNCi0JICogQHJldHVybiBkb3dubG9hZCBzaXplIG9mIHRoZSBmZWF0dXJlIGluIEtpbG9CeXRlcywgb3IgYW4gaW5kaWNhdGlvbiANCi0JICogdGhlIHNpemUgY291bGQgbm90IGJlIGRldGVybWluZWQNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgaW5zdGFsbCBzaXplIG9mIHRoZSBmZWF0dXJlLCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4NCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWwjVU5LTk9XTl9TSVpFDQotCSAqIEByZXR1cm4gaW5zdGFsbCBzaXplIG9mIHRoZSBmZWF0dXJlIGluIEtpbG9CeXRlcywgb3IgYW4gaW5kaWNhdGlvbiANCi0JICogdGhlIHNpemUgY291bGQgbm90IGJlIGRldGVybWluZWQNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplKCk7DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmVhdHVyZSBjYW4gYmUgdXNlZCBhcyBhIHByaW1hcnkgZmVhdHVyZS4NCi0JICogDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHByaW1hcnkgZmVhdHVyZSwgDQotCSAqIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWFyeSgpOw0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmZWF0dXJlIG11c3QgYmUgcHJvY2Vzc2VkIGFsb25lIGR1cmluZyBpbnN0YWxsYXRpb24NCi0JICogYW5kIGNvbmZpZ3VyYXRpb24uIEZlYXR1cmVzIHRoYXQgYXJlIG5vdCBleGNsdXNpdmUgY2FuIGJlIGluc3RhbGxlZCBpbiBhDQotCSAqIGJhdGNoLg0KLQkgKiANCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmZWF0dXJlIHJlcXVpcmVzIGV4Y2x1c2l2ZSBwcm9jZXNzaW5nLA0KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1c2l2ZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIGFuIGFwcGxpY2F0aW9uIHRvIGJlIHVzZWQgd2hlbg0KLQkgKiBzdGFydGluZyB1cCB0aGUgcGxhdGZvcm0gd2l0aCB0aGlzIGZlYXR1cmUgYXMgdGhlIHByaW1hcnkgZmVhdHVyZS4NCi0JICogVGhlIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIgbXVzdCByZXByZXNlbnQgYSB2YWxpZCBhcHBsaWNhdGlvbiByZWdpc3RlcmVkDQotCSAqIGluIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCk7DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIGEgY29sb2NhdGlvbiBhZmZpbml0eSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFmZmluaXR5RmVhdHVyZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhpcyBmZWF0dXJlLiBBIGNvbnRlbnQgcHJvdmlkZXINCi0JICogaXMgYW4gYWJzdHJhY3Rpb24gb2YgZWFjaCBmZWF0dXJlIGludGVybmFsIHBhY2thZ2luZyBzdHJ1Y3R1cmUuDQotCSAqIEl0IGFsbG93cyB0aGUgZmVhdHVyZSBjb250ZW50IHRvIGJlIGFjY2Vzc2VkIGluIGEgc3RhbmRhcmQgd2F5DQotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGludGVybmFsIHBhY2thZ2luZy4gQWxsIGNvbmNyZXRlIGZlYXR1cmVzDQotCSAqIG5lZWQgdG8gYmUgYWJsZSB0byByZXR1cm4gYSBjb250ZW50IHByb3ZpZGVyLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIGNvbnRlbnQgcHJvdmlkZXINCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBnZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY29udGVudCBjb25zdW1lciBmb3IgdGhpcyBmZWF0dXJlLiBBIGNvbnRlbnQgY29uc3VtZXINCi0JICogaXMgYW4gYWJzdHJhY3Rpb24gb2YgZWFjaCBmZWF0dXJlIGludGVybmFsIHBhY2thZ2luZyBtZWNoYW5pc20uDQotCSAqIEl0IGFsbG93cyBjb250ZW50IHRvIGJlIHN0b3JlZCBpbnRvIGEgZmVhdHVyZSBpbiBhIHN0YW5kYXJkIHdheQ0KLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBwYWNrYWdpbmcgbWVjaGFuaXNtIHVzZWQuIE9ubHkgY29uY3JldGUgZmVhdHVyZXMNCi0JICogdGhhdCBzdXBwb3J0IHN0b3JpbmcgbmVlZCB0byBpbXBsZW1lbnQgYSBjb250ZW50IGNvbnN1bWVyLiBUaGUgcGxhdGZvcm0NCi0JICogaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgZmVhdHVyZSB0eXBlIHN1cHBvcnRpbmcgY29udGVudCBjb25zdW1lci4NCi0JICogVGhpcyBpcyB0aGUgZmVhdHVyZSB0eXBlIHJlcHJlc2VudGluZyBhIGxvY2FsbHktaW5zdGFsbGVkDQotCSAqIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgY29udGVudCBjb25zdW1lcg0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHNpdGUgZm9yIHRoaXMgZmVhdHVyZS4gVGhpcyBpcyB0eXBpY2FsbHkgcGVyZm9ybWVkIGFzIHBhcnQNCi0JICogb2YgdGhlIGZlYXR1cmUgY3JlYXRpb24gb3BlcmF0aW9uLiBPbmNlIHNldCwgdGhlIHNpdGUNCi0JICogc2hvdWxkIG5vdCBiZSByZXNldC4NCi0JICogDQotCSAqIEBwYXJhbSBzaXRlIHRoZSBzaXRlDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBzaXRlIGZvciB0aGlzIGZlYXR1cmUgaXMgYWxyZWFkeSBzZXQNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNpdGUoSVNpdGUgc2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGlzIGZlYXR1cmUuIFRoaXMgaXMgdHlwaWNhbGx5DQotCSAqIHBlcmZvcm1lZCBhcyBwYXJ0IG9mIHRoZSBmZWF0dXJlIGNyZWF0aW9uIG9wZXJhdGlvbi4gT25jZSBzZXQsIHRoZSANCi0JICogcHJvdmlkZXIgc2hvdWxkIG5vdCBiZSByZXNldC4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlQ29udGVudFByb3ZpZGVyIGNvbnRlbnQgcHJvdmlkZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBmZWF0dXJlQ29udGVudFByb3ZpZGVyKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmZWF0dXJlIGlzIHBhdGNoaW5nIGFub3RoZXIgZmVhdHVyZSwNCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiBAcmV0dXJuIGJvb2xlYW4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpOw0KLQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTM3ZjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZUNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi0NCi0vKioNCi0gKiBGZWF0dXJlIGNvbnRlbnQgY29uc3VtZXIuDQotICogQSBmZWF0dXJlIGNvbnRlbnQgY29uc3VtZXIgaXMgYW4gYWJzdHJhY3Rpb24gb2YgZWFjaCBmZWF0dXJlIGludGVybmFsDQotICogcGFja2FnaW5nIG1lY2hhbmlzbS4gSXQgYWxsb3dzIGNvbnRlbnQgdG8gYmUgc3RvcmVkIGludG8gYSBmZWF0dXJlIGluDQotICogYSBzdGFuZGFyZCB3YXkgcmVnYXJkbGVzcyBvZiB0aGUgcGFja2FnaW5nIG1lY2hhbmlzbSB1c2VkLiBPbmx5IGNvbmNyZXRlDQotICogZmVhdHVyZXMgdGhhdCBzdXBwb3J0IHN0b3JpbmcgbmVlZCB0byBpbXBsZW1lbnQgYSBjb250ZW50IGNvbnN1bWVyLiANCi0gKiBUaGUgcGxhdGZvcm0gaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgZmVhdHVyZSB0eXBlIHN1cHBvcnRpbmcgY29udGVudA0KLSAqIGNvbnN1bWVyLiBUaGlzIGlzIHRoZSBmZWF0dXJlIHR5cGUgcmVwcmVzZW50aW5nIGEgbG9jYWxseS1pbnN0YWxsZWQNCi0gKiBmZWF0dXJlLg0KLSAqIDxwPg0KLSAqIEEgZmVhdHVyZSBjb250ZW50IGNvbnN1bWVyIGRlbGVnYXRlcyB0aGUgc3RvcmFnZSBvZiBwbHVnLWluIGFuZCANCi0gKiBub24tcGx1Zy1pbiBmaWxlcyB0byBhIGdlbmVyaWMgY29udGVudCBjb25zdW1lci4NCi0gKiA8L3A+DQotICogPHA+DQotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgDQotICogd2lsbCBvbmx5IHVzZSB0aGUgZmVhdHVyZSBjb250ZW50IGNvbnN1bWVyIHByb3ZpZGVkIGJ5IHRoZSBmZWF0dXJlIHR5cGUocykNCi0gKiBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklDb250ZW50Q29uc3VtZXINCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciB7DQotDQotCQ0KLQkvKioNCi0JICogU3RvcmUgYSBmZWF0dXJlIGZpbGUuDQotCSAqIE5vdGUgdGhhdCBvbmx5IHRoZSBmZWF0dXJlIGRlZmluaXRpb24gZmlsZXMgc2hvdWxkIGJlIHN0b3JlZCB1c2luZw0KLQkgKiB0aGlzIG1ldGhvZC4gUGx1Zy1pbiBmaWxlcyBhbmQgbm9uLXBsdWctaW4gZGF0YSBmaWxlcyBzaG91bGQgYmUNCi0JICogc3RvcmVkIHVzaW5nIHRoZSBjb250ZW50IGNvbnN1bWVycyBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIHJlc3BlY3RpdmUNCi0JICogZW50cmllcy4NCi0JICogDQotCSAqIEBzZWUgI29wZW4oSVBsdWdpbkVudHJ5KQ0KLQkgKiBAc2VlICNvcGVuKElOb25QbHVnaW5FbnRyeSkJIA0KLQkgKiBAcGFyYW0gY29udGVudFJlZmVyZW5jZSBjb250ZW50IHJlZmVyZW5jZSB0byBmZWF0dXJlIGZpbGUNCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIE9wZW5zIGEgZ2VuZXJpYyBjb250ZW50IGNvbnN1bWVyIGZvciB0aGUgc3BlY2lmaWVkIHBsdWctaW4gZW50cnkuDQotCSAqIFBsdWctaW4gZmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIGVudHJ5IHNob3VsZCBiZSBzdG9yZWQNCi0JICogdXNpbmcgdGhpcyBjb250ZW50IGNvbnN1bWVyLg0KLQkgKiANCi0JICogQHBhcmFtIHBsdWdpbkVudHJ5IHBsdWctaW4gZW50cnkNCi0JICogQHJldHVybiBnZW5lcmljIGNvbnRlbnQgY29uc3VtZXIgZm9yIHRoZSBlbnRyeQ0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJQ29udGVudENvbnN1bWVyIG9wZW4oSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIE9wZW5zIGEgZ2VuZXJpYyBjb250ZW50IGNvbnN1bWVyIGZvciB0aGUgc3BlY2lmaWVkIG5vbi1wbHVnLWluIGVudHJ5Lg0KLQkgKiBOb24tcGx1Zy1pbiBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZW50cnkgc2hvdWxkIGJlIHN0b3JlZA0KLQkgKiB1c2luZyB0aGlzIGNvbnRlbnQgY29uc3VtZXIuDQotCSAqIA0KLQkgKiBAcGFyYW0gbm9uUGx1Z2luRW50cnkgbm9uLXBsdWctaW4gZW50cnkNCi0JICogQHJldHVybiBnZW5lcmljIGNvbnRlbnQgY29uc3VtZXIgZm9yIHRoZSBlbnRyeQ0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJQ29udGVudENvbnN1bWVyIG9wZW4oSU5vblBsdWdpbkVudHJ5IG5vblBsdWdpbkVudHJ5KQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBDbG9zZXMgdGhpcyBjb250ZW50IGNvbnN1bWVyLiBUaGlzIGluZGljYXRlcyBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbg0KLQkgKiBvZiB0aGUgc3RvcmUgb3BlcmF0aW9ucy4gVGhlIGNvbnRlbnQgY29uc3VtZXIgY29tbWl0cyBhbnkgY2hhbmdlcw0KLQkgKiBtYWRlIGJ5IHRoaXMgY29uc3VtZXIuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgbmV3bHkgcG9wdWxhdGVkIGZlYXR1cmUNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIENsb3NlcyB0aGlzIGNvbnRlbnQgY29uc3VtZXIsIGluZGljYXRpbmcgdGhlIHN0b3JlIG9wZXJhdGlvbnMgc2hvdWxkDQotCSAqIGJlIGFib3J0ZWQuIFRoZSBjb250ZW50IGNvbnN1bWVyIGF0dGVtcHRzIHRvIGJhY2sgb3V0IGFueSBjaGFuZ2VzDQotCSAqIG1hZGUgYnkgdGhpcyBjb250ZW50IGNvbnN1bWVyLg0KLQkgKiANCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhYm9ydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSBmb3IgdGhpcyBjb250ZW50IGNvbnN1bWVyLg0KLQkgKiBJbiBnZW5lcmFsLCB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYXMgcGFydCBvZg0KLQkgKiBmZWF0dXJlIGNyZWF0aW9uLiBPbmNlIHNldCwgdGhlIGZlYXR1cmUgc2hvdWxkIG5vdCBiZSByZXNldC4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUgZm9yIHRoaXMgY29udGVudCBjb25zdW1lcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBmb3IgdGhpcyBjb250ZW50IGNvbnN1bWVyLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBmZWF0dXJlIGZvciB0aGlzIGNvbnRlbnQgY29uc3VtZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHBhcmVudCBmb3IgdGhpcyBjb250ZW50IGNvbnN1bWVyLg0KLQkgKiBJbiBnZW5lcmFsLCB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYXMgcGFydCBvZg0KLQkgKiBmZWF0dXJlIGNyZWF0aW9uLiBPbmNlIHNldCwgdGhlIGZlYXR1cmUgc2hvdWxkIG5vdCBiZSByZXNldC4NCi0JICogDQotCSAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGZlYXR1cmUgY29udGVudCBjb25zdW1lci4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBwYXJlbnQpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBjb250ZW50IGNvbnN1bWVyIHRoYXQgb3BlbmVkDQotCSAqIHRoaXMgZmVhdHVyZSBjb250ZW50IGNvbnN1bWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBpZiB0aGlzIGZlYXR1cmUgY29udGVudCBjb25zdW1lciBpcyBhIHJvb3QgZmVhdHVyZQ0KLQkgKiBjb250ZW50IGNvbnN1bWVyLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgZmVhdHVyZSBjb250ZW50IGNvbnN1bWVyLCBvciBudWxsLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgZ2V0UGFyZW50KCk7DQotDQotCS8qKg0KLQkgKiBMaW5rIHRoZSBjb250ZW50IGNvbnN1bWVyIG9mIHRoZSBmZWF0dXJlIGFzIGEgY2hpbGQNCi0JICogY29udGVudCBjb25zdW1lcg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGNoaWxkIGZlYXR1cmUuDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBjb250ZW50IGNvbnN1bWVycyB0aGF0DQotCSAqIHRoaXMgZmVhdHVyZSBjb250ZW50IGNvbnN1bWVyIG9wZW5lZA0KLQkgKg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZlYXR1cmUgY29udGVudCBjb25zdW1lciwgb3IgZW4gZW1wdHkgYXJyYXkuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZUNvbnRlbnRDb25zdW1lcltdIGdldENoaWxkcmVuKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUZlYXR1cmVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUZlYXR1cmVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4MGIwZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLQ0KLS8qKg0KLSAqIEZlYXR1cmUgY29udGVudCBwcm92aWRlci4NCi0gKiBBIGZlYXR1cmUgY29udGVudCBwcm92aWRlciBpcyBhbiBhYnN0cmFjdGlvbiBvZiBlYWNoIGZlYXR1cmUgaW50ZXJuYWwgDQotICogcGFja2FnaW5nIHN0cnVjdHVyZS4gSXQgYWxsb3dzIHRoZSBmZWF0dXJlIGNvbnRlbnQgdG8gYmUgYWNjZXNzZWQgaW4NCi0gKiBhIHN0YW5kYXJkIHdheSByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcm5hbCBwYWNrYWdpbmcuIEFsbCBjb25jcmV0ZSBmZWF0dXJlDQotICogaW1wbGVtZW50YXRpb25zIG5lZWQgdG8gaW1wbGVtZW50IGEgZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyLg0KLSAqIDxwPg0KLSAqIFRoZXJlIGFyZSB0d28gd2F5cyBvZiBsb29raW5nIGF0IGEgZmVhdHVyZSBjb250ZW50Og0KLSAqIDxvbD4NCi0gKiA8bGk+dGhlICJsb2dpY2FsIiB2aWV3LCB3aGljaCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhY3R1YWwgZmlsZXMgdGhhdA0KLSAqIG1ha2UgdXAgdGhlIGZlYXR1cmUuIFRoZXNlIGluY2x1ZGUgYW55IGZpbGVzIHRoYXQgZGVzY3JpYmUgdGhlIGZlYXR1cmUNCi0gKiBpdHNlbGYsIGZpbGVzIHRoYXQgYXJlIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgcmVmZXJlbmNlZCBwbHVnLWlucywNCi0gKiBhbmQgZmlsZXMgdGhhdCBhcmUgdGhlIG5vbi1wbHVnLWluIGRhdGEgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmZWF0dXJlDQotICogPGxpPnRoZSAicGFja2FnZWQiIHZpZXcsIHdoaWNoIGlzIGEgc2V0IG9mIHJlbGF0ZWQgYXJjaGl2ZSBmaWxlcyB0aGF0DQotICogY29udGFpbiB0aGUgImxvZ2ljYWwiIGZpbGVzLg0KLSAqIDwvb2w+DQotICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyIHRvIG1hbmFnZSB0aGUNCi0gKiBtYXBwaW5nIGJldHdlZW4gdGhlICJwYWNrYWdlZCIgYW5kICJsb2dpY2FsIiB2aWV3cy4NCi0gKiA8L3A+DQotICogPHA+DQotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgc2hvdWxkIA0KLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIA0KLSAqIGludGVyZmFjZS4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcg0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyIHsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgdXJsLiANCi0JICogVGhlIGV4YWN0IGludGVycHJldGF0aW9uIG9mIHRoaXMgVVJMIGlzIHNwZWNpZmljIHRvIGVhY2ggY29udGVudA0KLQkgKiBwcm92aWRlci4gVHlwaWNhbGx5LCB0aGUgVVJMIGlzIGEgcmVmZXJlbmNlIHRvIGEgZmlsZSB0aGF0IGNhbiBiZSANCi0JICogdXNlZCBkaXJlY3RseSwgb3IgaW5kaXJlY3RseSwgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZW50IG9mIHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIHVybA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldFVSTCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIGNvbnRlbnQgcmVmZXJlbmNlIHRvIHRoZSBmZWF0dXJlIG1hbmlmZXN0LiBUaGUgZmVhdHVyZSBtYW5pZmVzdA0KLQkgKiBpcyBhbiB4bWwgZmlsZSwgd2hvc2UgZm9ybWF0IGlzIHNwZWNpZmllZCBieSB0aGUgcGxhdGZvcm0uIFR5cGljYWxseQ0KLQkgKiBhIGZlYXR1cmUgd2lsbCBjb250YWluIHRoZSBtYW5pZmVzdCBhcyBvbmUgb2YgdGhlIHBhY2thZ2VkIGZpbGVzLg0KLQkgKiBGb3IgZmVhdHVyZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgbWFuaWZlc3QsIG9yIGNvbnRhaW4gYSBtYW5pZmVzdA0KLQkgKiB0aGF0IGRvZXMgbm90IGZvbGxvdyB0aGUgc3BlY2lmaWVkIGZvcm1hdCwgdGhpcyBtZXRob2QgcmV0dXJucw0KLQkgKiBhIHJlZmVyZW5jZSB0byBhIGNvbXB1dGVkIG1hbmlmZXN0IGluIHRoZSBhcHByb3ByaWF0ZSBwbGF0Zm9ybQ0KLQkgKiBmb3JtYXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHJldHVybiBmZWF0dXJlIG1hbmlmZXN0IHJlZmVyZW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSBmb3VuZC4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKEluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY29udGVudCByZWZlcmVuY2VzIG9mIGFsbCB0aGUgInBhY2thZ2VkIg0KLQkgKiBhcmNoaXZlcyB0aGF0IG1ha2UgdXAgdGhpcyBmZWF0dXJlLiANCi0JICogPHA+DQotCSAqIFRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVmZXJlbmNlcyBpcyBkZXBlbmRlbnQgb24gZWFjaCBmZWF0dXJlIA0KLQkgKiBjb250ZW50IHByb3ZpZGVyIChpLmUgaXMgZGVwZW5kZW50IG9uIHRoZSBwYWNrYWdpbmcgbWVjaGFuaXNtIHVzZWQNCi0JICogYnkgdGhlIHBhcnRpY3VsYXIgZmVhdHVyZSB0eXBlKS4NCi0JICogPC9wPg0KLQkgKiANCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcmVmZXJlbmNlcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVmZXJlbmNlcw0KLQkgKiBhcmUgZm91bmQNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY29udGVudCByZWZlcmVuY2VzIG9mIHRoZSAicGFja2FnZWQiDQotCSAqIGFyY2hpdmVzIHRoYXQgY29udGFpbiB0aGUgZmVhdHVyZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbi4NCi0JICogPHA+DQotCSAqIEluIGdlbmVyYWwsIHRoZSBmZWF0dXJlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBwYWNrYWdlZA0KLQkgKiBzZXBhcmF0ZWx5IGZyb20gdGhlICJidWxrIiBvZiB0aGUgYWN0dWFsIGZlYXR1cmUgY29udGVudC4NCi0JICogVGhlIGZlYXR1cmUgZW50cnkgYXJjaGl2ZShzKSBtdXN0IGJlIGRvd25sb2FkZWQgZnJvbSBhbiB1cGRhdGUNCi0JICogc2l0ZSBpbiBvcmRlciB0byBwcmVzZW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBmZWF0dXJlIHRvIHRoZQ0KLQkgKiBjbGllbnQuIENvbnNlcXVlbnRseSwga2VlcGluZyB0aGUgbnVtYmVyIGFuZCBzaXplIG9mIHRoZSBmZWF0dXJlDQotCSAqIGVudHJ5IGFyY2hpdmUocykgdG8gYSBtaW5pbXVtIHdpbGwgc3BlZWQgdXAgdGhlIHJlc3BvbnNpdmVuZXNzIG9mIHRoZQ0KLQkgKiB1c2VyIGludGVyZmFjZS4NCi0JICogPC9wPg0KLQkgKiA8cD4NCi0JICogVGhlIG51bWJlciBvZiByZXR1cm5lZCByZWZlcmVuY2VzIGlzIGRlcGVuZGVudCBvbiBlYWNoIGZlYXR1cmUNCi0JICogY29udGVudCBwcm92aWRlciAoaS5lIGlzIGRlcGVuZGVudCBvbiB0aGUgcGFja2FnaW5nIG1lY2hhbmlzbSB1c2VkDQotCSAqIGJ5IHRoZSBwYXJ0aWN1bGFyIGZlYXR1cmUgdHlwZSkuDQotCSAqIDwvcD4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IpDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlZmVyZW5jZXMNCi0JICogYXJlIGZvdW5kDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbnRlbnQgcmVmZXJlbmNlcyBvZiB0aGUgInBhY2thZ2VkIg0KLQkgKiBhcmNoaXZlcyB0aGF0IGNvbnRhaW4gdGhlIGZpbGVzIGZvciB0aGUgc3BlY2lmaWVkIHBsdWctaW4gZW50cnkuDQotCSAqIDxwPg0KLQkgKiBUaGUgbnVtYmVyIG9mIHJldHVybmVkIHJlZmVyZW5jZXMgaXMgZGVwZW5kZW50IG9uIGVhY2ggZmVhdHVyZQ0KLQkgKiBjb250ZW50IHByb3ZpZGVyIChpLmUgaXMgZGVwZW5kZW50IG9uIHRoZSBwYWNrYWdpbmcgbWVjaGFuaXNtIHVzZWQNCi0JICogYnkgdGhlIHBhcnRpY3VsYXIgZmVhdHVyZSB0eXBlKS4NCi0JICogPC9wPg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IpDQotCSAqIEBwYXJhbSBwbHVnaW5FbnRyeSBwbHVnLWluIGVudHJ5DQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlZmVyZW5jZXMNCi0JICogYXJlIGZvdW5kDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKA0KLQkJSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LA0KLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBjb250ZW50IHJlZmVyZW5jZXMgb2YgdGhlICJwYWNrYWdlZCINCi0JICogYXJjaGl2ZXMgdGhhdCBjb250YWluIHRoZSBmaWxlcyBmb3IgdGhlIHNwZWNpZmllZCBub24tcGx1Zy1pbiBlbnRyeS4NCi0JICogPHA+DQotCSAqIFRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVmZXJlbmNlcyBpcyBkZXBlbmRlbnQgb24gZWFjaCBmZWF0dXJlDQotCSAqIGNvbnRlbnQgcHJvdmlkZXIgKGkuZSBpcyBkZXBlbmRlbnQgb24gdGhlIHBhY2thZ2luZyBtZWNoYW5pc20gdXNlZA0KLQkgKiBieSB0aGUgcGFydGljdWxhciBmZWF0dXJlIHR5cGUpLg0KLQkgKiA8L3A+DQotCSAqIDxwPg0KLQkgKiBOb3RlLCB0aGF0IHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBpbnRlcnByZXQgbm9uLXBsdWctaW4gZW50cmllcyBpbiBhbnkgDQotCSAqIHdheSwgb3RoZXIgdGhhdCBwZXJmb3JtaW5nIGFueSByZXF1aXJlZCBkb3dubG9hZHMuIE5vbi1wbHVnLWluIGVudHJpZXMNCi0JICogYXJlIGhhbmRsZWQgYnkgY3VzdG9tIGluc3RhbGwgaGFuZGxlcnMgdGhhdCBtdXN0IGJlIHNwZWNpZmllZCBmb3INCi0JICogdGhlIGZlYXR1cmUuIENvbnNlcXVlbnRseSwgdGhpcyBpbnRlcmZhY2UgZG9lcyBub3QgbWFrZSBhIGRpc3RpbmN0aW9uDQotCSAqIGJldHdlZW4gdGhlICJsb2dpY2FsIiBhbmQgInBhY2thZ2VkIiB2aWV3cyBmb3Igbm9uLXBsdWctaW4gZW50cmllcy4NCi0JICogVGhlICJwYWNrYWdlZCIgdmlldyAocmV0dXJuaW5nIHJlZmVyZW5jZXMgdG8gdGhlIG5vbi1wbHVnLWluIGFyY2hpdmVzKQ0KLQkgKiBpcyB0aGUgb25seSBvbmUgc3VwcG9ydGVkLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGN1c3RvbSBpbnN0YWxsDQotCSAqIGhhbmRsZXIgdG8gdW5kZXJzdGFuZCB0aGUgImxvZ2ljYWwiIHZpZXcgb2Ygbm9uLXBsdWctaW4gYXJjaGl2ZXMuDQotCSAqIDwvcD4NCi0JICogDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlZmVyZW5jZXMNCi0JICogYXJlIGZvdW5kDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKA0KLQkJSU5vblBsdWdpbkVudHJ5IG5vblBsdWdpbkVudHJ5LA0KLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBjb250ZW50IHJlZmVyZW5jZXMgdG8gdGhlIGZlYXR1cmUgZGVmaW5pdGlvbiBmaWxlcw0KLQkgKiAoaS5lIHRoZSAibG9naWNhbCIgdmlldyBvZiB0aGUgZmlsZXMgZGVmaW5pbmcgdGhlIGZlYXR1cmUpLiBUaGVzZQ0KLQkgKiBhcmUgdGhlIGZpbGVzIHJlcXVpcmVkIHRvIHByZXNlbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZlYXR1cmUgdG8gdGhlDQotCSAqIGNsaWVudCwgYW5kIGluIGdlbmVyYWwsIHNob3VsZCBub3QgY29udGFpbiByZWZlcmVuY2VzIHRvIHBsdWctaW4gYW5kIA0KLQkgKiBub24tcGx1Zy1pbiBmaWxlcy4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IpDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIENvbnRlbnRSZWZlcmVuY2Ugb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVmZXJlbmNlcyBhcmUgZm91bmQNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHdoZW4gYW4gZXJyb3Igb2NjdXJzDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY29udGVudCByZWZlcmVuY2VzIHRvIHRoZSBmaWxlcyBpbXBsZW1lbnRpbmcNCi0JICogdGhlIHNwZWNpZmllZCBwbHVnLWluLiAoaS5lIHRoZSAibG9naWNhbCIgdmlldyBvZiB0aGUgcGx1Zy1pbikuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvcikNCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgQ29udGVudFJlZmVyZW5jZSBvciBhbiBlbXB0eSBhcnJheSBpZiBubyByZWZlcmVuY2VzIGFyZSBmb3VuZA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcygNCi0JCUlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwNCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgYWxsIGFyY2hpdmVzIHJlcXVpcmVkIGZvciB0aGUNCi0JICogc3BlY2lmaWVkIHBsdWctaW4gYW5kIG5vbi1wbHVnLWluIGVudHJpZXMgKHRoZSAicGFja2FnaW5nIiB2aWV3KS4NCi0JICogDQotCSAqIEBwYXJhbSBwbHVnaW5FbnRyaWVzIGFuIGFycmF5IG9mIHBsdWctaW4gZW50cmllcw0KLQkgKiBAcGFyYW0gbm9uUGx1Z2luRW50cmllcyBhbiBhcnJheSBvZiBub24tcGx1Zy1pbiBlbnRyaWVzDQotCSAqIEByZXR1cm4gdG90YWwgZG93bmxvYWQgc2l6ZSwgb3IgYW4gaW5kaWNhdGlvbiB0aGF0IHNpemUgY291bGQgbm90IGJlDQotCSAqIGRldGVybWluZWQNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Db250ZW50RW50cnlNb2RlbCNVTktOT1dOX1NJWkUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplRm9yKA0KLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcywNCi0JCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkVudHJpZXMpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgZmlsZXMgcmVxdWlyZWQgZm9yIHRoZQ0KLQkgKiBzcGVjaWZpZWQgcGx1Zy1pbiBhbmQgbm9uLXBsdWctaW4gZW50cmllcyAodGhlICJsb2dpY2FsIiB2aWV3KS4NCi0JICogDQotCSAqIEBwYXJhbSBwbHVnaW5FbnRyaWVzIGFuIGFycmF5IG9mIHBsdWctaW4gZW50cmllcw0KLQkgKiBAcGFyYW0gbm9uUGx1Z2luRW50cmllcyBhbiBhcnJheSBvZiBub24tcGx1Zy1pbiBlbnRyaWVzDQotCSAqIEByZXR1cm4gdG90YWwgZG93bmxvYWQgc2l6ZSwgb3IgYW4gaW5kaWNhdGlvbiB0aGF0IHNpemUgY291bGQgbm90IGJlDQotCSAqIGRldGVybWluZWQNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Db250ZW50RW50cnlNb2RlbCNVTktOT1dOX1NJWkUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0SW5zdGFsbFNpemVGb3IoDQotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5FbnRyaWVzLA0KLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRW50cmllcyk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2ZXJpZmllciBmb3IgdGhpcyBmZWF0dXJlLg0KLQkgKiBJZiBwcm92aWRlZCwgdGhlIHZlcmlmaWVyIGlzIGNhbGxlZCBhdCB2YXJpb3VzIHBvaW50IGR1cmluZw0KLQkgKiBpbnN0YWxsYXRpb24gcHJvY2Vzc2luZyB0byB2ZXJpZnkgZG93bmxvYWRlZCBhcmNoaXZlcy4gVGhlDQotCSAqIHR5cGUgb2YgdmVyaWZpY2F0aW9uIHByb3ZpZGVkIGlzIGRlcGVuZGVudCBvbiB0aGUgY29udGVudA0KLQkgKiBwcm92aWRlciBpbXBsZW1lbnRhdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gdmVyaWZpZXINCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJVmVyaWZpZXIgZ2V0VmVyaWZpZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGVudCBwcm92aWRlci4NCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSBmb3IgdGhpcyBjb250ZW50IHByb3ZpZGVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuDQotCSAqIEluIGdlbmVyYWwsIHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhcyBwYXJ0IG9mDQotCSAqIGZlYXR1cmUgY3JlYXRpb24uIE9uY2Ugc2V0LCB0aGUgZmVhdHVyZSBzaG91bGQgbm90IGJlIHJlc2V0Lg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmUgZmVhdHVyZSBmb3IgdGhpcyBjb250ZW50IHByb3ZpZGVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUZlYXR1cmVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDAyZWNmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUZlYXR1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotDQotLyoqDQotICogRmVhdHVyZSBmYWN0b3J5IGludGVyZmFjZS4NCi0gKiBBIGZlYXR1cmUgZmFjdG9yeSBpcyB1c2VkIHRvIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIGNvbmNyZXRlDQotICogZmVhdHVyZXMuIA0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VGZWF0dXJlRmFjdG9yeQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElGZWF0dXJlRmFjdG9yeSB7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgZmVhdHVyZSBkZWZpbmVkIGJ5IHRoZSBzdXBwbGllZCBVUkwuIFRoZSBmZWF0dXJlDQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHNpdGUuDQotCSAqIDxwPg0KLQkgKiBUaGUgYWN0dWFsIGludGVycHJldGF0aW9uIG9mIHRoZSBVUkwgaXMgZmVhdHVyZS10eXBlIHNwZWNpZmljLg0KLQkgKiBJbiBtb3N0IGNhc2VzIHRoZSBVUkwgd2lsbCBwb2ludCB0byBzb21lIGZlYXR1cmUtc3BlY2lmaWMNCi0JICogZmlsZSB0aGF0IGNhbiBiZSB1c2VkIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0byBjb25zdHJ1Y3QNCi0JICogdGhlIGZlYXR1cmUgb2JqZWN0Lg0KLQkgKiA8L3A+DQotCSAqIEBwYXJhbSB1cmwgVVJMIGludGVycHJldGVkIGJ5IHRoZSBmZWF0dXJlDQotCSAqIEBwYXJhbSBzaXRlIHNpdGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmZWF0dXJlDQotCSAqIEByZXR1cm4gY29uY3JldGUgZmVhdHVyZSBvYmplY3QNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVGZWF0dXJlKFVSTCwgSVNpdGUsIElQcm9ncmVzc01vbml0b3IpIGluc3RlYWQNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsIElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgYSBmZWF0dXJlIGRlZmluZWQgYnkgdGhlIHN1cHBsaWVkIFVSTC4gVGhlIGZlYXR1cmUNCi0JICogaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgc2l0ZS4NCi0JICogPHA+DQotCSAqIFRoZSBhY3R1YWwgaW50ZXJwcmV0YXRpb24gb2YgdGhlIFVSTCBpcyBmZWF0dXJlLXR5cGUgc3BlY2lmaWMuDQotCSAqIEluIG1vc3QgY2FzZXMgdGhlIFVSTCB3aWxsIHBvaW50IHRvIHNvbWUgZmVhdHVyZS1zcGVjaWZpYw0KLQkgKiBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHRvIGNvbnN0cnVjdA0KLQkgKiB0aGUgZmVhdHVyZSBvYmplY3QuDQotCSAqIDwvcD4NCi0JICogQHBhcmFtIHVybCBVUkwgaW50ZXJwcmV0ZWQgYnkgdGhlIGZlYXR1cmUNCi0JICogQHBhcmFtIHNpdGUgc2l0ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZlYXR1cmUNCi0JICogQHJldHVybiBjb25jcmV0ZSBmZWF0dXJlIG9iamVjdA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMSANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsIElTaXRlIHNpdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247CQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlUmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiN2UxOGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi0NCi0vKioNCi0gKiBGZWF0dXJlIHJlZmVyZW5jZS4NCi0gKiBBIHJlZmVyZW5jZSB0byBhIGZlYXR1cmUuDQotICogPHA+DQotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgc2hvdWxkIA0KLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIA0KLSAqIGludGVyZmFjZS4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZVJlZmVyZW5jZQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElGZWF0dXJlUmVmZXJlbmNlIGV4dGVuZHMgSUFkYXB0YWJsZSxJUGxhdGZvcm1FbnZpcm9ubWVudCB7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgVVJMLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIFVSTCANCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB1cGRhdGUgc2l0ZSBmb3IgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZQ0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIHNpdGUNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBsYWJlbA0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsNCi0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZS4NCi0JICogVGhpcyBpcyBhIGZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyB0aGUgZnVsbCBmZWF0dXJlIG9iamVjdC4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgZmVhdHVyZQ0KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yKSBpbnN0ZWFkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlLg0KLQkgKiBUaGlzIGlzIGEgZmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIHRoZSBmdWxsIGZlYXR1cmUgb2JqZWN0Lg0KLQkgKiANCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3INCi0JICogQHJldHVybiB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlDQotCSAqIEBzaW5jZSAyLjEgDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBpZGVudGlmaWVyLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSBpZGVudGlmaWVyLg0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgcmVmZXJlbmNlIFVSTC4NCi0JICogVGhpcyBpcyB0eXBpY2FsbHkgcGVyZm9ybWVkIGFzIHBhcnQgb2YgdGhlIGZlYXR1cmUgcmVmZXJlbmNlIGNyZWF0aW9uDQotCSAqIG9wZXJhdGlvbi4gT25jZSBzZXQsIHRoZSB1cmwgc2hvdWxkIG5vdCBiZSByZXNldC4NCi0JICogDQotCSAqIEBwYXJhbSB1cmwgcmVmZXJlbmNlIFVSTA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VVJMKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQXNzb2NpYXRlcyBhIHNpdGUgd2l0aCB0aGUgZmVhdHVyZSByZWZlcmVuY2UuDQotCSAqIFRoaXMgaXMgdHlwaWNhbGx5IHBlcmZvcm1lZCBhcyBwYXJ0IG9mIHRoZSBmZWF0dXJlIHJlZmVyZW5jZSBjcmVhdGlvbg0KLQkgKiBvcGVyYXRpb24uIE9uY2Ugc2V0LCB0aGUgc2l0ZSBzaG91bGQgbm90IGJlIHJlc2V0Lg0KLQkgKiANCi0JICogQHBhcmFtIHNpdGUgc2l0ZSBmb3IgdGhlIGZlYXR1cmUgcmVmZXJlbmNlDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElTaXRlIHNpdGUpOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmZWF0dXJlIGlzIHBhdGNoaW5nIGFub3RoZXIgZmVhdHVyZSwNCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiBAcmV0dXJuIGJvb2xlYW4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpOw0KLQkNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUltcG9ydC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGY2NDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotDQotLyoqDQotICogUGx1Zy1pbiBkZXBlbmRlbmN5IGVudHJ5Lg0KLSAqIERlc2NyaWJlcyBhIGZldHVyZSBkZXBlbmRlbmN5IG9uIGEgcGFydGljdWxhciBwbHVnLWluLiBUaGUgZGVwZW5kZW5jeSANCi0gKiBjYW4gc3BlY2lmeSBhIHNwZWNpZmljIHBsdWctaW4gdmVyc2lvbiBhbmQgYSBtYXRjaGluZyBydWxlIGZvciANCi0gKiBzYXRpc2Z5aW5nIHRoZSBkZXBlbmRlbmN5Lg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkltcG9ydA0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElJbXBvcnQgZXh0ZW5kcyBJQWRhcHRhYmxlLCBJVXBkYXRlQ29uc3RhbnRzLCBJUGxhdGZvcm1FbnZpcm9ubWVudCB7DQotDQotCS8qKg0KLQkgKiBUaGUgaW1wb3J0IHJlbGF0ZXMgdG8gYSBwbHVnaW4NCi0JICogQHNpbmNlIDIuMC4yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX1BMVUdJTiA9IDA7DQotCQ0KLQkvKioNCi0JICogVGhlIGltcG9ydCByZWxhdGVzIHRvIGEgZmVhdHVyZQ0KLQkgKiBAc2luY2UgMi4wLjINCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtJTkRfRkVBVFVSRSA9IDE7DQotDQotCS8qKiANCi0JICogUmV0dXJucyBhbiBpZGVudGlmaWVyIG9mIHRoZSBkZXBlbmRlbnQgcGx1Zy1pbi4NCi0JICogDQotCSAqIEByZXR1cm4gcGx1Zy1pbiBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtYXRjaGluZyBydWxlIGZvciB0aGUgZGVwZW5kZW5jeS4NCi0JICogDQotCSAqIEByZXR1cm4gbWF0Y2hpbmcgcnVsZQ0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRSdWxlKCk7DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWF0Y2hpbmcgcnVsZSBmb3IgdGhlIGRlcGVuZGVuY3kgaWRlbnRpZmllci4NCi0JICogDQotCSAqIEByZXR1cm4gbWF0Y2hpbmcgaWQgcnVsZQ0KLQkgKiBAc2luY2UgMi4xIA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRJZFJ1bGUoKTsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbmN5IGtpbmQNCi0JICogDQotCSAqIEBzZWUgI0tJTkRfUExVR0lODQotCSAqIEBzZWUgI0tJTkRfRkVBVFVSRQ0KLQkgKiBAcmV0dXJuIEtJTkRfUExVR0lOIGlmIHRoZSBkZXBlbmRlbmN5IHJlbGF0ZXMgdG8gYSBwbHVnaW4sIA0KLQkgKiBLSU5EX0ZFQVRVUkUgaWYgdGhlIGRlcGVuZGVuY3kgcmVsYXRlcyB0byBhIGZlYXR1cmUuDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldEtpbmQoKTsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBwYXRjaCBtb2RlLiBJZiB0aGUgaW1wb3J0IGlzIGluIHBhdGNoIG1vZGUsDQotCSAqIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgaXMgY29uc2lkZXJlZCBhIHBhdGNoIHRhcmdldCwNCi0JICogYW5kIHRoZSBmZWF0dXJlIHRoYXQgb3ducyB0aGUgaW1wb3J0IGlzIHBhdGNoIGNhcnJpZXIuDQotCSAqIFBhdGNoIGNhcnJpZXIgYW5kIHBhdGNoZWQgZmVhdHVyZSBhcmUgbGlua2VkIGluIGENCi0JICogZGlzdGluY3Qgd2F5OiBpZiBhIHBhdGNoZWQgZmVhdHVyZSBpcyBkaXNhYmxlZCwNCi0JICogYWxsIHRoZSBwYXRjaGVzIGFyZSBkaXNhYmxlZCB3aXRoIGl0Lg0KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgcmVwcmVzZW50cyBhIHBhdGNoDQotCSAqIHJlZmVyZW5jZSwgZmFsc2Ugb3RoZXJ3aXNlLg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjAyYmU4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotCi0KLQotLyoqCi0gKiBJbmNsdWRlZCBGZWF0dXJlIHJlZmVyZW5jZS4KLSAqIEEgcmVmZXJlbmNlIHRvIGEgaW5jbHVkZWQgZmVhdHVyZS4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgc2hvdWxkIAotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gKiBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlUmVmZXJlbmNlCi0gKiBAc2luY2UgMi4wLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGV4dGVuZHMgSUZlYXR1cmVSZWZlcmVuY2UsIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlLgotCSAqIFRoaXMgaXMgYSBmYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgdGhlIGZ1bGwgZmVhdHVyZSBvYmplY3QuCi0JICogZXF1aXZhbGVudCB0byBnZXRGZWF0dXJlKGZhbHNlLG51bGwpOwotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgZmVhdHVyZQotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IpCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlLgotCSAqIFRoaXMgaXMgYSBmYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgdGhlIGZ1bGwgZmVhdHVyZSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBlcmZlY3RNYXRjaCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGVyZmVjdCBtYXRjaCBmZWF0dXJlIGZlYXR1cmUgc2hvdWxkIGJlIHJldHVybmVkCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBiZXN0IG1hdGNoIGZlYXR1cmUgc2hvdWxkIGJlIHJldHVybmVkLgotCSAqIEBwYXJhbSBjb25maWd1cmVkU2l0ZSB0aGUgY29uZmlndXJlZCBzaXRlIHRvIHNlYXJjaCBmb3IgdGhlIEZlYXR1cmUuIElmIAotCSAqIHRoZSBjb25maWd1cmVkIHNpdGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHNlYXJjaCB3aWxsIGJlIGRvbmUgaW4gdGhlIGN1cnJlbnQgY29uZmlndXJlZCBzaXRlLgotCSAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgZmVhdHVyZQotCSAqIGluc3RlYWQKLQkgKiBAc2luY2UgMi4wLjIKLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKGJvb2xlYW4gcGVyZmVjdE1hdGNoLElDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUuCi0JICogVGhpcyBpcyBhIGZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyB0aGUgZnVsbCBmZWF0dXJlIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGVyZmVjdE1hdGNoIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwZXJmZWN0IG1hdGNoIGZlYXR1cmUgZmVhdHVyZSBzaG91bGQgYmUgcmV0dXJuZWQKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGJlc3QgbWF0Y2ggZmVhdHVyZSBzaG91bGQgYmUgcmV0dXJuZWQuCi0JICogQHBhcmFtIGNvbmZpZ3VyZWRTaXRlIHRoZSBjb25maWd1cmVkIHNpdGUgdG8gc2VhcmNoIGZvciB0aGUgRmVhdHVyZS4gSWYgCi0JICogdGhlIGNvbmZpZ3VyZWQgc2l0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgc2VhcmNoIHdpbGwgYmUgZG9uZSBpbiB0aGUgY3VycmVudCBjb25maWd1cmVkIHNpdGUuCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUKLQkgKiBAc2luY2UgMi4xCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotCSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLQkgKiBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdAotCSAqIGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQKLQkgKiB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkKLQkgKiBldm9sdmVzLgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoYm9vbGVhbiBwZXJmZWN0TWF0Y2gsSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIG9wdGlvbmFsLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBzaW5jZSAyLjAuMQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hdGNoaW5nIHJ1bGUgZm9yIHRoaXMgaW5jbHVkZWQgZmVhdHVyZS4KLQkgKiBUaGUgcnVsZSB3aWxsIGRldGVybWluZSB0aGUgYWJpbGl0eSBvZiB0aGUgaW5jbHVkZWQgZmVhdHVyZSB0byBtb3ZlIHZlcnNpb24gCi0JICogd2l0aG91dCBjYXVzaW5nIHRoZSBvdmVyYWxsIGZlYXR1cmUgdG8gYXBwZWFyIGJyb2tlbi4KLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5SVUxFX1BFUkZFQ1Q8L2NvZGU+Ci0JICogCi0JICogQHNlZSBJVXBkYXRlQ29uc3RhbnRzI1JVTEVfUEVSRkVDVAotCSAqIEBzZWUgSVVwZGF0ZUNvbnN0YW50cyNSVUxFX0VRVUlWQUxFTlQKLQkgKiBAc2VlIElVcGRhdGVDb25zdGFudHMjUlVMRV9DT01QQVRJQkxFCi0JICogQHNlZSBJVXBkYXRlQ29uc3RhbnRzI1JVTEVfR1JFQVRFUl9PUl9FUVVBTAotCSAqIEByZXR1cm4gaW50IHJlcHJlc2VudGF0aW9uIG9mIGZlYXR1cmUgbWF0Y2hpbmcgcnVsZS4KLQkgKiBAc2luY2UgMi4wLjIKLQkgKiBAZGVwcmVjYXRlZCBzaW5jZSAzLjAgaW5jbHVkZWQgZmVhdHVyZSB2ZXJzaW9uIGlzIGV4YWN0bHkgc3BlY2lmaWVkCi0JICovCi0JcHVibGljIGludCBnZXRNYXRjaCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlYXJjaCBsb2NhdGlvbiBmb3IgdGhpcyBpbmNsdWRlZCBmZWF0dXJlLgotCSAqIFRoZSBsb2NhdGlvbiB3aWxsIGJlIHVzZWQgdG8gc2VhcmNoIHVwZGF0ZXMgZm9yIHRoaXMgZmVhdHVyZS4KLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5TRUFSQ0hfUk9PVDwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElVcGRhdGVDb25zdGFudHMjU0VBUkNIX1JPT1QKLQkgKiBAc2VlIElVcGRhdGVDb25zdGFudHMjU0VBUkNIX1NFTEYKLQkgKiBAcmV0dXJuIGludCByZXByZXNlbnRhdGlvbiBvZiBmZWF0dXJlIHNlYXJjaGluZyBydWxlLgotCSAqIEBzaW5jZSAyLjAuMgotCSAqLwotCi0JcHVibGljIGludCBnZXRTZWFyY2hMb2NhdGlvbigpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lJbnN0YWxsSGFuZGxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JSW5zdGFsbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiYzc3Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lJbnN0YWxsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBDdXN0b20gaW5zdGFsbCBoYW5kbGVyLgotICogQ3VzdG9tIGluc3RhbGwgaGFuZGxlcnMgY2FuIG9wdGlvbmFsbHkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgZmVhdHVyZS4KLSAqIFRoZSBhY3R1YWwgaW5zdGFsbCBoYW5kbGVyIGltcGxlbWVudGF0aW9uIGNhbiBiZSBwaHlzaWNhbGx5IGRlbGl2ZXJlZAotICogYXMgcGFydCBvZiB0aGUgZmVhdHVyZSBwYWNrYWdlLCBvciBjYW4gYWxyZWFkeSBiZSBpbnN0YWxsZWQgb24gdGhlIGNsaWVudAotICogbWFjaGluZSBhbmQgcmVnaXN0ZXJlZCB2aWEgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmluc3RhbGxIYW5kbGVyczwvY29kZT4KLSAqIGV4dGVuc2lvbiBwb2ludC4gVGhlIGluc3RhbGwgaGFuZGxlciBtZXRob2RzIGFyZSBjYWxsZWQgYXQgcHJlZGV0ZXJtaW5lZAotICogcG9pbnQgZHVyaW5nIHVwZGF0ZSBhY3Rpb25zLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgCi0gKiBkaXJlY3RseSBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlSW5zdGFsbEhhbmRsZXIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zdGFsbEhhbmRsZXIgewotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBoYW5kbGVyIGlzIGJlaW5nIGluaXRpYWxpemVkIGZvciBmZWF0dXJlIGluc3RhbGwuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkRMRVJfQUNUSU9OX0lOU1RBTEwgPSAxOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBoYW5kbGVyIGlzIGJlaW5nIGluaXRpYWxpemVkIGZvciBmZWF0dXJlIGNvbmZpZ3VyZS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFORExFUl9BQ1RJT05fQ09ORklHVVJFID0gMjsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgaGFuZGxlciBpcyBiZWluZyBpbml0aWFsaXplZCBmb3IgZmVhdHVyZSB1bmNvbmZpZ3VyZS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFORExFUl9BQ1RJT05fVU5DT05GSUdVUkUgPSAzOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBoYW5kbGVyIGlzIGJlaW5nIGluaXRpYWxpemVkIGZvciBmZWF0dXJlIHVuaW5zdGFsbC4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEFORExFUl9BQ1RJT05fVU5JTlNUQUxMID0gNDsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGluc3RhbGwgaGFuZGxlci4KLQkgKiBJbnN0YWxsIGhhbmRsZXJzIGFyZSBhbHdheXMgY29uc3RydWN0ZWQgdXNpbmcgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JICogVGhlIGFyZSBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY29uc3RydWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIHVwZGF0ZSBhY3Rpb24gdHlwZQotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSB0YXJnZXQgb2YgdGhlIGFjdGlvbgotCSAqIEBwYXJhbSBlbnRyeSBtb2RlbCBlbnRyeSB0aGF0IGRlZmluZXMgdGhpcyBoYW5kbGVyCi0JICogQHBhcmFtIG1vbml0b3Igb3B0aW9uYWwgcHJvZ3Jlc3MgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi0JCWludCB0eXBlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJSW5zdGFsbEhhbmRsZXJFbnRyeSBlbnRyeSwKLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnN0YWxsIGFjdGlvbi4gQXQgdGhpcyBwb2ludCwgbm8gaW5zdGFsbAotCSAqIHByb2Nlc3NpbmcgaGFzIHRha2VuIHBsYWNlLgotCSAqIAotCSAqIEBzZWUgI0hBTkRMRVJfQUNUSU9OX0lOU1RBTEwKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCBhZnRlciBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHBsdWctaW4gZW50cmllcyBoYXZlIGJlZW4gZG93bmxvYWRlZCwKLQkgKiBidXQgYmVmb3JlIHRoZXkgYXJlIGFjdHVsbHkgdW5wYWNrZWQgYW5kIGluc3RhbGxlZC4KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9JTlNUQUxMCi0JICogQHBhcmFtIHBsdWdpbnMgZG93bmxvYWRlZCBwbHVnLWluIGVudHJpZXMuIE5vdGUgdGhpcyBtYXkgYmUgYSBzdWJzZXQKLQkgKiBvZiB0aGUgcGx1Zy1pbnMgYWN0dWFsbHkgcmVmZXJlbmNlcyBieSB0aGUgZmVhdHVyZS4KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHBsdWdpbnNEb3dubG9hZGVkKElQbHVnaW5FbnRyeVtdIHBsdWdpbnMpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gbm9uLXBsdWctaW4gZW50cmllcyBoYXZlIGJlZW4gCi0JICogZG93bmxvYWRlZC4gVGhlIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgY2FuIHBlcmZvcm0gYW55IGN1c3RvbQotCSAqIHZlcmlmaWNhdGlvbiBvZiB0aGUgbm9uLXBsdWctaW4gZW50cmllcyAodGhlc2UgYXJlIG5vdCBpbnRlcnByZXRlZAotCSAqIGluIGFueSB3YXkgYnkgdGhlIHBsYXRmb3JtIChiZXlvbmQgZG93bmxvYWRpbmcpKS4KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9JTlNUQUxMCi0JICogQHBhcmFtIG5vblBsdWdpbkRhdGEgZG93bmxvYWRlZCBub24tcGx1Zy1pbiBlbnRyaWVzLgotCSAqIEBwYXJhbSBsaXN0ZW5lciB2ZXJpZmljYXRpb24gbGlzdGVuZXIsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIG5vblBsdWdpbkRhdGFEb3dubG9hZGVkKAotCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5EYXRhLAotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIHRoZSBmZWF0dXJlIGZpbGVzIGFuZCBhbnkgZG93bmxvYWRlZCBwbHVnLWlucyBoYXZlCi0JICogYmVlbiBpbnN0YWxsZWQuIFR5cGljYWxseSB0aGlzIGlzIHRoZSBwb2ludCB3aGVyZSB0aGUgY3VzdG9tCi0JICogaW5zdGFsbCBoYW5kbGVyIGNhbiBpbnN0YWxsIGFueSBub24tcGx1Zy1pbiBlbnRyaWVzICh0aGVzZSBhcmUgbm90IAotCSAqIGludGVycHJldGVkIGluIGFueSB3YXkgYnkgdGhlIHBsYXRmb3JtIChiZXlvbmQgZG93bmxvYWRpbmcpKS4KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9JTlNUQUxMCi0JICogQHBhcmFtIGNvbnN1bWVyIGNvbnRlbnQgY29uc3VtZXIgZm9yIHRoZSBmZWF0dXJlLiBUaGUgaW5zdGFsbCBoYW5kbGVyCi0JICogY2FuIGNob29zZSB0byB1c2UgdGhpcyBjb25zdW1lciB0byBpbnN0YWxsIHRoZSBub24tcGx1Zy1pbiBkYXRhLAotCSAqIG9yIGNhbiBoYW5kbGUgdGhlIGRhdGEgaW4gYW55IG90aGVyIHdheS4gSWYgdXNpbmcgdGhlIGNvbnN1bWVyLAotCSAqIHRoZSBpbnN0YWxsIGhhbmRsZXIgc2hvdWxkIG9ubHkgY2FsbCAKLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpCi0JICogYW5kIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjb3BlbihJTm9uUGx1Z2luRW50cnkpCi0JICogbWV0aG9kcyBvZiB0aGUgY29uc3VtZXIuIAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB0ZXJtaW5hdGVzIHRoZSBhY3Rpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVJbnN0YWxsKElGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0YWxsIGFjdGlvbi4KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9JTlNUQUxMCi0JICogQHBhcmFtIHN1Y2Nlc3MgaW5kaWNhdGVzIGFjdGlvbiBzdWNjZXNzLiAKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGNvbmZpZ3VyZSBhY3Rpb24KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9DT05GSUdVUkUKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIHRoZSBmZWF0dXJlIGhhcyBiZWVuIGNvbmZpZ3VyZWQuIFRoZSBpbnN0YWxsIGhhbmRsZXIKLQkgKiBzaG91bGQgcGVyZm9ybSBhbnkgY29tcGxldGlvbiB0YXNrcy4gTm8gYXJndW1lbnRzIGFyZSBwYXNzZWQKLQkgKiB0byB0aGUgbWV0aG9kLiBJZiBuZWVkZWQsIHRoZSBpbnN0YWxsIGhhbmRsZXIgY2FuIHVzZSBhcmd1bWVudHMKLQkgKiBwYXNzZWQgb24gdGhlIGluaXRpYWxpemF0aW9uIGNhbGwuCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fQ09ORklHVVJFCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGNvbmZpZ3VyZSBhY3Rpb24uCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fQ09ORklHVVJFCi0JICogQHBhcmFtIHN1Y2Nlc3MgaW5kaWNhdGVzIGFjdGlvbiBzdWNjZXNzLiAKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdW5jb25maWd1cmUgYWN0aW9uCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fVU5DT05GSUdVUkUKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgdGhlIGZlYXR1cmUgaGFzIGJlZW4gdW5jb25maWd1cmVkLiBUaGUgaW5zdGFsbCBoYW5kbGVyCi0JICogc2hvdWxkIHBlcmZvcm0gYW55IGNvbXBsZXRpb24gdGFza3MuIE5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0JICogdG8gdGhlIG1ldGhvZC4gSWYgbmVlZGVkLCB0aGUgaW5zdGFsbCBoYW5kbGVyIGNhbiB1c2UgYXJndW1lbnRzCi0JICogcGFzc2VkIG9uIHRoZSBpbml0aWFsaXphdGlvbiBjYWxsLgotCSAqIAotCSAqIEBzZWUgI0hBTkRMRVJfQUNUSU9OX1VOQ09ORklHVVJFCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZVVuY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgdW5jb25maWd1cmUgYWN0aW9uLgotCSAqIAotCSAqIEBzZWUgI0hBTkRMRVJfQUNUSU9OX1VOQ09ORklHVVJFCi0JICogQHBhcmFtIHN1Y2Nlc3MgaW5kaWNhdGVzIGFjdGlvbiBzdWNjZXNzLiAKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB1bmluc3RhbGwgYWN0aW9uCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fVU5JTlNUQUxMCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGxJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgZmVhdHVyZSBoYXMgYmVlbiB1bmluc3RhbGxlZC4gVGhlIGluc3RhbGwgaGFuZGxlcgotCSAqIHNob3VsZCBwZXJmb3JtIGFueSBjb21wbGV0aW9uIHRhc2tzLiBObyBhcmd1bWVudHMgYXJlIHBhc3NlZAotCSAqIHRvIHRoZSBtZXRob2QuIElmIG5lZWRlZCwgdGhlIGluc3RhbGwgaGFuZGxlciBjYW4gdXNlIGFyZ3VtZW50cwotCSAqIHBhc3NlZCBvbiB0aGUgaW5pdGlhbGl6YXRpb24gY2FsbC4gTm90ZSwgdGhhdCBhdCB0aGlzIHBvaW50Ci0JICogdGhlIGZlYXR1cmUgZmlsZXMgYW5kIGFueSB1bnJlZmVyZW5jZWQgcGx1Zy1pbnMgaGF2ZSBiZWVuCi0JICogcmVtb3ZlZC4KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9VTklOU1RBTEwKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlVW5pbnN0YWxsKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgdW5pbnN0YWxsIGFjdGlvbi4KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9VTklOU1RBTEwKLQkgKiBAcGFyYW0gc3VjY2VzcyBpbmRpY2F0ZXMgYWN0aW9uIHN1Y2Nlc3MuIAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB0ZXJtaW5hdGVzIHRoZSBhY3Rpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lJbnN0YWxsSGFuZGxlckVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lJbnN0YWxsSGFuZGxlckVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTIzMWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JSW5zdGFsbEhhbmRsZXJFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBJbnN0YWxsIGhhbmRsZXIgZW50cnkuCi0gKiBBc3NvY2lhdGVzIGFuIG9wdGlvbmFsIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgd2l0aCB0aGUgZmVhdHVyZS4KLSAqIEluc3RhbGwgaGFuZGxlcnMgbXVzdCBpbXBsZW1lbnQgdGhlIElJbnN0YWxsSGFuZGxlciBpbnRlcmZhY2UuCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCAKLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICogaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSW5zdGFsbEhhbmRsZXJFbnRyeQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zdGFsbEhhbmRsZXJFbnRyeSBleHRlbmRzIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogUmV0dXJucyBvcHRpb25hbCBVUkwgdXNlZCBmb3IgYnJvd3Nlci10cmlnZ2VyZWQgaW5zdGFsbGF0aW9uIGhhbmRsaW5nLgotCSAqIAotCSAqIEByZXR1cm4gdXJsCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBvcHRpb25hbCBuYW1lIG9mIGEgbGlicmFyeSBjb250YWluaW5nIHRoZSBpbnN0YWxsCi0JICogaGFuZGxlciBjbGFzc2VzLiBJZiBzcGVjaWZpZWQsIHRoZSByZWZlcmVuY2VkIGxpYnJhcnkKLQkgKiBtdXN0IGJlIGNvbnRhaW5lZCBpbiB0aGUgZmVhdHVyZSBhcmNoaXZlLgotCSAqIAotCSAqIEByZXR1cm4gaW5zdGFsbCBoYW5kbGVyIGxpYnJhcnkgbmFtZQotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluc3RhbGwgaGFuZGxlciBuYW1lLgotCSAqIEl0IGlzIGludGVycHJldGVkIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIGxpYnJhcnkKLQkgKiBzcGVjaWZpY2F0aW9uLiBJZiBsaWJyYXJ5IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lCi0JICogaXMgaW50ZXByZXRlZCBhcyBhbiBpZGVudGlmaWVyIG9mIGEgImdsb2JhbCIgaW5zdGFsbAotCSAqIGhhbmRsZXIgcmVnaXN0ZXJlZCBpbiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuaW5zdGFsbEhhbmRsZXJzPC9jb2RlPiAKLQkgKiBleHRlbnNpb24gcG9pbnQuIElmIGxpYnJhcnkgaXMgc3BlY2lmaWVkLCB0aGUgbmFtZSBpcyBpbnRlcnByZXRlZAotCSAqIGFzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyBjb250YWluZWQgaW4gdGhlCi0JICogbGlicmFyeS4gSW4gYm90aCBjYXNlcywgdGhlIHJlc3VsdGluZyBjbGFzcyBtdXN0Ci0JICogaW1wbGVtZW50IElJbnN0YWxsSGFuZGxlci4gVGhlIGNsYXNzIGlzIGR5bmFtaWNhbGx5IGxvYWRlZCBhbmQKLQkgKiBjYWxsZWQgYXQgc3BlY2lmaWMgcG9pbnRzIGR1cmluZyBmZWF0dXJlIHByb2Nlc3NpbmcuCi0JICogVGhlIGhhbmRsZXIgaGFzIHZpc2liaWxpdHkgdG8gdGhlIEFQSSBjbGFzc2VzIGZyb20gdGhlIHVwZGF0ZSBwbHVnLWluLAotCSAqIGFuZCBwbHVnLWlucyByZXF1aXJlZCBieSB0aGUgdXBkYXRlIHBsdWdpbi4gCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIKLQkgKiBAcmV0dXJuIGhhbmRsZXIgbmFtZQotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIYW5kbGVyTmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lOb25QbHVnaW5FbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JTm9uUGx1Z2luRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmMDVmNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lOb25QbHVnaW5FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLQ0KLS8qKg0KLSAqIE5vbi1wbHVnLWluIGVudHJ5IGRlZmluZXMgYW4gYXJiaXRyYXJ5IG5vbi1wbHVnLWluIGRhdGEgZmlsZSBwYWNrYWdlZA0KLSAqIGFzIHBhcnQgb2YgYSBmZWF0dXJlLiBOb24tcGx1Zy1pbiBlbnRyaWVzIGFyZSBub3QgaW50ZXJwcmV0ZWQgYnkgdGhlDQotICogcGxhdGZvcm0gKG90aGVyIHRoYW4gYmVpbmcgZG93bmxvYWRlZCBhcyBwYXJ0IG9mIGFuIGluc3RhbGwgYWN0aW9uKS4NCi0gKiBUaGV5IHJlcXVpcmUgYSBjdXN0b20gaW5zdGFsbCBoYW5kbGVyIHRvIGJlIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZQ0KLSAqIGZlYXR1cmUuIE5vdGUsIHRoYXQgZGVmaW5pbmcgYSBub24tcGx1Zy1pbiBlbnRyeSBkb2VzIG5vdCBuZWNlc3NhcmlseQ0KLSAqIGluZGljYXRlIHRoZSBub24tcGx1Zy1pbiBmaWxlIGlzIHBhY2thZ2VkIHRvZ2V0aGVyIHdpdGggYW55IG90aGVyDQotICogZmVhdHVyZSBmaWxlcy4gVGhlIGFjdHVhbCBwYWNrYWdpbmcgZGV0YWlscyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUNCi0gKiBmZWF0dXJlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBmZWF0dXJlLg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLk5vblBsdWdpbkVudHJ5DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vblBsdWdpbkVudHJ5IGV4dGVuZHMgSVBsYXRmb3JtRW52aXJvbm1lbnQsIElBZGFwdGFibGUgew0KLQ0KLQkvKiogDQotCSAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyBkYXRhIGVudHJ5LiANCi0JICogDQotCSAqIEByZXR1cm4gZGF0YSBlbnRyeSBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRvd25sb2FkIHNpemUgb2YgdGhlIGVudHJ5LCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4NCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWwjVU5LTk9XTl9TSVpFDQotCSAqIEByZXR1cm4gZG93bmxvYWQgc2l6ZSBvZiB0aGUgZmVhdHVyZSBpbiBLaWxvQnl0ZXMsIG9yIGFuIGluZGljYXRpb24gDQotCSAqIHRoZSBzaXplIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgc2l6ZSBvZiB0aGUgZmVhdHVyZSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQuDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNvbnRlbnRFbnRyeU1vZGVsI1VOS05PV05fU0laRQ0KLQkgKiBAcmV0dXJuIGluc3RhbGwgc2l6ZSBvZiB0aGUgZmVhdHVyZSBpbiBLaWxvQnl0ZXMsIG9yIGFuIGluZGljYXRpb24gDQotCSAqIHRoZSBzaXplIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZSgpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lQbGF0Zm9ybUVudmlyb25tZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lQbGF0Zm9ybUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMTdhYmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JUGxhdGZvcm1FbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBQbHVnLWluIGVudHJ5IGRlZmluZXMgYSBwYWNrYWdpbmcgcmVmZXJlbmNlIGZyb20gYSBmZWF0dXJlIHRvIGEgcGx1Zy1pbi4KLSAqIEl0IGluZGljYXRlcyB0aGF0IHRoZSByZWZlcmVuY2VkIHBsdWctaW4gaXMgdG8gYmUgY29uc2lkZXJlZCBhcwotICogcGFydCBvZiB0aGUgZmVhdHVyZS4gTm90ZSwgdGhhdCB0aGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGluZGljYXRlCi0gKiB0aGF0IHRoZSBwbHVnLWluIGZpbGVzIGFyZSBwYWNrYWdlZCB0b2dldGhlciB3aXRoIGFueSBvdGhlcgotICogZmVhdHVyZSBmaWxlcy4gVGhlIGFjdHVhbCBwYWNrYWdpbmcgZGV0YWlscyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUKLSAqIGZlYXR1cmUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIGZlYXR1cmUuCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCAKLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICogaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuUGx1Z2luRW50cnkKLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQbGF0Zm9ybUVudmlyb25tZW50IGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgb3B0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLgotCSAqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygb3MgZGVzaWduYXRvcnMgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0uCi0JICogSW5kaWNhdGVzIHRoaXMgZW50cnkgc2hvdWxkIG9ubHkgYmUgaW5zdGFsbGVkIG9uIG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogb3Mgc3lzdGVtcy4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgb3IgaXMgPGNvZGU+KjwvY29kZT4sIHRoZQotCSAqIGVudHJ5IGNhbiBiZSBpbnN0YWxsZWQgb24gYWxsIHN5c3RlbXMgKHBvcnRhYmxlIGltcGxlbWVudGF0aW9uKS4gSWYgdGhlCi0KLQkgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYXMgYSBoaW50IGJ5IHRoZSBpbnN0YWxsYXRpb24gYW5kIHVwZGF0ZQotCSAqIHN1cHBvcnQuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPUygpOwotCi0JLyoqCi0JICogUmV0dXJucyBvcHRpb25hbCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uIAotCSAqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXJjaCBkZXNpZ25hdG9ycyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4KLQkgKiBJbmRpY2F0ZXMgdGhpcyBlbnRyeSBzaG91bGQgb25seSBiZSBpbnN0YWxsZWQgb24gb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBzeXN0ZW1zLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCBvciBpcyA8Y29kZT4qPC9jb2RlPiwgdGhlCi0JICogZW50cnkgY2FuIGJlIGluc3RhbGxlZCBvbiBhbGwgc3lzdGVtcyAocG9ydGFibGUgaW1wbGVtZW50YXRpb24pLgotCSAqIAotCSAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBhcyBhIGhpbnQgYnkgdGhlIGluc3RhbGxhdGlvbiBhbmQgdXBkYXRlCi0JICogc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4gCi0JICogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhcmNoIGRlc2lnbmF0b3JzIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtLgotCSAqIEluZGljYXRlcyB0aGlzIGVudHJ5IHNob3VsZCBvbmx5IGJlIGluc3RhbGxlZCBvbiBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqIHN5c3RlbXMuIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIG9yIGlzIDxjb2RlPio8L2NvZGU+LCB0aGUKLQkgKiBlbnRyeSBjYW4gYmUgaW5zdGFsbGVkIG9uIGFsbCBzeXN0ZW1zIChwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbikuCi0JICogCi0JICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGFzIGEgaGludCBieSB0aGUgaW5zdGFsbGF0aW9uIGFuZCB1cGRhdGUKLQkgKiBzdXBwb3J0LgotCSAqIAotCSAqIEByZXR1cm4gc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T1NBcmNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGxvY2FsZSBzcGVjaWZpY2F0aW9uLiAKLQkgKiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxvY2FsZSBkZXNpZ25hdG9ycyBkZWZpbmVkIGJ5IEphdmEuCi0JICogSW5kaWNhdGVzIHRoaXMgZW50cnkgc2hvdWxkIG9ubHkgYmUgaW5zdGFsbGVkIG9uIGEgc3lzdGVtIHJ1bm5pbmcKLQkgKiB3aXRoIGEgY29tcGF0aWJsZSBsb2NhbGUgKHVzaW5nIEphdmEgbG9jYWxlLW1hdGNoaW5nIHJ1bGVzKS4KLQkgKiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCBvciBpcyA8Y29kZT4qPC9jb2RlPiwgdGhlIGVudHJ5IGNhbgotCSAqIGJlIGluc3RhbGxlZCBvbiBhbGwgc3lzdGVtcyAobGFuZ3VhZ2UtbmV1dHJhbCBpbXBsZW1lbnRhdGlvbikuCi0JICogCi0JICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGFzIGEgaGludCBieSB0aGUgaW5zdGFsbGF0aW9uIGFuZCB1cGRhdGUKLQkgKiAgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUgc3BlY2lmaWNhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JUGx1Z2luRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVBsdWdpbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTVhOWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JUGx1Z2luRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi0NCi0vKioNCi0gKiBQbHVnLWluIGVudHJ5IGRlZmluZXMgYSBwYWNrYWdpbmcgcmVmZXJlbmNlIGZyb20gYSBmZWF0dXJlIHRvIGEgcGx1Zy1pbi4NCi0gKiBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVmZXJlbmNlZCBwbHVnLWluIGlzIHRvIGJlIGNvbnNpZGVyZWQgYXMNCi0gKiBwYXJ0IG9mIHRoZSBmZWF0dXJlLiBOb3RlLCB0aGF0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgaW5kaWNhdGUNCi0gKiB0aGF0IHRoZSBwbHVnLWluIGZpbGVzIGFyZSBwYWNrYWdlZCB0b2dldGhlciB3aXRoIGFueSBvdGhlcg0KLSAqIGZlYXR1cmUgZmlsZXMuIFRoZSBhY3R1YWwgcGFja2FnaW5nIGRldGFpbHMgYXJlIGRldGVybWluZWQgYnkgdGhlDQotICogZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgZmVhdHVyZS4NCi0gKiA8cD4NCi0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgDQotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgDQotICogaW50ZXJmYWNlLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5QbHVnaW5FbnRyeQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcg0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElQbHVnaW5FbnRyeSBleHRlbmRzIElQbGF0Zm9ybUVudmlyb25tZW50LElBZGFwdGFibGUgew0KLQ0KLQkvKiogDQotCSAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyBwbHVnaW4gZW50cnkNCi0JICogDQotCSAqIEByZXR1cm4gcGx1Z2luIGVudHJ5IGlkZW50aWZpZXINCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiB3aGV0aHllciB0aGlzIGVudHJ5IHJlcHJlc2VudHMgYSBmcmFnbWVudC4NCi0JICogDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVudHJ5IHJlcHJlc2VudHMgYSBwbHVnLWluIGZyYWdtZW50LCANCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBlbnRyeSByZXByZXNlbnRzIGEgcGx1Zy1pbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZG93bmxvYWQgc2l6ZSBvZiB0aGUgZW50cnksIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLg0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Db250ZW50RW50cnlNb2RlbCNVTktOT1dOX1NJWkUNCi0JICogQHJldHVybiBkb3dubG9hZCBzaXplIG9mIHRoZSBmZWF0dXJlIGluIEtpbG9CeXRlcywgb3IgYW4gaW5kaWNhdGlvbiANCi0JICogdGhlIHNpemUgY291bGQgbm90IGJlIGRldGVybWluZWQNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgaW5zdGFsbCBzaXplIG9mIHRoZSBmZWF0dXJlLCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4NCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWwjVU5LTk9XTl9TSVpFDQotCSAqIEByZXR1cm4gaW5zdGFsbCBzaXplIG9mIHRoZSBmZWF0dXJlIGluIEtpbG9CeXRlcywgb3IgYW4gaW5kaWNhdGlvbiANCi0JICogdGhlIHNpemUgY291bGQgbm90IGJlIGRldGVybWluZWQNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplKCk7DQotDQotCS8qKiANCi0JICogU2V0cyB0aGUgaWRlbnRpZmllciBvZiB0aGlzIHBsdWdpbiBlbnRyeS4gDQotCSAqIFRoaXMgaXMgdHlwaWNhbGx5IHBlcmZvcm1lZCBhcyBwYXJ0IG9mIHRoZSBwbHVnLWluIGVudHJ5IGNyZWF0aW9uDQotCSAqIG9wZXJhdGlvbi4gT25jZSBzZXQsIHRoZSBpZGVudGlmaWVyIHNob3VsZCBub3QgYmUgcmVzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gaWRlbnRpZmllciBwbHVnaW4gZW50cnkgaWRlbnRpZmllcg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbmVkSWRlbnRpZmllcihWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50aWZpZXIpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzdkYjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi0NCi0vKioNCi0gKiBTaXRlIHJlcHJlc2VudHMgYSBsb2NhdGlvbiBjb250YWluaW5nIHNvbWUgbnVtYmVyIG9mIGZlYXR1cmVzIChwYWNrYWdlZA0KLSAqIG9yIGluc3RhbGxlZCkuIFNpdGVzIGFyZSB0cmVhdGVkIHB1cmVseSBhcyBhbiBpbnN0YWxsYXRpb24gYW5kIHBhY2thZ2luZw0KLSAqIGNvbnN0cnVjdC4gVGhleSBkbyBub3QgcGxheSBhIHJvbGUgZHVyaW5nIEVjbGlwc2UgcGx1Zy1pbiBleGVjdXRpb24uIA0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGUNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJU2l0ZSBleHRlbmRzIElBZGFwdGFibGUgew0KLQ0KLQkvKioNCi0JICogRGVmYXVsdCB0eXBlIGZvciBhbiBpbnN0YWxsZWQgZmVhdHVyZS4gRGlmZmVyZW50IGNvbmNyZXRlIGZlYXR1cmUNCi0JICogaW1wbGVtZW50YXRpb25zIGNhbiBiZSByZWdpc3RlcmVkIHRvZ2V0aGVyIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB0eXBlDQotCSAqIHVzaW5nIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXM8L2NvZGU+IA0KLQkgKiBleHRlbnNpb24gcG9pbnQuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1RZUEUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuaW5zdGFsbGVkIjsgLy8kTk9OLU5MUy0xJAkJDQotDQotCS8qKg0KLQkgKiBEZWZhdWx0IHR5cGUgZm9yIGEgcGFja2FnZWQgZmVhdHVyZS4gRGlmZmVyZW50IGNvbmNyZXRlIGZlYXR1cmUNCi0JICogaW1wbGVtZW50YXRpb25zIGNhbiBiZSByZWdpc3RlcmVkIHRvZ2V0aGVyIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB0eXBlDQotCSAqIHVzaW5nIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXM8L2NvZGU+IA0KLQkgKiBleHRlbnNpb24gcG9pbnQuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI7IC8vJE5PTi1OTFMtMSQJCQ0KLQ0KLQkvKioNCi0JICogSWYgd2UgYXJlIHVuYWJsZSB0byBhY2Nlc3MgYSBzaXRlLCB0aGUgcmV0dXJuZWQgQ29yZUV4Y2VwdGlvbiB3aWxsIGNvbnRhaW4NCi0JICogdGhpcyByZXR1cm4gY29kZS4NCi0JICogDQotCSAqIEBzaW5jZSAyLjAuMQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lURV9BQ0NFU1NfRVhDRVBUSU9OID0gNDI7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXRlIFVSTA0KLQkgKiANCi0JICogQHJldHVybiBzaXRlIFVSTA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgc2l0ZSB0eXBlLiBEaWZmZXJlbnQgY29uY3JldGUgc2l0ZSBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlDQotCSAqIHJlZ2lzdGVyZWQgdG9nZXRoZXIgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHR5cGUgdXNpbmcgdGhlDQotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnNpdGVUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50Lg0KLQkgKiANCi0JICogQHJldHVybiBzaXRlIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXRlIGRlc2NyaXB0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBzaXRlIGRlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0ZWdvcmllcyBkZWZpbmVkIGJ5IHRoZSBzaXRlLg0KLQkgKiANCi0JICogQHJldHVybiBhcnJheSBvZiBzaXRlIGNhdGVnb3JpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElDYXRlZ29yeVtdIGdldENhdGVnb3JpZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG5hbWVkIHNpdGUgY2F0ZWdvcnkuDQotCSAqIA0KLQkgKiBAcGFyYW0gbmFtZSBjYXRlZ29yeSBuYW1lDQotCSAqIEByZXR1cm4gbmFtZWQgY2F0ZWdvcnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmaXQgZG9lcyBub3QgZXhpc3QNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElDYXRlZ29yeSBnZXRDYXRlZ29yeShTdHJpbmcgbmFtZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlZmVyZW5jZXMgdG8gZmVhdHVyZXMgb24gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlZmVyZW5jZXMgdG8gZmVhdHVyZXMgb24gdGhpcyBzaXRlLg0KLQkgKiBObyBmaWx0ZXJpbmcgb2NjdXJzLg0KLQkgKiANCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5Li4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgaWYgDQotCSAqIGl0IGlzIGluc3RhbGxlZCBvbiB0aGlzIHNpdGUuDQotCSAqIGZpbHRlcmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCB3aW5kb3dpbmcgc3lzdGVtIGFuZCBhcmNoaXRlY3R1cmUNCi0JICogc3lzdGVtIHNldCBpbiA8Y29kZT5TaXRlbWFuYWdlcjwvY29kZT4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUNCi0JICogQHJldHVybiBmZWF0dXJlIHJlZmVyZW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBmZWF0dXJlDQotCSAqIGNhbm5vdCBiZSBsb2NhdGVkIG9uIHRoaXMgc2l0ZS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZSBnZXRGZWF0dXJlUmVmZXJlbmNlKElGZWF0dXJlIGZlYXR1cmUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBwbHVnLWluIGFuZCBub24tcGx1Zy1pbiBhcmNoaXZlcyBsb2NhdGVkDQotCSAqIG9uIHRoaXMgc2l0ZQ0KLQkgKiANCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBhcmNoaXZlIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZQ0KLQkgKiBubyBhcmNoaXZlcyBrbm93biB0byB0aGlzIHNpdGUuIE5vdGUsIHRoYXQgYW4gZW1wdHkgYXJyYXkgZG9lcyBub3QNCi0JICogbmVjZXNzYXJpbHkgaW5kaWNhdGUgdGhlcmUgYXJlIG5vIGFyY2hpdmVzIGFjY2Vzc2libGUgb24gdGhpcyBzaXRlLg0KLQkgKiBJdCBzaW1wbHkgaW5kaWNhdGVzIHRoZSBzaXRlIGhhcyBubyBwcmlvciBrbm93bGVkZ2Ugb2Ygc3VjaCBhcmNoaXZlcy4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJQXJjaGl2ZVJlZmVyZW5jZVtdIGdldEFyY2hpdmVzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGlzIHNpdGUuIEEgY29udGVudCBwcm92aWRlcg0KLQkgKiBpcyBhbiBhYnN0cmFjdGlvbiBvZiBlYWNoIHNpdGUgb3JnYW5pemF0aW9uLiBJdCBhbGxvd3MgdGhlIA0KLQkgKiBjb250ZW50IG9mIHRoZSBzaXRlIHRvIGJlIGFjY2Vzc2VkIGluIGEgc3RhbmRhcmQgd2F5DQotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yZ2FuaXphdGlvbi4gQWxsIGNvbmNyZXRlIHNpdGVzDQotCSAqIG5lZWQgdG8gYmUgYWJsZSB0byByZXR1cm4gYSBjb250ZW50IHByb3ZpZGVyLg0KLQkgKiANCi0JICogQHJldHVybiBzaXRlIGNvbnRlbnQgcHJvdmlkZXINCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJU2l0ZUNvbnRlbnRQcm92aWRlciBnZXRTaXRlQ29udGVudFByb3ZpZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHR5cGUgZm9yIGEgcGFja2FnZWQgZmVhdHVyZSBzdXBwb3J0ZWQgYnkgdGhpcyBzaXRlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgdHlwZSwgYXMgcmVnaXN0ZXJlZCBpbiB0aGUNCi0JICogPGNvZGU+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZVR5cGVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhY2thZ2VkRmVhdHVyZVR5cGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHBsdWctaW5zIGluc3RhbGxlZA0KLQkgKiBvbiB0aGlzIHNpdGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGFycmF5IG9mIHBsdWctaW4gZW50cmllcyxvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwbHVnLWlucyBpbnN0YWxsZWQgb24gdGhpcyBzaXRlDQotCSAqIA0KLQkgKiBAcmV0dXJuIG51bWJlciBvZiBpbnN0YWxsZWQgcGx1Zy1pbnMNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCk7DQotDQotCS8qKg0KLQkgKiBBZGRzIGEgbmV3IHBsdWctaW4gZW50cnkgdG8gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHBhcmFtIHBsdWdpbkVudHJ5IHBsdWctaW4gZW50cnkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHBsdWctaW5zIHRoYXQgYXJlDQotCSAqIGluc3RhbGxlZCBvbiB0aGlzIHNpdGUgYW5kIGFyZSByZWZlcmVuY2VkIG9ubHkgYnkgdGhlIHNwZWNpZmllZA0KLQkgKiBmZWF0dXJlLiBUaGVzZSBhcmUgcGx1Zy1pbnMgdGhhdCBhcmUgbm90IHNoYXJlZCB3aXRoIGFueSBvdGhlcg0KLQkgKiBmZWF0dXJlLg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmUgZmVhdHVyZQ0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBsdWctaW4gZW50cmllcywgb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllc09ubHlSZWZlcmVuY2VkQnkoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgZG93bmxvYWRlZCBpbiBvcmRlcg0KLQkgKiB0byBpbnN0YWxsIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBvbiB0aGlzIHNpdGUsIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLg0KLQkgKiBUaGlzIG1ldGhvZCB0YWtlcyBpbnRvIGFjY291bnQgYW55IHBsdWctaW5zIHRoYXQgYXJlIGFscmVhZHkNCi0JICogYXZhaWxhYmxlIG9uIHRoaXMgc2l0ZS4NCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWwjVU5LTk9XTl9TSVpFDQotCSAqIEBwYXJhbSBmZWF0dXJlIGNhbmRpZGF0ZSBmZWF0dXJlDQotCSAqIEByZXR1cm4gZG93bmxvYWQgc2l6ZSBvZiB0aGUgZmVhdHVyZSBpbiBLaWxvQnl0ZXMsIG9yIGFuIGluZGljYXRpb24gDQotCSAqIHRoZSBzaXplIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemVGb3IoSUZlYXR1cmUgZmVhdHVyZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgaW5zdGFsbGVkDQotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgb24gdGhpcyBzaXRlLCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4NCi0JICogVGhpcyBtZXRob2QgdGFrZXMgaW50byBhY2NvdW50IGFueSBwbHVnLWlucyB0aGF0IGFyZSBhbHJlYWR5DQotCSAqIGluc3RhbGxlZCBvbiB0aGlzIHNpdGUuDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNvbnRlbnRFbnRyeU1vZGVsI1VOS05PV05fU0laRQ0KLQkgKiBAcGFyYW0gZmVhdHVyZSBjYW5kaWRhdGUgZmVhdHVyZQ0KLQkgKiBAcmV0dXJuIGluc3RhbGwgc2l6ZSBvZiB0aGUgZmVhdHVyZSBpbiBLaWxvQnl0ZXMsIG9yIGFuIGluZGljYXRpb24gDQotCSAqIHRoZSBzaXplIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKTsNCi0NCi0JLyoqDQotCSAqIEluc3RhbGxzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBvbiB0aGlzIHNpdGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZSBmZWF0dXJlIHRvIGluc3RhbGwNCi0JICogQHBhcmFtIHZlcmlmaWNhdGlvbkxpc3RlbmVyIGluc3RhbGwgdmVyaWZpY2F0aW9uIGxpc3RlbmVyDQotCSAqIEBwYXJhbSBtb25pdG9yIGluc3RhbGwgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBleGNlcHRpb24gSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBpbnN0YWxsDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgZmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIEluc3RhbGxzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBvbiB0aGlzIHNpdGUuDQotCSAqIE9ubHkgb3B0aW9uYWwgZmVhdHVyZXMgcGFzc2VkIGFzIHBhcmFtZXRlciB3aWxsIGJlIGluc3RhbGxlZC4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUgdG8gaW5zdGFsbA0KLQkgKiBAcGFyYW0gb3B0aW9uYWxmZWF0dXJlcyBsaXN0IG9mIG9wdGlvbmFsIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZA0KLQkgKiBAcGFyYW0gdmVyaWZpY2F0aW9uTGlzdGVuZXIgaW5zdGFsbCB2ZXJpZmljYXRpb24gbGlzdGVuZXINCi0JICogQHBhcmFtIG1vbml0b3IgaW5zdGFsbCBtb25pdG9yLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQGV4Y2VwdGlvbiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGluc3RhbGwNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZW1vdmVzICh1bmluc3RhbGxzKSB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgZnJvbSB0aGlzIHNpdGUuIFRoaXMgbWV0aG9kDQotCSAqIHRha2VzIGludG8gYWNjb3VudCBwbHVnLWluIGVudHJpZXMgcmVmZXJlbmNlZCBieSB0aGUgc3BlY2lmaWVkIGZldGF1cmUNCi0JICogdGhhdCBjb250aW51ZSB0byBiZSByZXF1aXJlZCBieSBvdGhlciBmZWF0dXJlcyBpbnN0YWxsZWQgb24gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmUgZmVhdHVyZSB0byByZW1vdmUNCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcg0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc2l0ZSBjb250ZW50IHByb3ZpZGVyLiBUaGlzIGlzIHR5cGljYWxseSBwZXJmb3JtZWQNCi0JICogYXMgcGFydCBvZiB0aGUgc2l0ZSBjcmVhdGlvbiBvcGVyYXRpb24uIE9uY2Ugc2V0LCB0aGUgDQotCSAqIHByb3ZpZGVyIHNob3VsZCBub3QgYmUgcmVzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2l0ZUNvbnRlbnRQcm92aWRlciBzaXRlIGNvbnRlbnQgcHJvdmlkZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihJU2l0ZUNvbnRlbnRQcm92aWRlciBzaXRlQ29udGVudFByb3ZpZGVyKTsNCi0NCi0JLyoqIA0KLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JQ29uZmlndXJlZFNpdGU8L2NvZGU+IGZvciB0aGlzIHNpdGUgaW4gdGhlIGN1cnJlbnQgDQotCSAqIGNvbmZpZ3VyYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBmb3VuZC4NCi0JICogDQotCSAqIEBzaW5jZSAyLjAuMg0KLQkgKi8NCi0JcHVibGljIElDb25maWd1cmVkU2l0ZSBnZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsNCi0NCi0JLyoqDQotCSogQ3JlYXRlcyBhIG5ldyBmZWF0dXJlIG9iamVjdC4gVGhlIGZlYXR1cmUgbXVzdCBleGlzdCBvbiB0aGlzIHNpdGUNCi0JKiBvciBhIGNvcmUgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgDQotCSogbWF5IGVsZWN0IHRvIGNhY2hlIGluc3RhbmNlcywgaW4gd2hpY2ggY2FzZSBzdWJzZXF1ZW50IGNhbGxzIA0KLQkqIHRvIGNyZWF0ZSBhIGZlYXR1cmUgd2l0aCB0aGUgc2FtZSBVUkwgd2lsbA0KLQkqIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZS4NCi0JKiBwYXJhbSB0eXBlIHRoZSBmZWF0dXJlIHR5cGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBmYWN0b3J5LiBJZg0KLQkqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHBhc3NlZCwgZGVmYXVsdCBmZWF0dXJlIHR5cGUgd2lsbCBiZSB1c2VkLg0KLQkqIHBhcmFtIHVybCBVUkwgb2YgdGhlIGZlYXR1cmUgYXJjaGl2ZSBhcyBsaXN0ZWQgaW4gdGhlIHNpdGUuDQotCSogcmV0dXJuIG5ld2x5IGNyZWF0ZWQgZmVhdHVyZSBvYmplY3QsIG9yIGEgY2FjaGVkIHZhbHVlIGlmDQotCSogY2FjaGluZyBpcyBpbXBsZW1lbnRlZCBieSB0aGlzIHNpdGUuDQotCSogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZUZlYXR1cmUoU3RyaW5nLFVSTCxJUHJvZ3Jlc3NNb25pdG9yKSBpbnN0ZWFkDQotCSogQHNpbmNlIDIuMC4yDQotCSovDQotCUlGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoU3RyaW5nIHR5cGUsIFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JKiBDcmVhdGVzIGEgbmV3IGZlYXR1cmUgb2JqZWN0LiBUaGUgZmVhdHVyZSBtdXN0IGV4aXN0IG9uIHRoaXMgc2l0ZQ0KLQkqIG9yIGEgY29yZSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIENvbmNyZXRlIGltcGxlbWVudGF0aW9ucyANCi0JKiBtYXkgZWxlY3QgdG8gY2FjaGUgaW5zdGFuY2VzLCBpbiB3aGljaCBjYXNlIHN1YnNlcXVlbnQgY2FsbHMgDQotCSogdG8gY3JlYXRlIGEgZmVhdHVyZSB3aXRoIHRoZSBzYW1lIFVSTCB3aWxsDQotCSogcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlLg0KLQkqIHBhcmFtIHR5cGUgdGhlIGZlYXR1cmUgdHlwZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzZWxlY3QgdGhlIGZhY3RvcnkuIElmDQotCSogPGNvZGU+bnVsbDwvY29kZT4gaXMgcGFzc2VkLCBkZWZhdWx0IGZlYXR1cmUgdHlwZSB3aWxsIGJlIHVzZWQuDQotCSogcGFyYW0gdXJsIFVSTCBvZiB0aGUgZmVhdHVyZSBhcmNoaXZlIGFzIGxpc3RlZCBpbiB0aGUgc2l0ZS4NCi0JKiByZXR1cm4gbmV3bHkgY3JlYXRlZCBmZWF0dXJlIG9iamVjdCwgb3IgYSBjYWNoZWQgdmFsdWUgaWYNCi0JKiBjYWNoaW5nIGlzIGltcGxlbWVudGVkIGJ5IHRoaXMgc2l0ZS4NCi0JKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcg0KLQkqIEBzaW5jZSAyLjENCi0JKi8NCi0JSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCxJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOWU4ZTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotIA0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi0NCi0vKioNCi0gKiBTaXRlIGNvbnRlbnQgcHJvdmlkZXIuDQotICogQSBzaXRlIGNvbnRlbnQgcHJvdmlkZXIgaXMgYW4gYWJzdHJhY3Rpb24gb2YgZWFjaCBzaXRlIGludGVybmFsIA0KLSAqIG9yZ2FuaXphdGlvbi4gSXQgYWxsb3dzIHRoZSBzaXRlIGNvbnRlbnQgdG8gYmUgYWNjZXNzZWQgaW4NCi0gKiBhIHN0YW5kYXJkIHdheSByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcm5hbCBvcmdhbml6YXRpb24uIEFsbCBjb25jcmV0ZSBzaXRlDQotICogaW1wbGVtZW50YXRpb25zIG5lZWQgdG8gaW1wbGVtZW50IGEgc2l0ZSBjb250ZW50IHByb3ZpZGVyLg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXINCi0gKiBAc2luY2UgMi4wDQotICovDQotIA0KLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVDb250ZW50UHJvdmlkZXIgew0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGlzIHNpdGUNCi0JICogDQotCSAqIEByZXR1cm4gc2l0ZSBVUkwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8JDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7DQotCQkJDQotCQ0KLQkvKioNCi0JICogUmV0dXJucyBhIFVSTCBmb3IgdGhlIGlkZW50aWZpZWQgYXJjaGl2ZSANCi0JICogDQotCSAqIEBwYXJhbSBpZCBhcmNoaXZlIGlkZW50aWZpZXINCi0JICogQHJldHVybiBhcmNoaXZlIFVSTCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiANCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcgaWQpICB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpdGUgZm9yIHRoaXMgcHJvdmlkZXINCi0JICogDQotCSAqIEByZXR1cm4gcHJvdmlkZXIgc2l0ZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpOwkNCi0JDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBzaXRlIGZvciB0aGlzIHByb3ZpZGVyLg0KLQkgKiBJbiBnZW5lcmFsLCB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYXMgcGFydCBvZg0KLQkgKiBzaXRlIGNyZWF0aW9uLiBPbmNlIHNldCwgdGhlIHNpdGUgc2hvdWxkIG5vdCBiZSByZXNldC4NCi0JICogDQotCSAqIEBwYXJhbSBzaXRlIHByb3ZpZGVyIHNpdGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2l0ZShJU2l0ZSBzaXRlKTsNCi19DQotDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVNpdGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNDI1MmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi0NCi0vKioNCi0gKiBTaXRlIGZhY3RvcnkgaW50ZXJmYWNlLg0KLSAqIEEgc2l0ZSBmYWN0b3J5IGlzIHVzZWQgdG8gY29uc3RydWN0IG5ldyBpbnN0YW5jZXMgb2YgY29uY3JldGUNCi0gKiBzaXRlcy4gDQotICogPHA+DQotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgc2hvdWxkIA0KLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIA0KLSAqIGludGVyZmFjZS4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZVNpdGVGYWN0b3J5DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVGYWN0b3J5IHsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBzaXRlIGRlZmluZWQgYnkgdGhlIHN1cHBsaWVkIFVSTC4gDQotCSAqIDxwPg0KLQkgKiBUaGUgYWN0dWFsIGludGVycHJldGF0aW9uIG9mIHRoZSBVUkwgaXMgc2l0ZS10eXBlIHNwZWNpZmljLg0KLQkgKiBJbiBtb3N0IGNhc2VzIHRoZSBVUkwgd2lsbCBwb2ludCB0byBzb21lIHNpdGUtc3BlY2lmaWMNCi0JICogZmlsZSB0aGF0IGNhbiBiZSB1c2VkIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0byBjb25zdHJ1Y3QNCi0JICogdGhlIHNpdGUgb2JqZWN0Lg0KLQkgKiA8L3A+DQotCSAqIEBwYXJhbSB1cmwgVVJMIGludGVycHJldGVkIGJ5IHRoZSBzaXRlDQotCSAqIEByZXR1cm4gc2l0ZSBvYmplY3QNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBleGNlcHRpb24gSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHRoZSByZWZlcmVuY2VkIHNpdGUgdHlwZSBpcw0KLQkgKiBub3QgYSBzdXBwb3J0ZWQgdHlwZSBmb3IgdGhpcyBmYWN0b3J5IA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVNpdGVGYWN0b3J5RXh0ZW5zaW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlRmFjdG9yeUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmY1ZmQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVNpdGVGYWN0b3J5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgc3RhbmRhcmQgSVNpdGVGYWN0b3J5IGludGVyZmFjZS4KLSAqIElmIGEgZmFjdG9yeSBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIGFuZCBpcyBoYW5kbGluZwotICogVVJMIGNvbm5lY3Rpb25zLCBhIHByb2dyZXNzIG1vbml0b3IgY2FuIGJlIHBhc3NlZCB0byAKLSAqIGFsbG93IGNhbmNlbGluZyBvZiBmcm96ZW4gY29ubmVjdGlvbnMuIAotICogPC9wPgotICogPHA+SW5wdXQgc3RyZWFtIGlzIG9idGFpbmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gb24KLSAqIGEgc2VwYXJhdGUgdGhyZWFkLiBXaGVuIGNvbm5lY3Rpb24gaXMgY2FuY2VsZWQsIAotICogdGhlIHRocmVhZCBpcyBzdGlsbCBhY3RpdmUuIEl0IGlzIGFsbG93ZWQgdG8gdGVybWluYXRlCi0gKiB3aGVuIHRoZSBjb25uZWN0aW9uIHRpbWVzIG91dCBvbiBpdHMgb3duLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZVNpdGVGYWN0b3J5Ci0gKiBAc2luY2UgMi4xCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJU2l0ZUZhY3RvcnlFeHRlbnNpb24gewotCS8qKgotCSAqIFJldHVybnMgYSBzaXRlIGRlZmluZWQgYnkgdGhlIHN1cHBsaWVkIFVSTC4gCi0JICogPHA+Ci0JICogVGhlIGFjdHVhbCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVVJMIGlzIHNpdGUtdHlwZSBzcGVjaWZpYy4KLQkgKiBJbiBtb3N0IGNhc2VzIHRoZSBVUkwgd2lsbCBwb2ludCB0byBzb21lIHNpdGUtc3BlY2lmaWMKLQkgKiBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHRvIGNvbnN0cnVjdAotCSAqIHRoZSBzaXRlIG9iamVjdC4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIHVybCBVUkwgaW50ZXJwcmV0ZWQgYnkgdGhlIHNpdGUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IgdGhhdCBjYW4gYmUgY2FuY2VsZWQKLQkgKiBAcmV0dXJuIHNpdGUgb2JqZWN0Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gdGhlIHJlZmVyZW5jZWQgc2l0ZSB0eXBlIGlzCi0JICogbm90IGEgc3VwcG9ydGVkIHR5cGUgZm9yIHRoaXMgZmFjdG9yeSAKLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVNpdGVGZWF0dXJlUmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlRmVhdHVyZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTQ5ZWRkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVNpdGVGZWF0dXJlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogU2l0ZSBGZWF0dXJlIHJlZmVyZW5jZS4KLSAqIEEgcmVmZXJlbmNlIHRvIGEgZmVhdHVyZSBvbiBhIHBhcnRpY3VsYXIgdXBkYXRlIHNpdGUuCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCAKLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICogaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUZlYXR1cmVSZWZlcmVuY2UKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZXh0ZW5kcyBJRmVhdHVyZVJlZmVyZW5jZSwgSUFkYXB0YWJsZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGVnb3JpZXMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZSBiZWxvbmcgdG8uCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjYXRlZ29yaWVzLCBvciBhbiBlbXB0eSBhcnJheQotCSAqIEBzaW5jZSAyLjEgCi0JICovCi0JcHVibGljIElDYXRlZ29yeVtdIGdldENhdGVnb3JpZXMoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBjYXRlZ29yeSB0byB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeSBuZXcgY2F0ZWdvcnkKLQkgKiBAc2luY2UgMi4xIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5KElDYXRlZ29yeSBjYXRlZ29yeSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVVSTEVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lVUkxFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjEzNDViLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVVSTEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotDQotLyoqDQotICogVVJMIGVudHJ5IGlzIGFuIGFubm90YXRlZCBVUkwgb2JqZWN0LiBJdCBhbGxvd3MgZGVzY3JpcHRpdmUgdGV4dCB0byBiZQ0KLSAqIGFzc29jaWF0ZWQgd2l0aCBhIFVSTC4gV2hlbiB1c2VkIGFzIGRlc2NyaXB0aW9uIG9iamVjdCwgdGhlIGFubm90YXRpb24NCi0gKiB0eXBpY2FsbHkgY29ycmVzcG9uZHMgdG8gc2hvcnQgZGVzY3JpcHRpdmUgdGV4dCwgd2l0aCB0aGUgVVJMIHJlZmVyZW5jZQ0KLSAqIHBvaW50aW5nIHRvIGZ1bGwgYnJvd3NhYmxlIGRlc2NyaXB0aW9uLg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlVSTEVudHJ5DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVVSTEVudHJ5IGV4dGVuZHMgSUFkYXB0YWJsZSB7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURV9TSVRFID0gMDsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCX1NJVEUgPSAxOwkNCi0NCi0JLyoqIA0KLQkgKiBSZXR1cm5zIHRoZSBVUkwgYW5ub3RhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lDQotCSAqIA0KLQkgKiBAcmV0dXJuIHVybCBhbm5vdGF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgYWN0dWFsIFVSTC4NCi0JICogDQotCSAqIEByZXR1cm4gdXJsLg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKTsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBVUkxFbnRyeQ0KLQkgKiANCi0JICogQHNlZSAjVVBEQVRFX1NJVEUNCi0JICogQHNlZSAjV0VCX1NJVEUNCi0JICogQHJldHVybiB0eXBlDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFR5cGUoKTsJDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVVwZGF0ZUNvbnN0YW50cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JVXBkYXRlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MDZiYTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JVXBkYXRlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi0gCi0vKioKLSAqIE1hbmFnZXMgYSBsaXN0IG9mIHN0YXRpYyBjb25zdGFudHMuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJVXBkYXRlQ29uc3RhbnRzIHsKLQkKLQkJLyoqCi0JICogTm8gbWF0Y2hpbmcgcnVsZSBzcGVjaWZpZWQgCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfTk9ORSA9IDA7Ci0KLQkvKioKLQkgKiBEZXBlbmRlbmN5IGNhbiBiZSBzYXRpc2ZpZWQgb25seSB3aXRoIHBsdWctaW4gdmVyc2lvbiBtYXRjaGluZyAKLQkgKiBleGFjdGx5IHRoZSBzcGVjaWZpZWQgdmVyc2lvbi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9QRVJGRUNUID0gMTsKLQotCS8qKgotCSAqIERlcGVuZGVuY3kgY2FuIGJlIHNhdGlzZmllZCBvbmx5IHdpdGggcGx1Zy1pbiB2ZXJzaW9uIHRoYXQgaXMgCi0JICogZXF1aXZhbGVudCB0byB0aGUgc3BlY2lmaWVkIHZlcnNpb24gKHNhbWUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24KLQkgKiBpZGVudGlmaWVyLCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgc2VydmljZSBpZGVudGlmaWVyKS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9FUVVJVkFMRU5UID0gMjsKLQotCS8qKgotCSAqIERlcGVuZGVuY3kgY2FuIGJlIHNhdGlzZmllZCBvbmx5IHdpdGggcGx1Zy1pbiB2ZXJzaW9uIHRoYXQgaXMgCi0JICogY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiAoZWl0aGVyIGlzIGVxdWl2YWxlbnQsCi0JICogb3IgZ3JlYXRlciBtaW5vciBpZGVudGlmaWVyIChidXQgc2FtZSBtYWpvciBpZGVudGlmaWVyKSkuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfQ09NUEFUSUJMRSA9IDM7Ci0KLQkvKioKLQkgKiBEZXBlbmRlbmN5IGNhbiBiZSBzYXRpc2ZpZWQgb25seSB3aXRoIHBsdWctaW4gdmVyc2lvbiB0aGF0IGlzIAotCSAqIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2ZXJzaW9uLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0dSRUFURVJfT1JfRVFVQUwgPSA0OwotCQotCS8qKgotCSAqIERlcGVuZGVuY3kgY2FuIGJlIHNhdGlzZmllZCBvbmx5IGlmIHRoZSByZXF1aXJlZCBpZGVudGlmaWVyCi0JICogaXMgYSBwcmVmaXggb2YgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLgotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1BSRUZJWCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgc2VhcmNoIGxvY2F0aW9uIGZvciB1cGRhdGVzIGlzIGRlZmluZWQgYnkgdGhlIHJvb3QgZmVhdHVyZS4KLQkgKiBAc2luY2UgMi4wLjIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hfUk9PVCA9IDE8PDE7Ci0JCi0JLyoqCi0JICogVGhlIHNlYXJjaCBsb2NhdGlvbiBmb3IgdXBkYXRlcyBpcyBkZWZpbmVkIGJ5IHRoaXMgZmVhdHVyZS4KLQkgKiBAc2luY2UgMi4wLjIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hfU0VMRiA9IDE8PDI7Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVZlcmlmaWNhdGlvbkxpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lWZXJpZmljYXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzkxODZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVZlcmlmaWNhdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotIAotLyoqCi0gKiBWZXJpZmljYXRpb24gbGlzdGVuZXIuIFRoaXMgaW50ZXJmYWNlIGFic3RyYWN0IHRoZSB1c2VyIGludGVyYWN0aW9uCi0gKiB0aGF0IG1heSBiZSByZXF1aXJlZCBhcyBhIHJlc3VsdCBvZiBmZWF0dXJlIGluc3RhbGxhdGlvbi4gSW4gcGFydGljdWxhciwKLSAqIGFzIGZlYXR1cmUgYXJjaGl2ZXMgYXJlIGRvd25sb2FkZWQgYW5kIHZlcmlmaWVkLCB0aGUgdXNlciBtYXkgbmVlZCB0byAKLSAqIGluZGljYXRlIHdoZXRoZXIgdG8gYWNjZXB0IGFueSBvbmUgb2YgdGhlIGFyY2hpdmVzLCBvciBhYm9ydCB0aGUgCi0gKiBpbnN0YWxsYXRpb24uCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmljYXRpb25SZXN1bHQKLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWVyCi0gKiBAc2luY2UgMi4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgewotCQotCS8qKgotCSAqIEluZGljYXRlIHRoZSBhY3Rpb24gdGhhdCByZXN1bHRlZCBpbiB0aGlzIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgYWJvcnRlZC4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX0FCT1JUID0gMDsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZSB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcHJvY2Vzc2luZyB0aGUgcmVxdWVzdC4KLQkgKiBUaGUgYWN0aW9uIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcyBub3RpZmljYXRpb24gc2hvdWxkIGJlIGFib3J0ZWQuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9FUlJPUiA9IDE7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGUgdGhhdCB0aGUgdGFyZ2V0IG9mIHRoZSB2ZXJpZmljYXRpb24gc2hvdWxkIGJlIGFjY2VwdGVkLAotCSAqIGJ1dCB0aGUgaW5mb3JtYXRpb24gc3VwcGxpZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uIHJlc3VsdAotCSAqIHNob3VsZCBiZSB0cnVzdGVkIG9ubHkgZm9yIHRoaXMgcmVxdWVzdC4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX0lOU1RBTExfVFJVU1RfT05DRSA9IDI7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGUgdGhhdCB0aGUgdGFyZ2V0IG9mIHRoZSB2ZXJpZmljYXRpb24gc2hvdWxkIGJlIGFjY2VwdGVkLAotCSAqIGFuZCB0aGUgaW5mb3JtYXRpb24gc3VwcGxpZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uIHJlc3VsdAotCSAqIHNob3VsZCBiZSB0cnVzdGVkIGZvciB0aGlzIHJlcXVlc3QsIGFuZCBzdWJzZXF1ZW50IHJlcXVlc3RzLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVMgPSAzOwotCQotCS8qKgotCSAqIERldGVybWluZSBpZiB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgY3VycmVudCBhY3Rpb24KLQkgKiBiYXNlZCBvbiB0aGUgaW5kaWNhdGVkIHZlcmlmaWNhdGlvbiByZXN1bHRzLiBUeXBpY2FsbHksCi0JICogdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgcHJvbXB0IHRoZSB1c2VyCi0JICogZm9yIHRoZSBhcHByb3ByaWF0ZSBhbnN3ZXIuIEhvd2V2ZXIsIG90aGVyIHJlc3Bvc2UgCi0JICogaW1wbGVtZW50YXRpb25zIGNhbiBiZSBwcm92aWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0IHZlcmlmaWNhdGlvbiByZXN1bHQgCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgcHJvbXB0KElWZXJpZmljYXRpb25SZXN1bHQgcmVzdWx0KTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVZlcmlmaWNhdGlvblJlc3VsdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JVmVyaWZpY2F0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzI4OWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JVmVyaWZpY2F0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotLyoqCi0gKiBWZXJpZmljYXRpb24gcmVzdWx0LiBBbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMKLSAqIGEgdG9rZW4gcGFzc2VkIGJldHdlZW4gdGhlIHVwZGF0ZSBmcmFtZXdvcmsgYW5kIHRoZSB2ZXJpZmllciBhbmQgdmVyaWZpY2F0aW9uCi0gKiBsaXN0ZW5lci4gVGhlIHZlcmlmaWVyIHVzZXMgdGhlIHRva2VuIHRvIGNhcHR1cmUgdGhlIHJlc3VsdCBvZiB0aGUgZmlsZQotICogdmVyaWZpY2F0aW9uLiBJdCBpcyB0aGVuIHBhc3NlZCB0byB0aGUgdmVyaWZpY2F0aW9uIGxpc3RlbmVyCi0gKiB0byBvcHRpb25hbGx5IHByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgdXNlciAoaW4gYW4gCi0gKiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyB3YXkpLiBUaGUgdmVyaWZpY2F0aW9uIGxpc3RlbmVyIGluIHR1cm4KLSAqIHVzZXMgdGhpcyB0b2tlbiB0byBjYXB0dXJlIHRoZSBkZXNpcmVkIHJlc3BvbnNlLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWZXJpZmljYXRpb25SZXN1bHQgewotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBmaWxlIHR5cGUgaXMgcmVjb2duaXplZCBidXQgdGhlIGZpbGUgaXMgbm90IHNpZ25lZAotCSAqIAotCSAqIEBzZWUgI1RZUEVfRU5UUllfVU5SRUNPR05JWkVECi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRU5UUllfTk9UX1NJR05FRCA9IDE7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgaXQgd2FzIHNpZ25lZAotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0VOVFJZX0NPUlJVUFRFRCA9IDI7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGZpbGUgaXMgc2lnbmVkIGJ5IGEga25vd24gc2lnbmVyCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQgPSAzOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBmaWxlIGlzIHNpZ25lZCBidXQgdGhlIHNpZ25lciBpcyBub3Qga25vd24KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FTlRSWV9TSUdORURfVU5SRUNPR05JWkVEID0gNTsKLQotCS8qKgotCSAqIEVycm9yIG9jY3VycmVkIGR1cmluZyB2ZXJpZmljYXRpb24KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTl9FUlJPUiA9IDY7Ci0KLQkvKioKLQkgKiBWZXJpZmljYXRpb24gd2FzIGNhbmNlbGxlZAotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJJRklDQVRJT05fQ0FOQ0VMTEVEID0gNzsKLQotCS8qKgotCSAqIENvdWxkIG5vdCBwZXJmb3JtIHZlcmlmaWNhdGlvbiBkdWUgdG8gdW5yZWNvZ25pemVkIGZpbGUKLQkgKiAKLQkgKiBAc2VlICNUWVBFX0VOVFJZX05PVF9TSUdORUQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FTlRSWV9VTlJFQ09HTklaRUQgPSA4OwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCByZWZlcmVuY2UgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSB2ZXJpZmljYXRpb24uCi0JICogCi0JICogQHJldHVybiBjb250ZW50IHJlZmVyZW5jZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRDb250ZW50UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHRoZSByZWZlcmVuY2VkIGZpbGUgaXMgcGFydCBvZi4KLQkgKiAKLQkgKiBAcmV0dXJuIGZlYXR1cmUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZlcmlmaWNhdGlvbiBjb2RlLgotCSAqIAotCSAqIEByZXR1cm4gdmVyaWZpY2F0aW9uIGNvZGUsIGFzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyaWZpY2F0aW9uQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbnkgZXhjZXB0aW9uIGNhdWdodCBkdXJpbmcgdmVyaWZpY2F0aW9uCi0JICogCi0JICogQHJldHVybiBleGNlcHRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uIGdldFZlcmlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBkaXNwbGF5IHRleHQgZGVzY3JpYmluZyB0aGUgcmVzdWx0IG9mIHRoZSB2ZXJpZmljYXRpb24uCi0JICogCi0JICogQHJldHVybiByZXN1bHQgdGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0ZXh0IGRlc2NyaWJpbmcgdGhlIHNpZ25lcgotCSAqIAotCSAqIEByZXR1cm4gc2lnbmVyIGluZm9ybWF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaWduZXJJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRleHQgZGVzY3JpYmluZyB0aGUgYXV0aG9yaXR5IHRoYXQgdmVyaWZpZWQvIGNlcnRpZmllZCAKLQkgKiB0aGUgc2lnbmVyCi0JICogCi0JICogQHJldHVybiB2ZXJpZmllciBpbmZvcm1hdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyaWZpZXJJbmZvKCk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVmZXJlbmNlZCBmaWxlIGlzIHBhcnQgb2YgdGhlIG92ZXJhbGwgZmVhdHVyZQotCSAqIGRlZmluaXRpb24sIG9yIG9uZSBvZiBpdHMgY29tcG9uZW50IHBsdWctaW4gb3Igbm9uLXBsdWctaW4gZW50cmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlZmVyZW5jZSBpcyBhIGZlYXR1cmUgZmlsZSwgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHJlZmVyZW5jZSBpcyBhIHBsdWctaW4gb3Igbm9uLXBsdWctaW4gZmlsZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZlYXR1cmVWZXJpZmljYXRpb24oKTsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2lnbmVyIGFuZCB2ZXJpZmllciBpbmZvIGhhdmUgYWxyZWFkeSBiZWVuIGFjY2VwdGVkIGJ5IHRoZSB1c2VyCi0JICogZHVyaW5nIGEgcHJldmlvdXMgdmVyaWZpY2F0aW9uIG9mIG9uZSBvZiB0aGUgZmlsZSBvZiB0aGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXN1bHQgaGFzIGFscmVhZHkgYmVlbiBhY2NlcHRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgdGhlIHJlc3VsdCBoYXMgbm90IHlldCBiZWVuIGFjY2VwdGVkIGJ5IHRoZSB1c2VyCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFscmVhZHlTZWVuKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lWZXJpZmllci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4MTg1YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIFZlcmlmaWVyLiBUaGlzIGludGVyZmFjZSBhYnN0cmFjdHMgdGhlIGFyY2hpdmUgdmVyaWZpY2F0aW9uIHN0ZXAKLSAqIHBlcmZvcm1lZCBieSBzcGVjaWZpYyBmZWF0dXJlIGltcGxlbWVudGF0aW9ucy4gVGhlIGFjdHVhbCBkZXRhaWxzCi0gKiBvZiB0aGUgdmVyaWZpY2F0aW9uIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpY2F0aW9uUmVzdWx0Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFZlcmlmaWVyKCkKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmVyaWZpZXIgewotCi0JLyoqCi0JICogUGVyZm9ybSB2ZXJpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhcmNoaXZlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUgY29udGFpbmluZyB0aGlzIGFyY2hpdmUKLQkgKiBAcGFyYW0gcmVmZXJlbmNlIGFjdHVhbCBhcmNoaXZlIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBpc0ZlYXR1cmVWZXJpZmljYXRpb24gPGNvZGU+dHJ1ZTwvY29kZT4gaW5kaWNhdGVzIHRoZSBzcGVjaWZpZWQKLQkgKiByZWZlcmVuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgcGFydCBvZiB0aGUgZmVhdHVyZSBkZXNjcmlwdGlvbgotCSAqIGluZm9ybWF0aW9uIChpZS4gdmVyaWZ5aW5nIHRoZSBvdmVyYWxsIGZlYXR1cmUpLCAKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaW5kaWNhdGVzIHRoZSBzcGVjaWZpZWQgcmVmZXJlbmNlIGlzIGEgcGx1Zy1pbgotCSAqIG9yIGEgbm9uLXBsdWctaW4gYXJjaGl2ZSBmaWxlIChpZS4gdmVyaWZ5aW5nIGEgY29tcG9uZW50IG9mIHRoZQotCSAqIGZlYXR1cmUpCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB2ZXJpZmljYXRpb24gcmVzdWx0Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmeSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJQ29udGVudFJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCWJvb2xlYW4gaXNGZWF0dXJlVmVyaWZpY2F0aW9uLAotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkJCi0JLyoqCi0JICogU2V0cyB0aGUgcGFyZW50IHZlcmlmaWVyLgotCSAqIAotCSAqIFRoZSBwYXJlbnQgdmVyaWZpZXIgY2FuIG9ubHkgYmUgc2V0IG9uY2UgYnkgdGhlIHBhcmVudCBmZWF0dXJlLgotCSAqIEl0IG1heSB1c2VkIGZvciBkaWZmZXJlbnQgdmVyaWZpY2F0aW9uIHN0cmF0ZWdpZXMuIAotCSAqIChmb3IgaW5zdGFuY2UsIHlvdSBtYXkgZGVjaWRlIHRoYXQgYm90aCB0aGUgcGFyZW50IGFuZCBjdXJyZW50IHZlcmlmaWVyCi0JICogbXVzdCBzdWNlc3NmdWxseSB2ZXJpZnkgdGhlIGNvbnRlbnQgcmVmZXJlbmNlLCBvciB0aGF0IG9ubHkgb25lIG9mIHRoZW0gbXVzdCB2ZXJpZnkpCi0JICogQHBhcmFtIHBhcmVudFZlcmlmaWVyIHRoZSBwYXJlbnQgdmVyaWZpZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KElWZXJpZmllciBwYXJlbnRWZXJpZmllcik7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IHZlcmlmaWVyCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IHZlcmlmaWVyCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJVmVyaWZpZXIgZ2V0UGFyZW50KCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0ltcG9ydC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmYTM1Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgYSBwbHVnLWluIGRlcGVuZGVuY3kuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4NCi0gKiA8L3A+IA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbXBvcnQNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkltcG9ydE1vZGVsDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBJbXBvcnRNb2RlbCBpbXBsZW1lbnRzIElJbXBvcnQgew0KLQ0KLQkvL1BFUkY6IG5ldyBpbnN0YW5jZSB2YXJpYWJsZQ0KLQlwcml2YXRlIFZlcnNpb25lZElkZW50aWZpZXIgdmVyc2lvbklkOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBpZGVudGlmaWVyIG9mIHRoZSBkZXBlbmRlbnQgcGx1Zy1pbi4NCi0JICogQHNlZSBJSW1wb3J0I2dldFZlcnNpb25lZElkZW50aWZpZXIoKQ0KLQkgKi8NCi0JcHVibGljIFZlcnNpb25lZElkZW50aWZpZXIgZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpIHsNCi0JCWlmICh2ZXJzaW9uSWQgIT0gbnVsbCkNCi0JCQlyZXR1cm4gdmVyc2lvbklkOw0KLQ0KLQkJU3RyaW5nIGlkID0gZ2V0SWRlbnRpZmllcigpOw0KLQkJU3RyaW5nIHZlciA9IGdldFZlcnNpb24oKTsNCi0JCWlmIChpZCAhPSBudWxsICYmIHZlciAhPSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJdmVyc2lvbklkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoaWQsIHZlcik7DQotCQkJCXJldHVybiB2ZXJzaW9uSWQ7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gY3JlYXRlIHZlcnNpb25lZCBpZGVudGlmaWVyOiIgKyBpZCArICI6IiArIHZlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCX0NCi0JCX0NCi0NCi0JCQ0KLQkJdmVyc2lvbklkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIiIsbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCXJldHVybiB2ZXJzaW9uSWQ7CQkNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWF0Y2hpbmcgcnVsZSBmb3IgdGhlIGRlcGVuZGVuY3kuDQotCSAqIEBzZWUgSUltcG9ydCNnZXRSdWxlKCkNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UnVsZSgpIHsNCi0JCXJldHVybiBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0TWF0Y2hpbmdSdWxlKGdldE1hdGNoaW5nUnVsZU5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtYXRjaGluZyBydWxlIGZvciB0aGUgZGVwZW5kZW5jeSBpZGVudGlmaWVyLg0KLQkgKiBAc2VlIElJbXBvcnQjZ2V0SWRSdWxlKCkNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SWRSdWxlKCkgew0KLQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRNYXRjaGluZ0lkUnVsZShnZXRNYXRjaGluZ0lkUnVsZU5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW1wb3J0I2dldEtpbmQoKQ0KLQkgKi8NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRlcGVuZGVuY3kga2luZA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbXBvcnQjZ2V0S2luZCgpDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7DQotCQlyZXR1cm4gaXNGZWF0dXJlSW1wb3J0KCk/S0lORF9GRUFUVVJFOktJTkRfUExVR0lOOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjU3MWFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHJlcHJlc2VudGluZyB0aGUgb3B0aW9ucyBvZiBhIG5lc3RlZCBmZWF0dXJlLgotICogRmVhdHVyZSB3aWxsIGluY2x1ZGUgb3RoZXIgZmVhdHVyZXMuIFRoaXMgY2xhc3Mgd2lsbCByZXByZXNlbnQgdGhlIG9wdGlvbnMgb2YgdGhlIGluY2x1c2lvbi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW5zdGFudGlhdGU7IG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+IAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcgotICogQHNpbmNlIDIuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UKLQlleHRlbmRzIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsCi0JaW1wbGVtZW50cyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlCi0JICogCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmVhdHVyZSBvcHRpb25zIAotCSAqIAotCSAqIEBwYXJhbSBpbmNsdWRlZEZlYXR1cmVSZWYgcmVmZXJlbmNlIHRvIGNsb25lCi0JICogQHNpbmNlIDIuMC4yCi0JICovCi0JcHVibGljIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZShJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGluY2x1ZGVkRmVhdHVyZVJlZikgewotCQlzdXBlcigoSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGluY2x1ZGVkRmVhdHVyZVJlZik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLgotCSAqIEBwYXJhbSBmZWF0dXJlUmVmZXJlbmNlCi0JICovCi0JcHVibGljIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlKSB7Ci0JCXN1cGVyKGZlYXR1cmVSZWZlcmVuY2UpOwotCX0KLQotCS8qCi0JICogTWV0aG9kIGlzRGlzYWJsZWQuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlzYWJsZWQoKSB7Ci0JCUlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9IGdldFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJaWYgKGNTaXRlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZCA9IGNTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0aGlzLmVxdWFscyhjb25maWd1cmVkW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JCS8vCQkvLyBGSVhNRTogdGhlIGFib3ZlIGNvZGUgd2FzIGNvbW1lbnRlZCBvdXQgYW5kIHJldHVybmVkIGZhbHNlLiAKLQkJLy8JCS8vIFNob3VsZCB0aGlzIGJlIGNvbW1lbnRlZCBvdXQgYWdhaW4/Ci0JCS8vCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgaXNJbnN0YWxsZWQuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5pbnN0YWxsZWQoKSB7Ci0JCWlmICghaXNEaXNhYmxlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGluc3RhbGxlZCA9IGdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbGxlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRoaXMuZXF1YWxzKGluc3RhbGxlZFtpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGlmIHdlIHJlYWNoZWQgdGhpcyBwb2ludCwgdGhlIGNvbmZpZ3VyZWQgc2l0ZSBleGlzdHMgYW5kIGl0IGRvZXMgbm90Ci0JCS8vIGNvbnRhaW4gdGhpcyBmZWF0dXJlIHJlZmVyZW5jZSwgc28gY2xlYXJseSB0aGUgZmVhdHVyZSBpcyB1bmluc3RhbGxlZAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UjZ2V0RmVhdHVyZShib29sZWFuLAotCSAqIElDb25maWd1cmVkU2l0ZSkKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKAotCQlib29sZWFuIHBlcmZlY3RNYXRjaCwKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRGZWF0dXJlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSNnZXRGZWF0dXJlKGJvb2xlYW4sCi0JICogSUNvbmZpZ3VyZWRTaXRlLElQcm9ncmVzc01vbml0b3IpCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgKLQkJYm9vbGVhbiBwZXJmZWN0TWF0Y2gsCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSwKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gZ2V0RmVhdHVyZShtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlI2dldEZlYXR1cmUoKQotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRGZWF0dXJlKG51bGwpOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlI2dldEZlYXR1cmUKLQkgKiAoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlzVW5pbnN0YWxsZWQoKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywgUG9saWN5LmJpbmQoIkluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZS5mZWF0dXJlVW5pbnN0YWxsZWQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldEZlYXR1cmVJZGVudGlmaWVyKCkpLCBudWxsKSk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRGZWF0dXJlKG1vbml0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5zdGFsbEhhbmRsZXJFbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JbnN0YWxsSGFuZGxlckVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNGMzOTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JbnN0YWxsSGFuZGxlckVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBpbnN0YWxsIGhhbmRsZXIgZW50cnkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+IAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyRW50cnkKLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlcgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbEhhbmRsZXJFbnRyeQotCWV4dGVuZHMgSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsCi0JaW1wbGVtZW50cyBJSW5zdGFsbEhhbmRsZXJFbnRyeSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSW5zdGFsbEhhbmRsZXJFbnRyeS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEluc3RhbGxIYW5kbGVyRW50cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JbnN0YWxsTW9uaXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JbnN0YWxsTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWU4YzkwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5zdGFsbE1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIEluc3RhbGwgcHJvZ3Jlc3MgbW9uaXRvcg0KLSAqIERlbGVnYXRpbmcgd3JhcHBlciBmb3IgSVByb2dyZXNzTW9uaXRvciB1c2VkIGZvciBpbnN0YWxsYXRpb24gaGFuZGxpbmcuDQotICogDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW5zdGFsbE1vbml0b3IgaW1wbGVtZW50cyBJUHJvZ3Jlc3NNb25pdG9yIHsNCi0NCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsNCi0JcHJvdGVjdGVkIFN0YWNrIHRhc2tzOw0KLQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhc2tTdHJpbmc7DQotCXByb3RlY3RlZCBTdHJpbmcgc3ViVGFza1N0cmluZzsNCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0RldGFpbHM7DQotCXByb3RlY3RlZCBsb25nIHRvdGFsQ29weUNvdW50Ow0KLQlwcm90ZWN0ZWQJbG9uZyBjdXJyZW50Q291bnQgPSAwOw0KLQ0KLQlwcm90ZWN0ZWQgY2xhc3MgTW9uaXRvclN0YXRlIHsNCi0NCi0JCXByaXZhdGUgU3RyaW5nIHRhc2tTdHJpbmc7DQotCQlwcml2YXRlIFN0cmluZyBzdWJUYXNrU3RyaW5nOw0KLQkJcHJpdmF0ZSBib29sZWFuIHNob3dEZXRhaWxzOw0KLQkJcHJpdmF0ZSBsb25nIHRvdGFsQ29weUNvdW50Ow0KLQ0KLQkJcHJpdmF0ZSBNb25pdG9yU3RhdGUoDQotCQkJU3RyaW5nIHRhc2tTdHJpbmcsDQotCQkJU3RyaW5nIHN1YlRhc2tTdHJpbmcsDQotCQkJYm9vbGVhbiBzaG93RGV0YWlscywNCi0JCQlsb25nIHRvdGFsQ29weUNvdW50KSB7DQotCQkJdGhpcy50YXNrU3RyaW5nID0gdGFza1N0cmluZzsNCi0JCQl0aGlzLnN1YlRhc2tTdHJpbmcgPSBzdWJUYXNrU3RyaW5nOw0KLQkJCXRoaXMuc2hvd0RldGFpbHMgPSBzaG93RGV0YWlsczsNCi0JCQl0aGlzLnRvdGFsQ29weUNvdW50ID0gdG90YWxDb3B5Q291bnQ7DQotCQl9DQotDQotCQlwcml2YXRlIFN0cmluZyBnZXRUYXNrU3RyaW5nKCkgew0KLQkJCXJldHVybiB0aGlzLnRhc2tTdHJpbmc7DQotCQl9DQotDQotCQlwcml2YXRlIFN0cmluZyBnZXRTdWJUYXNrU3RyaW5nKCkgew0KLQkJCXJldHVybiB0aGlzLnN1YlRhc2tTdHJpbmc7DQotCQl9DQotDQotCQlwcml2YXRlIGJvb2xlYW4gZ2V0U2hvd0RldGFpbHMoKSB7DQotCQkJcmV0dXJuIHRoaXMuc2hvd0RldGFpbHM7DQotCQl9DQotDQotCQlwcml2YXRlIGxvbmcgZ2V0VG90YWxDb3B5Q291bnQoKSB7DQotCQkJcmV0dXJuIHRoaXMudG90YWxDb3B5Q291bnQ7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBJbnN0YWxsTW9uaXRvcigpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5zdGFsbCBtb25pdG9yIGNvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9uaXRvciBiYXNlIGluc3RhbGwgbW9uaXRvcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSW5zdGFsbE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOw0KLQkJdGhpcy50YXNrcyA9IG5ldyBTdGFjaygpOw0KLQkJdGhpcy50YXNrU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMuc3ViVGFza1N0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLnNob3dEZXRhaWxzID0gZmFsc2U7DQotCQl0aGlzLnRvdGFsQ29weUNvdW50ID0gMDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQmVnaW4gbmV3IG1vbml0b3IgdGFzay4NCi0JICogDQotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNiZWdpblRhc2soU3RyaW5nLCBpbnQpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgew0KLQkJdGFza1N0cmluZyA9IG5hbWU7DQotCQltb25pdG9yLmJlZ2luVGFzayhuYW1lLCB0b3RhbFdvcmspOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZSBjb21wbGV0aW9uIG9mIG1vbml0b3IgYWN0aXZpdHkuDQotCSAqIA0KLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjZG9uZSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGRvbmUoKSB7DQotCQltb25pdG9yLmRvbmUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGUgbW9uaXRvciBwcm9ncmVzcy4NCi0JICogDQotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNpbnRlcm5hbFdvcmtlZChkb3VibGUpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7DQotCQltb25pdG9yLmludGVybmFsV29ya2VkKHdvcmspOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVjayBpcyB1c2UgaW5kaWNhdGVkIHRoYXQgdGhlIG9wZXJhdGlvbiBiZSBjYW5jZWxsZWQuDQotCSAqIA0KLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7DQotCQlyZXR1cm4gbW9uaXRvci5pc0NhbmNlbGVkKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldCB0aGUgY2FuY2VsbGF0aW9uIHN0YXRlLg0KLQkgKiANCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3NldENhbmNlbGVkKGJvb2xlYW4pDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsNCi0JCW1vbml0b3Iuc2V0Q2FuY2VsZWQodmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXQgdGFzayBuYW1lLg0KLQkgKiANCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3NldFRhc2tOYW1lKFN0cmluZykNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsNCi0JCXRoaXMudGFza1N0cmluZyA9IG5hbWU7DQotCQl0aGlzLnN1YlRhc2tTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy5zaG93RGV0YWlscyA9IGZhbHNlOw0KLQkJdGhpcy50b3RhbENvcHlDb3VudCA9IDA7DQotCQltb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkDQotCQltb25pdG9yLnNldFRhc2tOYW1lKG5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXQgc3VidGFzayBuYW1lLg0KLQkgKiANCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3N1YlRhc2soU3RyaW5nKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7DQotCQl0aGlzLnN1YlRhc2tTdHJpbmcgPSBuYW1lOw0KLQkJdGhpcy5zaG93RGV0YWlscyA9IGZhbHNlOw0KLQkJdGhpcy50b3RhbENvcHlDb3VudCA9IDA7DQotCQltb25pdG9yLnN1YlRhc2sobmFtZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluZGljYXRlIG1vbml0b3IgcHJvZ3Jlc3MuDQotCSAqIA0KLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3Ijd29ya2VkKGludCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7DQotCQltb25pdG9yLndvcmtlZCh3b3JrKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2F2ZSB0aGUgY3VycmVudCBtb25pdG9yIHN0YXRlLg0KLQkgKiBUaGUgc3RhdGVzIGFyZSBzYXZlZCBvbiBhIHB1c2gtZG93biBzdGFjay4gUHJpb3Igc3RhdGVzDQotCSAqIGNhbiBiZSByZXN0b3JlZCBieSBjYWxsaW5nIHJlc3RvclN0YXRlKCkNCi0JICogDQotCSAqIEBzZWUgI3Jlc3RvcmVTdGF0ZSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZSgpIHsNCi0JCXRhc2tzLnB1c2goDQotCQkJbmV3IE1vbml0b3JTdGF0ZSh0YXNrU3RyaW5nLCBzdWJUYXNrU3RyaW5nLCBzaG93RGV0YWlscywgdG90YWxDb3B5Q291bnQpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVzdG9yZSB0aGUgbW9uaXRvciBzdGF0ZS4NCi0JICogDQotCSAqIEBzZWUgI3NhdmVTdGF0ZSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZSgpIHsNCi0JCWlmICh0YXNrcy5zaXplKCkgPiAwKSB7DQotCQkJTW9uaXRvclN0YXRlIHN0YXRlID0gKE1vbml0b3JTdGF0ZSkgdGFza3MucG9wKCk7DQotCQkJc2V0VGFza05hbWUoc3RhdGUuZ2V0VGFza1N0cmluZygpKTsNCi0JCQlzdWJUYXNrKHN0YXRlLmdldFN1YlRhc2tTdHJpbmcoKSk7DQotCQkJdGhpcy5zaG93RGV0YWlscyA9IHN0YXRlLmdldFNob3dEZXRhaWxzKCk7DQotCQkJdGhpcy50b3RhbENvcHlDb3VudCA9IHN0YXRlLmdldFRvdGFsQ29weUNvdW50KCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEluZGljYXRlIHdoZXRoZXIgdGhlIG1vbml0b3Igc3VidGFzayBtZXNzYWdlIHNob3VsZCBpbmNsdWRlDQotCSAqIGNvcHkgcHJvZ3Jlc3MgY291bnRzLg0KLQkgKiANCi0JICogQHNlZSAjc2V0Q29weUNvdW50KGxvbmcpDQotCSAqIEBzZWUgI3NldFRvdGFsQ291bnQobG9uZykNCi0JICogQHBhcmFtIHNldHRpbmcgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2hvdyB0aGUgY29weSBjb3VudCwNCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzaG93Q29weURldGFpbHMoYm9vbGVhbiBzZXR0aW5nKSB7DQotCQl0aGlzLnNob3dEZXRhaWxzID0gc2V0dGluZzsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuDQotCSAqIA0KLQkgKiBAc2VlICNzaG93Q29weURldGFpbHMoYm9vbGVhbikNCi0JICogQHNlZSAjc2V0Q29weUNvdW50KGxvbmcpDQotCSAqIEBwYXJhbSBjb3VudCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gY29weS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VG90YWxDb3VudChsb25nIGNvdW50KSB7DQotCQl0aGlzLnRvdGFsQ29weUNvdW50ID0gY291bnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG51bWJlciBvZiBieXRlcyBhbHJlYWR5IGNvcGllZC4NCi0JICogDQotCSAqIEBzZWUgI3Nob3dDb3B5RGV0YWlscyhib29sZWFuKQ0KLQkgKiBAc2VlICNzZXRUb3RhbENvdW50KGxvbmcpDQotCSAqIEBwYXJhbSBjb3VudCBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBjb3BpZWQuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldENvcHlDb3VudChsb25nIGNvdW50KSB7DQotCQlpZiAoc2hvd0RldGFpbHMgJiYgY291bnQgPiAwKSB7DQotCQkJY3VycmVudENvdW50ID0gY291bnQ7DQotCQkJbG9uZyBjb3VudEsgPSBjb3VudCAvIDEwMjQ7DQotCQkJbG9uZyB0b3RhbEsgPSB0b3RhbENvcHlDb3VudCAvIDEwMjQ7DQotCQkJU3RyaW5nIG1zZyA9DQotCQkJCSh0b3RhbEsgPD0gMCkNCi0JCQkJCT8gUG9saWN5LmJpbmQoIkluc3RhbGxNb25pdG9yLkRvd25sb2FkU2l6ZSIsIExvbmcudG9TdHJpbmcoY291bnRLKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJOiBQb2xpY3kuYmluZCgNCi0JCQkJCQkiSW5zdGFsbE1vbml0b3IuRG93bmxvYWRTaXplTG9uZyIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQlMb25nLnRvU3RyaW5nKGNvdW50SyksDQotCQkJCQkJTG9uZy50b1N0cmluZyh0b3RhbEspKTsNCi0JCQltb25pdG9yLnN1YlRhc2soc3ViVGFza1N0cmluZyArIG1zZyk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBJbmNyZW1lbnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLg0KLQkgKiANCi0JICogQHNlZSAjc2hvd0NvcHlEZXRhaWxzKGJvb2xlYW4pDQotCSAqIEBzZWUgI3NldFRvdGFsQ291bnQobG9uZykNCi0JICogQHBhcmFtIGluY3JlbWVudCBudW1iZXIgb2YgbmV3IGJ5dGVzICBjb3BpZWQuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGluY3JlbWVudENvdW50KGxvbmcgaW5jcmVtZW50KSB7DQotCQlzZXRDb3B5Q291bnQoY3VycmVudENvdW50ICsgaW5jcmVtZW50KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0phckNvbnRlbnRSZWZlcmVuY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSmFyQ29udGVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTA4NjVmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSmFyQ29udGVudFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuamFyLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogTG9jYWwgLmphciBmaWxlIGNvbnRlbnQgcmVmZXJlbmNlLg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlDQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJFbnRyeUNvbnRlbnRSZWZlcmVuY2UNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIEphckNvbnRlbnRSZWZlcmVuY2UgZXh0ZW5kcyBDb250ZW50UmVmZXJlbmNlIHsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IHJlZmVyZW5jZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotCXByaXZhdGUgSmFyRmlsZSBqYXJGaWxlOw0KLQ0KLQkvKioNCi0JICogQ29udGVudCBzZWxlY3RvciB1c2VkIGluIC5qYXIgb3BlcmF0aW9ucy4NCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYXVzZXMgYWxsIGZpbGUgZW50cmllcyB0byBiZSBzZWxlY3RlZCB3aXRoDQotCSAqIGdlbmVyYXRlZCBpZGVudGlmaWVycyBiZWluZyB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwgLmphciBlbnRyeSBuYW1lLg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb250ZW50U2VsZWN0b3Igew0KLQ0KLQkJLyoqDQotCQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgLmphciBlbnRyeSBzaG91bGQgYmUgc2VsZWN0ZWQuDQotCQkgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHNlbGVjdCBhbGwgbm9uLWRpcmVjdG9yeSBlbnRyaWVzLg0KLQkJICogDQotCQkgKiBAcGFyYW0gZW50cnkgLmphciBlbnRyeQ0KLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbnRyeSBpcyB0byBiZSBzZWxlY3RlZCwgDQotCQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCQkgKiBAc2luY2UgMi4wDQotCQkgKi8NCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoSmFyRW50cnkgZW50cnkpIHsNCi0JCQlyZXR1cm4gZW50cnkgPT0gbnVsbCA/IGZhbHNlIDogIWVudHJ5LmlzRGlyZWN0b3J5KCk7DQotCQl9DQotDQotCQkvKioNCi0JCSAqIERlZmluZXMgdGhlICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyIGZvciB0aGUgDQotCQkgKiBlbnRyeS4gRGVmYXVsdCBpZGVudGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBqYXIgZW50cnkgbmFtZS4NCi0JCSAqIA0KLQkJICogQHBhcmFtIGVudHJ5IC5qYXIgZW50cnkNCi0JCSAqIEByZXR1cm4gInN5bWJvbGljIiBwYXRoIGlkZW50aWZpZXINCi0JCSAqIEBzaW5jZSAyLjANCi0JCSAqLw0KLQkJcHVibGljIFN0cmluZyBkZWZpbmVJZGVudGlmaWVyKEphckVudHJ5IGVudHJ5KSB7DQotCQkJcmV0dXJuIGVudHJ5ID09IG51bGwgPyBudWxsIDogZW50cnkuZ2V0TmFtZSgpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgamFyIGNvbnRlbnQgcmVmZXJlbmNlIGZyb20gVVJMLg0KLQkgKiANCi0JICogQHBhcmFtIGlkICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCSAqIEBwYXJhbSB1cmwgYWN0dWFsIHJlZmVyZW5jZWQgVVJMDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBKYXJDb250ZW50UmVmZXJlbmNlKFN0cmluZyBpZCwgVVJMIHVybCkgew0KLQkJc3VwZXIoaWQsIHVybCk7DQotCQl0aGlzLmphckZpbGUgPSBudWxsOw0KLQkJcmVmZXJlbmNlTGlzdC5hZGQodGhpcyk7IC8vIGtlZXAgdHJhY2sgb2YgYXJjaGl2ZXMNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGphciBjb250ZW50IHJlZmVyZW5jZSBmcm9tIGZpbGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gaWQgInN5bWJvbGljIiBwYXRoIGlkZW50aWZpZXINCi0JICogQHBhcmFtIGZpbGUgYWN0dWFsIHJlZmVyZW5jZWQgZmlsZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSmFyQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQsIEZpbGUgZmlsZSkgew0KLQkJc3VwZXIoaWQsIGZpbGUpOw0KLQkJdGhpcy5qYXJGaWxlID0gbnVsbDsNCi0JCXJlZmVyZW5jZUxpc3QuYWRkKHRoaXMpOyAvLyBrZWVwIHRyYWNrIG9mIGFyY2hpdmVzDQotCX0NCi0NCi0JLyoqDQotCSAqIEEgZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgamFyIGNvbnRlbnQgcmVmZXJlbmNlLg0KLQkgKiANCi0JICogQHBhcmFtIGlkICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCSAqIEBwYXJhbSBmaWxlIGFjdHVhbCByZWZlcmVuY2VkIGZpbGUNCi0JICogQHJldHVybiBqYXIgY29udGVudCByZWZlcmVuY2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgY3JlYXRlQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQsIEZpbGUgZmlsZSkgew0KLQkJcmV0dXJuIG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKGlkLCBmaWxlLHRydWUpOw0KLQl9DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBKYXJDb250ZW50UmVmZXJlbmNlLg0KLQkgKiBAcGFyYW0gaWQNCi0JICogQHBhcmFtIGZpbGUNCi0JICogQHBhcmFtIGINCi0JICovDQotCXB1YmxpYyBKYXJDb250ZW50UmVmZXJlbmNlKFN0cmluZyBpZCwgRmlsZSBmaWxlLCBib29sZWFuIGIpIHsNCi0JCXRoaXMoaWQsZmlsZSk7DQotCQlzZXRUZW1wTG9jYWwoYik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcmVmZXJlbmNlIGFzIGEgamFyIGZpbGUuIE5vdGUsIHRoYXQgdGhpcyBtZXRob2QNCi0JICogPGI+ZG9lcyBub3Q8L2I+IGNhdXNlIHRoZSBmaWxlIHRvIGJlIGRvd25sb2FkZWQgaWYgaXQNCi0JICogaXMgbm90IGFscmVhZHkgbG9jYWwuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHJlZmVyZW5jZSBhcyBqYXIgZmlsZQ0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIHJlZmVyZW5jZSBjYW5ub3QgYmUgcmV0dXJuZWQgYXMgamFyIGZpbGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIEphckZpbGUgYXNKYXJGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWlmICh0aGlzLmphckZpbGUgPT0gbnVsbCkgew0KLQkJCUZpbGUgZmlsZSA9IGFzRmlsZSgpOw0KLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKQ0KLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJhc0phckZpbGUgOiIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWlmIChmaWxlICE9IG51bGwgJiYgIWZpbGUuZXhpc3RzKCkpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKCJKYXJGaWxlIGRvZXMgbm90IGV4aXRzOiIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLQkJCX0NCi0JCQl0aGlzLmphckZpbGUgPSBuZXcgSmFyRmlsZShmaWxlKTsNCi0JCX0NCi0JCXJldHVybiBqYXJGaWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVbnBhY2tzIHRoZSByZWZlcmVuY2VkIGphciBhcmNoaXZlIGludG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4NCi0JICogUmV0dXJucyBjb250ZW50IHJlZmVyZW5jZXMgdG8gdGhlIHVucGFja2VkIGZpbGVzLg0KLQkgKiANCi0JICogQHBhcmFtIGRpciBsb2NhdGlvbiB0byB1bnBhY2sgdGhlIGphciBpbnRvDQotCSAqIEBwYXJhbSBzZWxlY3RvciBzZWxlY3RvciwgdXNlZCB0byBzZWxlY3QgZW50cmllcyB0byB1bnBhY2ssIGFuZCB0byBkZWZpbmUNCi0JICogInN5bWJvbGljIiBwYXRoIGlkZW50aWZpZXJzIGZvciB0aGUgZW50cmllcy4NCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciANCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbg0KLQkgKiBAZXhjZXB0aW9uIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gdW5wYWNrKEZpbGUgZGlyLCBDb250ZW50U2VsZWN0b3Igc2VsZWN0b3IsIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gew0KLQ0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYSBzZWxlY3Rvcg0KLQkJaWYgKHNlbGVjdG9yID09IG51bGwpDQotCQkJc2VsZWN0b3IgPSBuZXcgQ29udGVudFNlbGVjdG9yKCk7DQotDQotCQkvLyBnZXQgYXJjaGl2ZSBjb250ZW50DQotCQlKYXJGaWxlIGphckFyY2hpdmUgPSB0aGlzLmFzSmFyRmlsZSgpOw0KLQkJTGlzdCBjb250ZW50ID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJRW51bWVyYXRpb24gZW50cmllcyA9IGphckFyY2hpdmUuZW50cmllcygpOw0KLQ0KLQkJLy8gcnVuIHRocm91Z2ggdGhlIGVudHJpZXMgYW5kIHVuamFyDQotCQlTdHJpbmcgZW50cnlJZDsNCi0JCUphckVudHJ5IGVudHJ5Ow0KLQkJSW5wdXRTdHJlYW0gaXM7DQotCQlPdXRwdXRTdHJlYW0gb3M7DQotCQlGaWxlIGxvY2FsRmlsZTsNCi0JCXRyeSB7DQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQltb25pdG9yLnNhdmVTdGF0ZSgpOw0KLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKFBvbGljeS5iaW5kKCJKYXJDb250ZW50UmVmZXJlbmNlLlVucGFja2luZyIpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCQltb25pdG9yLnN1YlRhc2sodGhpcy5nZXRJZGVudGlmaWVyKCkpOw0KLQkJCQltb25pdG9yLnNob3dDb3B5RGV0YWlscyhmYWxzZSk7DQotCQkJfQ0KLQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7DQotCQkJCWVudHJ5ID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotCQkJCWlmIChlbnRyeSAhPSBudWxsICYmIHNlbGVjdG9yLmluY2x1ZGUoZW50cnkpKSB7DQotCQkJCQlpcyA9IG51bGw7DQotCQkJCQlvcyA9IG51bGw7DQotCQkJCQllbnRyeUlkID0gc2VsZWN0b3IuZGVmaW5lSWRlbnRpZmllcihlbnRyeSk7DQotCQkJCQlsb2NhbEZpbGUgPSBVdGlsaXRpZXMuY3JlYXRlTG9jYWxGaWxlKGRpciwgZW50cnlJZCk7IC8vIGNyZWF0ZSB0ZW1wIGZpbGUgDQotCQkJCQlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIHsNCi0JCQkJCQl0cnkgew0KLQkJCQkJCQlpcyA9IGphckFyY2hpdmUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOw0KLQkJCQkJCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvY2FsRmlsZSk7DQotCQkJCQkJCVV0aWxpdGllcy5jb3B5KGlzLCBvcywgbW9uaXRvcik7DQotCQkJCQkJfSBmaW5hbGx5IHsNCi0JCQkJCQkJaWYgKGlzICE9IG51bGwpDQotCQkJCQkJCQl0cnkgew0KLQkJCQkJCQkJCWlzLmNsb3NlKCk7DQotCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCQkJCQl9DQotCQkJCQkJCWlmIChvcyAhPSBudWxsKQ0KLQkJCQkJCQkJdHJ5IHsNCi0JCQkJCQkJCQlvcy5jbG9zZSgpOw0KLQkJCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCQljb250ZW50LmFkZChuZXcgQ29udGVudFJlZmVyZW5jZShlbnRyeUlkLCBsb2NhbEZpbGUpKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkNCi0JCQkJbW9uaXRvci5yZXN0b3JlU3RhdGUoKTsNCi0JCX0NCi0JCXJldHVybiAoQ29udGVudFJlZmVyZW5jZVtdKSBjb250ZW50LnRvQXJyYXkobmV3IENvbnRlbnRSZWZlcmVuY2VbMF0pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVbnBhY2tzIHRoZSBuYW1lZCBqYXIgZW50cnkgaW50byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLg0KLQkgKiBSZXR1cm5zIGNvbnRlbnQgcmVmZXJlbmNlIHRvIHRoZSB1bnBhY2tlZCBmaWxlLg0KLQkgKiANCi0JICogQHBhcmFtIGRpciBsb2NhdGlvbiB0byB1bnBhY2sgdGhlIGphciBpbnRvDQotCSAqIEBwYXJhbSBlbnRyeU5hbWUgbmFtZSBvZiB0aGUgamFyIGVudHJ5DQotCSAqIEBwYXJhbSBzZWxlY3RvciBzZWxlY3RvciwgdXNlZCB0byBkZWZpbmUgInN5bWJvbGljIiBwYXRoIGlkZW50aWZpZXINCi0JICogZm9yIHRoZSBlbnRyeQ0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yIA0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uDQotCSAqIEBleGNlcHRpb24gSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgdW5wYWNrKEZpbGUgZGlyLCBTdHJpbmcgZW50cnlOYW1lLCBDb250ZW50U2VsZWN0b3Igc2VsZWN0b3IsIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gew0KLQ0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYSBzZWxlY3Rvcg0KLQkJaWYgKHNlbGVjdG9yID09IG51bGwpDQotCQkJc2VsZWN0b3IgPSBuZXcgQ29udGVudFNlbGVjdG9yKCk7DQotDQotCQkvLyB1bmphciB0aGUgZW50cnkNCi0JCUphckZpbGUgamFyQXJjaGl2ZSA9IHRoaXMuYXNKYXJGaWxlKCk7DQotCQllbnRyeU5hbWUgPSBlbnRyeU5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7DQotCQlKYXJFbnRyeSBlbnRyeSA9IGphckFyY2hpdmUuZ2V0SmFyRW50cnkoZW50cnlOYW1lKTsNCi0JCVN0cmluZyBlbnRyeUlkOw0KLQkJaWYgKGVudHJ5ICE9IG51bGwpIHsNCi0JCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQotCQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsNCi0JCQllbnRyeUlkID0gc2VsZWN0b3IuZGVmaW5lSWRlbnRpZmllcihlbnRyeSk7DQotCQkJRmlsZSBsb2NhbEZpbGUgPSBVdGlsaXRpZXMuY3JlYXRlTG9jYWxGaWxlKGRpciwgZW50cnlJZCk7IC8vIGNyZWF0ZSB0ZW1wIGZpbGUNCi0JCQlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCWlzID0gamFyQXJjaGl2ZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7DQotCQkJCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvY2FsRmlsZSk7DQotCQkJCQlVdGlsaXRpZXMuY29weShpcywgb3MsIG1vbml0b3IpOw0KLQkJCQl9IGZpbmFsbHkgew0KLQkJCQkJaWYgKGlzICE9IG51bGwpDQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJaXMuY2xvc2UoKTsNCi0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCQkJfQ0KLQkJCQkJaWYgKG9zICE9IG51bGwpDQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJb3MuY2xvc2UoKTsNCi0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCQkJfQ0KLQkJCQl9DQotCQkJCXJldHVybiBuZXcgQ29udGVudFJlZmVyZW5jZShlbnRyeUlkLCBsb2NhbEZpbGUpOw0KLQkJCX0gZWxzZQ0KLQkJCQlyZXR1cm4gbnVsbDsgLy8gZW50cnkgd2FzIGEgZGlyZWN0b3J5DQotCQl9IGVsc2UNCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHRoaXMuYXNGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiICIgKyBlbnRyeU5hbWUpOwkvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoqDQotCSAqIFBlZWtzIGludG8gdGhlIHJlZmVyZW5jZWQgamFyIGFyY2hpdmUuDQotCSAqIFJldHVybnMgY29udGVudCByZWZlcmVuY2VzIHRvIHRoZSBqYXIgZW50cmllcyB3aXRoaW4gdGhlIGphciBmaWxlLg0KLQkgKiANCi0JICogQHBhcmFtIHNlbGVjdG9yIHNlbGVjdG9yLCB1c2VkIHRvIHNlbGVjdCBlbnRyaWVzIHRvIHJldHVybiwgYW5kIHRvIGRlZmluZQ0KLQkgKiAic3ltYm9saWMiIHBhdGggaWRlbnRpZmllcnMgZm9yIHRoZSBlbnRyaWVzLg0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yIA0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gcGVlayhDb250ZW50U2VsZWN0b3Igc2VsZWN0b3IsIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotDQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhIHNlbGVjdG9yDQotCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCkNCi0JCQlzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKTsNCi0NCi0JCS8vIGdldCBhcmNoaXZlIGNvbnRlbnQNCi0JCUphckZpbGUgamFyQXJjaGl2ZSA9IHRoaXMuYXNKYXJGaWxlKCk7DQotCQlMaXN0IGNvbnRlbnQgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyQXJjaGl2ZS5lbnRyaWVzKCk7DQotDQotCQkvLyBydW4gdGhyb3VnaCB0aGUgZW50cmllcyBhbmQgY3JlYXRlIGNvbnRlbnQgcmVmZXJlbmNlcw0KLQkJSmFyRW50cnkgZW50cnk7DQotCQlTdHJpbmcgZW50cnlJZDsNCi0JCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7DQotCQkJZW50cnkgPSAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsNCi0JCQlpZiAoc2VsZWN0b3IuaW5jbHVkZShlbnRyeSkpIHsNCi0JCQkJZW50cnlJZCA9IHNlbGVjdG9yLmRlZmluZUlkZW50aWZpZXIoZW50cnkpOw0KLQkJCQljb250ZW50LmFkZChuZXcgSmFyRW50cnlDb250ZW50UmVmZXJlbmNlKGVudHJ5SWQsIHRoaXMsIGVudHJ5KSk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIChDb250ZW50UmVmZXJlbmNlW10pIGNvbnRlbnQudG9BcnJheShuZXcgQ29udGVudFJlZmVyZW5jZVswXSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFBlZWtzIGludG8gdGhlIHJlZmVyZW5jZWQgamFyIGFyY2hpdmUgbG9va2luZyBmb3IgdGhlIG5hbWVkIGVudHJ5Lg0KLQkgKiBSZXR1cm5zIGNvbnRlbnQgcmVmZXJlbmNlIHRvIHRoZSBqYXIgZW50cnkgd2l0aGluIHRoZSBqYXIgZmlsZS4NCi0JICogDQotCSAqIEBwYXJhbSBlbnRyeU5hbWUgbmFtZSBvZiB0aGUgamFyIGVudHJ5DQotCSAqIEBwYXJhbSBzZWxlY3RvciBzZWxlY3RvciwgdXNlZCB0byBkZWZpbmUgInN5bWJvbGljIiBwYXRoIGlkZW50aWZpZXINCi0JICogZm9yIHRoZSBlbnRyeQ0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yIA0KLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IHJlZmVyZW5jZSBvZnIgPGNvZGU+bnVsbDwvbnVsbD4gaWYgdGhlIGVudHJ5IGRvZXNuJ3QgZXhpc3QNCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBwZWVrKFN0cmluZyBlbnRyeU5hbWUsIENvbnRlbnRTZWxlY3RvciBzZWxlY3RvciwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0NCi0JCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgc2VsZWN0b3INCi0JCWlmIChzZWxlY3RvciA9PSBudWxsKQ0KLQkJCXNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpOw0KLQ0KLQkJLy8gYXNzdW1lIHdlIGhhdmUgYSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgamFyIGFyY2hpdmUuDQotCQlKYXJGaWxlIGphckFyY2hpdmUgPSB0aGlzLmFzSmFyRmlsZSgpOw0KLQkJZW50cnlOYW1lID0gZW50cnlOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOw0KLQkJSmFyRW50cnkgZW50cnkgPSBqYXJBcmNoaXZlLmdldEphckVudHJ5KGVudHJ5TmFtZSk7DQotCQlpZiAoZW50cnkgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0NCi0JCVN0cmluZyBlbnRyeUlkID0gc2VsZWN0b3IuZGVmaW5lSWRlbnRpZmllcihlbnRyeSk7DQotCQlyZXR1cm4gbmV3IEphckVudHJ5Q29udGVudFJlZmVyZW5jZShlbnRyeUlkLCB0aGlzLCBlbnRyeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENsb3NlcyB0aGUgamFyIGFyY2hpdmUgY29ycmVzcG9uZGluZyB0byB0aGlzIHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgY2xvc2VBcmNoaXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWlmICh0aGlzLmphckZpbGUgIT0gbnVsbCkgew0KLQkJCXRoaXMuamFyRmlsZS5jbG9zZSgpOw0KLQkJCXRoaXMuamFyRmlsZSA9IG51bGw7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFBlcmZvcm0gc2h1dGRvd24gcHJvY2Vzc2luZyBmb3IgamFyIGFyY2hpdmUgaGFuZGxpbmcuDQotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHBsYXRmb3JtIGlzIHNodXR0aW5nIGRvd24uDQotCSAqIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYXQgYW55IG90aGVyIHRpbWUgdW5kZXINCi0JICogbm9ybWFsIGNpcmN1bXN0YW5jZXMuIEEgc2lkZS1lZmZlY3Qgb2YgY2FsbGluZyB0aGlzIG1ldGhvZA0KLQkgKiBpcyB0aGF0IGFsbCBqYXJzIHJlZmVyZW5jZWQgYnkgSmFyQ29udGVudFJlZmVyZW5jZXMgYXJlIGNsb3NlZC4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlTGlzdC5zaXplKCk7IGkrKykgew0KLQkJCUphckNvbnRlbnRSZWZlcmVuY2UgcmVmID0gKEphckNvbnRlbnRSZWZlcmVuY2UpIHJlZmVyZW5jZUxpc3QuZ2V0KGkpOw0KLQkJCXRyeSB7DQotCQkJCXJlZi5jbG9zZUFyY2hpdmUoKTsgLy8gZW5zdXJlIHdlIGFyZSBub3QgbGVhdmluZyBvcGVuIGphcnMNCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCS8vIHdlIHRyaWVkLCBub3RoaW5nIHdlIGNhbiBkbyAuLi4NCi0JCQl9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9KYXJFbnRyeUNvbnRlbnRSZWZlcmVuY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSmFyRW50cnlDb250ZW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZWVhZmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9KYXJFbnRyeUNvbnRlbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuamFyLio7DQotDQotLyoqDQotICogLmphciBmaWxlIGVudHJ5IGNvbnRlbnQgcmVmZXJlbmNlLg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlDQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJDb250ZW50UmVmZXJlbmNlDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYXJFbnRyeUNvbnRlbnRSZWZlcmVuY2UgZXh0ZW5kcyBDb250ZW50UmVmZXJlbmNlIHsNCi0NCi0JcHJpdmF0ZSBKYXJDb250ZW50UmVmZXJlbmNlIGphckNvbnRlbnRSZWZlcmVuY2U7DQotCXByaXZhdGUgSmFyRW50cnkgZW50cnk7DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgamFyIGVudHJ5IGNvbnRlbnQgcmVmZXJlbmNlLg0KLQkgKiANCi0JICogQHBhcmFtIGlkICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCSAqIEBwYXJhbSBqYXJDb250ZW50UmVmZXJlbmNlIGphciBmaWxlIGNvbnRlbnQgcmVmZXJlbmNlDQotCSAqIEBwYXJhbSBlbnRyeSBqYXIgZW50cnkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEphckVudHJ5Q29udGVudFJlZmVyZW5jZSgNCi0JCVN0cmluZyBpZCwNCi0JCUphckNvbnRlbnRSZWZlcmVuY2UgamFyQ29udGVudFJlZmVyZW5jZSwNCi0JCUphckVudHJ5IGVudHJ5KSB7DQotCQlzdXBlcihpZCwgKEZpbGUpIG51bGwpOw0KLQkJdGhpcy5qYXJDb250ZW50UmVmZXJlbmNlID0gamFyQ29udGVudFJlZmVyZW5jZTsNCi0JCXRoaXMuZW50cnkgPSBlbnRyeTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5wdXQgc3RyZWFtIGZvciB0aGUgcmVmZXJlbmNlLg0KLQkgKiANCi0JICogQHJldHVybiBpbnB1dCBzdHJlYW0NCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiB1bmFibGUgdG8gY3JlYXRlIHN0cmVhbQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJcmV0dXJuIGphckNvbnRlbnRSZWZlcmVuY2UuYXNKYXJGaWxlKCkuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOw0KLQl9CQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHJlZmVyZW5jZWQgZW50cnkuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGlucHV0IHNpemUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0SW5wdXRTaXplKCkgew0KLQkJcmV0dXJuIGVudHJ5LmdldFNpemUoKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSByZWZlcmVuY2UgaXMgdG8gYSBhbiBlbnRyeSB3aXRoaW4gYSBsb2NhbCBqYXIuDQotCSAqIA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWZlcmVuY2UgaXMgbG9jYWwsIA0KLQkgKiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTG9jYWxSZWZlcmVuY2UoKSB7DQotCQlyZXR1cm4gamFyQ29udGVudFJlZmVyZW5jZS5pc0xvY2FsUmVmZXJlbmNlKCk7DQotCX0JDQotCQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcmVmZXJlbmNlIGFzIGEgVVJMLg0KLQkgKiANCi0JICogQHJldHVybiByZWZlcmVuY2UgYXMgVVJMDQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gcmVmZXJlbmNlIGNhbm5vdCBiZSByZXR1cm5lZCBhcyBVUkwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTCBhc1VSTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlTdHJpbmcgZmlsZU5hbWUgPQ0KLQkJCWphckNvbnRlbnRSZWZlcmVuY2UuYXNGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7DQotCQlyZXR1cm4gbmV3IFVSTCgiamFyOmZpbGU6IiArIGZpbGVOYW1lICsgIiEvIiArIGVudHJ5LmdldE5hbWUoKSk7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQl9DQotCQkJDQotCS8qKg0KLQkgKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmVmZXJlbmNlLg0KLQkgKiANCi0JICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCVVSTCB1cmw7DQotCQl0cnkgew0KLQkJCXVybCA9IGFzVVJMKCk7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdXJsID0gbnVsbDsNCi0JCX0NCi0JCWlmICh1cmwgIT0gbnVsbCkNCi0JCQlyZXR1cm4gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQllbHNlDQotCQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIkAiICsgaGFzaENvZGUoKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvTm9uUGx1Z2luRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvTm9uUGx1Z2luRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhZjU3MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL05vblBsdWdpbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi0NCi0vKioNCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBub24tcGx1Zy1pbiBlbnRyeS4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLg0KLSAqIDwvcD4gDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSU5vblBsdWdpbkVudHJ5DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Ob25QbHVnaW5FbnRyeU1vZGVsDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBOb25QbHVnaW5FbnRyeQ0KLQlleHRlbmRzIE5vblBsdWdpbkVudHJ5TW9kZWwNCi0JaW1wbGVtZW50cyBJTm9uUGx1Z2luRW50cnkgew0KLQ0KLQkvKioNCi0JICogTm9uLXBsdWctaW4gZW50cnkgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIE5vblBsdWdpbkVudHJ5KCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1BsdWdpbkVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1BsdWdpbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OWY5ZjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9QbHVnaW5FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgcGx1Zy1pbiBlbnRyeS4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLg0KLSAqIDwvcD4gDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5QbHVnaW5FbnRyeU1vZGVsDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQbHVnaW5FbnRyeSBleHRlbmRzIFBsdWdpbkVudHJ5TW9kZWwgaW1wbGVtZW50cyBJUGx1Z2luRW50cnkgew0KLQkNCi0JLy8gUEVSRjogbmV3IGluc3RhbmNlIHZhcmlhYmxlDQotCXByaXZhdGUgVmVyc2lvbmVkSWRlbnRpZmllciB2ZXJzaW9uSWQ7DQotDQotCS8qKg0KLQkgKiBQbHVnLWluIGVudHJ5IGRlZmF1bHQgY29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBQbHVnaW5FbnRyeSgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyBwbHVnaW4gZW50cnkNCi0JICogDQotCSAqIEBzZWUgSVBsdWdpbkVudHJ5I2dldFZlcnNpb25lZElkZW50aWZpZXIoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgew0KLQkJaWYgKHZlcnNpb25JZCAhPSBudWxsKQ0KLQkJCXJldHVybiB2ZXJzaW9uSWQ7DQotDQotCQlTdHJpbmcgaWQgPSBnZXRQbHVnaW5JZGVudGlmaWVyKCk7DQotCQlTdHJpbmcgdmVyID0gZ2V0UGx1Z2luVmVyc2lvbigpOw0KLQkJaWYgKGlkICE9IG51bGwgJiYgdmVyICE9IG51bGwpIHsNCi0JCQl0cnkgew0KLQkJCQl2ZXJzaW9uSWQgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwgdmVyKTsNCi0JCQkJcmV0dXJuIHZlcnNpb25JZDsNCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgdmVyc2lvbmVkIGlkZW50aWZpZXI6IiArIGlkICsgIjoiICsgdmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJfQ0KLQkJfQ0KLQ0KLQkJdmVyc2lvbklkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIiIsbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCXJldHVybiB2ZXJzaW9uSWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyBwbHVnaW4gZW50cnkuIA0KLQkgKiANCi0JICogQHNlZSBJUGx1Z2luRW50cnkjc2V0VmVyc2lvbmVkSWRlbnRpZmllcihWZXJzaW9uZWRJZGVudGlmaWVyKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uZWRJZGVudGlmaWVyKFZlcnNpb25lZElkZW50aWZpZXIgaWRlbnRpZmllcikgew0KLQkJc2V0UGx1Z2luSWRlbnRpZmllcihpZGVudGlmaWVyLmdldElkZW50aWZpZXIoKSk7DQotCQlzZXRQbHVnaW5WZXJzaW9uKGlkZW50aWZpZXIuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOw0KLQl9CQ0KLQ0KLQkvKioNCi0JICogQ29tcGFyZXMgdHdvIHBsdWdpbiBlbnRyaWVzIGZvciBlcXVhbGl0eQ0KLQkgKiANCi0JICogQHBhcmFtIG9iamVjdCBwbHVnaW4gZW50cnkgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gZW50cmllcyBhcmUgZXF1YWwsIA0KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBJUGx1Z2luRW50cnkpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCUlQbHVnaW5FbnRyeSBlID0gKElQbHVnaW5FbnRyeSkgb2JqZWN0Ow0KLQkJcmV0dXJuIGdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9TaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMTNkYjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9TaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHNpdGUuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4NCi0gKiA8L3A+IA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlDQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5TaXRlTW9kZWwNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIFNpdGUgZXh0ZW5kcyBTaXRlTW9kZWwgaW1wbGVtZW50cyBJU2l0ZSB7DQotDQotCS8qKg0KLQkgKiBEZWZhdWx0IGluc3RhbGxhdGlvbiBwYXRoIGZvciBmZWF0dXJlcw0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIID0gImZlYXR1cmVzLyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIERlZmF1bHQgaW5zdGFsbGF0aW9uIHBhdGggZm9yIHBsdWctaW5zIGFuZCBwbHVnLWluIGZyYWdtZW50cw0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QTFVHSU5fUEFUSCA9ICJwbHVnaW5zLyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIERlZmF1bHQgcGF0aCBvbiBhIHNpdGUgd2hlcmUgcGFja2FnZWQgZmVhdHVyZXMgYXJlIGxvY2F0ZWQNCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkVBVFVSRV9QQVRIID0gImZlYXR1cmVzLyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIERlZmF1bHQgc2l0ZSBtYW5pZmVzdCBmaWxlIG5hbWUNCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfRklMRSA9ICJzaXRlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogRGVmYXVsdCBzaXRlIG1hbmlmZXN0IGV4dGVuc2lvbg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9YTUwgPSBTSVRFX0ZJTEUgKyAiLnhtbCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBJU2l0ZUNvbnRlbnRQcm92aWRlciBzaXRlQ29udGVudFByb3ZpZGVyOw0KLQkNCi0JcHJpdmF0ZSBNYXAgZmVhdHVyZUNhY2hlID0gbmV3IEhhc2hNYXAoKTsgLy8ga2V5PVVSTEtleSB2YWx1ZT1JRmVhdHVyZQ0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBTaXRlDQotCSAqLw0KLQlwdWJsaWMgU2l0ZSgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbXBhcmVzIHR3byBzaXRlcyBmb3IgZXF1YWxpdHkNCi0JICogDQotCSAqIEBwYXJhbSBvYmogc2l0ZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBzaXRlcyBhcmUgZXF1YWwsIA0KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJU2l0ZSkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJaWYgKGdldFVSTCgpID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJSVNpdGUgb3RoZXJTaXRlID0gKElTaXRlKSBvYmo7DQotDQotCQlyZXR1cm4gVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwoZ2V0VVJMKCksIG90aGVyU2l0ZS5nZXRVUkwoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpdGUgVVJMDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldFVSTCgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgew0KLQkJVVJMIHVybCA9IG51bGw7DQotCQl0cnkgew0KLQkJCXVybCA9IGdldFNpdGVDb250ZW50UHJvdmlkZXIoKS5nZXRVUkwoKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCX0NCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpdGUgZGVzY3JpcHRpb24uDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldERlc2NyaXB0aW9uKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsNCi0JCXJldHVybiAoSVVSTEVudHJ5KSBnZXREZXNjcmlwdGlvbk1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0ZWdvcmllcyBkZWZpbmVkIGJ5IHRoZSBzaXRlLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXRDYXRlZ29yaWVzKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElDYXRlZ29yeVtdIGdldENhdGVnb3JpZXMoKSB7DQotCQlDYXRlZ29yeU1vZGVsW10gcmVzdWx0ID0gZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsNCi0JCWlmIChyZXN1bHQubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJQ2F0ZWdvcnlbMF07DQotCQllbHNlDQotCQkJcmV0dXJuIChJQ2F0ZWdvcnlbXSkgcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBuYW1lZCBzaXRlIGNhdGVnb3J5Lg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXRDYXRlZ29yeShTdHJpbmcpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoU3RyaW5nIGtleSkgew0KLQkJSUNhdGVnb3J5IHJlc3VsdCA9IG51bGw7DQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQotCQlpbnQgbGVuZ3RoID0gZ2V0Q2F0ZWdvcnlNb2RlbHMoKS5sZW5ndGg7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGdldENhdGVnb3J5TW9kZWxzKClbaV0uZ2V0TmFtZSgpLmVxdWFscyhrZXkpKSB7DQotCQkJCXJlc3VsdCA9IChJQ2F0ZWdvcnkpIGdldENhdGVnb3J5TW9kZWxzKClbaV07DQotCQkJCWZvdW5kID0gdHJ1ZTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy9ERUJVRzoNCi0JCWlmICghZm91bmQpIHsNCi0JCQlTdHJpbmcgVVJMU3RyaW5nID0gKHRoaXMuZ2V0VVJMKCkgIT0gbnVsbCkgPyB0aGlzLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgOiAiPG5vIHNpdGUgdXJsPiI7IC8vJE5PTi1OTFMtMSQNCi0JCQlVcGRhdGVDb3JlLndhcm4oUG9saWN5LmJpbmQoIlNpdGUuQ2Fubm90RmluZENhdGVnb3J5Iiwga2V5LCBVUkxTdHJpbmcpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJaWYgKGdldENhdGVnb3J5TW9kZWxzKCkubGVuZ3RoIDw9IDApDQotCQkJCVVwZGF0ZUNvcmUud2FybihQb2xpY3kuYmluZCgiU2l0ZS5Ob0NhdGVnb3JpZXMiKSk7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVmZXJlbmNlcyB0byBmZWF0dXJlcyBvbiB0aGlzIHNpdGUuDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldEZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCkgew0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gcmVzdWx0ID0gZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOw0KLQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm4gbmV3IElTaXRlRmVhdHVyZVJlZmVyZW5jZVswXTsNCi0JCWVsc2UNCi0JCQlyZXR1cm4gKElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdKSByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldEZlYXR1cmVSZWZlcmVuY2VzKCkgew0KLQkJLy8gb25seSBmaWx0ZXIgbG9jYWwgc2l0ZQ0KLQkJaWYgKGdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpIT1udWxsKQ0KLQkJCXJldHVybiBmaWx0ZXJGZWF0dXJlcyhnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpKTsNCi0JCWVsc2UgDQotCQkJcmV0dXJuIGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBNZXRob2QgZmlsdGVyRmVhdHVyZXMuDQotCSAqIEFsc28gaW1wbGVtZW50ZWQgaW4gRmVhdHVyZQ0KLQkgKiAgDQotCSAqIEBwYXJhbSBsaXN0DQotCSAqIEByZXR1cm4gTGlzdA0KLQkgKi8NCi0JcHJpdmF0ZSBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmaWx0ZXJGZWF0dXJlcyhJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBhbGxJbmNsdWRlZCkgew0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJaWYgKGFsbEluY2x1ZGVkIT1udWxsKXsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7DQotCQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBpbmNsdWRlZCA9IGFsbEluY2x1ZGVkW2ldOw0KLQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLmlzVmFsaWRFbnZpcm9ubWVudChpbmNsdWRlZCkpDQotCQkJCQlsaXN0LmFkZChpbmNsdWRlZCk7DQotCQkJCWVsc2V7DQotCQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfV0FSTklOR1Mpew0KLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiRmlsdGVyZWQgb3V0IGZlYXR1cmUgcmVmZXJlbmNlOiIraW5jbHVkZWQpOyAvLyROT04tTkxTLTEkDQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlc3VsdCA9IG5ldyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbbGlzdC5zaXplKCldOw0KLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSl7DQotCQkJbGlzdC50b0FycmF5KHJlc3VsdCk7DQotCQl9DQotCQkNCi0JCXJldHVybiByZXN1bHQ7CQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBvbiB0aGlzIHNpdGUuDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldEZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmUpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZ2V0RmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZSBmZWF0dXJlKSB7DQotDQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJTaXRlOmdldEZlYXR1cmVSZWZlcmVuY2U6IFRoZSBmZWF0dXJlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgY3VycmVudFJlZmVyZW5jZSA9IG51bGw7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsNCi0JCQljdXJyZW50UmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXTsNCi0JCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwoZmVhdHVyZS5nZXRVUkwoKSwgY3VycmVudFJlZmVyZW5jZS5nZXRVUkwoKSkpDQotCQkJCXJldHVybiBjdXJyZW50UmVmZXJlbmNlOw0KLQkJfQ0KLQ0KLQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlICIgKyBmZWF0dXJlICsgIiBub3QgZm91bmQgb24gc2l0ZSIgKyB0aGlzLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBwbHVnLWluIGFuZCBub24tcGx1Zy1pbiBhcmNoaXZlcyBsb2NhdGVkDQotCSAqIG9uIHRoaXMgc2l0ZQ0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXRBcmNoaXZlcygpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJQXJjaGl2ZVJlZmVyZW5jZVtdIGdldEFyY2hpdmVzKCkgew0KLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gcmVzdWx0ID0gZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOw0KLQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm4gbmV3IElBcmNoaXZlUmVmZXJlbmNlWzBdOw0KLQkJZWxzZQ0KLQkJCXJldHVybiAoSUFyY2hpdmVSZWZlcmVuY2VbXSkgcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGlzIHNpdGUuDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldFNpdGVDb250ZW50UHJvdmlkZXIoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVNpdGVDb250ZW50UHJvdmlkZXIgZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChzaXRlQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZS5Ob0NvbnRlbnRQcm92aWRlciIpLCBudWxsKTsJLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmV0dXJuIHNpdGVDb250ZW50UHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdHlwZSBmb3IgYSBwYWNrYWdlZCBmZWF0dXJlIHN1cHBvcnRlZCBieSB0aGlzIHNpdGUNCi0JICogDQotCSAqIEBzZWUgSVNpdGUjZ2V0RGVmYXVsdFBhY2thZ2VkRmVhdHVyZVR5cGUoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkgew0KLQkJcmV0dXJuIERFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVudHJpZXMgY29ycmVzcG9uZGluZyB0byBwbHVnLWlucyBpbnN0YWxsZWQNCi0JICogb24gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXRQbHVnaW5FbnRyaWVzKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBsdWctaW5zIGluc3RhbGxlZCBvbiB0aGlzIHNpdGUNCi0JICogDQotCSAqIEBzZWUgSVNpdGUjZ2V0UGx1Z2luRW50cnlDb3VudCgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVudHJpZXMgY29ycmVzcG9uZGluZyB0byBwbHVnLWlucyB0aGF0IGFyZQ0KLQkgKiBpbnN0YWxsZWQgb24gdGhpcyBzaXRlIGFuZCBhcmUgcmVmZXJlbmNlZCBvbmx5IGJ5IHRoZSBzcGVjaWZpZWQNCi0JICogZmVhdHVyZS4gDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KElGZWF0dXJlKQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbnNUb1JlbW92ZSA9IG5ldyBJUGx1Z2luRW50cnlbMF07DQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQ0KLQkJCXJldHVybiBwbHVnaW5zVG9SZW1vdmU7DQotDQotCQkvLyBnZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgZmVhdHVyZQ0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJaWYgKGVudHJpZXMgIT0gbnVsbCkgew0KLQkJCS8vIGdldCBhbGwgdGhlIG90aGVyIHBsdWdpbnMgZnJvbSBhbGwgdGhlIG90aGVyIGZlYXR1cmVzDQotCQkJU2V0IGFsbFBsdWdpbklEID0gbmV3IEhhc2hTZXQoKTsNCi0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IGdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsNCi0JCQkJZm9yIChpbnQgaW5kZXhGZWF0dXJlcyA9IDA7IGluZGV4RmVhdHVyZXMgPCBmZWF0dXJlcy5sZW5ndGg7IGluZGV4RmVhdHVyZXMrKykgew0KLQkJCQkJSUZlYXR1cmUgZmVhdHVyZVRvQ29tcGFyZSA9IG51bGw7DQotCQkJCQl0cnkgew0KLQkJCQkJCWZlYXR1cmVUb0NvbXBhcmUgPSBmZWF0dXJlc1tpbmRleEZlYXR1cmVzXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKCFmZWF0dXJlLmVxdWFscyhmZWF0dXJlVG9Db21wYXJlKSkgew0KLQkJCQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBmZWF0dXJlc1tpbmRleEZlYXR1cmVzXS5nZXRGZWF0dXJlKG51bGwpLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQkJCQlpZiAocGx1Z2luRW50cmllcyAhPSBudWxsKSB7DQotCQkJCQkJCWZvciAoaW50IGluZGV4RW50cmllcyA9IDA7IGluZGV4RW50cmllcyA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpbmRleEVudHJpZXMrKykgew0KLQkJCQkJCQkJYWxsUGx1Z2luSUQuYWRkKHBsdWdpbkVudHJpZXNbaW5kZXhFbnRyaWVzXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOw0KLQkJCQkJCQl9DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIGNyZWF0ZSB0aGUgZGVsdGEgd2l0aCB0aGUgcGx1Z2lucyB0aGF0IG1heSBiZSBzdGlsbCB1c2VkIGJ5IG90aGVyIGNvbmZpZ3VyZWQgb3IgdW5jb25maWd1cmVkIGZlYXR1cmUNCi0JCQlMaXN0IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQkJZm9yIChpbnQgaW5kZXhQbHVnaW5zID0gMDsgaW5kZXhQbHVnaW5zIDwgZW50cmllcy5sZW5ndGg7IGluZGV4UGx1Z2lucysrKSB7DQotCQkJCWlmICghYWxsUGx1Z2luSUQuY29udGFpbnMoZW50cmllc1tpbmRleFBsdWdpbnNdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsNCi0JCQkJCXBsdWdpbnMuYWRkKGVudHJpZXNbaW5kZXhQbHVnaW5zXSk7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gbW92ZSBMaXN0IGludG8gQXJyYXkNCi0JCQlpZiAoIXBsdWdpbnMuaXNFbXB0eSgpKSB7DQotCQkJCXBsdWdpbnNUb1JlbW92ZSA9IG5ldyBJUGx1Z2luRW50cnlbcGx1Z2lucy5zaXplKCldOw0KLQkJCQlwbHVnaW5zLnRvQXJyYXkocGx1Z2luc1RvUmVtb3ZlKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gcGx1Z2luc1RvUmVtb3ZlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIGEgbmV3IHBsdWctaW4gZW50cnkgdG8gdGhpcyBzaXRlLg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24NCi0JICogYmVjYXVzZSB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGluc3RhbGwgYWN0aW9uLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNhZGRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnkpDQotCSAqIEBleGNlcHRpb24gamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEdldCBkb3dubG9hZCBzaXplIGZvciB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgb24gdGhpcyBzaXRlLg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24NCi0JICogYmVjYXVzZSB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGluc3RhbGwgYWN0aW9uLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXREb3dubG9hZFNpemVGb3IoSUZlYXR1cmUpDQotCSAqIEBleGNlcHRpb24gamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0IGluc3RhbGwgc2l6ZSBmb3IgdGhlIHNwZWNpZmllZCBmZWF0dXJlIG9uIHRoaXMgc2l0ZS4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIGJlY2F1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBpbnN0YWxsIGFjdGlvbi4NCi0JICogDQotCSAqIEBzZWUgSVNpdGUjZ2V0SW5zdGFsbFNpemVGb3IoSUZlYXR1cmUpDQotCSAqIEBleGNlcHRpb24gamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbnN0YWxsIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgYWxsIG9wdGlvbmFsIGZlYXR1cmVzIG9uIHRoaXMgc2l0ZS4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIGJlY2F1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBpbnN0YWxsIGFjdGlvbi4NCi0JICogDQotCSAqIEBzZWUgSVNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAZXhjZXB0aW9uIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgaW5zdGFsbA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluc3RhbGwgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGFuZCBsaXN0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgb24gdGhpcyBzaXRlLg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24NCi0JICogYmVjYXVzZSB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGluc3RhbGwgYWN0aW9uLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNpbnN0YWxsKElGZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBleGNlcHRpb24gSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBpbnN0YWxsDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBzb3VyY2VGZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbnN0YWxsIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBvbiB0aGlzIHNpdGUgdXNpbmcgdGhlIGNvbnRlbnQgY29uc3VtZXIgYXMgDQotCSAqIGEgY29udGV4dCB0byBpbnN0YWxsIHRoZSBmZWF0dXJlIGluLg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24NCi0JICogYmVjYXVzZSB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIGluc3RhbGwgYWN0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIHNvdXJjZUZlYXR1cmUgZmVhdHVyZSB0byBpbnN0YWxsDQotCSAqIEBwYXJhbSBwYXJlbnRDb250ZW50Q29uc3VtZXIgY29udGVudCBjb25zdW1lciBvZiB0aGUgcGFyZW50IGZlYXR1cmUNCi0JICogQHBhcmFtIHBhcmVudFZlcmlmaWVyIHZlcmlmaWVyIG9mIHRoZSBwYXJlbnQgZmVhdHVyZQ0KLQkgKiBAcGFyYW0gdmVyaWZpY2F0aW9uTGlzdGVuZXIgaW5zdGFsbCB2ZXJpZmljYXRpb24gbGlzdGVuZXINCi0JICogQHBhcmFtIHByb2dyZXNzIGluc3RhbGwgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBleGNlcHRpb24gSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBpbnN0YWxsDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiANCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIHNvdXJjZUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgcGFyZW50Q29udGVudENvbnN1bWVyLCBJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZW1vdmUgKHVuaW5zdGFsbCkgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGZyb20gdGhpcyBzaXRlLg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24NCi0JICogYmVjYXVzZSB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlbW92ZSBhY3Rpb24uDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI3JlbW92ZShJRmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBzaXRlIGNvbnRlbnQgcHJvdmlkZXIuDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI3NldFNpdGVDb250ZW50UHJvdmlkZXIoSVNpdGVDb250ZW50UHJvdmlkZXIpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNpdGVDb250ZW50UHJvdmlkZXIoSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlcikgew0KLQkJdGhpcy5zaXRlQ29udGVudFByb3ZpZGVyID0gc2l0ZUNvbnRlbnRQcm92aWRlcjsNCi0JfQ0KLQkvKioNCi0JICogQHNlZSBJU2l0ZSNnZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKQ0KLQkgKi8NCi0JcHVibGljIElDb25maWd1cmVkU2l0ZSBnZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSB7DQotCQlyZXR1cm4gKElDb25maWd1cmVkU2l0ZSkgZ2V0Q29uZmlndXJlZFNpdGVNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2NyZWF0ZUZlYXR1cmUoU3RyaW5nLCBVUkwpDQotCSAqIEBkZXByZWNhdGVkDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGNyZWF0ZUZlYXR1cmUodHlwZSx1cmwsbnVsbCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGUjY3JlYXRlRmVhdHVyZShTdHJpbmcsIFVSTCwNCi0JICogSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFN0cmluZyB0eXBlLCBVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIEZpcnN0IGNoZWNrIHRoZSBjYWNoZQ0KLQkJVVJMS2V5IGtleSA9IG5ldyBVUkxLZXkodXJsKTsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGZlYXR1cmVDYWNoZS5nZXQoa2V5KTsNCi0JCWlmIChmZWF0dXJlICE9IG51bGwpIHJldHVybiBmZWF0dXJlOw0KLQ0KLQkJLy8gQ3JlYXRlIGEgbmV3IG9uZQ0KLQkJaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCS8vIGFzayB0aGUgU2l0ZSBmb3IgdGhlIGRlZmF1bHQgdHlwZQ0KLQkJCXR5cGUgPSBnZXREZWZhdWx0UGFja2FnZWRGZWF0dXJlVHlwZSgpOw0KLQkJfQ0KLQ0KLQkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3J5KHR5cGUpOw0KLQkJZmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZSh1cmwsIHRoaXMsIG1vbml0b3IpOw0KLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgew0KLQkJCS8vIEFkZCB0aGUgZmVhdHVyZSB0byB0aGUgY2FjaGUNCi0JCQlmZWF0dXJlQ2FjaGUucHV0KGtleSwgZmVhdHVyZSk7DQotCQl9DQotCQlyZXR1cm4gZmVhdHVyZTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGZWF0dXJlRnJvbUNhY2hlKFVSTCBmZWF0dXJlVVJMKSB7DQotCQlVUkxLZXkga2V5ID0gbmV3IFVSTEtleShmZWF0dXJlVVJMKTsNCi0JCWZlYXR1cmVDYWNoZS5yZW1vdmUoa2V5KTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1NpdGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDYxZTg3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotIA0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBCYXNlIHNpdGUgY29udGVudCBwcm92aWRlcg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2l0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTaXRlQ29udGVudFByb3ZpZGVyIHsNCi0NCi0JcHJpdmF0ZSBVUkwgYmFzZTsNCi0JcHJpdmF0ZSBJU2l0ZSBzaXRlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFNpdGVDb250ZW50UHJvdmlkZXINCi0JICovDQotCXB1YmxpYyBTaXRlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCi0JCXN1cGVyKCk7DQotCQl0aGlzLmJhc2UgPSB1cmw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGlzIHNpdGUNCi0JICogDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0VVJMKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlyZXR1cm4gYmFzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIFVSTCBmb3IgdGhlIGlkZW50aWZpZWQgYXJjaGl2ZQ0KLQkgKiANCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRQcm92aWRlciNnZXRBcmNoaXZlUmVmZXJlbmNlKFN0cmluZykNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRBcmNoaXZlUmVmZXJlbmNlKFN0cmluZyBhcmNoaXZlSUQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJcmV0dXJuIG5ldyBVUkwoZ2V0VVJMKCksIGFyY2hpdmVJRCk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQkJUG9saWN5LmJpbmQoDQotCQkJCQkJIlNpdGVDb250ZW50UHJvdmlkZXIuRXJyb3JDcmVhdGluZ1VSTEZvckFyY2hpdmVJRCIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQlhcmNoaXZlSUQsDQotCQkJCQkJZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSksDQotCQkJCQllKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2l0ZSBmb3IgdGhpcyBwcm92aWRlcg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRQcm92aWRlciNnZXRTaXRlKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7DQotCQlyZXR1cm4gc2l0ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc2l0ZSBmb3IgdGhpcyBwcm92aWRlcg0KLQkgKiANCi0JICogQHBhcmFtIHNpdGUgc2l0ZSBmb3IgdGhpcyBwcm92aWRlcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElTaXRlIHNpdGUpIHsNCi0JCXRoaXMuc2l0ZSA9IHNpdGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9TaXRlRmVhdHVyZVJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9TaXRlRmVhdHVyZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWQ1MTc1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZUZlYXR1cmVSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgYSBmZWF0dXJlIHJlZmVyZW5jZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4gCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlUmVmZXJlbmNlTW9kZWwKLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlRmVhdHVyZVJlZmVyZW5jZSBleHRlbmRzIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgaW1wbGVtZW50cyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgewotCi0JcHJpdmF0ZSBMaXN0IGNhdGVnb3JpZXM7Ci0KLQkvKioKLQkgKiBGZWF0dXJlIHJlZmVyZW5jZSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFNpdGVGZWF0dXJlUmVmZXJlbmNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIEZlYXR1cmVSZWZlcmVuY2UuCi0JICogQHBhcmFtIHJlZiB0aGUgcmVmZXJlbmNlIHRvIGNvcHkKLQkgKi8KLQlwdWJsaWMgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQlzdXBlcihyZWYpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0ZWdvcmllcyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIGJlbG9uZyB0by4KLQkgKiAKLQkgKiBAc2VlIElTaXRlRmVhdHVyZVJlZmVyZW5jZSNnZXRDYXRlZ29yaWVzKCkKLQkgKiBAc2luY2UgMi4xIAotCSAqLwotCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCkgewotCi0JCWlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKLQkJCWNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmdbXSBjYXRlZ29yaWVzQXNTdHJpbmcgPSBnZXRDYXRlZ29yeU5hbWVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXNBc1N0cmluZy5sZW5ndGg7IGkrKykgewotCQkJCUlDYXRlZ29yeSBzaXRlQ2F0ID0gZ2V0U2l0ZSgpLmdldENhdGVnb3J5KGNhdGVnb3JpZXNBc1N0cmluZ1tpXSk7Ci0JCQkJaWYgKHNpdGVDYXQgIT0gbnVsbCkKLQkJCQkJY2F0ZWdvcmllcy5hZGQoc2l0ZUNhdCk7Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBzaXRlVVJMID0gZ2V0U2l0ZSgpLmdldFVSTCgpICE9IG51bGwgPyBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSA6IG51bGw7Ci0JCQkJCVVwZGF0ZUNvcmUud2FybigiQ2F0ZWdvcnkgIiArIGNhdGVnb3JpZXNBc1N0cmluZ1tpXSArICIgbm90IGZvdW5kIGluIFNpdGU6IiArIHNpdGVVUkwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJQ2F0ZWdvcnlbXSByZXN1bHQgPSBuZXcgSUNhdGVnb3J5WzBdOwotCi0JCWlmICghKGNhdGVnb3JpZXMgPT0gbnVsbCB8fCBjYXRlZ29yaWVzLmlzRW1wdHkoKSkpIHsKLQkJCXJlc3VsdCA9IG5ldyBJQ2F0ZWdvcnlbY2F0ZWdvcmllcy5zaXplKCldOwotCQkJY2F0ZWdvcmllcy50b0FycmF5KHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY2F0ZWdvcnkgdG8gdGhlIHJlZmVyZW5jZWQgZmVhdHVyZS4KLQkgKiAKLQkgKiBAc2VlIElTaXRlRmVhdHVyZVJlZmVyZW5jZSNhZGRDYXRlZ29yeShJQ2F0ZWdvcnkpCi0JICogQHNpbmNlIDIuMSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShJQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJdGhpcy5hZGRDYXRlZ29yeU5hbWUoY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9TaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTNkYmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9TaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFNpdGUgRmVhdHVyZSByZWZlcmVuY2UgbW9kZWwgb2JqZWN0LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IAotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgCi0gKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1vZGVsLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZVJlZmVyZW5jZQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBleHRlbmRzIEZlYXR1cmVSZWZlcmVuY2UgewotCi0JcHJpdmF0ZSBMaXN0IC8qIG9mIFN0cmluZyovCi0JY2F0ZWdvcnlOYW1lczsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIG9iamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgRmVhdHVyZVJlZmVyZW5jZU1vZGVsLgotCSAqIEBwYXJhbSByZWYKLQkgKi8KLQlwdWJsaWMgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbChJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCXN1cGVyKHJlZik7Ci0JCWlmIChyZWYgaW5zdGFuY2VvZiBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSB7Ci0JCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIHJlZk1vZGVsID0gKFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIHJlZjsKLQkJCXNldENhdGVnb3J5TmFtZXMocmVmTW9kZWwuZ2V0Q2F0ZWdvcnlOYW1lcygpKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZXMgb2YgY2F0ZWdvcmllcyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIGJlbG9uZ3MgdG8uCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBuYW1lcywgb3IgYW4gZW1wdHkgYXJyYXkuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDYXRlZ29yeU5hbWVzKCkgewotCQlpZiAoY2F0ZWdvcnlOYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgY2F0ZWdvcnlOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVzIG9mIGNhdGVnb3JpZXMgdGhpcyBmZWF0dXJlIGJlbG9uZ3MgdG8uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnlOYW1lcyBhbiBhcnJheSBvZiBjYXRlZ29yeSBuYW1lcwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeU5hbWVzKFN0cmluZ1tdIGNhdGVnb3J5TmFtZXMpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKGNhdGVnb3J5TmFtZXMgPT0gbnVsbCkKLQkJCXRoaXMuY2F0ZWdvcnlOYW1lcyA9IG51bGw7Ci0JCWVsc2UKLQkJCXRoaXMuY2F0ZWdvcnlOYW1lcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChjYXRlZ29yeU5hbWVzKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbmFtZSBvZiBhIGNhdGVnb3J5IHRoaXMgZmVhdHVyZSBiZWxvbmdzIHRvLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5TmFtZSBjYXRlZ29yeSBuYW1lCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5TmFtZShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCWlmICh0aGlzLmNhdGVnb3J5TmFtZXMgPT0gbnVsbCkKLQkJCXRoaXMuY2F0ZWdvcnlOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCF0aGlzLmNhdGVnb3J5TmFtZXMuY29udGFpbnMoY2F0ZWdvcnlOYW1lKSkKLQkJCXRoaXMuY2F0ZWdvcnlOYW1lcy5hZGQoY2F0ZWdvcnlOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbmFtZSBvZiBhIGNhdGVnb3J5cyB0aGlzIGZlYXR1cmUgYmVsb25ncyB0by4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeU5hbWUgY2F0ZWdvcnkgbmFtZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDYXRlZ29yeU5hbWUoU3RyaW5nIGNhdGVnb3J5TmFtZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodGhpcy5jYXRlZ29yeU5hbWVzICE9IG51bGwpCi0JCQl0aGlzLmNhdGVnb3J5TmFtZXMucmVtb3ZlKGNhdGVnb3J5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9TaXRlTWFuYWdlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9TaXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2IzNGZhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICogICAgIExhdXJlbnQgRm91cnJpZXIgKGxhdXJlbnRAZm91cnJpZXIubm9tLmZyKSAtIEhUVFAgUHJveHkgY29kZSBhbmQgTmV0QWNjZXNzIFBsdWdpbiANCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBTaXRlIE1hbmFnZXIuDQotICogQSBoZWxwZXIgY2xhc3MgdXNlZCBmb3IgY3JlYXRpbmcgc2l0ZSBpbnN0YW5jZS4gDQotICogU2l0ZSBtYW5hZ2VyIGlzIGEgc2luZ2xldG9uIGNsYXNzLiBJdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkOyANCi0gKiBhbGwgZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSBzdGF0aWMgbWV0aG9kcy4NCi0gKiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUxvY2FsU2l0ZQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTaXRlTWFuYWdlciB7DQotDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBvczsNCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzOw0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXJjaDsNCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5sOw0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHR0cFByb3h5RW5hYmxlOw0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSFRUUF9IT1NUID0gImh0dHAucHJveHlIb3N0IjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9IVFRQX1BPUlQgPSAiaHR0cC5wcm94eVBvcnQiOwkgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9IVFRQX1BST1hZID0gImh0dHAucHJveHlTZXQiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgU2l0ZU1hbmFnZXIoKSB7DQotCX0NCi0NCi0JLyoqIA0KLQkgKiBSZXR1cm5zIGEgc2l0ZSBvYmplY3QgZm9yIHRoZSBzaXRlIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQgVVJMLg0KLQkgKiBUeXBpY2FsbHksIHRoZSBVUkwgcmVmZXJlbmNlcyBhIHNpdGUgbWFuaWZlc3QgZmlsZSBvbiBhbiB1cGRhdGUgDQotCSAqIHNpdGUuIEFuIHVwZGF0ZSBzaXRlIGFjdHMgYXMgYSBzb3VyY2Ugb2YgZmVhdHVyZXMgZm9yIGluc3RhbGxhdGlvbg0KLQkgKiBhY3Rpb25zLg0KLQkgKiANCi0JICogQHBhcmFtIHNpdGVVUkwgc2l0ZSBVUkwNCi0JICogQHJldHVybiBzaXRlIG9iamVjdCBmb3IgdGhlIHVybA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFNpdGUoVVJMLElQb2dyZXNzTW9uaXRvcikgaW5zdGVhZA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU2l0ZSBnZXRTaXRlKFVSTCBzaXRlVVJMKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gSW50ZXJuYWxTaXRlTWFuYWdlci5nZXRTaXRlKHNpdGVVUkwsIHRydWUsbnVsbCk7DQotCX0NCi0NCi0JLyoqIA0KLQkgKiBSZXR1cm5zIGEgc2l0ZSBvYmplY3QgZm9yIHRoZSBzaXRlIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQgVVJMLg0KLQkgKiBUeXBpY2FsbHksIHRoZSBVUkwgcmVmZXJlbmNlcyBhIHNpdGUgbWFuaWZlc3QgZmlsZSBvbiBhbiB1cGRhdGUgDQotCSAqIHNpdGUuIEFuIHVwZGF0ZSBzaXRlIGFjdHMgYXMgYSBzb3VyY2Ugb2YgZmVhdHVyZXMgZm9yIGluc3RhbGxhdGlvbg0KLQkgKiBhY3Rpb25zLg0KLQkgKiANCi0JICogQHBhcmFtIHNpdGVVUkwgc2l0ZSBVUkwNCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3INCi0JICogQHJldHVybiBzaXRlIG9iamVjdCBmb3IgdGhlIHVybCBvciA8c2FtcD5udWxsPC9zYW1wPiBpbiBjYXNlIGEgDQotCSAqIHVzZXIgY2FuY2VsZWQgdGhlIGNvbm5lY3Rpb24gaW4gdGhlIHByb2dyZXNzIG1vbml0b3IuDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4xIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU2l0ZSBnZXRTaXRlKFVSTCBzaXRlVVJMLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBJbnRlcm5hbFNpdGVNYW5hZ2VyLmdldFNpdGUoc2l0ZVVSTCwgdHJ1ZSwgbW9uaXRvcik7DQotCX0NCi0NCi0JLyoqIA0KLQkgKiBSZXR1cm5zIGEgc2l0ZSBvYmplY3QgZm9yIHRoZSBzaXRlIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQgVVJMLg0KLQkgKiBUeXBpY2FsbHksIHRoZSBVUkwgcmVmZXJlbmNlcyBhIHNpdGUgbWFuaWZlc3QgZmlsZSBvbiBhbiB1cGRhdGUgDQotCSAqIHNpdGUuIEFuIHVwZGF0ZSBzaXRlIGFjdHMgYXMgYSBzb3VyY2Ugb2YgZmVhdHVyZXMgZm9yIGluc3RhbGxhdGlvbg0KLQkgKiBhY3Rpb25zLg0KLQkgKiANCi0JICogQHBhcmFtIHNpdGVVUkwgc2l0ZSBVUkwNCi0JICogQHBhcmFtIHVzZXNDYWNoZSA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNhY2hlIHNob3VsZCBiZSByZWZyZXNoZWQsIGFuZCB0aGUgc2l0ZSBlbnRpcmVseSByZXBhcnNlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4NCi0JICogQHJldHVybiBzaXRlIG9iamVjdCBmb3IgdGhlIHVybA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFNpdGUoVVJMLGJvb2xlYW4sSVBvZ3Jlc3NNb25pdG9yKSBpbnN0ZWFkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTaXRlIGdldFNpdGUoVVJMIHNpdGVVUkwsIGJvb2xlYW4gdXNlc0NhY2hlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gSW50ZXJuYWxTaXRlTWFuYWdlci5nZXRTaXRlKHNpdGVVUkwsIHVzZXNDYWNoZSxudWxsKTsNCi0JfQ0KLQ0KLQkvKiogDQotCSAqIFJldHVybnMgYSBzaXRlIG9iamVjdCBmb3IgdGhlIHNpdGUgc3BlY2lmaWVkIGJ5IHRoZSBhcmd1bWVudCBVUkwuDQotCSAqIFR5cGljYWxseSwgdGhlIFVSTCByZWZlcmVuY2VzIGEgc2l0ZSBtYW5pZmVzdCBmaWxlIG9uIGFuIHVwZGF0ZSANCi0JICogc2l0ZS4gQW4gdXBkYXRlIHNpdGUgYWN0cyBhcyBhIHNvdXJjZSBvZiBmZWF0dXJlcyBmb3IgaW5zdGFsbGF0aW9uDQotCSAqIGFjdGlvbnMuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2l0ZVVSTCBzaXRlIFVSTA0KLQkgKiBAcGFyYW0gdXNlc0NhY2hlIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgY2FjaGUgc2hvdWxkIGJlIHJlZnJlc2hlZCwgYW5kIHRoZSBzaXRlIGVudGlyZWx5IHJlcGFyc2VkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLg0KLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcg0KLQkgKiBAcmV0dXJuIHNpdGUgb2JqZWN0IGZvciB0aGUgdXJsIG9yIDxzYW1wPm51bGw8L3NhbXA+IGluIGNhc2UgYSANCi0JICogdXNlciBjYW5jZWxlZCB0aGUgY29ubmVjdGlvbiBpbiB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4NCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVNpdGUgZ2V0U2l0ZShVUkwgc2l0ZVVSTCwgYm9vbGVhbiB1c2VzQ2FjaGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIEludGVybmFsU2l0ZU1hbmFnZXIuZ2V0U2l0ZShzaXRlVVJMLCB1c2VzQ2FjaGUsIG1vbml0b3IpOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAibG9jYWwgc2l0ZSIuIEEgbG9jYWwgc2l0ZSBpcyBhIGxvZ2ljYWwgY29sbGVjdGlvbg0KLQkgKiBvZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHBsdXMgb25lIG9yIG1vcmUgZmlsZSBzeXN0ZW0gDQotCSAqIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcywgcmVwcmVzZW50ZWQgYXMgaW50aXZpZHVhbCBzaXRlcy4gDQotCSAqIFRoZXNlIGFyZSBwb3RlbnRpYWwgdGFyZ2V0cyBmb3IgaW5zdGFsbGF0aW9uIGFjdGlvbnMuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBsb2NhbCBzaXRlDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJTG9jYWxTaXRlIGdldExvY2FsU2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBJbnRlcm5hbFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUcmlnZ2VyIGhhbmRsaW5nIG9mIG5ld2x5IGRpc2NvdmVyZWQgZmVhdHVyZXMuIFRoaXMgbWV0aG9kDQotCSAqIGNhbiBiZSBjYWxsZWQgYnkgdGhlIGV4ZWN1dGluZyBhcHBsaWNhdGlvbiB3aGVuZXZlciBpdA0KLQkgKiBpcyBpbnZva2VkIHdpdGggdGhlIC1uZXdVcGRhdGVzIGNvbW1hbmQgbGluZSBhcmd1bWVudC4NCi0JICogDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuDQotCSAqIEBzaW5jZSAyLjANCi0JICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSB0aGlzIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZU5ld0NoYW5nZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCX0NCi0JLyoqDQotCSAqIFJldHVybnMgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFyY2gNCi0JICogZGVzaWduYXRvcnMgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0uIA0KLQkgKiANCi0JICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGFzIGEgaGludCBieSB0aGUgaW5zdGFsbGF0aW9uIGFuZCB1cGRhdGUNCi0JICogc3VwcG9ydC4NCi0JICogDQotCSAqIEByZXR1cm4gc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9TQXJjaCgpIHsNCi0JCWlmIChhcmNoID09IG51bGwpDQotCQkJYXJjaCA9IFBsYXRmb3JtLmdldE9TQXJjaCgpOw0KLQkJcmV0dXJuIGFyY2g7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9zDQotCSAqIGRlc2lnbmF0b3JzIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtLg0KLQkgKiANCi0JICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGFzIGEgaGludCBieSB0aGUgaW5zdGFsbGF0aW9uIGFuZCB1cGRhdGUNCi0JICogc3VwcG9ydC4NCi0JICoNCi0JICogQHJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPUygpIHsNCi0JCWlmIChvcyA9PSBudWxsKQ0KLQkJCW9zID0gUGxhdGZvcm0uZ2V0T1MoKTsNCi0JCXJldHVybiBvczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXJjaA0KLQkgKiBkZXNpZ25hdG9ycyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4gDQotCSAqIA0KLQkgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYXMgYSBoaW50IGJ5IHRoZSBpbnN0YWxsYXRpb24gYW5kIHVwZGF0ZQ0KLQkgKiBzdXBwb3J0Lg0KLQkgKiBAcmV0dXJuIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1MoKSB7DQotCQlpZiAod3MgPT0gbnVsbCkNCi0JCQl3cyA9IFBsYXRmb3JtLmdldFdTKCk7DQotCQlyZXR1cm4gd3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGFyY2guDQotCSAqIEBwYXJhbSBhcmNoIFRoZSBhcmNoIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE9TQXJjaChTdHJpbmcgYXJjaCkgew0KLQkJU2l0ZU1hbmFnZXIuYXJjaCA9IGFyY2g7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG9zLg0KLQkgKiBAcGFyYW0gb3MgVGhlIG9zIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE9TKFN0cmluZyBvcykgew0KLQkJU2l0ZU1hbmFnZXIub3MgPSBvczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgd3MuDQotCSAqIEBwYXJhbSB3cyBUaGUgd3MgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V1MoU3RyaW5nIHdzKSB7DQotCQlTaXRlTWFuYWdlci53cyA9IHdzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBubC4NCi0JICogQHBhcmFtIG5sIFRoZSBubCB0byBzZXQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXROTChTdHJpbmcgbmwpIHsNCi0JCVNpdGVNYW5hZ2VyLm5sID0gbmw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIGJ5dGVzIHBlciBzZWNvbmQgdHJhbnNmZXIgcmF0ZSBmb3IgdGhpcyBVUkwNCi0JICogQHBhcmFtIHNpdGUgdGhlIFVSTCBvZiB0aGUgc2l0ZQ0KLQkgKiBAcmV0dXJuIGxvbmcgYSBieXRlcyBwZXIgc2Vjb25kIGVzdGltYXRlIHJhdGUNCi0JICogQHNpbmNlIDIuMQ0KLSAJICovCQ0KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0RXN0aW1hdGVkVHJhbnNmZXJSYXRlKFVSTCBzaXRlKSB7DQotCQlpZiAoc2l0ZSA9PSBudWxsKQ0KLQkJCXJldHVybiAwOw0KLQkJcmV0dXJuIEludGVybmFsU2l0ZU1hbmFnZXIuZ2V0RXN0aW1hdGVkVHJhbnNmZXJSYXRlKHNpdGUuZ2V0SG9zdCgpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBjdXJyZW50IGxvY2FsZQ0KLQkgKiANCi0JICogQHJldHVybiB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIGN1cnJlbnQgbG9jYWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5MKCkgew0KLQkJaWYgKG5sID09IG51bGwpDQotCQkJbmwgPSBQbGF0Zm9ybS5nZXROTCgpOw0KLQkJcmV0dXJuIG5sOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBIVFRQIFByb3h5IFNlcnZlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lDQotCSAqIEByZXR1cm4gdGhlIEhUVFAgcHJveHkgU2VydmVyIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHR0cFByb3h5U2VydmVyKCkgew0KLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShQX0hUVFBfSE9TVCk7DQotCX0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIEhUVFAgUHJveHkgUG9ydCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lDQotCSAqIEByZXR1cm4gdGhlIEhUVFAgcHJveHkgUG9ydCANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEh0dHBQcm94eVBvcnQoKSB7DQotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KFBfSFRUUF9QT1JUKTsNCi0JfQ0KLQkvKioNCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgdXNlIHRoZSANCi0JICogaHR0cCBwcm94eSBzZXJ2ZXIsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHJldHVybiBpcyB0aGUgaHR0cCBwcm94eSBzZXJ2ZXIgZW5hYmxlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIdHRwUHJveHlFbmFibGUoKSB7DQotCQlyZXR1cm4gaXNIdHRwUHJveHlFbmFibGU7DQotCX0NCi0JLyoqDQotCSAqIFNldHMgdGhlIEhUVFAgUHJveHkgaW5mb3JtYXRpb24NCi0JICogU2V0cyB0aGUgSFRUUCBwcm94eSBzZXJ2ZXIgZm9yIHRoZSBIVFRQIHByb3h5IHNlcnZlciANCi0JICogU2V0cyB0aGUgSFRUUCBwcm94eSBwb3J0IGZvciB0aGUgSFRUUCBwcm94eSBzZXJ2ZXIgDQotCSAqIElmIHRoZSBwcm94eSBuYW1lIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBwcm94eSBwb3J0IGlzDQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBjb25uZWN0aW9uIHdpbGwgbm90IHVzZSBIVFRQIHByb3h5IHNlcnZlci4NCi0JICogDQotCSAqIEBwYXJhbSBlbmFibGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHVzZSBhbiBodHRwDQotCSAqIHByb3h5IHNlcnZlciwgPGNvZGU+ZmFsc2UgPC9jb2RlPiBvdGhlcndpc2UuDQotCSAqIEBwYXJhbSBodHRwUHJveHlTZXJ2ZXIgdGhlIEhUVFAgcHJveHkgc2VydmVyIG5hbWUgb3IgSVAgYWRyZXNzDQotCSAqIEBwYXJhbSBodHRwUHJveHlQb3J0IHRoZSBIVFRQIHByb3h5IHBvcnQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIdHRwUHJveHlJbmZvKGJvb2xlYW4gZW5hYmxlLCBTdHJpbmcgaHR0cFByb3h5U2VydmVyLCBTdHJpbmcgaHR0cFByb3h5UG9ydCkgew0KLQkJaXNIdHRwUHJveHlFbmFibGUgPSBlbmFibGU7DQotDQotCQkvLyBpZiBlbmFibGUgaXMgZmFsc2UsIG9yIHZhbHVlcyBhcmUgbnVsbCwNCi0JCS8vIHdlIHNob3VsZCByZW1vdmUgdGhlIHByb3BlcnRpZXMgYW5kIHNhdmUgdGhlIGZhY3QgdGhhdCBwcm94eSBpcyBkaXNhYmxlIA0KLQkJaWYgKCFlbmFibGUgfHwgaHR0cFByb3h5U2VydmVyID09IG51bGwgfHwgaHR0cFByb3h5UG9ydCA9PSBudWxsKSB7DQotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoUF9IVFRQX0hPU1QpOw0KLQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKFBfSFRUUF9QT1JUKTsNCi0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZShQX0hUVFBfUFJPWFkpOw0KLQkJCS8vaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1dBUk5JTkdTKQ0KLQkJCVVwZGF0ZUNvcmUud2FybigiUmVtb3ZlIHByb3h5IHNlcnZlciBpbmZvIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoVXBkYXRlQ29yZS5IVFRQX1BST1hZX0VOQUJMRSwgaXNIdHRwUHJveHlFbmFibGUoKSk7DQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCS8vU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoInByb3h5U2V0IiwgInRydWUiKTsNCi0JCS8vU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoInByb3h5SG9zdCIsIHByb3h5SG9zdCk7DQotCQkvL1N5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJwcm94eVBvcnQiLCBwcm94eVBvcnQpOw0KLQkJDQotCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnNldFByb3BlcnR5KFBfSFRUUF9QUk9YWSwgZW5hYmxlPyJ0cnVlIjoiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnNldFByb3BlcnR5KFBfSFRUUF9IT1NULCBodHRwUHJveHlTZXJ2ZXIpOw0KLQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5zZXRQcm9wZXJ0eShQX0hUVFBfUE9SVCwgaHR0cFByb3h5UG9ydCk7DQotCQkvL2lmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19XQVJOSU5HUykNCi0JCVVwZGF0ZUNvcmUud2FybigiQWRkZWQgcHJveHkgc2VydmVyIGluZm86IiArIGh0dHBQcm94eVNlcnZlciArICI6IiArIGh0dHBQcm94eVBvcnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShVcGRhdGVDb3JlLkhUVFBfUFJPWFlfSE9TVCwgZ2V0SHR0cFByb3h5U2VydmVyKCkpOw0KLQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFVwZGF0ZUNvcmUuSFRUUF9QUk9YWV9QT1JULCBnZXRIdHRwUHJveHlQb3J0KCkpOw0KLQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFVwZGF0ZUNvcmUuSFRUUF9QUk9YWV9FTkFCTEUsIGlzSHR0cFByb3h5RW5hYmxlKCkpOw0KLQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsNCi0NCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1VSTEVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1VSTEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NmRmNzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9VUkxFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgYW4gYW5ub3RhdGVkIFVSTC4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLg0KLSAqIDwvcD4gDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVVSTEVudHJ5DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5VUkxFbnRyeU1vZGVsDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBVUkxFbnRyeSBleHRlbmRzIFVSTEVudHJ5TW9kZWwgaW1wbGVtZW50cyBJVVJMRW50cnkgew0KLQ0KLQkvKioNCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgYW5ub3RhdGVkIFVSTA0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5KCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBhbm5vdGF0ZWQgVVJMLg0KLQkgKiANCi0JICogQHJldHVybiBhbm5vdGF0ZWQgdXJsIGFzIFN0cmluZw0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJU3RyaW5nIHJlc3VsdCA9ICJJVVJMRW50cnk6ICI7IC8vJE5PTi1OTFMtMSQNCi0JCVN0cmluZyBVUkxTdHJpbmcgPQ0KLQkJCShnZXRVUkwoKSA9PSBudWxsKSA/IFBvbGljeS5iaW5kKCJGZWF0dXJlLk5vVVJMIikgOiBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpOwkvLyROT04tTkxTLTEkDQotCQlyZXN1bHQgPQ0KLQkJCXJlc3VsdA0KLQkJCQkrICgoZ2V0QW5ub3RhdGlvbigpID09IG51bGwpID8gVVJMU3RyaW5nIDogZ2V0QW5ub3RhdGlvbigpICsgIiA6ICIgKyBVUkxTdHJpbmcpOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvVXRpbGl0aWVzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1V0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjUzNTAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgY29sbGVjdGlvbiBvZiB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSAKLSAqIHVzZWQgZm9yIGluc3RhbGwgcHJvY2Vzc2luZwotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFV0aWxpdGllcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZW50cnlNYXA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKERhdGVGb3JtYXQuREVGQVVMVCwgRGF0ZUZvcm1hdC5ERUZBVUxULCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLQlwcml2YXRlIHN0YXRpYyBsb25nIHRtcHNlZWQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkaXJSb290ID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgd29ya2luZyBkaXJlY3RvcnkgKGluIHRlbXBvcmFyeSBzcGFjZSkuIEVuc3VyZXMKLQkgKiB0aGUgZGlyZWN0b3J5IGV4aXN0cy4gQW55IGRpcmVjdG9yeSBsZXZlbHMgdGhhdCBoYWQgdG8gYmUgY3JlYXRlZAotCSAqIGFyZSBtYXJrZWQgZm9yIGRlbGV0aW9uIG9uIGV4aXQuCi0JICogCi0JICogQHJldHVybiB3b3JraW5nIGRpcmVjdG9yeQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRmlsZSBjcmVhdGVXb3JraW5nRGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpZiAoZGlyUm9vdCA9PSBudWxsKSB7Ci0JCQlkaXJSb290ID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBpbiBMaW51eCwgcmV0dXJucyAnL3RtcCcsIHdlIG11c3QgYWRkICcvJwotCQkJaWYgKCFkaXJSb290LmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCQlkaXJSb290ICs9IEZpbGUuc2VwYXJhdG9yOwotCi0JCQkvLyBvbiBVbml4L0xpbnV4LCB0aGUgdGVtcCBkaXIgaXMgc2hhcmVkIGJ5IG1hbnkgdXNlcnMsIHNvIHdlIG5lZWQgdG8gZW5zdXJlIAotCQkJLy8gdGhhdCB0aGUgdG9wIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGRpZmZlcmVudCBmb3IgZWFjaCB1c2VyCi0JCQlpZiAoIVBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlob21lID0gSW50ZWdlci50b1N0cmluZyhob21lLmhhc2hDb2RlKCkpOwotCQkJCWRpclJvb3QgKz0gaG9tZSArIEZpbGUuc2VwYXJhdG9yOwotCQkJfQotCQkJZGlyUm9vdCArPSAiZWNsaXBzZSIgKyBGaWxlLnNlcGFyYXRvciArICIudXBkYXRlIiArIEZpbGUuc2VwYXJhdG9yICsgTG9uZy50b1N0cmluZyh0bXBzZWVkKSArIEZpbGUuc2VwYXJhdG9yOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCVN0cmluZyB0bXBOYW1lID0gZGlyUm9vdCArIExvbmcudG9TdHJpbmcoKyt0bXBzZWVkKSArIEZpbGUuc2VwYXJhdG9yOwotCi0JCUZpbGUgdG1wRGlyID0gbmV3IEZpbGUodG1wTmFtZSk7Ci0JCXZlcmlmeVBhdGgodG1wRGlyLCBmYWxzZSk7Ci0JCWlmICghdG1wRGlyLmV4aXN0cygpKQotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih0bXBOYW1lKTsKLQkJcmV0dXJuIHRtcERpcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgd29ya2luZyBmaWxlLiBUaGUgZmlsZSBpcyBtYXJrZWQgZm9yIGRlbGV0aW9uIG9uIGV4aXQuCi0JICogCi0JICogQHNlZSAjbG9va3VwTG9jYWxGaWxlKFN0cmluZykKLQkgKiBAcGFyYW0gdG1wRGlyIGRpcmVjdG9yeSBsb2NhdGlvbiBmb3IgbmV3IGZpbGUuIEFueSBtaXNzaW5nIGRpcmVjdG9yeQotCSAqIGxldmVscyBhcmUgY3JlYXRlZCAoYW5kIG1hcmtlZCBmb3IgZGVsZXRpb24gb24gZXhpdCkKLQkgKiBAcGFyYW0gbmFtZSBvcHRpb25hbCBmaWxlIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LiBJZiBuYW1lIGlzIG5vdAotCSAqIHNwZWNpZmllZCwgYSB0ZW1wb3JhcnkgbmFtZSBpcyBnZW5lcmF0ZWQuCi0JICogQHJldHVybiBjcmVhdGVkIHdvcmtpbmcgZmlsZQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRmlsZSBjcmVhdGVMb2NhbEZpbGUoRmlsZSB0bXBEaXIsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBjcmVhdGUgdGhlIGxvY2FsIGZpbGUKLQkJRmlsZSB0ZW1wOwotCQlTdHJpbmcgZmlsZVBhdGg7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBmaWxlIHdpdGggc3BlY2lmaWVkIG5hbWUKLQkJCWZpbGVQYXRoID0gbmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCWlmIChmaWxlUGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCQlmaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZygxKTsKLQkJCXRlbXAgPSBuZXcgRmlsZSh0bXBEaXIsIGZpbGVQYXRoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNyZWF0ZSBmaWxlIHdpdGggdGVtcCBuYW1lCi0JCQl0ZW1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZWNsaXBzZSIsIG51bGwsIHRtcERpcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0ZW1wLmRlbGV0ZU9uRXhpdCgpOwotCQl2ZXJpZnlQYXRoKHRlbXAsIHRydWUpOwotCi0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qKgotCSAqIFRoZSBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGxvb2t1cCBrZXkuCi0JICogQHBhcmFtIGtleSBvcHRpb25hbCBsb29rdXAga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdGVtcCB0aGUgbG9jYWwgd29ya2luZyBmaWxlCi0JICogQHNpbmNlIDIuMC4yCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBtYXBMb2NhbEZpbGUoU3RyaW5nIGtleSwgRmlsZSB0ZW1wKSB7Ci0JCS8vIGNyZWF0ZSBmaWxlIGFzc29jaWF0aW9uIAotCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCWlmIChlbnRyeU1hcCA9PSBudWxsKQotCQkJCWVudHJ5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWVudHJ5TWFwLnB1dChrZXksIHRlbXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHByZXZpb3VzbHkgY2FjaGVkIGxvY2FsIGZpbGUgKGluIHRlbXBvcmFyeSBhcmVhKSBtYXRjaGluZyB0aGUKLQkgKiBzcGVjaWZpZWQga2V5LiAKLQkgKiAKLQkgKiBAcGFyYW0ga2V5IGxvb2t1cCBrZXkKLQkgKiBAcmV0dXJuIGNhY2hlZCBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRmlsZSBsb29rdXBMb2NhbEZpbGUoU3RyaW5nIGtleSkgewotCQlpZiAoZW50cnlNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEZpbGUpIGVudHJ5TWFwLmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIEZsdXNoZXMgYWxsIHRoZSBrZXlzIGZyb20gdGhlIGxvY2FsIGZpbGUgbWFwLgotCSAqIFJlaW5pdGlhbGl6ZSB0aGUgY2FjaGUuCi0gICAgICoKLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBmbHVzaExvY2FsRmlsZSgpIHsKLQkJZW50cnlNYXAgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBrZXkgZnJvbSB0aGUgbG9jYWwgZmlsZSBtYXAuIFRoZSBmaWxlIGlzCi0JICogbm90IGFjdHVhbGx5IGRlbGV0ZWQgdW50aWwgVk0gdGVybWluYXRpb24uCi0JICogCi0JICogQHBhcmFtIGtleSBsb29rdXAga2V5Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTG9jYWxGaWxlKFN0cmluZyBrZXkpIHsKLQkJaWYgKGVudHJ5TWFwICE9IG51bGwpCi0JCQllbnRyeU1hcC5yZW1vdmUoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gTmVpdGhlciBzdHJlYW0KLQkgKiBpcyBjbG9zZWQgYXMgcGFydCBvZiB0aGlzIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaXMgaW5wdXQgc3RyZWFtCi0JICogQHBhcmFtIG9zIG91dHB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcywgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiB7Ci0JCWxvbmcgb2Zmc2V0ID0gVXBkYXRlTWFuYWdlclV0aWxzLmNvcHkoaXMsIG9zLCBtb25pdG9yLCAwKTsKLQkJaWYgKG9mZnNldCAhPSAtMSkgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJGZWF0dXJlLkluc3RhbGxhdGlvbkNhbmNlbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJdGhyb3cgbmV3IEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uKG1zZywgbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENvcmVFeGNlcHRpb24gZnJvbSBzb21lIG90aGVyIGV4Y2VwdGlvbi4KLQkgKiBUaGUgdHlwZSBvZiB0aGUgQ29yZUV4Y2VwdGlvbiBpcyA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPgotCSAqIElmIHRoZSBleGNlcHRpb24gcGFzc2VkIGFzIGEgcGFyYW1ldGVyIGlzIGFsc28gYSBDb3JlRXhjZXB0aW9uLAotCSAqIHRoZSBuZXcgQ29yZUV4Y2VwdGlvbiB3aWxsIGNvbnRhaW4gYWxsIHRoZSBzdGF0dXMgb2YgdGhlIHBhc3NlZAotCSAqIENvcmVFeGNlcHRpb24uCi0JICogCi0JICogQHNlZSBJU3RhdHVzI0VSUk9SCi0JICogQHBhcmFtIHMgZXhjZXB0aW9uIHN0cmluZwotCSAqIEBwYXJhbSBjb2RlIHRoZSBjb2RlIHJlcG9ydGVkCi0JICogQHBhcmFtIGUgYWN0dWFsIGV4Y2VwdGlvbiBiZWluZyByZXBvcnRlZAotCSAqIEByZXR1cm4gYSBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBuZXdDb3JlRXhjZXB0aW9uKFN0cmluZyBzLCBpbnQgY29kZSwgVGhyb3dhYmxlIGUpIHsKLQkJU3RyaW5nIGlkID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCQkvLyBjaGVjayB0aGUgY2FzZSBvZiBhIG11bHRpc3RhdHVzCi0JCUlTdGF0dXMgc3RhdHVzOwotCQlpZiAoZSBpbnN0YW5jZW9mIEZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbikKLQkJCXJldHVybiAoRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uKWU7Ci0JCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlpZiAocyA9PSBudWxsKQotCQkJCXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKGlkLCBjb2RlLCBzLCBlKTsKLQkJCUlTdGF0dXMgY2hpbGRyZW5TdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQkJKChNdWx0aVN0YXR1cykgc3RhdHVzKS5hZGQoY2hpbGRyZW5TdGF0dXMpOwotCQkJKChNdWx0aVN0YXR1cykgc3RhdHVzKS5hZGRBbGwoY2hpbGRyZW5TdGF0dXMpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIGNvbXBsZXRlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzICE9IG51bGwpCi0JCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKHMpOwotCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiIFsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtc2cgPSBlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCQljb21wbGV0ZVN0cmluZy5hcHBlbmQobXNnIT1udWxsP21zZzplLnRvU3RyaW5nKCkpOwotCQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGlkLCBjb2RlLCBjb21wbGV0ZVN0cmluZy50b1N0cmluZygpLCBlKTsKLQkJfQotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb3JlRXhjZXB0aW9uIGZyb20gc29tZSBvdGhlciBleGNlcHRpb24uCi0JICogVGhlIHR5cGUgb2YgdGhlIENvcmVFeGNlcHRpb24gaXMgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4KLQkgKiBJZiB0aGUgZXhjZXB0aW9ucGFzc2VkIGFzIGEgcGFyYW1ldGVyIGlzIGFsc28gYSBDb3JlRXhjZXB0aW9uLAotCSAqIHRoZSBuZXcgQ29yZUV4Y2VwdGlvbiB3aWxsIGNvbnRhaW4gYWxsIHRoZSBzdGF0dXMgb2YgdGhlIHBhc3NlZAotCSAqIENvcmVFeGNlcHRpb24uCi0JICogCi0JICogQHNlZSBJU3RhdHVzI0VSUk9SCi0JICogQHBhcmFtIHMgZXhjZXB0aW9uIHN0cmluZwotCSAqIEBwYXJhbSBlIGFjdHVhbCBleGNlcHRpb24gYmVpbmcgcmVwb3J0ZWQKLQkgKiBAcmV0dXJuIGEgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvcmVFeGNlcHRpb24gbmV3Q29yZUV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIG5ld0NvcmVFeGNlcHRpb24ocywgSVN0YXR1cy5PSywgZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENvcmVFeGNlcHRpb24gZnJvbSB0d28gb3RoZXIgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzIG92ZXJhbGwgZXhjZXB0aW9uIHN0cmluZwotCSAqIEBwYXJhbSBzMSBzdHJpbmcgZm9yIGZpcnN0IGRldGFpbGVkIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBzMiBzdHJpbmcgZm9yIHNlY29uZCBkZXRhaWxlZCBleGNlcHRpb24KLQkgKiBAcGFyYW0gZTEgZmlyc3QgZGV0YWlsZWQgZXhjZXB0aW9uCi0JICogQHBhcmFtIGUyIHNlY29uZCBkZXRhaWxlZCBleGNlcHRpb24KLQkgKiBAcmV0dXJuIGEgQ29yZUV4Y2VwdGlvbiB3aXRoIG11bHRpLXN0YXR1cwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvcmVFeGNlcHRpb24gbmV3Q29yZUV4Y2VwdGlvbihTdHJpbmcgcywgU3RyaW5nIHMxLCBTdHJpbmcgczIsIENvcmVFeGNlcHRpb24gZTEsIENvcmVFeGNlcHRpb24gZTIpIHsKLQkJU3RyaW5nIGlkID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCUlTdGF0dXMgY2hpbGRTdGF0dXMxID0gKChDb3JlRXhjZXB0aW9uKSBlMSkuZ2V0U3RhdHVzKCk7Ci0JCUlTdGF0dXMgY2hpbGRTdGF0dXMyID0gKChDb3JlRXhjZXB0aW9uKSBlMikuZ2V0U3RhdHVzKCk7Ci0JCWludCBjb2RlID0gKGNoaWxkU3RhdHVzMS5nZXRDb2RlKCkgPT0gY2hpbGRTdGF0dXMyLmdldENvZGUoKSkgPyBjaGlsZFN0YXR1czEuZ2V0Q29kZSgpIDogSVN0YXR1cy5PSzsKLQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoaWQsIGNvZGUsIHMsIG51bGwpOwotCi0JCW11bHRpLmFkZChjaGlsZFN0YXR1czEpOwotCQltdWx0aS5hZGRBbGwoY2hpbGRTdGF0dXMxKTsKLQkJbXVsdGkuYWRkKGNoaWxkU3RhdHVzMik7Ci0JCW11bHRpLmFkZEFsbChjaGlsZFN0YXR1czIpOwotCi0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihtdWx0aSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIGEgRGF0ZSBiYXNlZCBvbiB0aGUgZGVmYXVsdCBMb2NhbGUgCi0JICogSWYgdGVoIERhdGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gcmV0dXJucyBhbiBlbXB0eSBTdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gZGF0ZSB0aGUgRGF0ZSB0byBmb3JtYXQKLQkgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgRGF0ZSBhcyBhIFN0cmluZwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXQoRGF0ZSBkYXRlKSB7Ci0JCWlmIChkYXRlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRhdGVGb3JtYXQuZm9ybWF0KGRhdGUpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gc2h1dGRvd24gcHJvY2Vzc2luZyBmb3IgdGVtcG9yYXJ5IGZpbGUgaGFuZGxpbmcuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gcGxhdGZvcm0gaXMgc2h1dHRpbmcgZG93bi4KLQkgKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGF0IGFueSBvdGhlciB0aW1lIHVuZGVyCi0JICogbm9ybWFsIGNpcmN1bXN0YW5jZXMuIEEgc2lkZS1lZmZlY3Qgb2YgY2FsbGluZyB0aGlzIG1ldGhvZAotCSAqIGlzIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IG1hbmFnZWQgCi0JICogYnkgdGhpcyBjbGFzcyBhcmUgZGVsZXRlZC4gCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJaWYgKGRpclJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlGaWxlIHRlbXAgPSBuZXcgRmlsZShkaXJSb290KTsgLy8gdGVtcCBkaXJlY3Rvcnkgcm9vdCBmb3IgdGhpcyBydW4KLQkJY2xlYW51cFRlbXAodGVtcCk7Ci0JCXRlbXAuZGVsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGVhbnVwVGVtcChGaWxlIHJvb3QpIHsKLQkJRmlsZVtdIGZpbGVzID0gcm9vdC5saXN0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGZpbGVzICE9IG51bGwgJiYgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJCQljbGVhbnVwVGVtcChmaWxlc1tpXSk7Ci0JCQlmaWxlc1tpXS5kZWxldGUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5UGF0aChGaWxlIHBhdGgsIGJvb2xlYW4gaXNGaWxlKSB7Ci0JCS8vIGlmIHdlIGFyZSBleHBlY3RpbmcgYSBmaWxlIGJhY2sgb2ZmIDEgcGF0aCBlbGVtZW50Ci0JCWlmIChpc0ZpbGUpIHsKLQkJCWlmIChwYXRoLmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJCS8vIG1ha2Ugc3VyZSB0aGlzIGlzIGEgZmlsZQotCQkJCXBhdGggPSBwYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJCQlpc0ZpbGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIGFscmVhZHkgZXhpc3RzIC4uLiBqdXN0IHJldHVybgotCQlpZiAocGF0aC5leGlzdHMoKSkKLQkJCXJldHVybjsKLQotCQkvLyBkb2VzIG5vdCBleGlzdCAuLi4gZW5zdXJlIHBhcmVudCBleGlzdHMKLQkJRmlsZSBwYXJlbnQgPSBwYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJdmVyaWZ5UGF0aChwYXJlbnQsIGZhbHNlKTsKLQotCQkvLyBlbnN1cmUgZGlyZWN0b3JpZXMgYXJlIG1hZGUuIE1hcmsgZmlsZXMgb3IgZGlyZWN0b3JpZXMgZm9yIGRlbGV0aW9uCi0JCWlmICghaXNGaWxlKQotCQkJcGF0aC5ta2RpcigpOwotCQlwYXRoLmRlbGV0ZU9uRXhpdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvVmVyaWZpZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxNDQ2OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1ZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIGEgdmVyaWZpZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4gCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpZXIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZlcmlmaWVyIGltcGxlbWVudHMgSVZlcmlmaWVyIHsKLQkKLQlwcml2YXRlIElWZXJpZmllciBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBAc2VlIElWZXJpZmllciN2ZXJpZnkoSUZlYXR1cmUsIENvbnRlbnRSZWZlcmVuY2UsIGJvb2xlYW4sIEluc3RhbGxNb25pdG9yKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmeSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJQ29udGVudFJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCWJvb2xlYW4gaXNGZWF0dXJlVmVyaWZpY2F0aW9uLAotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiA7Ci0KLQkvKioKLQkgKiBAc2VlIElWZXJpZmllciN2ZXJpZnkoSUZlYXR1cmUsIENvbnRlbnRSZWZlcmVuY2UsIGJvb2xlYW4sIEluc3RhbGxNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIpewotCQlpZiAodGhpcy5wYXJlbnQ9PW51bGwpewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnRWZXJpZmllcjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgdmVyaWZpZXIKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgdmVyaWZpZXIKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIElWZXJpZmllciBnZXRQYXJlbnQoKXsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvVmVyc2lvbmVkSWRlbnRpZmllci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9WZXJzaW9uZWRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmQ3MTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9WZXJzaW9uZWRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIFZlcnNpb25lZCBJZGVudGlmaWVyLiBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyBjb21iaW5pbmcgYW4gaWRlbnRpZmljYXRpb24NCi0gKiBzdHJpbmcgd2l0aCBhIHZlcnNpb24uDQotICogPHA+DQotICogQ2xpZW50cyBtYXkgaW5zdGFudGlhdGU7IG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXINCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIFZlcnNpb25lZElkZW50aWZpZXIgew0KLQlwcml2YXRlIFN0cmluZyBpZDsNCi0JcHJpdmF0ZSBQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2ZXJzaW9uOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIl8iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3QgYSB2ZXJzaW9uZWQgaWRlbnRpZmllciBmcm9tIGFuIGlkZW50aWZpZXIgYW5kIGEgc3RyaW5nDQotCSAqIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVyc2lvbg0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXIjdG9TdHJpbmcoKQ0KLQkgKiBAcGFyYW0gaWQgaWRlbnRpZmllciBzdHJpbmcNCi0JICogQHBhcmFtIHZlcnNpb25OYW1lIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB2ZXJzaW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb25OYW1lKSB7DQotCQlpZiAoaWQgPT0gbnVsbAl8fCAoaWQgPSBpZC50cmltKCkpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQlQb2xpY3kuYmluZCgiVmVyc2lvbmVkSWRlbnRpZmllci5JZE9yVmVyc2lvbk51bGwiLCBpZCwgdmVyc2lvbk5hbWUpKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy5pZCA9IGlkOw0KLQkJLy8gMTU3MDcNCi0JCWlmICh2ZXJzaW9uTmFtZSAhPSBudWxsKXsNCi0JCQkvLyBpZiAoUGx1Z2luVmVyc2lvbklkZW50aWZpZXIudmFsaWRhdGVWZXJzaW9uSWRlbnRpZmllcih2ZXJzaW9uTmFtZSkuaXNPaygpKQ0KLQkJCXRyeSB7DQotCQkJCXRoaXMudmVyc2lvbiA9IG5ldyBQbHVnaW5WZXJzaW9uSWRlbnRpZmllcih2ZXJzaW9uTmFtZSk7DQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKXsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKCJJbnZhbGlkIFZlcnNpb246Iit2ZXJzaW9uTmFtZSxlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JCWlmICh0aGlzLnZlcnNpb249PW51bGwpDQotCQkJdmVyc2lvbiA9IG5ldyBQbHVnaW5WZXJzaW9uSWRlbnRpZmllcigwLCAwLCAwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgaWRlbnRpZmllcg0KLQkgKiANCi0JICogQHJldHVybiBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsNCi0JCXJldHVybiBpZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmVyc2lvbg0KLQkgKiANCi0JICogQHJldHVybiB2ZXJzaW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBnZXRWZXJzaW9uKCkgew0KLQkJcmV0dXJuIHZlcnNpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlcnNpb25lZCBpZGVudGlmaWVyLg0KLQkgKiANCi0JICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdmVyc2lvbmVkIGlkZW50aWZpZXIuIFRoZSByZXN1bHRpbmcgDQotCSAqIHN0cmluZyBpcyA8aWQ+Xzx2ZXJzaW9uPiwgd2hlcmUgPGlkPiBpcyB0aGUgaWRlbnRpZmllciBhbmQgDQotCSAqIDx2ZXJzaW9uPiBpcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZXJzaW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlyZXR1cm4gaWQuZXF1YWxzKCIiKSA/ICIiIDogaWQgKyBTRVBBUkFUT1IgKyB2ZXJzaW9uLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQl9DQotDQotCS8qKg0KLQkgKiBDb21wYXJlcyB0d28gdmVyc2lvbmVkIGlkZW50aWZpZXJzIGZvciBlcXVhbGl0eQ0KLQkgKiANCi0JICogQHBhcmFtIG9iaiBvdGhlciB2ZXJzaW9uZWQgaWRlbnRpZmllciB0byBjb21wYXJlIHRvDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbCwgDQotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFZlcnNpb25lZElkZW50aWZpZXIpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gKFZlcnNpb25lZElkZW50aWZpZXIpIG9iajsNCi0JCWlmICghdGhpcy5pZC5lcXVhbHModmlkLmlkKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gdGhpcy52ZXJzaW9uLmVxdWFscyh2aWQudmVyc2lvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBjb21wdXRlZCBoYXNoY29kZSBmb3IgdGhlIHZlcnNpb25lZCBpZGVudGlmaWVyLg0KLQkgKiANCi0JICogQHJldHVybiBoYXNoIGNvZGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsNCi0JCXJldHVybiB0b1N0cmluZygpLmhhc2hDb2RlKCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9BcmNoaXZlUmVmZXJlbmNlTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvQXJjaGl2ZVJlZmVyZW5jZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDlhYTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9BcmNoaXZlUmVmZXJlbmNlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi0vKioNCi0gKiBTaXRlIGFyY2hpdmUgbW9kZWwgb2JqZWN0Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgDQotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgDQotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQXJjaGl2ZVJlZmVyZW5jZQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVJlZmVyZW5jZU1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3Qgew0KLQ0KLQlwcml2YXRlIFN0cmluZyBwYXRoOw0KLQlwcml2YXRlIFN0cmluZyB1cmxTdHJpbmc7DQotCXByaXZhdGUgVVJMIHVybDsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSB1bmluaXRpYWxpemVkIG1vZGVsIG9iamVjdC4NCi0JICogIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmUgdGhlIHNpdGUgYXJjaGl2ZSAic3ltYm9saWMiIHBhdGgNCi0JICoNCi0JICogQHJldHVybiBwYXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7DQotCQlyZXR1cm4gcGF0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCBVUkwgc3RyaW5nIGZvciB0aGUgYXJjaGl2ZS4NCi0JICoNCi0JICogQHJldHVybiB1cmwgc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFVSTFN0cmluZygpIHsNCi0JCXJldHVybiB1cmxTdHJpbmc7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIFVSTCBmb3IgdGhlIGFyY2hpdmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHVybCwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBzaXRlIGFyY2hpdmUgInN5bWJvbGljIiBwYXRoLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gcGF0aCBhcmNoaXZlICJzeW1ib2xpYyIgcGF0aC4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMucGF0aCA9IHBhdGg7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHVucmVzb2x2ZWQgVVJMIHN0cmluZyBmb3IgdGhlIGFyY2hpdmUuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSB1cmxTdHJpbmcgdW5yZXNvbHZlZCB1cmwgc3RyaW5nLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRVUkxTdHJpbmcoU3RyaW5nIHVybFN0cmluZykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMudXJsU3RyaW5nID0gdXJsU3RyaW5nOw0KLQkJdGhpcy51cmwgPSBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuDQotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSANCi0JICogYmFzZSBVUkwgYXJndW1lbnQuIEFueSB0cmFuc2xhdGFibGUgc3RyaW5ncyBpbiB0aGUgbW9kZWwgdGhhdCBhcmUNCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgDQotCSAqIHJlc291cmNlIGJ1bmRsZS4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlIFVSTA0KLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSBVUkwNCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSxVUkwgYnVuZGxlVVJMKQ0KLQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzDQotCQl1cmwgPSByZXNvbHZlVVJMKGJhc2UsIGJ1bmRsZVVSTCwgdXJsU3RyaW5nKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0NhdGVnb3J5TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvQ2F0ZWdvcnlNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZmZGVmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvQ2F0ZWdvcnlNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBGZWF0dXJlIGNhdGVnb3J5IGRlZmluaXRpb24gbW9kZWwgb2JqZWN0LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IAotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgCi0gKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1vZGVsLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ2F0ZWdvcnkKLSAqIEBzaW5jZSAyLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgbG9jYWxpemVkTGFiZWw7Ci0JcHJpdmF0ZSBVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3IgY29tcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBtb2RlbCBvYmplY3QuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBDYXRlZ29yeU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGNhdGVnb3J5IG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGNhdGVnb3J5LiBJZiB0aGUgbW9kZWwKLQkgKiBvYmplY3QgaGFzIGJlZW4gcmVzb2x2ZWQsIHRoZSBsYWJlbCBpcyBsb2NhbGl6ZWQuCi0JICogCi0JICogQHJldHVybiBkaXNwbGF5YWJsZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCWlmIChsb2NhbGl6ZWRMYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxvY2FsaXplZExhYmVsOwotCQllbHNlCi0JCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIG5vbi1sb2NhbGl6ZWQgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBjYXRlZ29yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIG5vbi1sb2NhbGl6ZWQgZGlzcGxheWFibGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsTm9uTG9jYWxpemVkKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIGRldGFpbGVkIGNhdGVnb3J5IGRlc2NyaXB0aW9uCi0JICogCi0JICogQHJldHVybiBjYXRlZ29yeSBkZXNjcmlwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBVUkxFbnRyeU1vZGVsIGdldERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYXRlZ29yeSBkaXNwbGF5YWJsZSBsYWJlbC4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbCBkaXNwbGF5YWJsZSBsYWJlbCwgb3IgcmVzb3VyY2Uga2V5Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMubG9jYWxpemVkTGFiZWwgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNhdGVnb3J5IG5hbWUuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBjYXRlZ29yeSBuYW1lCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYXRlZ29yeSBkZXNjcmlwdGlvbi4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBjYXRlZ29yeSBkZXNjcmlwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbk1vZGVsKFVSTEVudHJ5TW9kZWwgZGVzY3JpcHRpb24pIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIE1hcmtzIHRoZSBtb2RlbCBvYmplY3QgYXMgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrUmVhZE9ubHkoKSB7Ci0JCXN1cGVyLm1hcmtSZWFkT25seSgpOwotCQltYXJrUmVmZXJlbmNlUmVhZE9ubHkoZ2V0RGVzY3JpcHRpb25Nb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuCi0JICogQW55IFVSTCBzdHJpbmdzIGluIHRoZSBtb2RlbCBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIAotCSAqIGJhc2UgVVJMIGFyZ3VtZW50LiBBbnkgdHJhbnNsYXRhYmxlIHN0cmluZ3MgaW4gdGhlIG1vZGVsIHRoYXQgYXJlCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgCi0JICogcmVzb3VyY2UgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlIFVSTAotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTAotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsVVJMIGJ1bmRsZVVSTCkKLQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCS8vIHJlc29sdmUgbG9jYWwgZWxlbWVudHMKLQkJbG9jYWxpemVkTGFiZWwgPSByZXNvbHZlTkxTdHJpbmcoYnVuZGxlVVJMLCBsYWJlbCk7Ci0KLQkJLy8gZGVsZWdhdGUgdG8gcmVmZXJlbmNlcwotCQlyZXNvbHZlUmVmZXJlbmNlKGdldERlc2NyaXB0aW9uTW9kZWwoKSxiYXNlLCBidW5kbGVVUkwpOwotCX0KLQotCS8qKgotCSAqIENvbXBhcmUgdHdvIGNhdGVnb3J5IG1vZGVscyBmb3IgZXF1YWxpdHkuCi0JICogCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3J5TW9kZWwpIHsKLQkJCUNhdGVnb3J5TW9kZWwgb3RoZXJDYXRlZ29yeSA9IChDYXRlZ29yeU1vZGVsKSBvYmo7Ci0JCQlyZXN1bHQgPSBnZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShvdGhlckNhdGVnb3J5LmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlIGhhc2ggY29kZSBmb3IgY2F0ZWdvcnkgbW9kZWwuCi0JICogCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbXBhcmF0b3IgZm9yIGNhdGVnb3J5IG1vZGVscy4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbXBhcmF0b3IKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldENvbXBhcmF0b3IoKSB7Ci0JCWlmIChjb21wID09IG51bGwpIHsKLQkJCWNvbXAgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQkvKgotCQkJCSAqIEBzZWUgQ29tcGFyYXRvciNjb21wYXJlKE9iamVjdCxPYmplY3QpCi0JCQkJICogUmV0dXJucyAwIGlmIHZlcnNpb25zIGFyZSBlcXVhbC4KLQkJCQkgKiBSZXR1cm5zIC0xIGlmIG9iamVjdDEgaXMgYWZ0ZXIgdGhhbiBvYmplY3QyLgotCQkJCSAqIFJldHVybnMgKzEgaWYgb2JqZWN0MSBpcyBiZWZvcmUgdGhhbiBvYmplY3QyLgotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCi0JCQkJCUNhdGVnb3J5TW9kZWwgY2F0MSA9IChDYXRlZ29yeU1vZGVsKSBvMTsKLQkJCQkJQ2F0ZWdvcnlNb2RlbCBjYXQyID0gKENhdGVnb3J5TW9kZWwpIG8yOwotCi0JCQkJCWlmIChjYXQxLmVxdWFscyhjYXQyKSkKLQkJCQkJCXJldHVybiAwOwotCQkJCQlyZXR1cm4gY2F0MS5nZXROYW1lKCkuY29tcGFyZVRvKGNhdDIuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBjb21wOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLk1vZGVsT2JqZWN0I2dldFByb3BlcnR5TmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiBTaXRlLlNJVEVfRklMRTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9Db250ZW50RW50cnlNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9Db250ZW50RW50cnlNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmIwOTYxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvQ29udGVudEVudHJ5TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbDsNCi0NCi0NCi0vKioNCi0gKiBDb250ZW50IGVudHJ5IG1vZGVsIG9iamVjdC4NCi0gKiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBwbHVnLWluIGFuZCBub24tcGx1Zy1pbiBlbnRyeSBtb2RlbHMuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtdXN0IGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlBsdWdpbkVudHJ5TW9kZWwNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLk5vblBsdWdpbkVudHJ5TW9kZWwNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRFbnRyeU1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3Qgew0KLQ0KLQkvKioNCi0JICogQW4gaW5kaWNhdGlvbiB0aGUgc2l6ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZA0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFVOS05PV05fU0laRSA9IC0xOw0KLQ0KLQlwcml2YXRlIGxvbmcgZG93bmxvYWRTaXplID0gVU5LTk9XTl9TSVpFOw0KLQlwcml2YXRlIGxvbmcgaW5zdGFsbFNpemUgPSBVTktOT1dOX1NJWkU7DQotCXByaXZhdGUgU3RyaW5nIG9zOw0KLQlwcml2YXRlIFN0cmluZyB3czsNCi0JcHJpdmF0ZSBTdHJpbmcgbmw7DQotCXByaXZhdGUgU3RyaW5nIGFyY2g7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgdW5pbml0aWFsaXplZCBjb250ZW50IGVudHJ5IG1vZGVsIG9iamVjdC4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByb3RlY3RlZCBDb250ZW50RW50cnlNb2RlbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRvd25sb2FkIHNpemUgb2YgdGhlIGVudHJ5LCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4NCi0JICogDQotCSAqIEByZXR1cm4gZG93bmxvYWQgc2l6ZSBvZiB0aGUgZW50cnkgaW4gS2lsb0J5dGVzLCBvciBhbiBpbmRpY2F0aW9uIA0KLQkgKiB0aGUgc2l6ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0NCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplKCkgew0KLQkJcmV0dXJuIGRvd25sb2FkU2l6ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgaW5zdGFsbCBzaXplIG9mIHRoZSBlbnRyeSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbGwgc2l6ZSBvZiB0aGUgZW50cnkgaW4gS2lsb0J5dGVzLCBvciBhbiBpbmRpY2F0aW9uIA0KLQkgKiB0aGUgc2l6ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZSgpIHsNCi0JCXJldHVybiBpbnN0YWxsU2l6ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBvcHRpb25hbCBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0T1MoKSB7DQotCQlyZXR1cm4gb3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgb3B0aW9uYWwgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgew0KLQkJcmV0dXJuIHdzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIG9wdGlvbmFsIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4gDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE9TQXJjaCgpIHsNCi0JCXJldHVybiBhcmNoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGxvY2FsZSBzcGVjaWZpY2F0aW9uLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUgc3BlY2lmaWNhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgew0KLQkJcmV0dXJuIG5sOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBkb3dubG9hZCBzaXplIG9mIHRoZSBlbnRyeS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBkb3dubG9hZFNpemUgZG93bmxvYWQgc2l6ZSBvZiB0aGUgZW50cnkgaW4gS2lsb0J5dGVzDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXREb3dubG9hZFNpemUobG9uZyBkb3dubG9hZFNpemUpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAoZG93bmxvYWRTaXplIDwgMCkNCi0JCQl0aGlzLmRvd25sb2FkU2l6ZSA9IFVOS05PV05fU0laRTsNCi0JCWVsc2UNCi0JCQl0aGlzLmRvd25sb2FkU2l6ZSA9IGRvd25sb2FkU2l6ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgaW5zdGFsbCBzaXplIG9mIHRoZSBlbnRyeS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBpbnN0YWxsU2l6ZSBpbnN0YWxsIHNpemUgb2YgdGhlIGVudHJ5IGluIEtpbG9CeXRlcw0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsU2l6ZShsb25nIGluc3RhbGxTaXplKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKGluc3RhbGxTaXplIDwgMCkNCi0JCQl0aGlzLmluc3RhbGxTaXplID0gVU5LTk9XTl9TSVpFOw0KLQkJZWxzZQ0KLQkJCXRoaXMuaW5zdGFsbFNpemUgPSBpbnN0YWxsU2l6ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIG9zIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE9TIGlkZW50aWZpZXJzIGFzIGRlZmluZWQgYnkgRWNsaXBzZS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0T1MoU3RyaW5nIG9zKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5vcyA9IG9zOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSB3cyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBXUyBpZGVudGlmaWVycyBhcyBkZWZpbmVkIGJ5IEVjbGlwc2UuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFdTKFN0cmluZyB3cykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMud3MgPSB3czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gYXJjaCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhcmNoIGlkZW50aWZpZXJzIGFzIGRlZmluZWQgYnkgRWNsaXBzZS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QXJjaChTdHJpbmcgYXJjaCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuYXJjaCA9IGFyY2g7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gbmwgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYWxlIGlkZW50aWZpZXJzLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXROTChTdHJpbmcgbmwpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLm5sID0gbmw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9EZWZhdWx0RmVhdHVyZVBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9EZWZhdWx0RmVhdHVyZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2FjNjQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRGVmYXVsdEZlYXR1cmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLWltcG9ydCBvcmcueG1sLnNheC4qOw0KLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7DQotDQotLyoqDQotICogRGVmYXVsdCBmZWF0dXJlIHBhcnNlci4NCi0gKiBQYXJzZXMgdGhlIGZlYXR1cmUgbWFuaWZlc3QgZmlsZSBhcyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4gRGVmZXJzDQotICogdG8gYSBtb2RlbCBmYWN0b3J5IHRvIGNyZWF0ZSB0aGUgYWN0dWFsIGNvbmNyZXRlIG1vZGVsIG9iamVjdHMuIFRoZSANCi0gKiB1cGRhdGUgZnJhbWV3b3JrIHN1cHBsaWVzIHR3byBmYWN0b3J5IGltcGxlbWVudGF0aW9uczoNCi0gKiA8dWw+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIDxsaT5Ac2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbEZhY3RvcnkNCi0gKiA8bGk+QHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlRmVhdHVyZUZhY3RvcnkNCi0gKiA8L3VsPg0KLSAqIA0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZlYXR1cmVQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7DQotDQotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsNCi0JcHJpdmF0ZSBGZWF0dXJlTW9kZWxGYWN0b3J5IGZhY3Rvcnk7DQotCXByaXZhdGUgTXVsdGlTdGF0dXMgc3RhdHVzOw0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gVVJMX0FMUkVBRFlfU0VFTiA9IGZhbHNlOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSUdOT1JFRF9FTEVNRU5UID0gLTE7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTklUSUFMID0gMDsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOQ0xVREVTID0gMTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0ZFQVRVUkUgPSAyOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSEFORExFUiA9IDM7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ERVNDUklQVElPTiA9IDQ7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT1BZUklHSFQgPSA1Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfTElDRU5TRSA9IDY7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9VUkwgPSA3Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVVBEQVRFID0gODsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPVkVSWSA9IDk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9SRVFVSVJFUyA9IDEwOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU1QT1JUID0gMTE7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTFVHSU4gPSAxMjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RBVEEgPSAxMzsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFUyA9ICJpbmNsdWRlcyI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVIgPSAiaW5zdGFsbC1oYW5kbGVyIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZUklHSFQgPSAiY29weXJpZ2h0IjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRSA9ICJsaWNlbnNlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURSA9ICJ1cGRhdGUiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDT1ZFUlkgPSAiZGlzY292ZXJ5IjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRVMgPSAicmVxdWlyZXMiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEEgPSAiZGF0YSI7IC8vJE5PTi1OTFMtMSQNCi0JLy8gQ3VycmVudCBTdGF0ZSBJbmZvcm1hdGlvbg0KLQlTdGFjayBzdGF0ZVN0YWNrID0gbmV3IFN0YWNrKCk7DQotDQotCS8vIEN1cnJlbnQgb2JqZWN0IHN0YWNrICh1c2VkIHRvIGhvbGQgdGhlIGN1cnJlbnQgb2JqZWN0IHdlIGFyZQ0KLQkvLyBwb3B1bGF0aW5nIGluIHRoaXMgcGx1Z2luIGRlc2NyaXB0b3INCi0JU3RhY2sgb2JqZWN0U3RhY2sgPSBuZXcgU3RhY2soKTsNCi0NCi0JcHJpdmF0ZSBpbnQgY3VycmVudFN0YXRlOw0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0NCi0JCVNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBmZWF0dXJlIHBhcnNlci4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpIHsNCi0JCXN1cGVyKCk7DQotCQl0cnkgew0KLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7DQotCQkJdGhpcy5wYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOw0KLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJVXBkYXRlQ29yZS5sb2coZSk7DQotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUubG9nKGUpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGluaXQoRmVhdHVyZU1vZGVsRmFjdG9yeSBmYWN0b3J5KSB7DQotCQkvLyBQRVJGOiBzZXBhcmF0ZSBpbnN0YW5jZSBjcmVhdGlvbiBmcm9tIHBhcnNpbmcNCi0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7DQotCQlzdGF0ZVN0YWNrID0gbmV3IFN0YWNrKCk7DQotCQlvYmplY3RTdGFjayA9IG5ldyBTdGFjaygpOw0KLQkJc3RhdHVzID0gbnVsbDsNCi0JCVVSTF9BTFJFQURZX1NFRU4gPSBmYWxzZTsNCi0JCS8vcGFyc2VyLnJlc2V0KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIGlucHV0IHN0ZWFtIGFuZCBjb25zdHJ1Y3RzIGEgZmVhdHVyZSBtb2RlbC4NCi0JICogVGhlIGlucHV0IHN0cmVhbSBpcyBub3QgY2xvc2VkIGFzIHBhcnQgb2YgdGhpcyBvcGVyYXRpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gaW4gaW5wdXQgc3RyZWFtDQotCSAqIEByZXR1cm4gZmVhdHVyZSBtb2RlbA0KLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbg0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBGZWF0dXJlTW9kZWwgcGFyc2UoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0JCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JTklUSUFMKSk7DQotCQljdXJyZW50U3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOw0KLQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOw0KLQkJaWYgKG9iamVjdFN0YWNrLmlzRW1wdHkoKSkNCi0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Ob0ZlYXR1cmVUYWciKSk7IC8vJE5PTi1OTFMtMSQNCi0JCWVsc2Ugew0KLQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBGZWF0dXJlTW9kZWwpIHsNCi0JCQkJcmV0dXJuIChGZWF0dXJlTW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCX0gZWxzZSB7DQotCQkJCVN0cmluZyBzdGFjayA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RTdGFjay5pdGVyYXRvcigpOw0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCi0JCQkJCXN0YWNrID0gIlxyXG4iICsgaXRlci5uZXh0KCkudG9TdHJpbmcoKSArIHN0YWNrOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuV3JvbmdQYXJzaW5nU3RhY2siLCBzdGFjaykpOy8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYWxsIHN0YXR1cyBvYmplY3RzIGFjY3VtdWxhdGVkIGJ5IHRoZSBwYXJzZXIuDQotCSAqDQotCSAqIEByZXR1cm4gbXVsdGktc3RhdHVzIGNvbnRhaW5pbmcgYWNjdW11bGF0ZWQgc3RhdHVzLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIE11bHRpU3RhdHVzIGdldFN0YXR1cygpIHsNCi0JCXJldHVybiBzdGF0dXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIEhhbmRsZSBzdGFydCBvZiBlbGVtZW50IHRhZ3MNCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNzdGFydEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgQXR0cmlidXRlcykNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJTdGFydCBFbGVtZW50OiB1cmk6IiArIHVyaSArICIgbG9jYWwgTmFtZToiICsgbG9jYWxOYW1lICsgIiBxTmFtZToiICsgcU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQ0KLQkJc3dpdGNoIChjdXJyZW50U3RhdGUpIHsNCi0JCQljYXNlIFNUQVRFX0lHTk9SRURfRUxFTUVOVCA6DQotCQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGxvY2FsTmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOwkvLyROT04tTkxTLTEkDQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfSU5JVElBTCA6DQotCQkJCWhhbmRsZUluaXRpYWxTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0ZFQVRVUkUgOg0KLQkJCWNhc2UgU1RBVEVfSU5DTFVERVMgOg0KLQkJCWNhc2UgU1RBVEVfSEFORExFUiA6DQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTiA6DQotCQkJY2FzZSBTVEFURV9DT1BZUklHSFQgOg0KLQkJCWNhc2UgU1RBVEVfTElDRU5TRSA6DQotCQkJCWhhbmRsZUZlYXR1cmVTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX1VSTCA6DQotCQkJCWlmIChVUkxfQUxSRUFEWV9TRUVOKQ0KLQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuVG9vTWFueVVSTHRhZyIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQloYW5kbGVVUkxTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX1VQREFURSA6DQotCQkJY2FzZSBTVEFURV9ESVNDT1ZFUlkgOg0KLQkJCQloYW5kbGVVcGRhdGVEaXNjb3ZlcnlTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX1JFUVVJUkVTIDoNCi0JCQkJaGFuZGxlUmVxdWlyZXNTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0lNUE9SVCA6DQotCQkJCWhhbmRsZUltcG9ydFN0YXRlKGxvY2FsTmFtZSxhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotCQkJCQ0KLQkJCWNhc2UgU1RBVEVfUExVR0lOIDoNCi0JCQljYXNlIFNUQVRFX0RBVEEgOg0KLQkJCQloYW5kbGVGZWF0dXJlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJZGVmYXVsdCA6DQotCQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duU3RhcnRTdGF0ZSIsIEludGVnZXIudG9TdHJpbmcoY3VycmVudFN0YXRlKSkpOwkvLyROT04tTkxTLTEkDQotCQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaW50IG5ld1N0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsNCi0JCWlmIChuZXdTdGF0ZSAhPSBTVEFURV9JR05PUkVEX0VMRU1FTlQpDQotCQkJY3VycmVudFN0YXRlID0gbmV3U3RhdGU7DQotDQotCX0NCi0NCi0JLyoqDQotCSAqIEhhbmRsZSBlbmQgb2YgZWxlbWVudCB0YWdzDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZW5kRWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgew0KLQ0KLQkJLy8gdmFyaWFibGVzIHVzZWQNCi0JCVVSTEVudHJ5TW9kZWwgaW5mbyA9IG51bGw7DQotCQlGZWF0dXJlTW9kZWwgZmVhdHVyZU1vZGVsID0gbnVsbDsNCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsNCi0JCWludCBpbm5lclN0YXRlID0gMDsNCi0NCi0JCWludCBzdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7DQotCQlzd2l0Y2ggKHN0YXRlKSB7DQotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOg0KLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0lOSVRJQUwgOg0KLQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5QYXJzaW5nU3RhY2tCYWNrVG9Jbml0aWFsU3RhdGUiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFN0cmluZykgew0KLQkJCQkJdGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJRmVhdHVyZU1vZGVsIGZlYXR1cmUgPSAoRmVhdHVyZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQlmZWF0dXJlLmdldERlc2NyaXB0aW9uTW9kZWwoKS5zZXRBbm5vdGF0aW9uKHRleHQpOw0KLQkJCQl9DQotCQkJCS8vZG8gbm90IHBvcA0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0lOQ0xVREVTIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSB7DQotCQkJCQlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBpbmNsdWRlZEZlYXR1cmVSZWZNb2RlbCA9ICgoSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpKTsNCi0JCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBGZWF0dXJlTW9kZWwpIHsNCi0JCQkJCQlmZWF0dXJlTW9kZWwgPSAoRmVhdHVyZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQkJZmVhdHVyZU1vZGVsLmFkZEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGluY2x1ZGVkRmVhdHVyZVJlZk1vZGVsKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0hBTkRMRVIgOg0KLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOw0KLQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsKSB7DQotCQkJCQlJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwgaGFuZGxlck1vZGVsID0gKEluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQlmZWF0dXJlTW9kZWwgPSAoRmVhdHVyZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQlpZiAoZmVhdHVyZU1vZGVsLmdldEluc3RhbGxIYW5kbGVyTW9kZWwoKSAhPSBudWxsKQ0KLQkJCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLkVsZW1lbnRBbHJlYWR5U2V0IiwgZ2V0U3RhdGUoc3RhdGUpKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCWVsc2UNCi0JCQkJCQlmZWF0dXJlTW9kZWwuc2V0SW5zdGFsbEhhbmRsZXJNb2RlbChoYW5kbGVyTW9kZWwpOw0KLQkJCQl9DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT04gOg0KLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOw0KLQ0KLQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0JCQkJd2hpbGUgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFN0cmluZykgew0KLQkJCQkJdGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpICsgdGV4dDsNCi0JCQkJfQ0KLQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgVVJMRW50cnlNb2RlbCkgew0KLQkJCQkJaW5mbyA9IChVUkxFbnRyeU1vZGVsKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQkJCXRleHQgPSBjbGVhbnVwVGV4dCh0ZXh0KTsNCi0JCQkJCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJCQkJaW5mby5zZXRBbm5vdGF0aW9uKHRleHQpOw0KLQ0KLQkJCQkJaW5uZXJTdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7DQotCQkJCQlzd2l0Y2ggKGlubmVyU3RhdGUpIHsNCi0JCQkJCQljYXNlIFNUQVRFX0ZFQVRVUkUgOg0KLQkJCQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSB7DQotCQkJCQkJCQlmZWF0dXJlTW9kZWwgPSAoRmVhdHVyZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQkJCQlpZiAoZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKSAhPSBudWxsKQ0KLQkJCQkJCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLkVsZW1lbnRBbHJlYWR5U2V0IiwgZ2V0U3RhdGUoc3RhdGUpKSk7CS8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCWVsc2UNCi0JCQkJCQkJCQlmZWF0dXJlTW9kZWwuc2V0RGVzY3JpcHRpb25Nb2RlbChpbmZvKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCQlicmVhazsNCi0NCi0JCQkJCQlkZWZhdWx0IDoNCi0JCQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuU3RhdGVJbmNsdWRlV3JvbmdFbGVtZW50IiwgZ2V0U3RhdGUoaW5uZXJTdGF0ZSksIGdldFN0YXRlKHN0YXRlKSkpOwkvLyROT04tTkxTLTEkDQotCQkJCQkJCWJyZWFrOw0KLQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfQ09QWVJJR0hUIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCXdoaWxlIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0JCQkJCXRleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKSArIHRleHQ7DQotCQkJCX0NCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFVSTEVudHJ5TW9kZWwpIHsNCi0JCQkJCWluZm8gPSAoVVJMRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQl0ZXh0ID0gY2xlYW51cFRleHQodGV4dCk7DQotCQkJCQlpZiAodGV4dCAhPSBudWxsKSB7DQotCQkJCQkJaW5mby5zZXRBbm5vdGF0aW9uKHRleHQpOw0KLQkJCQkJfQ0KLQ0KLQkJCQkJaW5uZXJTdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7DQotCQkJCQlzd2l0Y2ggKGlubmVyU3RhdGUpIHsNCi0JCQkJCQljYXNlIFNUQVRFX0ZFQVRVUkUgOg0KLQkJCQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSB7DQotCQkJCQkJCQlmZWF0dXJlTW9kZWwgPSAoRmVhdHVyZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQkJCQlpZiAoZmVhdHVyZU1vZGVsLmdldENvcHlyaWdodE1vZGVsKCkgIT0gbnVsbCkNCi0JCQkJCQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5FbGVtZW50QWxyZWFkeVNldCIsIGdldFN0YXRlKHN0YXRlKSkpOy8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCWVsc2UNCi0JCQkJCQkJCQlmZWF0dXJlTW9kZWwuc2V0Q29weXJpZ2h0TW9kZWwoaW5mbyk7DQotCQkJCQkJCX0NCi0JCQkJCQkJYnJlYWs7DQotDQotCQkJCQkJZGVmYXVsdCA6DQotCQkJCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLlN0YXRlSW5jbHVkZVdyb25nRWxlbWVudCIsIGdldFN0YXRlKGlubmVyU3RhdGUpLCBnZXRTdGF0ZShzdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQlicmVhazsNCi0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0xJQ0VOU0UgOg0KLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOw0KLQ0KLQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0JCQkJd2hpbGUgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFN0cmluZykgew0KLQkJCQkJdGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpICsgdGV4dDsNCi0JCQkJfQ0KLQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgVVJMRW50cnlNb2RlbCkgew0KLQkJCQkJaW5mbyA9IChVUkxFbnRyeU1vZGVsKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQkJCXRleHQgPSBjbGVhbnVwVGV4dCh0ZXh0KTsNCi0JCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsNCi0JCQkJCQlpbmZvLnNldEFubm90YXRpb24odGV4dCk7DQotCQkJCQl9DQotDQotCQkJCQlpbm5lclN0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsNCi0JCQkJCXN3aXRjaCAoaW5uZXJTdGF0ZSkgew0KLQkJCQkJCWNhc2UgU1RBVEVfRkVBVFVSRSA6DQotCQkJCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBGZWF0dXJlTW9kZWwpIHsNCi0JCQkJCQkJCWZlYXR1cmVNb2RlbCA9IChGZWF0dXJlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCQkJCQkJCWlmIChmZWF0dXJlTW9kZWwuZ2V0TGljZW5zZU1vZGVsKCkgIT0gbnVsbCkNCi0JCQkJCQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5FbGVtZW50QWxyZWFkeVNldCIsIGdldFN0YXRlKHN0YXRlKSkpOwkvLyROT04tTkxTLTEkDQotCQkJCQkJCQllbHNlDQotCQkJCQkJCQkJZmVhdHVyZU1vZGVsLnNldExpY2Vuc2VNb2RlbChpbmZvKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCQlicmVhazsNCi0NCi0JCQkJCQlkZWZhdWx0IDoNCi0JCQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuU3RhdGVJbmNsdWRlV3JvbmdFbGVtZW50IiwgZ2V0U3RhdGUoaW5uZXJTdGF0ZSksIGdldFN0YXRlKHN0YXRlKSkpOwkvLyROT04tTkxTLTEkDQotCQkJCQkJCWJyZWFrOw0KLQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfVVJMIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJVVJMX0FMUkVBRFlfU0VFTiA9IHRydWU7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfVVBEQVRFIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFVSTEVudHJ5TW9kZWwpIHsNCi0JCQkJCWluZm8gPSAoVVJMRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSB7DQotCQkJCQkJZmVhdHVyZU1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJCWlmIChmZWF0dXJlTW9kZWwuZ2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoKSAhPSBudWxsKSB7DQotCQkJCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLkVsZW1lbnRBbHJlYWR5U2V0IiwgZ2V0U3RhdGUoc3RhdGUpKSk7CS8vJE5PTi1OTFMtMSQNCi0JCQkJCQl9IGVsc2Ugew0KLQkJCQkJCQlmZWF0dXJlTW9kZWwuc2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoaW5mbyk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfRElTQ09WRVJZIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFVSTEVudHJ5TW9kZWwpIHsNCi0JCQkJCWluZm8gPSAoVVJMRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSB7DQotCQkJCQkJZmVhdHVyZU1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJCWZlYXR1cmVNb2RlbC5hZGREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbChpbmZvKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX1JFUVVJUkVTIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIEZlYXR1cmVNb2RlbCkgew0KLQkJCQkJZmVhdHVyZU1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJSW1wb3J0TW9kZWxbXSBpbXBvcnRNb2RlbHMgPSBmZWF0dXJlTW9kZWwuZ2V0SW1wb3J0TW9kZWxzKCk7DQotCQkJCQlpZiAoaW1wb3J0TW9kZWxzLmxlbmd0aCA9PSAwKSB7DQotCQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuUmVxdWlyZVN0YXRlV2l0aG91dEltcG9ydEVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJYm9vbGVhbiBwYXRjaE1vZGUgPSBmYWxzZTsNCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydE1vZGVscy5sZW5ndGg7IGkrKykgew0KLQkJCQkJCQlJbXBvcnRNb2RlbCBpbXBvcnRNb2RlbCA9IGltcG9ydE1vZGVsc1tpXTsNCi0JCQkJCQkJaWYgKGltcG9ydE1vZGVsLmlzUGF0Y2goKSkgew0KLQkJCQkJCQkJaWYgKHBhdGNoTW9kZSA9PSBmYWxzZSkNCi0JCQkJCQkJCQlwYXRjaE1vZGUgPSB0cnVlOw0KLQkJCQkJCQkJZWxzZSB7DQotCQkJCQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuTXVsdGlwbGVQYXRjaEltcG9ydHMiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQlicmVhazsNCi0JCQkJCQkJCX0NCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0lNUE9SVCA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBJbXBvcnRNb2RlbCkgew0KLQkJCQkJSW1wb3J0TW9kZWwgaW1wb3J0TW9kZWwgPSAoSW1wb3J0TW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIEZlYXR1cmVNb2RlbCkgew0KLQkJCQkJCWZlYXR1cmVNb2RlbCA9IChGZWF0dXJlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCQkJCQlmZWF0dXJlTW9kZWwuYWRkSW1wb3J0TW9kZWwoaW1wb3J0TW9kZWwpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfUExVR0lOIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFBsdWdpbkVudHJ5TW9kZWwpIHsNCi0JCQkJCVBsdWdpbkVudHJ5TW9kZWwgcGx1Z2luRW50cnkgPSAoUGx1Z2luRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSB7DQotCQkJCQkJZmVhdHVyZU1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJCWZlYXR1cmVNb2RlbC5hZGRQbHVnaW5FbnRyeU1vZGVsKHBsdWdpbkVudHJ5KTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0RBVEEgOg0KLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOw0KLQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgTm9uUGx1Z2luRW50cnlNb2RlbCkgew0KLQkJCQkJTm9uUGx1Z2luRW50cnlNb2RlbCBub25QbHVnaW5FbnRyeSA9IChOb25QbHVnaW5FbnRyeU1vZGVsKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBGZWF0dXJlTW9kZWwpIHsNCi0JCQkJCQlmZWF0dXJlTW9kZWwgPSAoRmVhdHVyZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQkJZmVhdHVyZU1vZGVsLmFkZE5vblBsdWdpbkVudHJ5TW9kZWwobm9uUGx1Z2luRW50cnkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWRlZmF1bHQgOg0KLQkJCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93bkVuZFN0YXRlIikgKyBzdGF0ZSk7Ly8kTk9OLU5MUy0xJA0KLQkJCQlicmVhazsNCi0JCX0NCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJFbmQgRWxlbWVudDoiICsgdXJpICsgIjoiICsgbG9jYWxOYW1lICsgIjoiICsgcU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQl9DQotCQ0KLQkvKg0KLQkgKiBNZXRob2QgY2xlYW51cFRleHQuDQotCSAqIFJlbW92ZXMgcHJlIHdoaXRlIHNwYWNlIGFuZCBwb3N0IHdoaXRlIHNwYWNlDQotCSAqIHJldHVybiBudWxsIGlmIHRoZSB0ZXh0IG9ubHkgY29udGFpbnMgd2hpdGVzcGFjZXMgKFx0IFxyXG4gYW5kIHNwYWNlcykNCi0JICogDQotCSAqIEBwYXJhbSB0ZXh0IG9yIG51bGwNCi0JICogQHJldHVybiBTdHJpbmcNCi0JICovDQotCXByaXZhdGUgU3RyaW5nIGNsZWFudXBUZXh0KFN0cmluZyB0ZXh0KSB7DQotCQl0ZXh0ID0gdGV4dC50cmltKCk7DQotCQlpZiAoIiIuZXF1YWxzKHRleHQpKSByZXR1cm4gbnVsbDsgLy8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIHRleHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEhhbmRsZSBjaGFyYWN0ZXIgdGV4dA0KLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI2NoYXJhY3RlcnMoY2hhcltdLCBpbnQsIGludCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgew0KLQkJU3RyaW5nIHRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJYm9vbGVhbiB2YWxpZCA9IHRydWU7DQotDQotCQlpZiAodmFsaWQpIHsNCi0JCQl0ZXh0ID0gbmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCk7DQotCQl9DQotDQotCQkvL29ubHkgcHVzaCBpZiBub3QgdW5rbm93biBzdGF0ZQ0KLQkJaW50IHN0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsNCi0JCWlmIChzdGF0ZSA9PSBTVEFURV9ERVNDUklQVElPTiB8fCBzdGF0ZSA9PSBTVEFURV9DT1BZUklHSFQgfHwgc3RhdGUgPT0gU1RBVEVfTElDRU5TRSkNCi0JCQlvYmplY3RTdGFjay5wdXNoKHRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgZXJyb3JzDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24pDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7DQotCQlsb2dTdGF0dXMoZXgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgZmF0YWwgZXJyb3JzDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikNCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQlsb2dTdGF0dXMoZXgpOw0KLQkJdGhyb3cgZXg7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUluaXRpYWxTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEZFQVRVUkUpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0ZFQVRVUkUpKTsNCi0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZQ0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVGZWF0dXJlU3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIQU5ETEVSKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9IQU5ETEVSKSk7DQotCQkJcHJvY2Vzc0hhbmRsZXIoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT04pKTsNCi0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENPUFlSSUdIVCkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ09QWVJJR0hUKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhMSUNFTlNFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9MSUNFTlNFKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhVUkwpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1VSTCkpOw0KLQkJCS8vTm8gcHJvY2VzcyBhcyBVUkwgdGFnIGRvZXMgbm90IGNvbnRhaW4gYW55IGVsZW1lbnQgaXRzZWxmDQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhJTkNMVURFUykpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSU5DTFVERVMpKTsNCi0JCQlwcm9jZXNzSW5jbHVkZXMoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhSRVFVSVJFUykpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfUkVRVUlSRVMpKTsNCi0JCQlwcm9jZXNzUmVxdWlyZShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKFBMVUdJTikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfUExVR0lOKSk7DQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERBVEEpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RBVEEpKTsNCi0JCQlwcm9jZXNzRGF0YShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZQ0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlVVJMU3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhVUERBVEUpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1VQREFURSkpOw0KLQkJCXByb2Nlc3NVUkxJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoRElTQ09WRVJZKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ESVNDT1ZFUlkpKTsNCi0JCQlwcm9jZXNzVVJMSW5mbyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZQ0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVxdWlyZXNTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKElNUE9SVCkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSU1QT1JUKSk7DQotCQkJcHJvY2Vzc0ltcG9ydChhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZQ0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlVXBkYXRlRGlzY292ZXJ5U3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIQU5ETEVSKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9IQU5ETEVSKSk7DQotCQkJcHJvY2Vzc0hhbmRsZXIoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT04pKTsNCi0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENPUFlSSUdIVCkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ09QWVJJR0hUKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhMSUNFTlNFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9MSUNFTlNFKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhVUkwpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1VSTCkpOw0KLQkJCS8vTm8gcHJvY2VzcyBhcyBVUkwgdGFnIGRvZXMgbm90IGNvbnRhaW4gYW55IGVsZW1lbnQgaXRzZWxmDQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhJTkNMVURFUykpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSU5DTFVERVMpKTsNCi0JCQlwcm9jZXNzSW5jbHVkZXMoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhSRVFVSVJFUykpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfUkVRVUlSRVMpKTsNCi0JCQlwcm9jZXNzUmVxdWlyZShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKFBMVUdJTikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfUExVR0lOKSk7DQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERBVEEpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RBVEEpKTsNCi0JCQlwcm9jZXNzRGF0YShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKFVQREFURSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfVVBEQVRFKSk7DQotCQkJcHJvY2Vzc1VSTEluZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhESVNDT1ZFUlkpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RJU0NPVkVSWSkpOw0KLQkJCXByb2Nlc3NVUkxJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlDQotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLlVua25vd25FbGVtZW50IiwgZWxlbWVudE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotDQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVJbXBvcnRTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEhBTkRMRVIpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0hBTkRMRVIpKTsNCi0JCQlwcm9jZXNzSGFuZGxlcihhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERFU0NSSVBUSU9OKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ERVNDUklQVElPTikpOw0KLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ09QWVJJR0hUKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DT1BZUklHSFQpKTsNCi0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKExJQ0VOU0UpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0xJQ0VOU0UpKTsNCi0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKFVSTCkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfVVJMKSk7DQotCQkJLy9ObyBwcm9jZXNzIGFzIFVSTCB0YWcgZG9lcyBub3QgY29udGFpbiBhbnkgZWxlbWVudCBpdHNlbGYNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKElOQ0xVREVTKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JTkNMVURFUykpOw0KLQkJCXByb2Nlc3NJbmNsdWRlcyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKFJFUVVJUkVTKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9SRVFVSVJFUykpOw0KLQkJCXByb2Nlc3NSZXF1aXJlKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoUExVR0lOKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9QTFVHSU4pKTsNCi0JCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoREFUQSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREFUQSkpOw0KLQkJCXByb2Nlc3NEYXRhKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSU1QT1JUKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JTVBPUlQpKTsNCi0JCQlwcm9jZXNzSW1wb3J0KGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlDQotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLlVua25vd25FbGVtZW50IiwgZWxlbWVudE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qDQotCSAqIFByb2Nlc3MgZmVhdHVyZSBpbmZvcm1hdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NGZWF0dXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQ0KLQkJLy8gaWRlbnRpZmllciBhbmQgdmVyc2lvbg0KLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIHZlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmVxdWFscygiIikgLy8kTk9OLU5MUy0xJA0KLQkJfHwgdmVyID09IG51bGwgfHwgdmVyLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5JZE9yVmVyc2lvbkludmFsaWQiLCBuZXcgU3RyaW5nW10geyBpZCwgdmVyLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpOwkvLyROT04tTkxTLTEkDQotCQl9IGVsc2Ugew0KLQkJCS8vIGNyZWF0ZSBmZWF0dXJlIG1vZGVsDQotCQkJRmVhdHVyZU1vZGVsIGZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmVNb2RlbCgpOw0KLQ0KLQkJCWZlYXR1cmUuc2V0RmVhdHVyZUlkZW50aWZpZXIoaWQpOw0KLQkJCWZlYXR1cmUuc2V0RmVhdHVyZVZlcnNpb24odmVyKTsNCi0NCi0JCQkvLyBsYWJlbA0KLQkJCVN0cmluZyBsYWJlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlmZWF0dXJlLnNldExhYmVsKGxhYmVsKTsNCi0NCi0JCQkvLyBwcm92aWRlcg0KLQkJCVN0cmluZyBwcm92aWRlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInByb3ZpZGVyLW5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0UHJvdmlkZXIocHJvdmlkZXIpOw0KLQ0KLQkJCS8vaW1hZ2UNCi0JCQlTdHJpbmcgaW1hZ2VVUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpbWFnZSIpOyAvLyROT04tTkxTLTEkDQotCQkJZmVhdHVyZS5zZXRJbWFnZVVSTFN0cmluZyhpbWFnZVVSTCk7DQotDQotCQkJLy8gT1MNCi0JCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkDQotCQkJZmVhdHVyZS5zZXRPUyhvcyk7DQotDQotCQkJLy8gV1MNCi0JCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOyAvLyROT04tTkxTLTEkDQotCQkJZmVhdHVyZS5zZXRXUyh3cyk7DQotDQotCQkJLy8gTkwNCi0JCQlTdHJpbmcgbmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJubCIpOyAvLyROT04tTkxTLTEkDQotCQkJZmVhdHVyZS5zZXROTChubCk7DQotDQotCQkJLy8gYXJjaA0KLQkJCVN0cmluZyBhcmNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXJjaCIpOyAvLyROT04tTkxTLTEkDQotCQkJZmVhdHVyZS5zZXRBcmNoKGFyY2gpOw0KLQ0KLQkJCS8vIHByaW1hcnkNCi0JCQlTdHJpbmcgcHJpbWFyeSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInByaW1hcnkiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0UHJpbWFyeShwcmltYXJ5ICE9IG51bGwgJiYgcHJpbWFyeS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCS8vIGV4Y2x1c2l2ZQ0KLQkJCVN0cmluZyBleGNsdXNpdmUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJleGNsdXNpdmUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0RXhjbHVzaXZlKGV4Y2x1c2l2ZSAhPSBudWxsICYmIGV4Y2x1c2l2ZS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCS8vIGFwcGxpY2F0aW9uDQotCQkJU3RyaW5nIGFwcGxpY2F0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXBwbGljYXRpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0QXBwbGljYXRpb24oYXBwbGljYXRpb24pOw0KLQ0KLQkJCS8vIGFmZmluaXR5DQotCQkJU3RyaW5nIGFmZmluaXR5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiY29sb2NhdGlvbi1hZmZpbml0eSIpOyAvLyROT04tTkxTLTEkDQotCQkJZmVhdHVyZS5zZXRBZmZpbml0eUZlYXR1cmUoYWZmaW5pdHkpOw0KLQ0KLQkJCS8vIHByaW1hcnkgcGx1Z2luDQotCQkJU3RyaW5nIHBsdWdpbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBsdWdpbiIpOyAvLyROT04tTkxTLTEkDQotCQkJZmVhdHVyZS5zZXRQcmltYXJ5UGx1Z2luSUQocGx1Z2luKTsNCi0NCi0JCQlvYmplY3RTdGFjay5wdXNoKGZlYXR1cmUpOw0KLQ0KLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7DQotCQkJCWRlYnVnKCJFbmQgcHJvY2VzcyBEZWZhdWx0RmVhdHVyZSB0YWc6IGlkOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkraWQgKyAiIHZlcjoiIC8vJE5PTi1OTFMtMSQNCi0JCQkJK3ZlciArICIgbGFiZWw6IiAvLyROT04tTkxTLTEkDQotCQkJCStsYWJlbCArICIgcHJvdmlkZXI6IiAvLyROT04tTkxTLTEkDQotCQkJCStwcm92aWRlcik7DQotCQkJCWRlYnVnKCJFbmQgcHJvY2VzcyBEZWZhdWx0RmVhdHVyZSB0YWc6IGltYWdlOiIgKyBpbWFnZVVSTCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJZGVidWcoIkVuZCBwcm9jZXNzIERlZmF1bHRGZWF0dXJlIHRhZzogd3M6IiAvLyROT04tTkxTLTEkDQotCQkJCSt3cyArICIgb3M6IiAvLyROT04tTkxTLTEkDQotCQkJCStvcyArICIgbmw6IiAvLyROT04tTkxTLTEkDQotCQkJCStubCArICIgYXBwbGljYXRpb246IiAvLyROT04tTkxTLTEkDQotCQkJCSthcHBsaWNhdGlvbik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qIA0KLQkgKiBwcm9jZXNzIFVSTCBpbmZvIHdpdGggZWxlbWVudCB0ZXh0DQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0hhbmRsZXIoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwgaGFuZGxlciA9IGZhY3RvcnkuY3JlYXRlSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsKCk7DQotDQotCQlTdHJpbmcgaGFuZGxlclVSTCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkDQotCQloYW5kbGVyLnNldFVSTFN0cmluZyhoYW5kbGVyVVJMKTsNCi0NCi0JCVN0cmluZyBsaWJyYXJ5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGlicmFyeSIpOyAvLyROT04tTkxTLTEkDQotCQloYW5kbGVyLnNldExpYnJhcnkobGlicmFyeSk7DQotDQotCQlTdHJpbmcgY2xhenogPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJoYW5kbGVyIik7IC8vJE5PTi1OTFMtMSQNCi0JCWhhbmRsZXIuc2V0SGFuZGxlck5hbWUoY2xhenopOw0KLQ0KLQkJb2JqZWN0U3RhY2sucHVzaChoYW5kbGVyKTsNCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJQcm9jZXNzZWQgSGFuZGxlcjogdXJsOiIgLy8kTk9OLU5MUy0xJA0KLQkJCStoYW5kbGVyVVJMICsgIiBsaWJyYXJ5OiIgLy8kTk9OLU5MUy0xJA0KLQkJCStsaWJyYXJ5ICsgIiBjbGFzczoiIC8vJE5PTi1OTFMtMSQNCi0JCQkrY2xhenopOw0KLQl9DQotDQotCS8qIA0KLQkgKiBwcm9jZXNzIFVSTCBpbmZvIHdpdGggZWxlbWVudCB0ZXh0DQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0luZm8oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlVUkxFbnRyeU1vZGVsIGluZiA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KLQkJU3RyaW5nIGluZm9VUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5mLnNldFVSTFN0cmluZyhpbmZvVVJMKTsNCi0NCi0JCW9iamVjdFN0YWNrLnB1c2goaW5mKTsNCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJQcm9jZXNzZWQgSW5mbzogdXJsOiIgKyBpbmZvVVJMKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qDQotCSAqIFByb2Nlc3MgaW5jbHVkZXMgaW5mb3JtYXRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSW5jbHVkZXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotDQotCQkvLyBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uDQotCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgdmVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkDQotDQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSAvLyROT04tTkxTLTEkDQotCQl8fCB2ZXIgPT0gbnVsbCB8fCB2ZXIudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLklkT3JWZXJzaW9uSW52YWxpZCIsIG5ldyBTdHJpbmdbXSB7IGlkLCB2ZXIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSk7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGluY2x1ZGVkRmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsNCi0JCWluY2x1ZGVkRmVhdHVyZS5zZXRGZWF0dXJlSWRlbnRpZmllcihpZCk7DQotCQlpbmNsdWRlZEZlYXR1cmUuc2V0RmVhdHVyZVZlcnNpb24odmVyKTsNCi0NCi0JCS8vIG5hbWUNCi0JCVN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JCWluY2x1ZGVkRmVhdHVyZS5zZXRMYWJlbChuYW1lKTsNCi0NCi0JCS8vIG9wdGlvbmFsDQotCQlTdHJpbmcgb3B0aW9uYWwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcHRpb25hbCIpOy8vJE5PTi1OTFMtMSQNCi0JCWJvb2xlYW4gaXNPcHRpb25hbCA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvbmFsKTsvLyROT04tTkxTLTEkDQotCQlpbmNsdWRlZEZlYXR1cmUuaXNPcHRpb25hbChpc09wdGlvbmFsKTsNCi0NCi0JCS8vIHNlYXJjaCBsb2NhdGlvbg0KLQkJU3RyaW5nIGxvY2F0aW9uTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInNlYXJjaC1sb2NhdGlvbiIpOy8vJE5PTi1OTFMtMSQNCi0JCS8vIGJ1ZyAyNzAzMA0KLQkJaWYgKGxvY2F0aW9uTmFtZSA9PSBudWxsKQ0KLQkJCWxvY2F0aW9uTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInNlYXJjaF9sb2NhdGlvbiIpOy8vJE5PTi1OTFMtMSQNCi0JCWludCBzZWFyY2hMb2NhdGlvbiA9IElVcGRhdGVDb25zdGFudHMuU0VBUkNIX1JPT1Q7DQotCQlpZiAoImJvdGgiLmVxdWFsc0lnbm9yZUNhc2UobG9jYXRpb25OYW1lKSkvLyROT04tTkxTLTEkDQotCQkJc2VhcmNoTG9jYXRpb24gPSBJVXBkYXRlQ29uc3RhbnRzLlNFQVJDSF9ST09UICYgSVVwZGF0ZUNvbnN0YW50cy5TRUFSQ0hfU0VMRjsNCi0JCWlmICgic2VsZiIuZXF1YWxzSWdub3JlQ2FzZShsb2NhdGlvbk5hbWUpKS8vJE5PTi1OTFMtMSQNCi0JCQlzZWFyY2hMb2NhdGlvbiA9IElVcGRhdGVDb25zdGFudHMuU0VBUkNIX1NFTEY7CQkJCQ0KLQkJaW5jbHVkZWRGZWF0dXJlLnNldFNlYXJjaExvY2F0aW9uKHNlYXJjaExvY2F0aW9uKTsNCi0NCi0JCS8vIG9zIGFyY2ggd3MgbmwNCi0JCVN0cmluZyBvcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9zIik7Ly8kTk9OLU5MUy0xJA0KLQkJaW5jbHVkZWRGZWF0dXJlLnNldE9TKG9zKTsNCi0NCi0JCVN0cmluZyB3cyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIndzIik7Ly8kTk9OLU5MUy0xJA0KLQkJaW5jbHVkZWRGZWF0dXJlLnNldFdTKHdzKTsNCi0NCi0JCVN0cmluZyBhcmNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXJjaCIpOy8vJE5PTi1OTFMtMSQNCi0JCWluY2x1ZGVkRmVhdHVyZS5zZXRBcmNoKGFyY2gpOw0KLQkJDQotCQkvLyBOTA0KLQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5jbHVkZWRGZWF0dXJlLnNldE5MKG5sKTsNCi0NCi0JCW9iamVjdFN0YWNrLnB1c2goaW5jbHVkZWRGZWF0dXJlKTsNCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7DQotCQkJZGVidWcoIkVuZCBwcm9jZXNzIEluY2x1ZGVzIHRhZzogaWQ6IiAvLyROT04tTkxTLTEkDQotCQkJK2lkICsgIiB2ZXI6IiArIHZlcik7IC8vJE5PTi1OTFMtMSQNCi0JCQlkZWJ1ZygibmFtZSA9IiArIG5hbWUgKyAiIG9wdGlvbmFsPSIgKyBvcHRpb25hbCArICIgc2VhcmNoLWxvY2F0aW9uPSIgKyBsb2NhdGlvbk5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCWRlYnVnKCJvcz0iICsgb3MgKyAiIHdzPSIgKyB3cyArICIgYXJjaD0iICsgYXJjaCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQl9DQotCX0NCi0NCi0JLyogDQotCSAqIHByb2Nlc3MgVVJMIGluZm8gd2l0aCBsYWJlbCBhdHRyaWJ1dGUNCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzVVJMSW5mbyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JCVVSTEVudHJ5TW9kZWwgaW5mID0gZmFjdG9yeS5jcmVhdGVVUkxFbnRyeU1vZGVsKCk7DQotCQlTdHJpbmcgaW5mb1VSTCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgbGFiZWwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgdHlwZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5mLnNldFVSTFN0cmluZyhpbmZvVVJMKTsNCi0JCWluZi5zZXRBbm5vdGF0aW9uKGxhYmVsKTsNCi0JCQ0KLQkJaWYgKCJ3ZWIiLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIC8vJE5PTi1OTFMtMSQNCi0JCQlpbmYuc2V0VHlwZShJVVJMRW50cnkuV0VCX1NJVEUpOw0KLQkJZWxzZSANCi0JCQlpbmYuc2V0VHlwZShJVVJMRW50cnkuVVBEQVRFX1NJVEUpOw0KLQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJZGVidWcoIlByb2Nlc3NlZCBVUkxJbmZvOiB1cmw6IiArIGluZm9VUkwgKyAiIGxhYmVsOiIgKyBsYWJlbCsiIHR5cGU6Iit0eXBlKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQ0KLQkJb2JqZWN0U3RhY2sucHVzaChpbmYpOw0KLQl9DQotDQotCS8qIA0KLQkgKiBwcm9jZXNzIGltcG9ydCBpbmZvDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0ltcG9ydChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JCVN0cmluZyBwbHVnaW5JRCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBsdWdpbiIpOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgZmVhdHVyZUlEID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgaWRNYXRjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkLW1hdGNoIik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWlmICghKHBsdWdpbklEID09IG51bGwgXiBmZWF0dXJlSUQgPT0gbnVsbCkpIHsNCi0JCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5QbHVnaW5BbmRGZWF0dXJlSWQiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQkvLyBzaW5jZSAyLjAuMiAsIG1hbmFnZSBmZWF0dXJlIGFuZCBwbHVnaW4gaW1wb3J0DQotCQlTdHJpbmcgaWQgPSBudWxsOw0KLQkJaWYgKHBsdWdpbklEID09IG51bGwpIHsNCi0JCQlpZCA9IGZlYXR1cmVJRDsNCi0JCX0gZWxzZSB7DQotCQkJaWQgPSBwbHVnaW5JRDsNCi0JCX0NCi0NCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuTWlzc2luZ0lkIiwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOy8vJE5PTi1OTFMtMSQNCi0JCWVsc2Ugew0KLQkJCUltcG9ydE1vZGVsIGltcCA9IGZhY3RvcnkuY3JlYXRlSW1wb3J0TW9kZWwoKTsNCi0JCQlTdHJpbmcgdmVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkDQotCQkJU3RyaW5nIG1hdGNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibWF0Y2giKTsgLy8kTk9OLU5MUy0xJA0KLQkJCVN0cmluZyBwYXRjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhdGNoIik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQlpbXAuc2V0UGF0Y2gocGF0Y2ggIT0gbnVsbCAmJiBwYXRjaC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkDQotDQotCQkJaWYgKHZlciA9PSBudWxsKSB7DQotCQkJCWlmIChpbXAuaXNQYXRjaCgpKSB7DQotCQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5NaXNzaW5nUGF0Y2hWZXJzaW9uIikpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJdmVyID0gIjAuMC4wIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQltYXRjaCA9ICJncmVhdGVyT3JFcXVhbCI7IC8vJE5PTi1OTFMtMSQNCi0JCQl9IGVsc2UgaWYgKG1hdGNoID09IG51bGwpIHsNCi0JCQkJaWYgKGltcC5pc1BhdGNoKCkpDQotCQkJCQltYXRjaCA9ICJwZXJmZWN0IjsgLy8kTk9OLU5MUy0xJA0KLQkJCQllbHNlDQotCQkJCQltYXRjaCA9ICJjb21wYXRpYmxlIjsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0NCi0JCQlpbXAuc2V0SWRlbnRpZmllcihpZCk7DQotCQkJaW1wLnNldFZlcnNpb24odmVyKTsNCi0JCQlpbXAuc2V0RmVhdHVyZUltcG9ydChmZWF0dXJlSUQgIT0gbnVsbCk7DQotCQkJaW1wLnNldE1hdGNoaW5nUnVsZU5hbWUobWF0Y2gpOw0KLQkJCWltcC5zZXRNYXRjaGluZ0lkUnVsZU5hbWUoaWRNYXRjaCk7DQotDQotCQkJaWYgKGltcC5pc1BhdGNoKCkpIHsNCi0JCQkJLy8gcGF0Y2ggcmVmZXJlbmNlIG11c3QgYmUgcGVyZmVjdC4NCi0JCQkJaWYgKG1hdGNoICE9IG51bGwgJiYgIW1hdGNoLmVxdWFsc0lnbm9yZUNhc2UoInBlcmZlY3QiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci53cm9uZ01hdGNoRm9yUGF0Y2giKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQlpZiAoaW1wLmlzRmVhdHVyZUltcG9ydCgpID09IGZhbHNlKSB7DQotCQkJCQlpbXAuc2V0UGF0Y2goZmFsc2UpOw0KLQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIucGF0Y2hXaXRoUGx1Z2luIikpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gb3MgYXJjaCB3cw0KLQkJCVN0cmluZyBvcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9zIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlpbXAuc2V0T1Mob3MpOw0KLQ0KLQkJCVN0cmluZyB3cyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIndzIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlpbXAuc2V0V1Mod3MpOw0KLQ0KLQkJCVN0cmluZyBhcmNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXJjaCIpOyAvLyROT04tTkxTLTEkDQotCQkJaW1wLnNldE9TQXJjaChhcmNoKTsNCi0NCi0JCQlvYmplY3RTdGFjay5wdXNoKGltcCk7DQotDQotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsNCi0JCQkJZGVidWcoIlByb2Nlc3NlZCBpbXBvcnQ6IGlkOiIgKyBpZCArICIgdmVyOiIgKyB2ZXIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCQlkZWJ1ZygiUHJvY2Vzc2VkIGltcG9ydDogbWF0Y2g6IiArIG1hdGNoKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0NCi0JCX0NCi0JfQ0KLQ0KLQkvKiANCi0JICogcHJvY2VzcyBpbXBvcnQgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXF1aXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQl9DQotDQotCS8qIA0KLQkgKiBwcm9jZXNzIHBsdWdpbiBlbnRyeSBpbmZvDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1BsdWdpbihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQNCi0JCVN0cmluZyB2ZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpIC8vJE5PTi1OTFMtMSQNCi0JCXx8IHZlciA9PSBudWxsIHx8IHZlci50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuSWRPclZlcnNpb25JbnZhbGlkIiwgbmV3IFN0cmluZ1tdIHsgaWQsIHZlciwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKTsJLy8kTk9OLU5MUy0xJA0KLQkJfSBlbHNlIHsNCi0JCQlQbHVnaW5FbnRyeU1vZGVsIHBsdWdpbkVudHJ5ID0gZmFjdG9yeS5jcmVhdGVQbHVnaW5FbnRyeU1vZGVsKCk7DQotCQkJcGx1Z2luRW50cnkuc2V0UGx1Z2luSWRlbnRpZmllcihpZCk7DQotCQkJcGx1Z2luRW50cnkuc2V0UGx1Z2luVmVyc2lvbih2ZXIpOw0KLQ0KLQkJCVN0cmluZyBmcmFnbWVudCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImZyYWdtZW50Iik7IC8vJE5PTi1OTFMtMSQNCi0JCQlwbHVnaW5FbnRyeS5pc0ZyYWdtZW50KGZyYWdtZW50ICE9IG51bGwgJiYgZnJhZ21lbnQudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSk7Ly8kTk9OLU5MUy0xJAkJCQ0KLQ0KLQkJCS8vc2V0T1MNCi0JCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkDQotCQkJcGx1Z2luRW50cnkuc2V0T1Mob3MpOw0KLQ0KLQkJCS8vc2V0V1MNCi0JCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOyAvLyROT04tTkxTLTEkDQotCQkJcGx1Z2luRW50cnkuc2V0V1Mod3MpOw0KLQ0KLQkJCS8vc2V0TkwNCi0JCQlTdHJpbmcgbmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJubCIpOyAvLyROT04tTkxTLTEkDQotCQkJcGx1Z2luRW50cnkuc2V0TkwobmwpOw0KLQ0KLQkJCS8vIHNldEFyY2gNCi0JCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXBsdWdpbkVudHJ5LnNldEFyY2goYXJjaCk7DQotDQotCQkJLy8gc2V0VW5wYWNrDQotCQkJU3RyaW5nIHVucGFjayA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVucGFjayIpOyAvLyROT04tTkxTLTEkDQotCQkJcGx1Z2luRW50cnkuc2V0VW5wYWNrKCEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UodW5wYWNrKSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQkvLyBkb3dubG9hZCBzaXplDQotCQkJbG9uZyBkb3dubG9hZF9zaXplID0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFOw0KLQkJCVN0cmluZyBkb3dubG9hZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImRvd25sb2FkLXNpemUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWlmIChkb3dubG9hZCAhPSBudWxsICYmICFkb3dubG9hZC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCXRyeSB7DQotCQkJCQlkb3dubG9hZF9zaXplID0gTG9uZy52YWx1ZU9mKGRvd25sb2FkKS5sb25nVmFsdWUoKTsNCi0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsNCi0JCQkJCS8vIHVzZSBVTktOT1dOX1NJWkUNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwbHVnaW5FbnRyeS5zZXREb3dubG9hZFNpemUoZG93bmxvYWRfc2l6ZSk7DQotDQotCQkJLy8gaW5zdGFsbCBzaXplCQ0KLQkJCWxvbmcgaW5zdGFsbF9zaXplID0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFOw0KLQkJCVN0cmluZyBpbnN0YWxsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaW5zdGFsbC1zaXplIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlpZiAoaW5zdGFsbCAhPSBudWxsICYmICFpbnN0YWxsLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJdHJ5IHsNCi0JCQkJCWluc3RhbGxfc2l6ZSA9IExvbmcudmFsdWVPZihpbnN0YWxsKS5sb25nVmFsdWUoKTsNCi0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsNCi0JCQkJCS8vIHVzZSBVTktOT1dOX1NJWkUNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwbHVnaW5FbnRyeS5zZXRJbnN0YWxsU2l6ZShpbnN0YWxsX3NpemUpOw0KLQ0KLQkJCW9iamVjdFN0YWNrLnB1c2gocGx1Z2luRW50cnkpOw0KLQ0KLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7DQotCQkJCWRlYnVnKCJQcm9jZXNzZWQgUGx1Z2luOiBpZDoiICsgaWQgKyAiIHZlcjoiICsgdmVyICsgIiBmcmFnbWVudDoiICsgZnJhZ21lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQlkZWJ1ZygiUHJvY2Vzc2VkIFBsdWdpbjogb3M6IiArIG9zICsgIiB3czoiICsgd3MgKyAiIG5sOiIgKyBubCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCWRlYnVnKCJQcm9jZXNzZWQgUGx1Z2luOiBkb3dubG9hZCBzaXplOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrZG93bmxvYWRfc2l6ZSArICIgaW5zdGFsbCBzaXplOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkraW5zdGFsbF9zaXplKTsNCi0JCQl9DQotDQotCQl9DQotCX0NCi0NCi0JLyogDQotCSAqIHByb2Nlc3Mgbm9uLXBsdWctaW4gZW50cnkgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLk1pc3NpbmdJZCIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJA0KLQkJfSBlbHNlIHsNCi0JCQlOb25QbHVnaW5FbnRyeU1vZGVsIGRhdGFFbnRyeSA9IGZhY3RvcnkuY3JlYXRlTm9uUGx1Z2luRW50cnlNb2RlbCgpOw0KLQkJCWRhdGFFbnRyeS5zZXRJZGVudGlmaWVyKGlkKTsNCi0NCi0JCQkvL3NldE9TDQotCQkJU3RyaW5nIG9zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3MiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWRhdGFFbnRyeS5zZXRPUyhvcyk7DQotDQotCQkJLy9zZXRXUw0KLQkJCVN0cmluZyB3cyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIndzIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlkYXRhRW50cnkuc2V0V1Mod3MpOw0KLQ0KLQkJCS8vc2V0TkwNCi0JCQlTdHJpbmcgbmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJubCIpOyAvLyROT04tTkxTLTEkDQotCQkJZGF0YUVudHJ5LnNldE5MKG5sKTsNCi0NCi0JCQkvLyBzZXRBcmNoDQotCQkJU3RyaW5nIGFyY2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcmNoIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlkYXRhRW50cnkuc2V0QXJjaChhcmNoKTsNCi0NCi0JCQkvLyBkb3dubG9hZCBzaXplDQotCQkJbG9uZyBkb3dubG9hZF9zaXplID0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFOw0KLQkJCVN0cmluZyBkb3dubG9hZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImRvd25sb2FkLXNpemUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWlmIChkb3dubG9hZCAhPSBudWxsICYmICFkb3dubG9hZC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCXRyeSB7DQotCQkJCQlkb3dubG9hZF9zaXplID0gTG9uZy52YWx1ZU9mKGRvd25sb2FkKS5sb25nVmFsdWUoKTsNCi0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsNCi0JCQkJCS8vIHVzZSBVTktOT1dOX1NJWkUNCi0JCQkJfQ0KLQkJCX0NCi0JCQlkYXRhRW50cnkuc2V0RG93bmxvYWRTaXplKGRvd25sb2FkX3NpemUpOw0KLQ0KLQkJCS8vIGluc3RhbGwgc2l6ZQkNCi0JCQlsb25nIGluc3RhbGxfc2l6ZSA9IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsNCi0JCQlTdHJpbmcgaW5zdGFsbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImluc3RhbGwtc2l6ZSIpOyAvLyROT04tTkxTLTEkDQotCQkJaWYgKGluc3RhbGwgIT0gbnVsbCAmJiAhaW5zdGFsbC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCXRyeSB7DQotCQkJCQlpbnN0YWxsX3NpemUgPSBMb25nLnZhbHVlT2YoaW5zdGFsbCkubG9uZ1ZhbHVlKCk7DQotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyB1c2UgVU5LTk9XTl9TSVpFDQotCQkJCX0NCi0JCQl9DQotCQkJZGF0YUVudHJ5LnNldEluc3RhbGxTaXplKGluc3RhbGxfc2l6ZSk7DQotDQotCQkJb2JqZWN0U3RhY2sucHVzaChkYXRhRW50cnkpOw0KLQ0KLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7DQotCQkJCWRlYnVnKCJQcm9jZXNzZWQgRGF0YTogaWQ6IiArIGlkKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlkZWJ1ZygiUHJvY2Vzc2VkIERhdGE6IGRvd25sb2FkIHNpemU6IiAvLyROT04tTkxTLTEkDQotCQkJCStkb3dubG9hZF9zaXplICsgIiBpbnN0YWxsIHNpemU6IiAvLyROT04tTkxTLTEkDQotCQkJCStpbnN0YWxsX3NpemUpOw0KLQkJCX0NCi0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZGVidWcoU3RyaW5nIHMpIHsNCi0JCVVwZGF0ZUNvcmUuZGVidWcoIkRlZmF1bHRGZWF0dXJlUGFyc2VyOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgbG9nU3RhdHVzKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7DQotCQlTdHJpbmcgbmFtZSA9IGV4LmdldFN5c3RlbUlkKCk7DQotCQlpZiAobmFtZSA9PSBudWxsKQ0KLQkJCW5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJZWxzZQ0KLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxICsgbmFtZS5sYXN0SW5kZXhPZigiLyIpKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJU3RyaW5nIG1zZzsNCi0JCWlmIChuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCW1zZyA9IFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5FcnJvclBhcnNpbmciLCBleC5nZXRNZXNzYWdlKCkpOy8vJE5PTi1OTFMtMSQNCi0JCX0gZWxzZSB7DQotCQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgbmFtZSwgSW50ZWdlci50b1N0cmluZyhleC5nZXRMaW5lTnVtYmVyKCkpLCBJbnRlZ2VyLnRvU3RyaW5nKGV4LmdldENvbHVtbk51bWJlcigpKSwgZXguZ2V0TWVzc2FnZSgpfTsNCi0JCQltc2cgPSBQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuRXJyb3JsaW5lQ29sdW1uTWVzc2FnZSIsIHZhbHVlcyk7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJZXJyb3IobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIFBsYXRmb3JtLlBBUlNFX1BST0JMRU0sIG1zZywgZXgpKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBIYW5kbGVzIGFuIGVycm9yIHN0YXRlIHNwZWNpZmllZCBieSB0aGUgc3RhdHVzLiAgVGhlIGNvbGxlY3Rpb24gb2YgYWxsIGxvZ2dlZCBzdGF0dXMNCi0JICogb2JqZWN0cyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgPGNvZGU+Z2V0U3RhdHVzKCk8L2NvZGU+Lg0KLQkgKg0KLQkgKiBAcGFyYW0gZXJyb3IgYSBzdGF0dXMgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCBlcnJvcihJU3RhdHVzIGVycm9yKSB7DQotDQotCQlpZiAoc3RhdHVzID09IG51bGwpIHsNCi0JCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoUExVR0lOX0lELCBQbGF0Zm9ybS5QQVJTRV9QUk9CTEVNLCBQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuRXJyb3JQYXJzaW5nRmVhdHVyZSIpLCBudWxsKTsJLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJc3RhdHVzLmFkZChlcnJvcik7DQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykNCi0JCQlVcGRhdGVDb3JlLmxvZyhlcnJvcik7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsRXJyb3JVbmtub3duVGFnKFN0cmluZyBtc2cpIHsNCi0JCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JR05PUkVEX0VMRU1FTlQpKTsNCi0JCWludGVybmFsRXJyb3IobXNnKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxFcnJvcihTdHJpbmcgbWVzc2FnZSkgew0KLQkJZXJyb3IobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIFBsYXRmb3JtLlBBUlNFX1BST0JMRU0sIG1lc3NhZ2UsIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiByZXR1cm4gdGhlIHN0YXRlIGFzIFN0cmluZw0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdGUoaW50IHN0YXRlKSB7DQotDQotCQlzd2l0Y2ggKHN0YXRlKSB7DQotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOg0KLQkJCQlyZXR1cm4gIklnbm9yZWQiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoNCi0JCQkJcmV0dXJuICJJbml0aWFsIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfRkVBVFVSRSA6DQotCQkJCXJldHVybiAiRmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0hBTkRMRVIgOg0KLQkJCQlyZXR1cm4gIkluc3RhbGwgSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OIDoNCi0JCQkJcmV0dXJuICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0lOQ0xVREVTIDoNCi0JCQkJcmV0dXJuICJpbmNsdWRlcyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0NPUFlSSUdIVCA6DQotCQkJCXJldHVybiAiQ29weXJpZ2h0IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfTElDRU5TRSA6DQotCQkJCXJldHVybiAiTGljZW5zZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX1VSTCA6DQotCQkJCXJldHVybiAiVVJMIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfVVBEQVRFIDoNCi0JCQkJcmV0dXJuICJVcGRhdGUgVVJMIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfRElTQ09WRVJZIDoNCi0JCQkJcmV0dXJuICJEaXNjb3ZlcnkgVVJMIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfUkVRVUlSRVMgOg0KLQkJCQlyZXR1cm4gIlJlcXVpcmUiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9JTVBPUlQgOg0KLQkJCQlyZXR1cm4gIkltcG9ydCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX1BMVUdJTiA6DQotCQkJCXJldHVybiAiUGx1Z2luIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfREFUQSA6DQotCQkJCXJldHVybiAiRGF0YSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQlkZWZhdWx0IDoNCi0JCQkJcmV0dXJuIFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duU3RhdGUiLCBJbnRlZ2VyLnRvU3RyaW5nKHN0YXRlKSk7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2lnbm9yYWJsZVdoaXRlc3BhY2UoY2hhcltdLCBpbnQsIGludCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhcltdIGFyZzAsIGludCBhcmcxLCBpbnQgYXJnMikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQlzdXBlci5pZ25vcmFibGVXaGl0ZXNwYWNlKGFyZzAsIGFyZzEsIGFyZzIpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRGVmYXVsdFNpdGVQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRGVmYXVsdFNpdGVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0OTVkNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0RlZmF1bHRTaXRlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLWltcG9ydCBvcmcueG1sLnNheC4qOw0KLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7DQotDQotLyoqDQotICogRGVmYXVsdCBzaXRlIHBhcnNlci4NCi0gKiBQYXJzZXMgdGhlIHNpdGUgbWFuaWZlc3QgZmlsZSBhcyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4gRGVmZXJzDQotICogdG8gYSBtb2RlbCBmYWN0b3J5IHRvIGNyZWF0ZSB0aGUgYWN0dWFsIGNvbmNyZXRlIG1vZGVsIG9iamVjdHMuIFRoZSANCi0gKiB1cGRhdGUgZnJhbWV3b3JrIHN1cHBsaWVzIHR3byBmYWN0b3J5IGltcGxlbWVudGF0aW9uczoNCi0gKiA8dWw+DQotICogPGxpPkBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsRmFjdG9yeQ0KLSAqIDxsaT5Ac2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VTaXRlRmFjdG9yeQ0KLSAqIDwvdWw+DQotICogDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFNpdGVQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7DQotCQ0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPQ0KLQkJU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQkNCi0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOw0KLQlwcml2YXRlIFNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeTsNCi0NCi0JcHJpdmF0ZSBNdWx0aVN0YXR1cyBzdGF0dXM7DQotDQotCXByaXZhdGUgYm9vbGVhbiBERVNDUklQVElPTl9TSVRFX0FMUkVBRFlfU0VFTiA9IGZhbHNlOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSUdOT1JFRF9FTEVNRU5UID0gLTE7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTklUSUFMID0gMDsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NJVEUgPSAxOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRkVBVFVSRSA9IDI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9BUkNISVZFID0gMzsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NBVEVHT1JZID0gNDsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NBVEVHT1JZX0RFRiA9IDU7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ERVNDUklQVElPTl9TSVRFID0gNjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRiA9IDc7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURSA9ICJzaXRlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJDSElWRSA9ICJhcmNoaXZlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfREVGID0gImNhdGVnb3J5LWRlZiI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lORk9fVVJMID0gImluZGV4Lmh0bWwiOyAvLyROT04tTkxTLTEkDQotDQotCS8vIEN1cnJlbnQgU3RhdGUgSW5mb3JtYXRpb24NCi0JU3RhY2sgc3RhdGVTdGFjayA9IG5ldyBTdGFjaygpOw0KLQ0KLQkvLyBDdXJyZW50IG9iamVjdCBzdGFjayAodXNlZCB0byBob2xkIHRoZSBjdXJyZW50IG9iamVjdCB3ZSBhcmUNCi0JLy8gcG9wdWxhdGluZyBpbiB0aGlzIHBsdWdpbiBkZXNjcmlwdG9yDQotCVN0YWNrIG9iamVjdFN0YWNrID0gbmV3IFN0YWNrKCk7DQotDQotCXByaXZhdGUgaW50IGN1cnJlbnRTdGF0ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBzaXRlIHBhcnNlci4NCi0JICovDQotCXB1YmxpYyBEZWZhdWx0U2l0ZVBhcnNlcigpIHsNCi0JCXN1cGVyKCk7DQotCQl0cnkgew0KLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7DQotCQkJdGhpcy5wYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOw0KLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJVXBkYXRlQ29yZS5sb2coZSk7DQotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUubG9nKGUpOw0KLQkJfQ0KLQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJZGVidWcoIkNyZWF0ZWQiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGluaXQoU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5KSB7DQotCQkvLyBQRVJGOiBzZXBhcmF0ZSBpbnN0YW5jZSBjcmVhdGlvbiBmcm9tIHBhcnNpbmcNCi0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7DQotCQlzdGF0ZVN0YWNrID0gbmV3IFN0YWNrKCk7DQotCQlvYmplY3RTdGFjayA9IG5ldyBTdGFjaygpOw0KLQkJc3RhdHVzID0gbnVsbDsNCi0JCURFU0NSSVBUSU9OX1NJVEVfQUxSRUFEWV9TRUVOID0gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIGlucHV0IHN0ZWFtIGFuZCBjb25zdHJ1Y3RzIGEgc2l0ZSBtb2RlbC4NCi0JICogVGhlIGlucHV0IHN0cmVhbSBpcyBub3QgY2xvc2VkIGFzIHBhcnQgb2YgdGhpcyBvcGVyYXRpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gaW4gaW5wdXQgc3RyZWFtDQotCSAqIEByZXR1cm4gc2l0ZSBtb2RlbA0KLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbg0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTaXRlTW9kZWwgcGFyc2UoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0JCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JTklUSUFMKSk7DQotCQljdXJyZW50U3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOw0KLQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOw0KLQkJaWYgKG9iamVjdFN0YWNrLmlzRW1wdHkoKSkNCi0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5Ob1NpdGVUYWciKSk7CS8vJE5PTi1OTFMtMSQNCi0JCWVsc2Ugew0KLQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTaXRlTW9kZWwpIHsNCi0JCQkJcmV0dXJuIChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCX0gZWxzZSB7DQotCQkJCVN0cmluZyBzdGFjayA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RTdGFjay5pdGVyYXRvcigpOw0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCi0JCQkJCXN0YWNrID0gc3RhY2sgKyBpdGVyLm5leHQoKS50b1N0cmluZygpICsgIlxyXG4iOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuV3JvbmdQYXJzaW5nU3RhY2siLCBzdGFjaykpOwkvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFsbCBzdGF0dXMgb2JqZWN0cyBhY2N1bXVsYXRlZCBieSB0aGUgcGFyc2VyLg0KLQkgKg0KLQkgKiBAcmV0dXJuIG11bHRpLXN0YXR1cyBjb250YWluaW5nIGFjY3VtdWxhdGVkIHN0YXR1cywgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBNdWx0aVN0YXR1cyBnZXRTdGF0dXMoKSB7DQotCQlyZXR1cm4gc3RhdHVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgc3RhcnQgb2YgZWxlbWVudCB0YWdzDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgew0KLQkJCWRlYnVnKCJTdGF0ZTogIiArIGN1cnJlbnRTdGF0ZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQlkZWJ1ZygiU3RhcnQgRWxlbWVudDogdXJpOiIgKyB1cmkgKyAiIGxvY2FsIE5hbWU6IiArIGxvY2FsTmFtZSArICIgcU5hbWU6IiArIHFOYW1lKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJfQ0KLQ0KLQkJc3dpdGNoIChjdXJyZW50U3RhdGUpIHsNCi0JCQljYXNlIFNUQVRFX0lHTk9SRURfRUxFTUVOVCA6DQotCQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGxvY2FsTmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOy8vJE5PTi1OTFMtMSQNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoNCi0JCQkJaGFuZGxlSW5pdGlhbFN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfU0lURSA6DQotCQkJCWhhbmRsZVNpdGVTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0ZFQVRVUkUgOg0KLQkJCQloYW5kbGVGZWF0dXJlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9BUkNISVZFIDoNCi0JCQkJaGFuZGxlU2l0ZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUlkgOg0KLQkJCQloYW5kbGVDYXRlZ29yeVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUllfREVGIDoNCi0JCQkJaGFuZGxlQ2F0ZWdvcnlEZWZTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUgOg0KLQkJCQloYW5kbGVTaXRlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYgOg0KLQkJCQloYW5kbGVTaXRlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJZGVmYXVsdCA6DQotCQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5Vbmtub3duU3RhcnRTdGF0ZSIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsvLyROT04tTkxTLTEkDQotCQkJCWJyZWFrOw0KLQkJfQ0KLQkJaW50IG5ld1N0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsNCi0JCWlmIChuZXdTdGF0ZSAhPSBTVEFURV9JR05PUkVEX0VMRU1FTlQpDQotCQkJY3VycmVudFN0YXRlID0gbmV3U3RhdGU7DQotDQotCX0NCi0NCi0JLyoqDQotCSAqIEhhbmRsZSBlbmQgb2YgZWxlbWVudCB0YWdzDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZW5kRWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgew0KLQ0KLQkJU3RyaW5nIHRleHQgPSBudWxsOw0KLQkJVVJMRW50cnlNb2RlbCBpbmZvID0gbnVsbDsNCi0NCi0JCWludCBzdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7DQotCQlzd2l0Y2ggKHN0YXRlKSB7DQotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOg0KLQkJCWNhc2UgU1RBVEVfQVJDSElWRSA6DQotCQkJY2FzZSBTVEFURV9DQVRFR09SWSA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfSU5JVElBTCA6DQotCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLlBhcnNpbmdTdGFja0JhY2tUb0luaXRpYWxTdGF0ZSIpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX1NJVEUgOg0KLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOw0KLQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU3RyaW5nKSB7DQotCQkJCQl0ZXh0ID0gKFN0cmluZykgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQlTaXRlTW9kZWwgc2l0ZSA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCQkJCXNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLnNldEFubm90YXRpb24odGV4dCk7DQotCQkJCX0NCi0JCQkJLy9kbyBub3QgcG9wIHRoZSBvYmplY3QNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUllfREVGIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFN0cmluZykgew0KLQkJCQkJdGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeSA9IChDYXRlZ29yeU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQljYXRlZ29yeS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuc2V0QW5ub3RhdGlvbih0ZXh0KTsNCi0JCQkJfQ0KLQkJCQlvYmplY3RTdGFjay5wb3AoKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9TSVRFIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCXdoaWxlIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0JCQkJCS8vIGFkZCB0ZXh0LCBwcmVzZXJ2aW5nIGF0IG1vc3Qgb25lIHNwYWNlIGJldHdlZW4gdGV4dCBmcmFnbWVudHMNCi0JCQkJCVN0cmluZyBuZXdUZXh0ID0gKFN0cmluZykgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQlpZiAodHJhaWxpbmdTcGFjZShuZXdUZXh0KSAmJiAhbGVhZGluZ1NwYWNlKHRleHQpKSB7DQotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0NCi0JCQkJCXRleHQgPSBuZXdUZXh0LnRyaW0oKSArIHRleHQ7DQotCQkJCQlpZiAobGVhZGluZ1NwYWNlKG5ld1RleHQpICYmICFsZWFkaW5nU3BhY2UodGV4dCkpIHsNCi0JCQkJCQl0ZXh0ID0gIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXRleHQgPSB0ZXh0LnRyaW0oKTsNCi0NCi0JCQkJaW5mbyA9IChVUkxFbnRyeU1vZGVsKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQkJaWYgKHRleHQgIT0gbnVsbCkNCi0JCQkJCWluZm8uc2V0QW5ub3RhdGlvbih0ZXh0KTsNCi0NCi0JCQkJU2l0ZU1vZGVsIHNpdGVNb2RlbCA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCQkJLy8gb3ZlcnJpZGUgZGVzY3JpcHRpb24uDQotCQkJCS8vIGRvIG5vdCByYWlzZSBlcnJvciBhcyBwcmV2aW91cyBkZXNjcmlwdGlvbiBtYXkgYmUgZGVmYXVsdCBvbmUNCi0JCQkJLy8gd2hlbiBwYXJzaW5nIHNpdGUgdGFnDQotCQkJCWlmIChERVNDUklQVElPTl9TSVRFX0FMUkVBRFlfU0VFTikNCi0JCQkJCWRlYnVnKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5FbGVtZW50QWxyZWFkeVNldCIsIGdldFN0YXRlKHN0YXRlKSkpOwkvLyROT04tTkxTLTEkDQotCQkJCXNpdGVNb2RlbC5zZXREZXNjcmlwdGlvbk1vZGVsKGluZm8pOw0KLQkJCQlERVNDUklQVElPTl9TSVRFX0FMUkVBRFlfU0VFTiA9IHRydWU7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fQ0FURUdPUllfREVGIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCXdoaWxlIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0JCQkJCS8vIGFkZCB0ZXh0LCBwcmVzZXJ2aW5nIGF0IG1vc3Qgb25lIHNwYWNlIGJldHdlZW4gdGV4dCBmcmFnbWVudHMNCi0JCQkJCVN0cmluZyBuZXdUZXh0ID0gKFN0cmluZykgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQlpZiAodHJhaWxpbmdTcGFjZShuZXdUZXh0KSAmJiAhbGVhZGluZ1NwYWNlKHRleHQpKSB7DQotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0NCi0JCQkJCXRleHQgPSBuZXdUZXh0LnRyaW0oKSArIHRleHQ7DQotCQkJCQlpZiAobGVhZGluZ1NwYWNlKG5ld1RleHQpICYmICFsZWFkaW5nU3BhY2UodGV4dCkpIHsNCi0JCQkJCQl0ZXh0ID0gIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXRleHQgPSB0ZXh0LnRyaW0oKTsNCi0NCi0JCQkJaW5mbyA9IChVUkxFbnRyeU1vZGVsKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQkJaWYgKHRleHQgIT0gbnVsbCkNCi0JCQkJCWluZm8uc2V0QW5ub3RhdGlvbih0ZXh0KTsNCi0NCi0JCQkJQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeSA9IChDYXRlZ29yeU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCWlmIChjYXRlZ29yeS5nZXREZXNjcmlwdGlvbk1vZGVsKCkgIT0gbnVsbCkNCi0JCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLkVsZW1lbnRBbHJlYWR5U2V0MiIsIGdldFN0YXRlKHN0YXRlKSwgY2F0ZWdvcnkuZ2V0TGFiZWwoKSkpOy8vJE5PTi1OTFMtMSQNCi0JCQkJZWxzZQ0KLQkJCQkJY2F0ZWdvcnkuc2V0RGVzY3JpcHRpb25Nb2RlbChpbmZvKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJZGVmYXVsdCA6DQotCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLlVua25vd25FbmRTdGF0ZSIsIGdldFN0YXRlKHN0YXRlKSkpOy8vJE5PTi1OTFMtMSQNCi0JCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykNCi0JCQlkZWJ1ZygiRW5kIEVsZW1lbnQ6IiArIHVyaSArICI6IiArIGxvY2FsTmFtZSArICI6IiArIHFOYW1lKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgY2hhcmFjdGVyIHRleHQNCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsNCi0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCk7DQotCQkvL29ubHkgcHVzaCBpZiBkZXNjcmlwdGlvbg0KLQkJaW50IHN0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsNCi0JCWlmIChzdGF0ZSA9PSBTVEFURV9ERVNDUklQVElPTl9TSVRFIHx8IHN0YXRlID09IFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRikNCi0JCQlvYmplY3RTdGFjay5wdXNoKHRleHQpOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgZXJyb3JzDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24pDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7DQotCQlsb2dTdGF0dXMoZXgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgZmF0YWwgZXJyb3JzDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikNCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQlsb2dTdGF0dXMoZXgpOw0KLQkJdGhyb3cgZXg7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUluaXRpYWxTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKFNJVEUpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1NJVEUpKTsNCi0JCQlwcm9jZXNzU2l0ZShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSB7DQotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLlVua25vd25FbGVtZW50IiwgZWxlbWVudE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCS8vIHdoYXQgd2UgcmVjZWl2ZWQgd2FzIG5vdCBhIHNpdGUueG1sLCBubyBuZWVkIHRvIGNvbnRpbnVlDQotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuSW52YWxpZFhNTFN0cmVhbSIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVTaXRlU3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoREVTQ1JJUFRJT04pKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUpKTsNCi0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEZFQVRVUkUpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0ZFQVRVUkUpKTsNCi0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEFSQ0hJVkUpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0FSQ0hJVkUpKTsNCi0JCQlwcm9jZXNzQXJjaGl2ZShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZX0RFRikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ0FURUdPUllfREVGKSk7DQotCQkJcHJvY2Vzc0NhdGVnb3J5RGVmKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlDQotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLlVua25vd25FbGVtZW50IiwgZWxlbWVudE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsgLy8kTk9OLU5MUy0xJCAJCQkNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRmVhdHVyZVN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERFU0NSSVBUSU9OKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ERVNDUklQVElPTl9TSVRFKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhGRUFUVVJFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9GRUFUVVJFKSk7DQotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhBUkNISVZFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9BUkNISVZFKSk7DQotCQkJcHJvY2Vzc0FyY2hpdmUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWV9ERUYpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZX0RFRikpOw0KLQkJCXByb2Nlc3NDYXRlZ29yeURlZihhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWSkpOw0KLQkJCXByb2Nlc3NDYXRlZ29yeShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZQ0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7IC8vJE5PTi1OTFMtMSQgCQkJDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhdGVnb3J5RGVmU3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoRkVBVFVSRSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfRkVBVFVSRSkpOw0KLQkJCXByb2Nlc3NGZWF0dXJlKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQVJDSElWRSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQVJDSElWRSkpOw0KLQkJCXByb2Nlc3NBcmNoaXZlKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ0FURUdPUllfREVGKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWV9ERUYpKTsNCi0JCQlwcm9jZXNzQ2F0ZWdvcnlEZWYoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT05fQ0FURUdPUllfREVGKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UNCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93bkVsZW1lbnQiLCBlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOwkvLyROT04tTkxTLTEkIAkJCQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVDYXRlZ29yeVN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERFU0NSSVBUSU9OKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ERVNDUklQVElPTl9TSVRFKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhGRUFUVVJFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9GRUFUVVJFKSk7DQotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhBUkNISVZFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9BUkNISVZFKSk7DQotCQkJcHJvY2Vzc0FyY2hpdmUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWV9ERUYpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZX0RFRikpOw0KLQkJCXByb2Nlc3NDYXRlZ29yeURlZihhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWSkpOw0KLQkJCXByb2Nlc3NDYXRlZ29yeShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZQ0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7Ly8kTk9OLU5MUy0xJCAJCQkNCi0JfQ0KLQ0KLQkvKiANCi0JICogcHJvY2VzcyBzaXRlIGluZm8NCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzU2l0ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJLy8gY3JlYXRlIHNpdGUgbWFwDQotCQlTaXRlTW9kZWwgc2l0ZSA9IGZhY3RvcnkuY3JlYXRlU2l0ZU1hcE1vZGVsKCk7DQotDQotCQkvLyBpZiBVUkwgaXMgc3BlY2lmaWVkLCBpdCByZXBsYWNlcyB0aGUgVVJMIG9mIHRoZSBzaXRlDQotCQkvLyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbG9jYXRpb24gb2YgZmVhdHVyZXMgYW5kIGFyY2hpdmVzDQotCQlTdHJpbmcgc2l0ZVVSTCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkDQotCQlpZiAoc2l0ZVVSTCAhPSBudWxsICYmICEoIiIuZXF1YWxzKHNpdGVVUkwudHJpbSgpKSkpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCWlmICghc2l0ZVVSTC5lbmRzV2l0aCgiLyIpICYmICFzaXRlVVJMLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCXNpdGVVUkwgKz0gIi8iOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCXNpdGUuc2V0TG9jYXRpb25VUkxTdHJpbmcoc2l0ZVVSTCk7DQotCQl9DQotDQotCQkvLyBwcm92aWRlIGRlZmF1bHQgZGVzY3JpcHRpb24gVVJMDQotCQkvLyBJZiA8ZGVzY3JpcHRpb24+IGlzIHNwZWNpZmllZCwgZm9yIHRoZSBzaXRlLCAgaXQgdGFrZXMgcHJlY2VkZW5jZQkJDQotCQlVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uID0gZmFjdG9yeS5jcmVhdGVVUkxFbnRyeU1vZGVsKCk7DQotCQlkZXNjcmlwdGlvbi5zZXRVUkxTdHJpbmcoREVGQVVMVF9JTkZPX1VSTCk7DQotCQlzaXRlLnNldERlc2NyaXB0aW9uTW9kZWwoZGVzY3JpcHRpb24pOw0KLQ0KLQkJLy8gdmVyaWZ5IHdlIGNhbiBwYXJzZSB0aGUgc2l0ZSAuLi5pZiB0aGUgc2l0ZSBoYXMNCi0JCS8vIGEgZGlmZmVyZW50IHR5cGUgdGhyb3cgYW4gZXhjZXB0aW9uIHRvIGZvcmNlIHJlcGFyc2luZw0KLQkJLy8gd2l0aCB0aGUgbWF0Y2hpbmcgcGFyc2VyDQotCQlTdHJpbmcgdHlwZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKCFmYWN0b3J5LmNhblBhcnNlU2l0ZVR5cGUodHlwZSkpIHsNCi0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKG5ldyBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24odHlwZSkpOw0KLQkJfQ0KLQkJc2l0ZS5zZXRUeXBlKHR5cGUpOw0KLQkJb2JqZWN0U3RhY2sucHVzaChzaXRlKTsNCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJFbmQgcHJvY2VzcyBTaXRlIHRhZzogc2l0ZVVSTDoiICsgc2l0ZVVSTCArICIgdHlwZToiICsgdHlwZSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCX0NCi0NCi0JLyogDQotCSAqIHByb2Nlc3MgZmVhdHVyZSBpbmZvDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0ZlYXR1cmUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpOw0KLQkJU3RyaW5nIHVybEluZm8gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKHVybEluZm8gPT0gbnVsbCB8fCB1cmxJbmZvLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuTWlzc2luZyIsICJ1cmwiLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7CS8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQNCi0NCi0JCWZlYXR1cmUuc2V0VVJMU3RyaW5nKHVybEluZm8pOw0KLQ0KLQkJU3RyaW5nIHR5cGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWZlYXR1cmUuc2V0VHlwZSh0eXBlKTsNCi0NCi0JCS8vIGlkZW50aWZpZXIgYW5kIHZlcnNpb24NCi0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQNCi0JCVN0cmluZyB2ZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCS8vIGlmIG9uZSBpcyBudWxsLCBhbmQgbm90IHRoZSBvdGhlcg0KLQkJaWYgKChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQleICh2ZXIgPT0gbnVsbCB8fCB2ZXIudHJpbSgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyBpZCwgdmVyLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfTsNCi0JCQlVcGRhdGVDb3JlLndhcm4oUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLklkT3JWZXJzaW9uSW52YWxpZCIsIHZhbHVlcykpOy8vJE5PTi1OTFMtMSQNCi0JCX0gZWxzZSB7DQotCQkJZmVhdHVyZS5zZXRGZWF0dXJlSWRlbnRpZmllcihpZCk7DQotCQkJZmVhdHVyZS5zZXRGZWF0dXJlVmVyc2lvbih2ZXIpOw0KLQkJfQ0KLQ0KLQkJLy8gZ2V0IGxhYmVsIGlmIGl0IGV4aXN0cw0KLQkJU3RyaW5nIGxhYmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKGxhYmVsICE9IG51bGwpIHsNCi0JCQlpZiAoIiIuZXF1YWxzKGxhYmVsLnRyaW0oKSkpIC8vJE5PTi1OTFMtMSQNCi0JCQkJbGFiZWwgPSBudWxsOw0KLQkJfQ0KLQkJZmVhdHVyZS5zZXRMYWJlbChsYWJlbCk7DQotDQotCQkvLyBPUw0KLQkJU3RyaW5nIG9zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3MiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZmVhdHVyZS5zZXRPUyhvcyk7DQotDQotCQkvLyBXUw0KLQkJU3RyaW5nIHdzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgid3MiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZmVhdHVyZS5zZXRXUyh3cyk7DQotDQotCQkvLyBOTA0KLQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZmVhdHVyZS5zZXROTChubCk7DQotDQotCQkvLyBhcmNoDQotCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJA0KLQkJZmVhdHVyZS5zZXRBcmNoKGFyY2gpOw0KLQ0KLQkJLy9wYXRjaA0KLQkJU3RyaW5nIHBhdGNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGF0Y2giKTsgLy8kTk9OLU5MUy0xJA0KLQkJZmVhdHVyZS5zZXRQYXRjaChwYXRjaCk7DQotDQotCQlTaXRlTW9kZWwgc2l0ZSA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCXNpdGUuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmUpOw0KLQkJZmVhdHVyZS5zZXRTaXRlTW9kZWwoc2l0ZSk7DQotDQotCQlvYmplY3RTdGFjay5wdXNoKGZlYXR1cmUpOw0KLQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJZGVidWcoIkVuZCBQcm9jZXNzaW5nIERlZmF1bHRGZWF0dXJlIFRhZzogdXJsOiIgKyB1cmxJbmZvICsgIiB0eXBlOiIgKyB0eXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCX0NCi0NCi0JLyogDQotCSAqIHByb2Nlc3MgYXJjaGl2ZSBpbmZvDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0FyY2hpdmUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWwgYXJjaGl2ZSA9IGZhY3RvcnkuY3JlYXRlQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKCk7DQotCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwYXRoIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5NaXNzaW5nIiwgInBhdGgiLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0NCi0JCWFyY2hpdmUuc2V0UGF0aChpZCk7DQotDQotCQlTdHJpbmcgdXJsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmICh1cmwgPT0gbnVsbCB8fCB1cmwudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLk1pc3NpbmciLCAiYXJjaGl2ZSIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJA0KLQkJfSBlbHNlIHsNCi0JCQlhcmNoaXZlLnNldFVSTFN0cmluZyh1cmwpOw0KLQ0KLQkJCVNpdGVNb2RlbCBzaXRlID0gKFNpdGVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCXNpdGUuYWRkQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKGFyY2hpdmUpOw0KLQkJfQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJZGVidWcoIkVuZCBwcm9jZXNzaW5nIEFyY2hpdmU6IHBhdGg6IiArIGlkICsgIiB1cmw6IiArIHVybCk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCX0NCi0NCi0JLyogDQotCSAqIHByb2Nlc3MgdGhlIENhdGVnb3J5ICBpbmZvDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NhdGVnb3J5KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQkJU3RyaW5nIGNhdGVnb3J5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkDQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUgPSAoU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJZmVhdHVyZS5hZGRDYXRlZ29yeU5hbWUoY2F0ZWdvcnkpOw0KLQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJZGVidWcoIkVuZCBwcm9jZXNzaW5nIENhdGVnb3J5OiBuYW1lOiIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKiANCi0JICogcHJvY2VzcyBjYXRlZ29yeSBkZWYgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDYXRlZ29yeURlZihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JCUNhdGVnb3J5TW9kZWwgY2F0ZWdvcnkgPSBmYWN0b3J5LmNyZWF0ZVNpdGVDYXRlZ29yeU1vZGVsKCk7DQotCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIGxhYmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJY2F0ZWdvcnkuc2V0TmFtZShuYW1lKTsNCi0JCWNhdGVnb3J5LnNldExhYmVsKGxhYmVsKTsNCi0NCi0JCVNpdGVNb2RlbCBzaXRlID0gKFNpdGVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJc2l0ZS5hZGRDYXRlZ29yeU1vZGVsKGNhdGVnb3J5KTsNCi0JCW9iamVjdFN0YWNrLnB1c2goY2F0ZWdvcnkpOw0KLQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJZGVidWcoIkVuZCBwcm9jZXNzaW5nIENhdGVnb3J5RGVmOiBuYW1lOiIgKyBuYW1lICsgIiBsYWJlbDoiICsgbGFiZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQ0KLQkvKiANCi0JICogcHJvY2VzcyBVUkwgaW5mbyB3aXRoIGVsZW1lbnQgdGV4dA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmZvKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQkJVVJMRW50cnlNb2RlbCBpbmYgPSBmYWN0b3J5LmNyZWF0ZVVSTEVudHJ5TW9kZWwoKTsNCi0JCVN0cmluZyBpbmZvVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQNCi0JCWluZi5zZXRVUkxTdHJpbmcoaW5mb1VSTCk7DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykNCi0JCQlkZWJ1ZygiUHJvY2Vzc2VkIEluZm86IHVybDoiICsgaW5mb1VSTCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCW9iamVjdFN0YWNrLnB1c2goaW5mKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgcykgew0KLQkJVXBkYXRlQ29yZS5kZWJ1ZygiRGVmYXVsdFNpdGVQYXJzZXIiICsgcyk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCBsb2dTdGF0dXMoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsNCi0JCVN0cmluZyBuYW1lID0gZXguZ2V0U3lzdGVtSWQoKTsNCi0JCWlmIChuYW1lID09IG51bGwpDQotCQkJbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkDQotCQllbHNlDQotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEgKyBuYW1lLmxhc3RJbmRleE9mKCIvIikpOyAvLyROT04tTkxTLTEkDQotDQotCQlTdHJpbmcgbXNnOw0KLQkJaWYgKG5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJCW1zZyA9IFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5FcnJvclBhcnNpbmciLCBleC5nZXRNZXNzYWdlKCkpOwkvLyROT04tTkxTLTEkDQotCQllbHNlIHsNCi0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyBuYW1lLCBJbnRlZ2VyLnRvU3RyaW5nKGV4LmdldExpbmVOdW1iZXIoKSksIEludGVnZXIudG9TdHJpbmcoZXguZ2V0Q29sdW1uTnVtYmVyKCkpLCBleC5nZXRNZXNzYWdlKCl9Ow0KLQkJCW1zZyA9IFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5FcnJvckxpbmVDb2x1bW5NZXNzYWdlIiwgdmFsdWVzKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQllcnJvcihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgUGxhdGZvcm0uUEFSU0VfUFJPQkxFTSwgbXNnLCBleCkpOw0KLQl9DQotDQotCS8qDQotCSAqIEhhbmRsZXMgYW4gZXJyb3Igc3RhdGUgc3BlY2lmaWVkIGJ5IHRoZSBzdGF0dXMuICBUaGUgY29sbGVjdGlvbiBvZiBhbGwgbG9nZ2VkIHN0YXR1cw0KLQkgKiBvYmplY3RzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyA8Y29kZT5nZXRTdGF0dXMoKTwvY29kZT4uDQotCSAqDQotCSAqIEBwYXJhbSBlcnJvciBhIHN0YXR1cyBkZXRhaWxpbmcgdGhlIGVycm9yIGNvbmRpdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGVycm9yKElTdGF0dXMgZXJyb3IpIHsNCi0NCi0JCWlmIChzdGF0dXMgPT0gbnVsbCkgew0KLQkJCXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsIFBsYXRmb3JtLlBBUlNFX1BST0JMRU0sIFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5FcnJvclBhcnNpbmdTaXRlIiksIG51bGwpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXN0YXR1cy5hZGQoZXJyb3IpOw0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJVXBkYXRlQ29yZS5sb2coZXJyb3IpOw0KLQl9DQotDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsRXJyb3JVbmtub3duVGFnKFN0cmluZyBtc2cpIHsNCi0JCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JR05PUkVEX0VMRU1FTlQpKTsNCi0JCWludGVybmFsRXJyb3IobXNnKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEVycm9yKFN0cmluZyBtZXNzYWdlKSB7DQotCQllcnJvcihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgbnVsbCkpOw0KLQl9DQotDQotCS8qDQotCSAqIHJldHVybiB0aGUgc3RhdGUgYXMgU3RyaW5nDQotCSAqLw0KLQlwcml2YXRlIFN0cmluZyBnZXRTdGF0ZShpbnQgc3RhdGUpIHsNCi0NCi0JCXN3aXRjaCAoc3RhdGUpIHsNCi0JCQljYXNlIFNUQVRFX0lHTk9SRURfRUxFTUVOVCA6DQotCQkJCXJldHVybiAiSWdub3JlZCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0lOSVRJQUwgOg0KLQkJCQlyZXR1cm4gIkluaXRpYWwiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9TSVRFIDoNCi0JCQkJcmV0dXJuICJTaXRlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfRkVBVFVSRSA6DQotCQkJCXJldHVybiAiRmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0FSQ0hJVkUgOg0KLQkJCQlyZXR1cm4gIkFyY2hpdmUiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9DQVRFR09SWSA6DQotCQkJCXJldHVybiAiQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9DQVRFR09SWV9ERUYgOg0KLQkJCQlyZXR1cm4gIkNhdGVnb3J5IERlZiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRiA6DQotCQkJCXJldHVybiAiRGVzY3JpcHRpb24gLyBDYXRlZ29yeSBEZWYiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9TSVRFIDoNCi0JCQkJcmV0dXJuICJEZXNjcmlwdGlvbiAvIFNpdGUiOyAvLyROT04tTkxTLTEkDQotDQotCQkJZGVmYXVsdCA6DQotCQkJCXJldHVybiBQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93blN0YXRlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQlwcml2YXRlIGJvb2xlYW4gbGVhZGluZ1NwYWNlKFN0cmluZyBzdHIpIHsNCi0JCWlmIChzdHIubGVuZ3RoKCkgPD0gMCkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXJldHVybiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHN0ci5jaGFyQXQoMCkpOw0KLQl9DQotCXByaXZhdGUgYm9vbGVhbiB0cmFpbGluZ1NwYWNlKFN0cmluZyBzdHIpIHsNCi0JCWlmIChzdHIubGVuZ3RoKCkgPD0gMCkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXJldHVybiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHN0ci5jaGFyQXQoc3RyLmxlbmd0aCgpIC0gMSkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRmVhdHVyZU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ZlYXR1cmVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA3ZTMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRmVhdHVyZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIEZlYXR1cmUgbW9kZWwgb2JqZWN0Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgDQotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgDQotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZU1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3Qgew0KLQ0KLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlSWQ7DQotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVWZXJzaW9uOw0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsNCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYWxpemVkTGFiZWw7DQotCXByaXZhdGUgU3RyaW5nIHByb3ZpZGVyOw0KLQlwcml2YXRlIFN0cmluZyBsb2NhbGl6ZWRQcm92aWRlcjsNCi0JcHJpdmF0ZSBTdHJpbmcgaW1hZ2VVUkxTdHJpbmc7DQotCXByaXZhdGUgVVJMIGltYWdlVVJMOw0KLQlwcml2YXRlIFN0cmluZyBvczsNCi0JcHJpdmF0ZSBTdHJpbmcgd3M7DQotCXByaXZhdGUgU3RyaW5nIG5sOw0KLQlwcml2YXRlIFN0cmluZyBhcmNoOw0KLQlwcml2YXRlIGJvb2xlYW4gcHJpbWFyeSA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gZXhjbHVzaXZlPWZhbHNlOw0KLQlwcml2YXRlIFN0cmluZyBwcmltYXJ5UGx1Z2luSUQ7DQotCXByaXZhdGUgU3RyaW5nIGFwcGxpY2F0aW9uOw0KLQlwcml2YXRlIFN0cmluZyBhZmZpbml0eTsNCi0JcHJpdmF0ZSBJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwgaW5zdGFsbEhhbmRsZXI7DQotCXByaXZhdGUgVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbjsNCi0JcHJpdmF0ZSBVUkxFbnRyeU1vZGVsIGNvcHlyaWdodDsNCi0JcHJpdmF0ZSBVUkxFbnRyeU1vZGVsIGxpY2Vuc2U7DQotCXByaXZhdGUgVVJMRW50cnlNb2RlbCB1cGRhdGVTaXRlSW5mbzsNCi0JcHJpdmF0ZSBMaXN0IC8qb2YgSW5mb01vZGVsKi8NCi0JZGlzY292ZXJ5U2l0ZUluZm87DQotCXByaXZhdGUgTGlzdCAvKm9mIEltcG9ydE1vZGVsKi8NCi0JaW1wb3J0czsNCi0JcHJpdmF0ZSBMaXN0IC8qb2YgUGx1Z2luRW50cnlNb2RlbCovDQotCXBsdWdpbkVudHJpZXM7DQotCXByaXZhdGUgTGlzdCAvKm9mIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsICovDQotCWZlYXR1cmVJbmNsdWRlczsNCi0JcHJpdmF0ZSBMaXN0IC8qb2YgTm9uUGx1Z2luRW50cnlNb2RlbCovDQotCW5vblBsdWdpbkVudHJpZXM7DQotDQotCS8vIHBlcmZvcm1hbmNlDQotCXByaXZhdGUgVVJMIGJ1bmRsZVVSTDsNCi0JcHJpdmF0ZSBVUkwgYmFzZTsNCi0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVkID0gZmFsc2U7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgZmVhdHVyZSBvYmplY3QuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgRmVhdHVyZU1vZGVsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29tcGFyZXMgMiBmZWF0dXJlIG1vZGVscyBmb3IgZXF1YWxpdHkNCi0JICogIA0KLQkgKiBAcGFyYW0gb2JqIGZlYXR1cmUgbW9kZWwgdG8gY29tcGFyZSB3aXRoDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBtb2RlbHMgYXJlIGVxdWFsLCANCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlGZWF0dXJlTW9kZWwgbW9kZWwgPSAoRmVhdHVyZU1vZGVsKSBvYmo7DQotDQotCQlyZXR1cm4gKGZlYXR1cmVJZC50b0xvd2VyQ2FzZSgpLmVxdWFscyhtb2RlbC5nZXRGZWF0dXJlSWRlbnRpZmllcigpKSAmJiBmZWF0dXJlVmVyc2lvbi50b0xvd2VyQ2FzZSgpLmVxdWFscyhtb2RlbC5nZXRGZWF0dXJlVmVyc2lvbigpKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgaWRlbnRpZmllciBhcyBhIHN0cmluZw0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkNCi0JICogQHJldHVybiBmZWF0dXJlIGlkZW50aWZpZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSWRlbnRpZmllcigpIHsNCi0JCS8vZGVsYXllZFJlc29sdmUoKTsgbm8gZGVsYXkNCi0JCXJldHVybiBmZWF0dXJlSWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgdmVyc2lvbiBhcyBhIHN0cmluZw0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkNCi0JICogQHJldHVybiBmZWF0dXJlIHZlcnNpb24gDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZVZlcnNpb24oKSB7DQotCQkvL2RlbGF5ZWRSZXNvbHZlKCk7IG5vIGRlbGF5DQotCQlyZXR1cm4gZmVhdHVyZVZlcnNpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIHRoZSBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGZlYXR1cmUuIElmIHRoZSBtb2RlbA0KLQkgKiBvYmplY3QgaGFzIGJlZW4gcmVzb2x2ZWQsIHRoZSBsYWJlbCBpcyBsb2NhbGl6ZWQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsNCi0JCWRlbGF5ZWRSZXNvbHZlKCk7DQotCQlpZiAobG9jYWxpemVkTGFiZWwgIT0gbnVsbCkNCi0JCQlyZXR1cm4gbG9jYWxpemVkTGFiZWw7DQotCQllbHNlDQotCQkJcmV0dXJuIGxhYmVsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSB0aGUgbm9uLWxvY2FsaXplZCBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIG5vbi1sb2NhbGl6ZWQgZGlzcGxheWFibGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsTm9uTG9jYWxpemVkKCkgew0KLQkJcmV0dXJuIGxhYmVsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSB0aGUgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBmZWF0dXJlIHByb3ZpZGVyLiBJZiB0aGUgbW9kZWwNCi0JICogb2JqZWN0IGhhcyBiZWVuIHJlc29sdmVkLCB0aGUgbGFiZWwgaXMgbG9jYWxpemVkLg0KLQkgKiANCi0JICogQHJldHVybiBkaXNwbGF5YWJsZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXIoKSB7DQotCQlkZWxheWVkUmVzb2x2ZSgpOw0KLQkJaWYgKGxvY2FsaXplZFByb3ZpZGVyICE9IG51bGwpDQotCQkJcmV0dXJuIGxvY2FsaXplZFByb3ZpZGVyOw0KLQkJZWxzZQ0KLQkJCXJldHVybiBwcm92aWRlcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmUgdGhlIG5vbi1sb2NhbGl6ZWQgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBmZWF0dXJlIHByb3ZpZGVyLg0KLQkgKiANCi0JICogQHJldHVybiBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQcm92aWRlck5vbkxvY2FsaXplZCgpIHsNCi0JCXJldHVybiBwcm92aWRlcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCBVUkwgc3RyaW5nIGZvciB0aGUgZmVhdHVyZSBpbWFnZS4NCi0JICoNCi0JICogQHJldHVybiB1cmwgc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEltYWdlVVJMU3RyaW5nKCkgew0KLQkJZGVsYXllZFJlc29sdmUoKTsNCi0JCXJldHVybiBpbWFnZVVSTFN0cmluZzsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgVVJMIGZvciB0aGUgaW1hZ2UuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHVybCwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRJbWFnZVVSTCgpIHsNCi0JCWRlbGF5ZWRSZXNvbHZlKCk7DQotCQlyZXR1cm4gaW1hZ2VVUkw7DQotCX0NCi0NCi0JLyoqDQotCSAqIEdldCBvcHRpb25hbCBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0T1MoKSB7DQotCQlyZXR1cm4gb3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIEdldCBvcHRpb25hbCB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLg0KLQkgKiBAcmV0dXJuIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRXUygpIHsNCi0JCXJldHVybiB3czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0IG9wdGlvbmFsIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRPU0FyY2goKSB7DQotCQlyZXR1cm4gYXJjaDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0IG9wdGlvbmFsIGxvY2FsZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7DQotCQlyZXR1cm4gbmw7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmZWF0dXJlIGNhbiBiZSB1c2VkIGFzIGEgcHJpbWFyeSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcHJpbWFyeSBmZWF0dXJlLCANCi0JICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnkoKSB7DQotCQlyZXR1cm4gcHJpbWFyeTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmZWF0dXJlIG11c3QgYmUgcHJvY2Vzc2VkIGFsb25lDQotCSAqIGR1cmluZyBpbnN0YWxsYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24uIEZlYXR1cmVzIHRoYXQNCi0JICogYXJlIG5vdCBleGNsdXNpdmUgY2FuIGJlIGluc3RhbGxlZCBpbiBhIGJhdGNoLg0KLQkgKiANCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmZWF0dXJlIHJlcXVpcmVzDQotCSAqIGV4Y2x1c2l2ZSBwcm9jZXNzaW5nLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1c2l2ZSgpIHsNCi0JCXJldHVybiBleGNsdXNpdmU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhlIGZlYXR1cmUgYXBwbGljYXRpb24NCi0JICogDQotCSAqIEByZXR1cm4gYXBwbGljYXRpb24gaWRlbnRpZmllciwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb24oKSB7DQotCQlyZXR1cm4gYXBwbGljYXRpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhlIGNvbG9jYXRpb24gYWZmaW5pdHkgZmVhdHVyZQ0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFmZmluaXR5RmVhdHVyZSgpIHsNCi0JCXJldHVybiBhZmZpbml0eTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbmQgb3B0aW9uYWwgY3VzdG9tIGluc3RhbGwgaGFuZGxlciBlbnRyeS4NCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFsbCBoYW5kbGVyIGVudHJ5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZg0KLQkgKiBub25lIHdhcyBzcGVjaWZpZWQNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCBnZXRJbnN0YWxsSGFuZGxlck1vZGVsKCkgew0KLQkJLy9kZWxheWVkUmVzb2x2ZSgpOyBubyBkZWxheQ0KLQkJcmV0dXJuIGluc3RhbGxIYW5kbGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGRlc2NyaXB0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIHJlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5TW9kZWwgZ2V0RGVzY3JpcHRpb25Nb2RlbCgpIHsNCi0JCS8vZGVsYXllZFJlc29sdmUoKTsgbm8gZGVsYXkNCi0JCXJldHVybiBkZXNjcmlwdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY29weXJpZ2h0IGluZm9ybWF0aW9uIGZvciB0aGUgZmVhdHVyZS4NCi0JICogDQotCSAqIEByZXR1cm4gY29weXJpZ2h0IGluZm9ybWF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5TW9kZWwgZ2V0Q29weXJpZ2h0TW9kZWwoKSB7DQotCQkvL2RlbGF5ZWRSZXNvbHZlKCk7IG5vIGRlbGF5DQotCQlyZXR1cm4gY29weXJpZ2h0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBsaWNlbnNlIGluZm9ybWF0aW9uIGZvciB0aGUgZmVhdHVyZS4NCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSBsaWNlbnNlLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5TW9kZWwgZ2V0TGljZW5zZU1vZGVsKCkgew0KLQkJLy9kZWxheWVkUmVzb2x2ZSgpOyBubyBkZWxheTsNCi0JCXJldHVybiBsaWNlbnNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGluZm9ybWF0aW9uIGVudHJ5IHJlZmVyZW5jaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUNCi0JICogZmVhdHVyZSB1cGRhdGUgc2l0ZS4NCi0JICogDQotCSAqIEByZXR1cm4gdXBkYXRlIHNpdGUgZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMRW50cnlNb2RlbCBnZXRVcGRhdGVTaXRlRW50cnlNb2RlbCgpIHsNCi0JCS8vZGVsYXllZFJlc29sdmUoKTsgbm8gZGVsYXk7DQotCQlyZXR1cm4gdXBkYXRlU2l0ZUluZm87DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiBhbiBhcnJheSBvZiBpbmZvcm1hdGlvbiBlbnRyaWVzIHJlZmVyZW5jaW5nIGxvY2F0aW9ucyBvZiBvdGhlcg0KLQkgKiB1cGRhdGUgc2l0ZXMuIA0KLQkgKiANCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzaXRlIGVudHJpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMRW50cnlNb2RlbFtdIGdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpIHsNCi0JCS8vZGVsYXllZFJlc29sdmUoKTsgbm8gZGVsYXk7DQotCQlpZiAoZGlzY292ZXJ5U2l0ZUluZm8gPT0gbnVsbCB8fCBkaXNjb3ZlcnlTaXRlSW5mby5zaXplKCkgPT0gMCkNCi0JCQlyZXR1cm4gbmV3IFVSTEVudHJ5TW9kZWxbMF07DQotDQotCQlyZXR1cm4gKFVSTEVudHJ5TW9kZWxbXSkgZGlzY292ZXJ5U2l0ZUluZm8udG9BcnJheShhcnJheVR5cGVGb3IoZGlzY292ZXJ5U2l0ZUluZm8pKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIGEgbGlzdCBvZiBwbHVnLWluIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiByZXF1aXJlZCBwbHVnLWluIGRlcGVuZGVuY2llcywgb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJbXBvcnRNb2RlbFtdIGdldEltcG9ydE1vZGVscygpIHsNCi0JCS8vZGVsYXllZFJlc29sdmUoKTsgbm8gZGVsYXk7DQotCQlpZiAoaW1wb3J0cyA9PSBudWxsIHx8IGltcG9ydHMuc2l6ZSgpID09IDApDQotCQkJcmV0dXJuIG5ldyBJbXBvcnRNb2RlbFswXTsNCi0NCi0JCXJldHVybiAoSW1wb3J0TW9kZWxbXSkgaW1wb3J0cy50b0FycmF5KGFycmF5VHlwZUZvcihpbXBvcnRzKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGx1Zy1pbiBlbnRyaWVzIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGFuIGVycmF5IG9mIHBsdWctaW4gZW50cmllcywgb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBQbHVnaW5FbnRyeU1vZGVsW10gZ2V0UGx1Z2luRW50cnlNb2RlbHMoKSB7DQotCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMuc2l6ZSgpID09IDApDQotCQkJcmV0dXJuIG5ldyBQbHVnaW5FbnRyeU1vZGVsWzBdOw0KLQ0KLQkJcmV0dXJuIChQbHVnaW5FbnRyeU1vZGVsW10pIHBsdWdpbkVudHJpZXMudG9BcnJheShhcnJheVR5cGVGb3IocGx1Z2luRW50cmllcykpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZlcnNpb25lZCBpZGVudGlmaWVyIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHZlcnNpb25lZCBpZGVudGlmaWVyLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldEZlYXR1cmVJbmNsdWRlSWRlbnRpZmllciBpbnN0ZWFkLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllcltdIGdldEZlYXR1cmVJbmNsdWRlVmVyc2lvbmVkSWRlbnRpZmllcigpIHsNCi0JCS8vZGVsYXllZFJlc29sdmUoKTsgbm8gZGVsYXkNCi0JCWlmIChmZWF0dXJlSW5jbHVkZXMgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbmV3IFZlcnNpb25lZElkZW50aWZpZXJbMF07DQotDQotCQkvLw0KLQkJSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVJbmNsdWRlcy5pdGVyYXRvcigpOw0KLQkJVmVyc2lvbmVkSWRlbnRpZmllcltdIHZlcnNpb25JbmNsdWRlZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyW2ZlYXR1cmVJbmNsdWRlcy5zaXplKCldOw0KLQkJaW50IGluZGV4ID0gMDsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KLQkJCUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsIG1vZGVsID0gKEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBpdGVyLm5leHQoKTsNCi0JCQl2ZXJzaW9uSW5jbHVkZWRbaW5kZXhdID0gbW9kZWwuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOw0KLQkJCWluZGV4Kys7DQotCQl9DQotCQlyZXR1cm4gdmVyc2lvbkluY2x1ZGVkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlLg0KLQkgKg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlSW5jbHVkZWQoKSB7DQotCQkvL2RlbGF5ZWRSZXNvbHZlKCk7IG5vIGRlbGF5DQotCQlpZiAoZmVhdHVyZUluY2x1ZGVzID09IG51bGwgfHwgZmVhdHVyZUluY2x1ZGVzLnNpemUoKSA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVswXTsNCi0JCXJldHVybiAoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdKSBmZWF0dXJlSW5jbHVkZXMudG9BcnJheShhcnJheVR5cGVGb3IoZmVhdHVyZUluY2x1ZGVzKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9uLXBsdWctaW4gZW50cmllcyByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZQ0KLQkgKiANCi0JICogQHJldHVybiBhbiBlcnJheSBvZiBub24tcGx1Zy1pbiBlbnRyaWVzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIE5vblBsdWdpbkVudHJ5TW9kZWxbXSBnZXROb25QbHVnaW5FbnRyeU1vZGVscygpIHsNCi0JCWlmIChub25QbHVnaW5FbnRyaWVzID09IG51bGwgfHwgbm9uUGx1Z2luRW50cmllcy5zaXplKCkgPT0gMCkNCi0JCQlyZXR1cm4gbmV3IE5vblBsdWdpbkVudHJ5TW9kZWxbMF07DQotDQotCQlyZXR1cm4gKE5vblBsdWdpbkVudHJ5TW9kZWxbXSkgbm9uUGx1Z2luRW50cmllcy50b0FycmF5KGFycmF5VHlwZUZvcihub25QbHVnaW5FbnRyaWVzKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgaWRlbnRpZmllci4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlSWQgZmVhdHVyZSBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVJZGVudGlmaWVyKFN0cmluZyBmZWF0dXJlSWQpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSB2ZXJzaW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmVWZXJzaW9uIGZlYXR1cmUgdmVyc2lvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlVmVyc2lvbihTdHJpbmcgZmVhdHVyZVZlcnNpb24pIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmZlYXR1cmVWZXJzaW9uID0gZmVhdHVyZVZlcnNpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgZGlzcGxheWFibGUgbGFiZWwuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gbGFiZWwgZGlzcGxheWFibGUgbGFiZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5sYWJlbCA9IGxhYmVsOw0KLQkJdGhpcy5sb2NhbGl6ZWRMYWJlbCA9IG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgcHJvdmlkZXIgZGlzcGxheWFibGUgbGFiZWwuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gcHJvdmlkZXIgcHJvdmlkZXIgZGlzcGxheWFibGUgbGFiZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UHJvdmlkZXIoU3RyaW5nIHByb3ZpZGVyKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOw0KLQkJdGhpcy5sb2NhbGl6ZWRQcm92aWRlciA9IG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHVucmVzb2x2ZWQgVVJMIGZvciB0aGUgZmVhdHVyZSBpbWFnZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBpbWFnZVVSTFN0cmluZyB1bnJlc29sdmVkIFVSTCBzdHJpbmcNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VVUkxTdHJpbmcoU3RyaW5nIGltYWdlVVJMU3RyaW5nKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5pbWFnZVVSTFN0cmluZyA9IGltYWdlVVJMU3RyaW5nOw0KLQkJdGhpcy5pbWFnZVVSTCA9IG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBvcyBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRPUyhTdHJpbmcgb3MpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLm9zID0gb3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSB3cyB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRXUyhTdHJpbmcgd3MpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLndzID0gd3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIG5sIGxvY2FsZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TkwoU3RyaW5nIG5sKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5ubCA9IG5sOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gYXJjaCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoKFN0cmluZyBhcmNoKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5hcmNoID0gYXJjaDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBmZWF0dXJlIGNhbiBhY3QgYXMgYSBwcmltYXJ5IGZlYXR1cmUuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gcHJpbWFyeSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZlYXR1cmUgY2FuIGFjdCBhcyBwcmltYXJ5LA0KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQcmltYXJ5KGJvb2xlYW4gcHJpbWFyeSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMucHJpbWFyeSA9IHByaW1hcnk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGZlYXR1cmUgY2FuIGFjdCBhcyBhIHByaW1hcnkgZmVhdHVyZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBleGNsdXNpdmUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmZWF0dXJlIG11c3QgYmUNCi0JICogcHJvY2Vzc2VkIGluZGVwZW5kZW50bHkgZnJvbSBvdGhlciBmZWF0dXJlcywgPGNvZGU+ZmFsc2U8L2NvZGU+IA0KLQkgKiBpZiBmZWF0dXJlIGNhbiBiZSBwcm9jZXNzZWQgaW4gYSBiYXRjaCB3aXRoIG90aGVyIGZlYXR1cmVzLg0KLQkgKiANCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RXhjbHVzaXZlKGJvb2xlYW4gZXhjbHVzaXZlKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5leGNsdXNpdmUgPSBleGNsdXNpdmU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgYXBwbGljYXRpb24gaWRlbnRpZmllci4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBhcHBsaWNhdGlvbiBmZWF0dXJlIGFwcGxpY2F0aW9uIGlkZW50aWZpZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIGFwcGxpY2F0aW9uKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBGZWF0dXJlIHRoaXMgZmVhdHVyZSBzaG91bGQgYmUNCi0JICogaW5zdGFsbGVkIHdpdGguDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gYWZmaW5pdHkgdGhlIGlkZW50aWZpZXIgb2YgdGhlIEZlYXR1cmUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QWZmaW5pdHlGZWF0dXJlKFN0cmluZyBhZmZpbml0eSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuYWZmaW5pdHkgPSBhZmZpbml0eTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY3VzdG9tIGluc3RhbGwgaGFuZGxlciBmb3IgdGhlIGZlYXR1cmUuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gaW5zdGFsbEhhbmRsZXIgaW5zdGFsbCBoYW5kbGVyIGVudHJ5DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxIYW5kbGVyTW9kZWwoSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsIGluc3RhbGxIYW5kbGVyKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5pbnN0YWxsSGFuZGxlciA9IGluc3RhbGxIYW5kbGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIGRlc2NyaXB0aW9uIGluZm9ybWF0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIGZlYXR1cmUgZGVzY3JpcHRpb24gaW5mb3JtYXRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25Nb2RlbChVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBjb3B5cmlnaHQgZmVhdHVyZSBjb3B5cmlnaHQgaW5mb3JtYXRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0TW9kZWwoVVJMRW50cnlNb2RlbCBjb3B5cmlnaHQpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmNvcHlyaWdodCA9IGNvcHlyaWdodDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSBsaWNlbnNlIGluZm9ybWF0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGxpY2Vuc2UgZmVhdHVyZSBsaWNlbnNlIGluZm9ybWF0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldExpY2Vuc2VNb2RlbChVUkxFbnRyeU1vZGVsIGxpY2Vuc2UpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmxpY2Vuc2UgPSBsaWNlbnNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSB1cGRhdGVTaXRlSW5mbyBmZWF0dXJlIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVTaXRlRW50cnlNb2RlbChVUkxFbnRyeU1vZGVsIHVwZGF0ZVNpdGVJbmZvKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy51cGRhdGVTaXRlSW5mbyA9IHVwZGF0ZVNpdGVJbmZvOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIGFkZGl0aW9uYWwgdXBkYXRlIHNpdGUgcmVmZXJlbmNlcy4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBkaXNjb3ZlcnlTaXRlSW5mbyBhZGRpdGlvbmFsIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZXMNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RGlzY292ZXJ5U2l0ZUVudHJ5TW9kZWxzKFVSTEVudHJ5TW9kZWxbXSBkaXNjb3ZlcnlTaXRlSW5mbykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCWlmIChkaXNjb3ZlcnlTaXRlSW5mbyA9PSBudWxsKQ0KLQkJCXRoaXMuZGlzY292ZXJ5U2l0ZUluZm8gPSBudWxsOw0KLQkJZWxzZQ0KLQkJCXRoaXMuZGlzY292ZXJ5U2l0ZUluZm8gPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZGlzY292ZXJ5U2l0ZUluZm8pKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSBwbHVnLWluIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gaW1wb3J0cyBmZWF0dXJlIHBsdWctaW4gZGVwZW5kZW5jeSBpbmZvcm1hdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJbXBvcnRNb2RlbHMoSW1wb3J0TW9kZWxbXSBpbXBvcnRzKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKGltcG9ydHMgPT0gbnVsbCkNCi0JCQl0aGlzLmltcG9ydHMgPSBudWxsOw0KLQkJZWxzZQ0KLQkJCXRoaXMuaW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChpbXBvcnRzKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgcGx1Zy1pbiByZWZlcmVuY2VzLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIHBsdWdpbkVudHJpZXMgZmVhdHVyZSBwbHVnLWluIHJlZmVyZW5jZXMNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UGx1Z2luRW50cnlNb2RlbHMoUGx1Z2luRW50cnlNb2RlbFtdIHBsdWdpbkVudHJpZXMpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsKQ0KLQkJCXRoaXMucGx1Z2luRW50cmllcyA9IG51bGw7DQotCQllbHNlDQotCQkJdGhpcy5wbHVnaW5FbnRyaWVzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHBsdWdpbkVudHJpZXMpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSBub24tcGx1Zy1pbiBkYXRhIHJlZmVyZW5jZXMuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gbm9uUGx1Z2luRW50cmllcyBmZWF0dXJlIG5vbi1wbHVnLWluIGRhdGEgcmVmZXJlbmNlcw0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXROb25QbHVnaW5FbnRyeU1vZGVscyhOb25QbHVnaW5FbnRyeU1vZGVsW10gbm9uUGx1Z2luRW50cmllcykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCWlmIChub25QbHVnaW5FbnRyaWVzID09IG51bGwpDQotCQkJdGhpcy5ub25QbHVnaW5FbnRyaWVzID0gbnVsbDsNCi0JCWVsc2UNCi0JCQl0aGlzLm5vblBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3Qobm9uUGx1Z2luRW50cmllcykpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIGFuIGFkZGl0aW9uYWwgdXBkYXRlIHNpdGUgcmVmZXJlbmNlLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGRpc2NvdmVyeVNpdGVJbmZvIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbChVUkxFbnRyeU1vZGVsIGRpc2NvdmVyeVNpdGVJbmZvKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKHRoaXMuZGlzY292ZXJ5U2l0ZUluZm8gPT0gbnVsbCkNCi0JCQl0aGlzLmRpc2NvdmVyeVNpdGVJbmZvID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJaWYgKCF0aGlzLmRpc2NvdmVyeVNpdGVJbmZvLmNvbnRhaW5zKGRpc2NvdmVyeVNpdGVJbmZvKSkNCi0JCQl0aGlzLmRpc2NvdmVyeVNpdGVJbmZvLmFkZChkaXNjb3ZlcnlTaXRlSW5mbyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZHMgYSBwbHVnLWluIGRlcGVuZGVuY3kgZW50cnkuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gaW1wb3J0RW50cnkgcGx1Zy1pbiBkZXBlbmRlbmN5IGVudHJ5DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZEltcG9ydE1vZGVsKEltcG9ydE1vZGVsIGltcG9ydEVudHJ5KSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKHRoaXMuaW1wb3J0cyA9PSBudWxsKQ0KLQkJCXRoaXMuaW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWlmICghdGhpcy5pbXBvcnRzLmNvbnRhaW5zKGltcG9ydEVudHJ5KSkNCi0JCQl0aGlzLmltcG9ydHMuYWRkKGltcG9ydEVudHJ5KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkcyBhIHBsdWctaW4gcmVmZXJlbmNlLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIHBsdWdpbkVudHJ5IHBsdWctaW4gcmVmZXJlbmNlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5TW9kZWwoUGx1Z2luRW50cnlNb2RlbCBwbHVnaW5FbnRyeSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCWlmICh0aGlzLnBsdWdpbkVudHJpZXMgPT0gbnVsbCkNCi0JCQl0aGlzLnBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQkvL1BFUkY6IG5vIExpc3RDb250YWlucygpDQotCQkvL2lmICghdGhpcy5wbHVnaW5FbnRyaWVzLmNvbnRhaW5zKHBsdWdpbkVudHJ5KSkNCi0JCXRoaXMucGx1Z2luRW50cmllcy5hZGQocGx1Z2luRW50cnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIGEgZmVhdHVyZSBpZGVudGlmaWVyLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiBAcGFyYW0gaW5jbHVkZSB0aGUgaW5jbHVkZWQgZmVhdHVyZQ0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBpbmNsdWRlKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKHRoaXMuZmVhdHVyZUluY2x1ZGVzID09IG51bGwpDQotCQkJdGhpcy5mZWF0dXJlSW5jbHVkZXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQkvL1BFUkY6IG5vIExpc3RDb250YWlucygpDQotCQkvL2lmICghdGhpcy5mZWF0dXJlSW5jbHVkZXMuY29udGFpbnMoaW5jbHVkZSkpDQotCQl0aGlzLmZlYXR1cmVJbmNsdWRlcy5hZGQoaW5jbHVkZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZHMgYSBub24tcGx1Zy1pbiBkYXRhIHJlZmVyZW5jZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBub25QbHVnaW5FbnRyeSBub24tcGx1Zy1pbiBkYXRhIHJlZmVyZW5jZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGROb25QbHVnaW5FbnRyeU1vZGVsKE5vblBsdWdpbkVudHJ5TW9kZWwgbm9uUGx1Z2luRW50cnkpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAodGhpcy5ub25QbHVnaW5FbnRyaWVzID09IG51bGwpDQotCQkJdGhpcy5ub25QbHVnaW5FbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJLy9QRVJGOiBubyBMaXN0Q29udGFpbnMoKQ0KLQkJLy9pZiAoIXRoaXMubm9uUGx1Z2luRW50cmllcy5jb250YWlucyhub25QbHVnaW5FbnRyeSkpDQotCQl0aGlzLm5vblBsdWdpbkVudHJpZXMuYWRkKG5vblBsdWdpbkVudHJ5KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyBhbiB1cGRhdGUgc2l0ZSByZWZlcmVuY2UuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gZGlzY292ZXJ5U2l0ZUluZm8gdXBkYXRlIHNpdGUgcmVmZXJlbmNlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZURpc2NvdmVyeVNpdGVFbnRyeU1vZGVsKFVSTEVudHJ5TW9kZWwgZGlzY292ZXJ5U2l0ZUluZm8pIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAodGhpcy5kaXNjb3ZlcnlTaXRlSW5mbyAhPSBudWxsKQ0KLQkJCXRoaXMuZGlzY292ZXJ5U2l0ZUluZm8ucmVtb3ZlKGRpc2NvdmVyeVNpdGVJbmZvKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyBhIHBsdWctaW4gZGVwZW5kZW5jeSBlbnRyeS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBpbXBvcnRFbnRyeSBwbHVnLWluIGRlcGVuZGVuY3kgZW50cnkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlSW1wb3J0TW9kZWwoSW1wb3J0TW9kZWwgaW1wb3J0RW50cnkpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAodGhpcy5pbXBvcnRzICE9IG51bGwpDQotCQkJdGhpcy5pbXBvcnRzLnJlbW92ZShpbXBvcnRFbnRyeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgYSBwbHVnLWluIHJlZmVyZW5jZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBwbHVnaW5FbnRyeSBwbHVnLWluIHJlZmVyZW5jZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVQbHVnaW5FbnRyeU1vZGVsKFBsdWdpbkVudHJ5TW9kZWwgcGx1Z2luRW50cnkpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAodGhpcy5wbHVnaW5FbnRyaWVzICE9IG51bGwpDQotCQkJdGhpcy5wbHVnaW5FbnRyaWVzLnJlbW92ZShwbHVnaW5FbnRyeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgYSBub24tcGx1Zy1pbiBkYXRhIHJlZmVyZW5jZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBub25QbHVnaW5FbnRyeSBub24tcGx1Zy1pbiBkYXRhIHJlZmVyZW5jZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVOb25QbHVnaW5FbnRyeU1vZGVsKE5vblBsdWdpbkVudHJ5TW9kZWwgbm9uUGx1Z2luRW50cnkpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAodGhpcy5ub25QbHVnaW5FbnRyaWVzICE9IG51bGwpDQotCQkJdGhpcy5ub25QbHVnaW5FbnRyaWVzLnJlbW92ZShub25QbHVnaW5FbnRyeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIE1hcmtzIHRoZSBtb2RlbCBvYmplY3QgYXMgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgbWFya1JlYWRPbmx5KCkgew0KLQkJc3VwZXIubWFya1JlYWRPbmx5KCk7DQotCQltYXJrUmVmZXJlbmNlUmVhZE9ubHkoZ2V0RGVzY3JpcHRpb25Nb2RlbCgpKTsNCi0JCW1hcmtSZWZlcmVuY2VSZWFkT25seShnZXRDb3B5cmlnaHRNb2RlbCgpKTsNCi0JCW1hcmtSZWZlcmVuY2VSZWFkT25seShnZXRMaWNlbnNlTW9kZWwoKSk7DQotCQltYXJrUmVmZXJlbmNlUmVhZE9ubHkoZ2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoKSk7DQotCQltYXJrTGlzdFJlZmVyZW5jZVJlYWRPbmx5KGdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpKTsNCi0JCW1hcmtMaXN0UmVmZXJlbmNlUmVhZE9ubHkoZ2V0SW1wb3J0TW9kZWxzKCkpOw0KLQkJbWFya0xpc3RSZWZlcmVuY2VSZWFkT25seShnZXRQbHVnaW5FbnRyeU1vZGVscygpKTsNCi0JCW1hcmtMaXN0UmVmZXJlbmNlUmVhZE9ubHkoZ2V0Tm9uUGx1Z2luRW50cnlNb2RlbHMoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlc29sdmUgdGhlIG1vZGVsIG9iamVjdC4NCi0JICogQW55IFVSTCBzdHJpbmdzIGluIHRoZSBtb2RlbCBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIA0KLQkgKiBiYXNlIFVSTCBhcmd1bWVudC4gQW55IHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIHRoZSBtb2RlbCB0aGF0IGFyZQ0KLQkgKiBzcGVjaWZpZWQgYXMgdHJhbnNsYXRpb24ga2V5cyBhcmUgbG9jYWxpemVkIHVzaW5nIHRoZSBzdXBwbGllZCANCi0JICogcmVzb3VyY2UgYnVuZGxlLg0KLQkgKiANCi0JICogQHBhcmFtIGJhc2UgVVJMDQotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIHVybA0KLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJdGhpcy5idW5kbGVVUkwgPSBidW5kbGVVUkw7DQotCQl0aGlzLmJhc2UgPSBiYXNlOw0KLQ0KLQkJLy8gcGx1Z2luIGVudHJ5IGFuZCBub25wbHVnaW5lbnRyeSBhcmUgb3B0aW1pemVkIHRvbw0KLQkJcmVzb2x2ZUxpc3RSZWZlcmVuY2UoZ2V0UGx1Z2luRW50cnlNb2RlbHMoKSwgYmFzZSwgYnVuZGxlVVJMKTsNCi0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldE5vblBsdWdpbkVudHJ5TW9kZWxzKCksIGJhc2UsIGJ1bmRsZVVSTCk7DQotCQkNCi0JCS8vVVJMU2l0ZU1vZGVsIGFyZSBvcHRpbWl6ZWQNCi0JCXJlc29sdmVSZWZlcmVuY2UoZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLGJhc2UsIGJ1bmRsZVVSTCk7DQotCQlyZXNvbHZlUmVmZXJlbmNlKGdldENvcHlyaWdodE1vZGVsKCksYmFzZSwgYnVuZGxlVVJMKTsNCi0JCXJlc29sdmVSZWZlcmVuY2UoZ2V0TGljZW5zZU1vZGVsKCksYmFzZSwgYnVuZGxlVVJMKTsNCi0JCXJlc29sdmVSZWZlcmVuY2UoZ2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoKSxiYXNlLCBidW5kbGVVUkwpOw0KLQkJcmVzb2x2ZUxpc3RSZWZlcmVuY2UoZ2V0RGlzY292ZXJ5U2l0ZUVudHJ5TW9kZWxzKCksYmFzZSwgYnVuZGxlVVJMKTsNCi0JCQ0KLQkJLy8gSW1wb3J0IE1vZGVscyBhcmUgb3B0aW1pemVkDQotCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRJbXBvcnRNb2RlbHMoKSxiYXNlLCBidW5kbGVVUkwpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBkZWxheWVkUmVzb2x2ZSgpIHsNCi0NCi0JCS8vIFBFUkY6IGRlbGF5IHJlc29sdXRpb24NCi0JCWlmIChyZXNvbHZlZCkNCi0JCQlyZXR1cm47DQotDQotCQlyZXNvbHZlZCA9IHRydWU7DQotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzDQotCQlsb2NhbGl6ZWRMYWJlbCA9IHJlc29sdmVOTFN0cmluZyhidW5kbGVVUkwsIGxhYmVsKTsNCi0JCWxvY2FsaXplZFByb3ZpZGVyID0gcmVzb2x2ZU5MU3RyaW5nKGJ1bmRsZVVSTCwgcHJvdmlkZXIpOw0KLQkJdHJ5IHsNCi0JCQlpbWFnZVVSTCA9IHJlc29sdmVVUkwoYmFzZSxidW5kbGVVUkwsIGltYWdlVVJMU3RyaW5nKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIiIsZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogTWV0aG9kIHNldFByaW1hcnlQbHVnaW4uDQotCSAqIEBwYXJhbSBwbHVnaW4NCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFByaW1hcnlQbHVnaW5JRChTdHJpbmcgcGx1Z2luKSB7DQotCQlpZiAocHJpbWFyeSAmJiBwcmltYXJ5UGx1Z2luSUQgPT0gbnVsbCkgew0KLQkJCXByaW1hcnlQbHVnaW5JRCA9IGZlYXR1cmVJZDsNCi0JCX0NCi0JCXByaW1hcnlQbHVnaW5JRCA9IHBsdWdpbjsNCi0JfQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcHJpbWFyeVBsdWdpbklELg0KLQkgKiBAcmV0dXJuIFN0cmluZw0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5UGx1Z2luSUQoKSB7DQotCQlyZXR1cm4gcHJpbWFyeVBsdWdpbklEOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZmVhdHVyZSBpcyBwYXRjaGluZyBhbm90aGVyIGZlYXR1cmUsDQotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHJldHVybiBib29sZWFuDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhdGNoKCkgew0KLQkJSW1wb3J0TW9kZWxbXSBpbXBvcnRzID0gZ2V0SW1wb3J0TW9kZWxzKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoaW1wb3J0c1tpXS5pc1BhdGNoKCkpDQotCQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRmVhdHVyZU1vZGVsRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9GZWF0dXJlTW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDhhMjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9GZWF0dXJlTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy54bWwuc2F4Lio7DQotDQotLyoqDQotICogRGVmYXVsdCBmZWF0dXJlIG1vZGVsIGZhY3RvcnkuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gSG93ZXZlciwgaW4gbW9zdCANCi0gKiBjYXNlcyBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBiYXNlIGltcGxlbWVudGF0aW9uIA0KLSAqIG9mIHRoaXMgZmFjdG9yeS4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZUZlYXR1cmVGYWN0b3J5DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlTW9kZWxGYWN0b3J5IHsNCi0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgZGVmYXVsdCBtb2RlbCBmYWN0b3J5Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEZlYXR1cmVNb2RlbEZhY3RvcnkoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuZCBwb3B1bGF0ZXMgYSBkZWZhdWx0IGZlYXR1cmUgZnJvbSBzdHJlYW0uDQotCSAqIFRoZSBwYXJzZXIgYXNzdW1lcyB0aGUgc3RyZWFtIGNvbnRhaW5zIGEgZGVmYXVsdCBmZWF0dXJlIG1hbmlmZXN0DQotCSAqIChmZWF0dXJlLnhtbCkgYXMgZG9jdW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uDQotCSAqIA0KLQkgKiBAcGFyYW0gc3RyZWFtIGZlYXR1cmUgc3RyZWFtDQotCSAqIEByZXR1cm4gcG9wdWxhdGVkIGZlYXR1cmUgbW9kZWwNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBGZWF0dXJlTW9kZWwgcGFyc2VGZWF0dXJlKElucHV0U3RyZWFtIHN0cmVhbSkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gew0KLQkJcGFyc2VyLmluaXQodGhpcyk7DQotCQlGZWF0dXJlTW9kZWwgZmVhdHVyZU1vZGVsID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJZmVhdHVyZU1vZGVsID0gcGFyc2VyLnBhcnNlKHN0cmVhbSk7DQotCQkJaWYgKHBhcnNlci5nZXRTdGF0dXMoKSE9bnVsbCkgew0KLQkJCQkvLyBzb21lIGludGVybmFsRXJyb3Igd2VyZSBkZXRlY3RlZA0KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHBhcnNlci5nZXRTdGF0dXMoKTsNCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsNCi0JCQl9DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkZlYXR1cmVNb2RlbEZhY3RvcnkuRXJyb3JBY2Nlc2luZ0ZlYXR1cmVTdHJlYW0iKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBmZWF0dXJlTW9kZWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgZmVhdHVyZSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgRmVhdHVyZU1vZGVsDQotCSAqIEByZXR1cm4gZmVhdHVyZSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgRmVhdHVyZU1vZGVsIGNyZWF0ZUZlYXR1cmVNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgRmVhdHVyZU1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgaW5jbHVkZWQgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsDQotCSAqIEByZXR1cm4gZmVhdHVyZSBtb2RlbA0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwgY3JlYXRlSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgaW5zdGFsbCBoYW5kbGVyIG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwNCi0JICogQHJldHVybiBpbnN0YWxsIGhhbmRsZXIgZW50cnkgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCBjcmVhdGVJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IEluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IGltcG9ydCBkZXBlbmRlbmN5IG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBJbXBvcnRNb2RlbA0KLQkgKiBAcmV0dXJuIGltcG9ydCBkZXBlbmRlbmN5IG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJbXBvcnRNb2RlbCBjcmVhdGVJbXBvcnRNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgSW1wb3J0TW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgZGVmYXVsdCBwbHVnLWluIGVudHJ5IG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBQbHVnaW5FbnRyeU1vZGVsDQotCSAqIEByZXR1cm4gcGx1Zy1pbiBlbnRyeSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgUGx1Z2luRW50cnlNb2RlbCBjcmVhdGVQbHVnaW5FbnRyeU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBQbHVnaW5FbnRyeU1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgbm9uLXBsdWctaW4gZW50cnkgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIE5vblBsdWdpbkVudHJ5TW9kZWwNCi0JICogQHJldHVybiBub24tcGx1Zy1pbiBlbnRyeSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgTm9uUGx1Z2luRW50cnlNb2RlbCBjcmVhdGVOb25QbHVnaW5FbnRyeU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBOb25QbHVnaW5FbnRyeU1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgYW5ub3RhdGVkIFVSTCBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgVVJMRW50cnlNb2RlbA0KLQkgKiBAcmV0dXJuIGFubm90YXRlZCBVUkwgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5TW9kZWwgY3JlYXRlVVJMRW50cnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgVVJMRW50cnlNb2RlbCgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRmVhdHVyZVJlZmVyZW5jZU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGYyMjU4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRmVhdHVyZVJlZmVyZW5jZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogRmVhdHVyZSByZWZlcmVuY2UgbW9kZWwgb2JqZWN0Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgDQotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgDQotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZVJlZmVyZW5jZQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3Qgew0KLQ0KLQlwcml2YXRlIFN0cmluZyB0eXBlOw0KLQlwcml2YXRlIFVSTCB1cmw7DQotCXByaXZhdGUgU3RyaW5nIHVybFN0cmluZzsNCi0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZUlkOw0KLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlVmVyc2lvbjsNCi0JcHJpdmF0ZSBTaXRlTW9kZWwgc2l0ZTsNCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7DQotCXByaXZhdGUgU3RyaW5nIGxvY2FsaXplZExhYmVsOw0KLQ0KLQkvLyBwZXJmb3JtYW5jZQ0KLQlwcml2YXRlIFVSTCBidW5kbGVVUkw7DQotCXByaXZhdGUgVVJMIGJhc2U7DQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlZCA9IGZhbHNlOw0KLQlwcml2YXRlIFN0cmluZyBvczsNCi0JcHJpdmF0ZSBTdHJpbmcgd3M7DQotCXByaXZhdGUgU3RyaW5nIG5sOw0KLQlwcml2YXRlIFN0cmluZyBhcmNoOw0KLQlwcml2YXRlIFN0cmluZyBwYXRjaDsJDQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwgb2JqZWN0Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIEZlYXR1cmVSZWZlcmVuY2VNb2RlbC4NCi0JICogQHBhcmFtIHJlZg0KLQkgKi8NCi0JcHVibGljIEZlYXR1cmVSZWZlcmVuY2VNb2RlbChGZWF0dXJlUmVmZXJlbmNlTW9kZWwgcmVmKSB7DQotCQlzZXRGZWF0dXJlSWRlbnRpZmllcihyZWYuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSk7DQotCQlzZXRGZWF0dXJlVmVyc2lvbihyZWYuZ2V0RmVhdHVyZVZlcnNpb24oKSk7DQotCQlzZXRUeXBlKHJlZi5nZXRUeXBlKCkpOw0KLQkJc2V0U2l0ZU1vZGVsKHJlZi5nZXRTaXRlTW9kZWwoKSk7DQotCQlzZXRMYWJlbChyZWYuZ2V0TGFiZWwoKSk7DQotCQlzZXRXUyhyZWYuZ2V0V1MoKSk7DQotCQlzZXRPUyhyZWYuZ2V0T1MoKSk7DQotCQlzZXRBcmNoKHJlZi5nZXRPU0FyY2goKSk7DQotCQlzZXROTChyZWYuZ2V0TkwoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbXBhcmVzIDIgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWxzIGZvciBlcXVhbGl0eQ0KLQkgKiAgDQotCSAqIEBwYXJhbSBvYmplY3QgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwgdG8gY29tcGFyZSB3aXRoDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBtb2RlbHMgYXJlIGVxdWFsLCANCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsNCi0NCi0JCWlmIChvYmplY3QgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlpZiAoZ2V0VVJMKCkgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlUmVmZXJlbmNlTW9kZWwpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmID0gKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgb2JqZWN0Ow0KLQ0KLQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGdldFVSTCgpLCBmLmdldFVSTCgpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIHR5cGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0DQotCSAqIGZlYXR1cmUgdHlwZSBmb3IgdGhlIHNpdGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLQkJcmV0dXJuIHR5cGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpdGUgbW9kZWwgZm9yIHRoZSByZWZlcmVuY2UuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHNpdGUgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFNpdGVNb2RlbCBnZXRTaXRlTW9kZWwoKSB7DQotCQlyZXR1cm4gc2l0ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCBVUkwgc3RyaW5nIGZvciB0aGUgcmVmZXJlbmNlLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHVybCBzdHJpbmcNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRVUkxTdHJpbmcoKSB7DQotCQlyZXR1cm4gdXJsU3RyaW5nOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBVUkwgZm9yIHRoZSBmZWF0dXJlIHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEByZXR1cm4gdXJsIHN0cmluZw0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCWRlbGF5ZWRSZXNvbHZlKCk7DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIgYXMgYSBzdHJpbmcNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2UjZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpDQotCSAqIEByZXR1cm4gZmVhdHVyZSBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSB7DQotCQlyZXR1cm4gZmVhdHVyZUlkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHZlcnNpb24gYXMgYSBzdHJpbmcNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2UjZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpDQotCSAqIEByZXR1cm4gZmVhdHVyZSB2ZXJzaW9uIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVWZXJzaW9uKCkgew0KLQkJcmV0dXJuIGZlYXR1cmVWZXJzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgdHlwZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlIHJlZmVyZW5jZWQgZmVhdHVyZSB0eXBlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLnR5cGUgPSB0eXBlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBzaXRlIGZvciB0aGUgcmVmZXJlbmNlZC4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBzaXRlIHNpdGUgZm9yIHRoZSByZWZlcmVuY2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2l0ZU1vZGVsKFNpdGVNb2RlbCBzaXRlKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5zaXRlID0gc2l0ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdW5yZXNvbHZlZCBVUkwgZm9yIHRoZSBmZWF0dXJlIHJlZmVyZW5jZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSB1cmxTdHJpbmcgdW5yZXNvbHZlZCBVUkwgc3RyaW5nDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFVSTFN0cmluZyhTdHJpbmcgdXJsU3RyaW5nKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy51cmxTdHJpbmcgPSB1cmxTdHJpbmc7DQotCQl0aGlzLnVybCA9IG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgaWRlbnRpZmllci4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlSWQgZmVhdHVyZSBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVJZGVudGlmaWVyKFN0cmluZyBmZWF0dXJlSWQpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSB2ZXJzaW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmVWZXJzaW9uIGZlYXR1cmUgdmVyc2lvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlVmVyc2lvbihTdHJpbmcgZmVhdHVyZVZlcnNpb24pIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmZlYXR1cmVWZXJzaW9uID0gZmVhdHVyZVZlcnNpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlc29sdmUgdGhlIG1vZGVsIG9iamVjdC4NCi0JICogQW55IFVSTCBzdHJpbmdzIGluIHRoZSBtb2RlbCBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIA0KLQkgKiBiYXNlIFVSTCBhcmd1bWVudC4gQW55IHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIHRoZSBtb2RlbCB0aGF0IGFyZQ0KLQkgKiBzcGVjaWZpZWQgYXMgdHJhbnNsYXRpb24ga2V5cyBhcmUgbG9jYWxpemVkIHVzaW5nIHRoZSBzdXBwbGllZCANCi0JICogcmVzb3VyY2UgYnVuZGxlLg0KLQkgKiANCi0JICogQHBhcmFtIGJhc2UgVVJMDQotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTA0KLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJdGhpcy5iYXNlID0gYmFzZTsNCi0JCXRoaXMuYnVuZGxlVVJMID0gYnVuZGxlVVJMOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBkZWxheWVkUmVzb2x2ZSgpIHsNCi0NCi0JCS8vIFBFUkY6IGRlbGF5IHJlc29sdXRpb24NCi0JCWlmIChyZXNvbHZlZCkNCi0JCQlyZXR1cm47DQotDQotCQlyZXNvbHZlZCA9IHRydWU7DQotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzDQotCQlsb2NhbGl6ZWRMYWJlbCA9IHJlc29sdmVOTFN0cmluZyhidW5kbGVVUkwsIGxhYmVsKTsNCi0JCXRyeSB7DQotCQkJdXJsID0gcmVzb2x2ZVVSTChiYXNlLCBidW5kbGVVUkwsIHVybFN0cmluZyk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7DQotCQkJVXBkYXRlQ29yZS53YXJuKCIiLGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJYnVmZmVyLmFwcGVuZChnZXRDbGFzcygpLnRvU3RyaW5nKCkgKyAiIDoiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYnVmZmVyLmFwcGVuZCgiIGF0ICIpOyAvLyROT04tTkxTLTEkDQotCQlpZiAodXJsICE9IG51bGwpDQotCQkJYnVmZmVyLmFwcGVuZCh1cmwudG9FeHRlcm5hbEZvcm0oKSk7DQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuTW9kZWxPYmplY3QjZ2V0UHJvcGVydHlOYW1lKCkNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgew0KLQkJcmV0dXJuIFNpdGUuU0lURV9GSUxFOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0cmlldmUgdGhlIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgZmVhdHVyZSByZWZlcmVuY2UuIElmIHRoZSBtb2RlbA0KLQkgKiBvYmplY3QgaGFzIGJlZW4gcmVzb2x2ZWQsIHRoZSBsYWJlbCBpcyBsb2NhbGl6ZWQuDQotCSAqDQotCSAqIEByZXR1cm4gZGlzcGxheWFibGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgew0KLQkJZGVsYXllZFJlc29sdmUoKTsNCi0JCWlmIChsb2NhbGl6ZWRMYWJlbCAhPSBudWxsKQ0KLQkJCXJldHVybiBsb2NhbGl6ZWRMYWJlbDsNCi0JCWVsc2UNCi0JCQlyZXR1cm4gbGFiZWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIHRoZSBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgZmVhdHVyZSByZWZlcmVuY2UuDQotCSAqDQotCSAqIEByZXR1cm4gbm9uLWxvY2FsaXplZCBkaXNwbGF5YWJsZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxOb25Mb2NhbGl6ZWQoKSB7DQotCQlyZXR1cm4gbGFiZWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGxhYmVsLg0KLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7DQotCQl0aGlzLmxhYmVsID0gbGFiZWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIEdldCBvcHRpb25hbCBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsNCi0JCXJldHVybiBvczsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogR2V0IG9wdGlvbmFsIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgew0KLQkJcmV0dXJuIHdzOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBHZXQgb3B0aW9uYWwgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4NCi0JICoNCi0JICogQHJldHVybiB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0T1NBcmNoKCkgew0KLQkJcmV0dXJuIGFyY2g7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIEdldCBvcHRpb25hbCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7DQotCQlyZXR1cm4gbmw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIG9zIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0DQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE9TKFN0cmluZyBvcykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMub3MgPSBvczsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gd3Mgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QNCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0V1MoU3RyaW5nIHdzKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy53cyA9IHdzOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBsb2NhbGUgc3BlY2lmaWNhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIG5sIGxvY2FsZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QNCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TkwoU3RyaW5nIG5sKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5ubCA9IG5sOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSBhcmNoIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0DQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEFyY2goU3RyaW5nIGFyY2gpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmFyY2ggPSBhcmNoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBwYXRjaCBtb2RlLg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQYXRjaCgpIHsNCi0JCXJldHVybiBwYXRjaDsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgcGF0Y2ggbW9kZS4NCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBhdGNoKFN0cmluZyBwYXRjaCkgew0KLQkJdGhpcy5wYXRjaCA9IHBhdGNoOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW1wb3J0TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW1wb3J0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxY2U0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ltcG9ydE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotLyoqDQotICogUGx1Zy1pbiBkZXBlbmRlbmN5IG1vZGVsIG9iamVjdC4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IA0KLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIA0KLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kZWwuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkltcG9ydA0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW1wb3J0TW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7DQotDQotCXByaXZhdGUgU3RyaW5nIGlkOw0KLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOw0KLQlwcml2YXRlIFN0cmluZyBtYXRjaGluZ0lkUnVsZU5hbWU7DQotCXByaXZhdGUgU3RyaW5nIG1hdGNoaW5nUnVsZU5hbWU7DQotCXByaXZhdGUgYm9vbGVhbiBmZWF0dXJlSW1wb3J0Ow0KLQlwcml2YXRlIGJvb2xlYW4gcGF0Y2g7DQotCXByaXZhdGUgU3RyaW5nIG9zQXJjaDsNCi0JcHJpdmF0ZSBTdHJpbmcgd3M7DQotCXByaXZhdGUgU3RyaW5nIG9zOw0KLQlwcml2YXRlIFN0cmluZyBubDsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSB1bmluaXRpYWxpemVkIHBsdWctaW4gZGVwZW5kZW5jeSBtb2RlbCBvYmplY3QuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSW1wb3J0TW9kZWwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbnQgcGx1Zy1pbiBpZGVudGlmaWVyLg0KLQkgKg0KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0SWRlbnRpZmllcigpIGluc3RlYWQNCi0JICogQHJldHVybiBwbHVnLWluIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkZW50aWZpZXIoKSB7DQotCQlyZXR1cm4gaWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRlcGVuZGVudCBpZGVudGlmaWVyLg0KLQkgKg0KLQkgKiBAcmV0dXJuICBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMC4yDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7DQotCQlyZXR1cm4gaWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRlcGVuZGVudCBwbHVnLWluIHZlcnNpb24uDQotCSAqDQotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRWZXJzaW9uKCkgaW5zdGVhZA0KLQkgKiBAcmV0dXJuIHBsdWctaW4gdmVyc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luVmVyc2lvbigpIHsNCi0JCXJldHVybiB2ZXJzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbnQgdmVyc2lvbi4NCi0JICoNCi0JICogQHJldHVybiB2ZXJzaW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMC4yDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7DQotCQlyZXR1cm4gdmVyc2lvbjsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRlcGVuZGVudCB2ZXJzaW9uIG1hdGNoaW5nIHJ1bGUgbmFtZS4NCi0JICoNCi0JICogQHJldHVybiBtYXRjaGluZyBydWxlIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nUnVsZU5hbWUoKSB7DQotCQlyZXR1cm4gbWF0Y2hpbmdSdWxlTmFtZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRlcGVuZGVudCBpZCBtYXRjaGluZyBydWxlIG5hbWUuDQotCSAqDQotCSAqIEByZXR1cm4gbWF0Y2hpbmcgcnVsZSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0lkUnVsZU5hbWUoKSB7DQotCQlyZXR1cm4gbWF0Y2hpbmdJZFJ1bGVOYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBkZXBlbmRlbnQgcGx1Zy1pbiBpZGVudGlmaWVyLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0SWRlbnRpZmllcigpDQotCSAqIEBwYXJhbSBwbHVnaW5JZCBkZXBlbmRlbnQgcGx1Zy1pbiBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBsdWdpbklkZW50aWZpZXIoU3RyaW5nIHBsdWdpbklkKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5pZCA9IHBsdWdpbklkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBkZXBlbmRlbnQgcGx1Zy1pbiB2ZXJzaW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0VmVyc2lvbigpDQotCSAqIEBwYXJhbSBwbHVnaW5WZXJzaW9uIGRlcGVuZGVudCBwbHVnLWluIHZlcnNpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UGx1Z2luVmVyc2lvbihTdHJpbmcgcGx1Z2luVmVyc2lvbikgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMudmVyc2lvbiA9IHBsdWdpblZlcnNpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGRlcGVuZGVudCBpZGVudGlmaWVyLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gaWQgZGVwZW5kZW50IGlkZW50aWZpZXINCi0JICogQHNpbmNlIDIuMC4yDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpZCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuaWQgPSBpZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZGVwZW5kZW50IHZlcnNpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSB2ZXJzaW9uIGRlcGVuZGVudCB2ZXJzaW9uDQotCSAqIEBzaW5jZSAyLjAuMg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBkZXBlbmRlbnQgdmVyc2lvbiBtYXRjaGluZyBydWxlIG5hbWUuIA0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gbWF0Y2hpbmdSdWxlTmFtZSBkZXBlbmRlbnQgdmVyc2lvbiBtYXRjaGluZyBydWxlLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRNYXRjaGluZ1J1bGVOYW1lKFN0cmluZyBtYXRjaGluZ1J1bGVOYW1lKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5tYXRjaGluZ1J1bGVOYW1lID0gbWF0Y2hpbmdSdWxlTmFtZTsNCi0JfQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZGVwZW5kZW50IGlkIG1hdGNoaW5nIHJ1bGUgbmFtZS4gDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSBtYXRjaGluZ0lkUnVsZU5hbWUgZGVwZW5kZW50IGlkIG1hdGNoaW5nIHJ1bGUuDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE1hdGNoaW5nSWRSdWxlTmFtZShTdHJpbmcgbWF0Y2hpbmdJZFJ1bGVOYW1lKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5tYXRjaGluZ0lkUnVsZU5hbWUgPSBtYXRjaGluZ0lkUnVsZU5hbWU7DQotCX0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGlzRmVhdHVyZUltcG9ydC4NCi0JICogQHJldHVybiBib29sZWFuDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZlYXR1cmVJbXBvcnQoKSB7DQotCQlyZXR1cm4gZmVhdHVyZUltcG9ydDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmVJbXBvcnQuDQotCSAqIEBwYXJhbSBmZWF0dXJlSW1wb3J0IFRoZSBmZWF0dXJlSW1wb3J0IHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZUltcG9ydChib29sZWFuIGZlYXR1cmVJbXBvcnQpIHsNCi0JCXRoaXMuZmVhdHVyZUltcG9ydCA9IGZlYXR1cmVJbXBvcnQ7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBwYXRjaCBtb2RlLg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpIHsNCi0JCXJldHVybiBwYXRjaDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFNldHMgdGhlIHBhdGNoIG1vZGUuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQYXRjaChib29sZWFuIHBhdGNoKSB7DQotCQl0aGlzLnBhdGNoID0gcGF0Y2g7DQotCX0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG9zLg0KLQkgKiBAcmV0dXJuIFN0cmluZw0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsNCi0JCXJldHVybiBvczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgb3NBcmNoLg0KLQkgKiBAcmV0dXJuIFN0cmluZw0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRPU0FyY2goKSB7DQotCQlyZXR1cm4gb3NBcmNoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB3cy4NCi0JICogQHJldHVybiBTdHJpbmcNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0V1MoKSB7DQotCQlyZXR1cm4gd3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG9zLg0KLQkgKiBAcGFyYW0gb3MgVGhlIG9zIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0T1MoU3RyaW5nIG9zKSB7DQotCQl0aGlzLm9zID0gb3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG9zQXJjaC4NCi0JICogQHBhcmFtIG9zQXJjaCBUaGUgb3NBcmNoIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0T1NBcmNoKFN0cmluZyBvc0FyY2gpIHsNCi0JCXRoaXMub3NBcmNoID0gb3NBcmNoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB3cy4NCi0JICogQHBhcmFtIHdzIFRoZSB3cyB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFdTKFN0cmluZyB3cykgew0KLQkJdGhpcy53cyA9IHdzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBubC4NCi0JICogQHJldHVybiBTdHJpbmcNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7DQotCQlyZXR1cm4gbmw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG5sLg0KLQkgKiBAcGFyYW0gbmwgVGhlIG5sIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TkwoU3RyaW5nIG5sKSB7DQotCQl0aGlzLm5sID0gbmw7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9JbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9JbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWExOWVmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotCi0vKioKLSAqIEluY2x1ZGVkIEZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIG9iamVjdC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gSG93ZXZlciwgaW4gbW9zdCAKLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIAotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZXh0ZW5kcyBGZWF0dXJlUmVmZXJlbmNlIHsKLQotCS8vIHNpbmNlIDIuMC4yCi0JcHJpdmF0ZSBib29sZWFuIGlzT3B0aW9uYWw7Ci0JcHJpdmF0ZSBpbnQgc2VhcmNoTG9jYXRpb247Ci0JCi0JLy8gVGhlc2UgYXJlIGFscmVhZHkgZGVmaW5lZCBieSBGZWF0dXJlUmVmZXJlbmNlTW9kZWwsIHdlIGRvbid0IG5lZWQgdG8gZHVwbGljYXRlIHRoZW0gaGVyZQotLy8JLy8gc2luY2UgMi4xCi0vLwlwcml2YXRlIFN0cmluZyBvczsKLS8vCXByaXZhdGUgU3RyaW5nIHdzOwotLy8JcHJpdmF0ZSBTdHJpbmcgYXJjaDsKLS8vCXByaXZhdGUgU3RyaW5nIG5sOwotLy8JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgaW5jbHVkZWQgZmVhdHVyZSByZWZlcmVuY2UKLQkgKiAKLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCkgewotCQlzdXBlcigpOwotCQlpc09wdGlvbmFsKGZhbHNlKTsKLQkJc2V0U2VhcmNoTG9jYXRpb24oSVVwZGF0ZUNvbnN0YW50cy5TRUFSQ0hfUk9PVCk7Ci0JfQotCQotCQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGVkRmVhdHVyZVJlZiB0aGUgaW5jbHVkZWQgcmVmZXJlbmNlIG1vZGVsIHRvIGNvcHkKLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGluY2x1ZGVkRmVhdHVyZVJlZikgewotCQlzdXBlcigoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKWluY2x1ZGVkRmVhdHVyZVJlZik7Ci0JCWlzT3B0aW9uYWwoaW5jbHVkZWRGZWF0dXJlUmVmLmlzT3B0aW9uYWwoKSk7Ci0JCXNldExhYmVsKGluY2x1ZGVkRmVhdHVyZVJlZi5nZXRMYWJlbCgpKTsKLQkJc2V0U2VhcmNoTG9jYXRpb24oaW5jbHVkZWRGZWF0dXJlUmVmLmdldFNlYXJjaExvY2F0aW9uKCkpOwotCQlzZXRBcmNoKGluY2x1ZGVkRmVhdHVyZVJlZi5nZXRPU0FyY2goKSk7Ci0JCXNldFdTKGluY2x1ZGVkRmVhdHVyZVJlZi5nZXRXUygpKTsKLQkJc2V0T1MoaW5jbHVkZWRGZWF0dXJlUmVmLmdldE9TKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsLgotCSAqIEBwYXJhbSBmZWF0dXJlUmVmZXJlbmNlCi0JICovCi0JcHVibGljIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJc3VwZXIoKEZlYXR1cmVSZWZlcmVuY2VNb2RlbClmZWF0dXJlUmVmZXJlbmNlKTsKLQkJaXNPcHRpb25hbChmYWxzZSk7Ci0JCXNldFNlYXJjaExvY2F0aW9uKElVcGRhdGVDb25zdGFudHMuU0VBUkNIX1JPT1QpOwotCQlzZXRMYWJlbChnZXRMYWJlbCgpKTsJCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hdGNoaW5nIHJ1bGUgZm9yIHRoaXMgaW5jbHVkZWQgZmVhdHVyZS4KLQkgKiBUaGUgcnVsZSB3aWxsIGRldGVybWluZSB0aGUgYWJpbGl0eSBvZiB0aGUgaW5jbHVkZWQgZmVhdHVyZSB0byBtb3ZlIHZlcnNpb24gCi0JICogd2l0aG91dCBjYXVzaW5nIHRoZSBvdmVyYWxsIGZlYXR1cmUgdG8gYXBwZWFyIGJyb2tlbi4KLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5NQVRDSF9QRVJGRUNUPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgSUltcG9ydCNSVUxFX1BFUkZFQ1QKLQkgKiBAc2VlIElJbXBvcnQjUlVMRV9FUVVJVkFMRU5UCi0JICogQHNlZSBJSW1wb3J0I1JVTEVfQ09NUEFUSUJMRQotCSAqIEBzZWUgSUltcG9ydCNSVUxFX0dSRUFURVJfT1JfRVFVQUwKLQkgKiBAcmV0dXJuIGludCByZXByZXNlbnRhdGlvbiBvZiBmZWF0dXJlIG1hdGNoaW5nIHJ1bGUuCi0JICogQHNpbmNlIDIuMC4yCi0JICogQGRlcHJlY2F0ZWQgc2luY2UgMy4wIGluY2x1ZGVkIGZlYXR1cmUgdmVyc2lvbiBpcyBleGFjdGx5IHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF0Y2goKXsKLQkJcmV0dXJuIEltcG9ydC5SVUxFX1BFUkZFQ1Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VhcmNoIGxvY2F0aW9uIGZvciB0aGlzIGluY2x1ZGVkIGZlYXR1cmUuCi0JICogVGhlIGxvY2F0aW9uIHdpbGwgYmUgdXNlZCB0byBzZWFyY2ggdXBkYXRlcyBmb3IgdGhpcyBmZWF0dXJlLgotCSAqIAotCSAqIFRoZSBkZWZhdWx0IGlzIDxjb2RlPlNFQVJDSF9ST09UPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgSVVwZGF0ZUNvbnN0YW50cyNTRUFSQ0hfUk9PVAotCSAqIEBzZWUgSVVwZGF0ZUNvbnN0YW50cyNTRUFSQ0hfU0VMRgotCSAqIEByZXR1cm4gaW50IHJlcHJlc2VudGF0aW9uIG9mIGZlYXR1cmUgc2VhcmNoaW5nIHJ1bGUuCi0JICogQHNpbmNlIDIuMC4yCi0JICovCi0KLQlwdWJsaWMgaW50IGdldFNlYXJjaExvY2F0aW9uKCl7Ci0JCXJldHVybiBzZWFyY2hMb2NhdGlvbjsKLQl9Ci0JCi0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlzT3B0aW9uYWwKLQkgKiAKLQkgKiBAcmV0dXJuIGlzT3B0aW9uYWwKLQkgKiBAc2luY2UgMi4wLjEKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotCQlyZXR1cm4gaXNPcHRpb25hbDsKLQl9Ci0KLQotCQotCi0JLyoqCi0JICogU2V0cyB0aGUgaXNPcHRpb25hbC4KLQkgKiBAcGFyYW0gaXNPcHRpb25hbCBUaGUgaXNPcHRpb25hbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpc09wdGlvbmFsKGJvb2xlYW4gaXNPcHRpb25hbCkgewotCQl0aGlzLmlzT3B0aW9uYWwgPSBpc09wdGlvbmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1hdGNoaW5nUnVsZS4KLQkgKiBAcGFyYW0gbWF0Y2hpbmdSdWxlIFRoZSBtYXRjaGluZ1J1bGUgdG8gc2V0Ci0JICogQGRlcHJlY2F0ZWQgc2luY2UgMy4wIGluY2x1ZGVkIGZlYXR1cmUgdmVyc2lvbiBpcyBleGFjdGx5IHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hdGNoaW5nUnVsZShpbnQgbWF0Y2hpbmdSdWxlKSB7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VhcmNoTG9jYXRpb24uCi0JICogQHBhcmFtIHNlYXJjaExvY2F0aW9uIFRoZSBzZWFyY2hMb2NhdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hMb2NhdGlvbihpbnQgc2VhcmNoTG9jYXRpb24pIHsKLQkJdGhpcy5zZWFyY2hMb2NhdGlvbiA9IHNlYXJjaExvY2F0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwZDFhOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0luc3RhbGxBYm9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogRXhjZXB0aW9uIHRocm93biB3aGVuIHRoZSB1c2VyIGNhbmNlbGxlZCBhbiBpbnN0YWxsYXRpb24uCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBDb3JlRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB0aGUgZXhjZXB0aW9uIGluZGljYXRpbmcgZW5jbG9zaW5nIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uKFN0cmluZyBtc2csRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIixJU3RhdHVzLk9LLG1zZyxlKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0luc3RhbGxIYW5kbGVyRW50cnlNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9JbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkZDA4OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0luc3RhbGxIYW5kbGVyRW50cnlNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi0vKioKLSAqIEluc3RhbGwgaGFuZGxlciBlbnRyeSBtb2RlbCBvYmplY3QuCi0gKiBBbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgZGVmaW5pdGlvbiBvZiBhIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIKLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gSG93ZXZlciwgaW4gbW9zdCAKLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIAotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluc3RhbGxIYW5kbGVyRW50cnkKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQotCXByaXZhdGUgU3RyaW5nIHVybFN0cmluZzsKLQlwcml2YXRlIFVSTCB1cmw7Ci0JcHJpdmF0ZSBTdHJpbmcgbGlicmFyeTsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHVuaW5pdGlhbGl6ZWQgaW5zdGFsbCBoYW5kbGVyIGVudHJ5IG1vZGVsIG9iamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgc3RyaW5nIHVzZWQgZm9yIGJyb3dzZXItdHJpZ2dlcmVkIGluc3RhbGxhdGlvbiBoYW5kbGluZy4KLQkgKgotCSAqIEByZXR1cm4gdXJsIHN0cmluZyBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSTFN0cmluZygpIHsKLQkJcmV0dXJuIHVybFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBVUkwgdXNlZCBmb3IgYnJvd3Nlci10cmlnZ2VyZWQgaW5zdGFsbGF0aW9uIGhhbmRsaW5nLgotCSAqIAotCSAqIEByZXR1cm4gdXJsLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXN0b20gaW5zdGFsbGVyIGxpYnJhcnkuCi0JICoKLQkgKiBAcmV0dXJuIGxpYnJhcnkgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5KCkgewotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXN0b20gaW5zdGFsbGVyLgotCSAqCi0JICogQHJldHVybiBoYW5kbGVyIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgVVJMIHN0cmluZyB1c2VkIGZvciBicm93c2VyLXRyaWdnZXJlZCBpbnN0YWxsYXRpb24gaGFuZGxpbmcuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSB1cmxTdHJpbmcgdHJpZ2dldCBwYWdlIFVSTCBzdHJpbmcsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJMU3RyaW5nKFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy51cmxTdHJpbmcgPSB1cmxTdHJpbmc7Ci0JCXRoaXMudXJsID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXN0b20gaW5zdGFsbCBoYW5kbGVyIGxpYnJhcnkgbmFtZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqCi0JICogQHBhcmFtIGxpYnJhcnkgbmFtZSwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5KSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubGlicmFyeSA9IGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgY3VzdG9tIGluc3RhbGwgaGFuZGxlci4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqCi0JICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgaW5zdGFsbCBoYW5kbGVyLCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhbmRsZXJOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgbW9kZWwgb2JqZWN0LgotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSAKLQkgKiBiYXNlIFVSTCBhcmd1bWVudC4gQW55IHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIHRoZSBtb2RlbCB0aGF0IGFyZQotCSAqIHNwZWNpZmllZCBhcyB0cmFuc2xhdGlvbiBrZXlzIGFyZSBsb2NhbGl6ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIAotCSAqIHJlc291cmNlIGJ1bmRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZSBVUkwKLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSBVUkwKLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLFVSTCBidW5kbGVVUkwpCi0JCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzCi0JCXVybCA9IHJlc29sdmVVUkwoYmFzZSxidW5kbGVVUkwsIHVybFN0cmluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9JbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZmRlZDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9JbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiB0aGUgdHlwZSBvZiB0aGUgc2l0ZSBkaXNjb3ZlcmVkIGluIHRoZSBzaXRlIG1hbmlmZXN0DQotICogZG9lcyBub3QgY29ycmVzcG9uZCB0byB0aGUgdHlwZSBleHBlY3RlZCBieSB0aGUgY29uY3JldGUgc2l0ZSBmYWN0b3J5Lg0KLSAqIA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlNpdGVNb2RlbEZhY3RvcnkjY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcpDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLQlwcml2YXRlIFN0cmluZyBuZXdTaXRlVHlwZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdCB0aGUgZXhjZXB0aW9uIGluZGljYXRpbmcgdGhlIGRldGVjdGVkIHNpdGUgdHlwZQ0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbihTdHJpbmcgbmV3VHlwZSkgew0KLQkJc3VwZXIoKTsNCi0JCW5ld1NpdGVUeXBlID0gbmV3VHlwZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2l0ZSB0eXBlIGRldGVjdGVkIGluIHRoZSBwYXJzZWQgc2l0ZSBtYW5pZmVzdA0KLQkgKiANCi0JICogQHJldHVybiBzaXRlIHR5cGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROZXdUeXBlKCkgew0KLQkJcmV0dXJuIG5ld1NpdGVUeXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvTW9kZWxPYmplY3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvTW9kZWxPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE2MmMxYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL01vZGVsT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBSb290IG1vZGVsIG9iamVjdC4gRXh0ZW5kZWQgYnkgYWxsIG1vZGVsIG9iamVjdHMuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGFuZCBtdXN0IGJlIHN1YmNsYXNzZWQuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kZWxPYmplY3QgZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdCB7DQotDQotCXByaXZhdGUgYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRUZJWCA9ICIlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RPVUJMRV9QUkVGSVggPSBLRVlfUFJFRklYICsgS0VZX1BSRUZJWDsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1bmRsZXM7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgYmFzZSBtb2RlbCBvYmplY3QuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcm90ZWN0ZWQgTW9kZWxPYmplY3QoKSB7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyB0aGF0IHRoaXMgbW9kZWwgb2JqZWN0IGlzIHdyaXRlYWJsZS4gIEEgcnVudGltZSBleGNlcHRpb24NCi0JICogaXMgdGhyb3duIGlmIGl0IGlzIG5vdC4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFzc2VydElzV3JpdGVhYmxlKCkgew0KLQkJQXNzZXJ0LmlzVHJ1ZSghaXNSZWFkT25seSgpLCBQb2xpY3kuYmluZCgiTW9kZWxPYmplY3QuTW9kZWxSZWFkT25seSIpKTsJLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoaXMgbW9kZWwgb2JqZWN0IGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRlbnRzIHRvIGJlIHJlYWQtb25seS4NCi0JICogU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgaW1wbGVtZW50YXRpb24uDQotCSAqIA0KLQkgKiBAc2VlICNpc1JlYWRPbmx5DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIG1hcmtSZWFkT25seSgpIHsNCi0JCXJlYWRPbmx5ID0gdHJ1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGlzIG1vZGVsIG9iamVjdCBpcyByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbW9kZWwgb2JqZWN0IGlzIHJlYWQtb25seSwNCi0JICoJCTxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHNlZSAjbWFya1JlYWRPbmx5DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7DQotCQlyZXR1cm4gcmVhZE9ubHk7DQotCX0NCi0NCi0JLyoqDQotCSAqIERlbGVnYXRlIHNldHRpbmcgb2YgcmVhZC1vbmx5DQotCSAqDQotCSAqIEBwYXJhbSBvIG9iamVjdCB0byBkZWxlZ2F0ZSB0by4gTXVzdCBiZSBvZiB0eXBlIE1vZGVsT2JqZWN0Lg0KLQkgKiBAc2VlICNpc1JlYWRPbmx5DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByb3RlY3RlZCB2b2lkIG1hcmtSZWZlcmVuY2VSZWFkT25seShNb2RlbE9iamVjdCBvKSB7DQotCQlpZiAobyA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCW8ubWFya1JlYWRPbmx5KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIERlbGVnYXRlIHNldHRpbmcgb2YgcmVhZC1vbmx5DQotCSAqDQotCSAqIEBwYXJhbSBvIG9iamVjdCBhcnJheSB0byBkZWxlZ2F0ZSB0by4gRWFjaCBlbGVtZW50IG11c3QgYmUgb2YgdHlwZSBNb2RlbE9iamVjdC4NCi0JICogQHNlZSAjaXNSZWFkT25seQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBtYXJrTGlzdFJlZmVyZW5jZVJlYWRPbmx5KE1vZGVsT2JqZWN0W10gbykgew0KLQkJaWYgKG8gPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspIHsNCi0JCQlvW2ldLm1hcmtSZWFkT25seSgpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBlbGVtZW50LiBUaGlzIG1ldGhvZCBhbGxvd3MgYW55IHJlbGF0aXZlIFVSTCBzdHJpbmdzDQotCSAqIHRvIGJlIHJlc29sdmVkIHRvIGFjdHVhbCBVUkwuIEl0IGFsc28gYWxsb3dzIGFueSB0cmFuc2xhdGFibGUgc3RyaW5ncw0KLQkgKiB0byBiZSBsb2NhbGl6ZWQuDQotCSAqIA0KLQkgKiBTdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHJlc29sdXRpb24uDQotCSAqIEBwYXJhbSBiYXNlIGJhc2UgVVJMLg0KLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSBVUkwuDQotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsIFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJcmV0dXJuOw0KLQl9DQotDQotCS8qKg0KLQkgKiBEZWxlZ2F0ZSByZXNvbHV0aW9uIHRvIHJlZmVyZW5jZWQgbW9kZWwNCi0JICoNCi0JICogQHBhcmFtIG8gb2JqZWN0IHRvIGRlbGVnYXRlIHRvLiBNdXN0IGJlIG9mIHR5cGUgTW9kZWxPYmplY3QuDQotCSAqIEBwYXJhbSB1cmwgYmFzZSBVUkwuDQotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTC4NCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZVJlZmVyZW5jZShNb2RlbE9iamVjdCBvLCBVUkwgdXJsLCBVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCWlmIChvID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJby5yZXNvbHZlKHVybCwgYnVuZGxlVVJMKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRGVsZWdhdGUgcmVzb2x1dGlvbiB0byBsaXN0IG9mIHJlZmVyZW5jZWQgbW9kZWxzDQotCSAqDQotCSAqIEBwYXJhbSBvIG9iamVjdCBhcnJheSB0byBkZWxlZ2F0ZSB0by4gRWFjaCBlbGVtZW50IG11c3QgYmUgb2YgdHlwZSBNb2RlbE9iamVjdC4NCi0JICogQHBhcmFtIHVybCBiYXNlIFVSTC4NCi0JICogQHBhcmFtIGJ1bmRsZVVSTCByZXNvdXJjZSBidW5kbGUgVVJMLg0KLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlTGlzdFJlZmVyZW5jZShNb2RlbE9iamVjdFtdIG8sIFVSTCB1cmwsIFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJaWYgKG8gPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspIHsNCi0JCQlvW2ldLnJlc29sdmUodXJsLCBidW5kbGVVUkwpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXNvbHZlIGEgVVJMIGJhc2VkIG9uIGNvbnRleHQNCi0JICoNCi0JICogQHBhcmFtIGNvbnRleHQgYmFzZSBVUkwuDQotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTC4NCi0JICogQHBhcmFtIHVybFN0cmluZyB1cmwgc3RyaW5nIGZyb20gbW9kZWwuDQotCSAqIEByZXR1cm4gVVJMLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIFVSTCByZXNvbHZlVVJMKFVSTCBjb250ZXh0LCBVUkwgYnVuZGxlVVJMLCBTdHJpbmcgdXJsU3RyaW5nKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0NCi0JCS8vIFVSTCBzdHJpbmcgd2FzIG5vdCBzcGVjaWZpZWQNCi0JCWlmICh1cmxTdHJpbmcgPT0gbnVsbCB8fCB1cmxTdHJpbmcudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm4gbnVsbDsNCi0NCi0JCS8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIE5MLXNlbnNpdGl2ZSBVUkwNCi0JCVN0cmluZyByZXNvbHZlZFVybFN0cmluZyA9IHJlc29sdmVOTFN0cmluZyhidW5kbGVVUkwsIHVybFN0cmluZyk7DQotDQotCQlyZXNvbHZlZFVybFN0cmluZyA9IHJlc29sdmVQbGF0ZnJvbUNvbmZpZ3VyYXRpb24ocmVzb2x2ZWRVcmxTdHJpbmcpOw0KLQ0KLQkJLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIGJhc2UgdXJsLCB1c2Ugb25seSB0aGUgc3VwcGxpZWQgc3RyaW5nDQotCQlpZiAoY29udGV4dCA9PSBudWxsKQ0KLQkJCXJldHVybiBuZXcgVVJMKHJlc29sdmVkVXJsU3RyaW5nKTsNCi0NCi0JCS8vIG90aGVyd2lzZSByZXR1cm4gbmV3IFVSTCBpbiBjb250ZXh0IG9mIGJhc2UgVVJMDQotCQlyZXR1cm4gbmV3IFVSTChjb250ZXh0LCByZXNvbHZlZFVybFN0cmluZyk7DQotCX0NCi0JLyoqDQotCSAqIFJlc29sdmVzIHRoZSBVUkwgYmFzZWQgb24gcGxhdGZyb20gQ29uZmlndXJhdGlvbg0KLQkgKiAkb3MkXCR3cyRcbGljZW5zZS50eHQgd2lsbCBiZWNvbWUNCi0JICogd2luMzJcd2luMzJcbGljZW5zZS50eHQgb24gYSBzeXN0ZW0gd2hlcmUgb3M9d2luMzIgYW5kIHdzPXdpbjMyDQotCSAqIA0KLQkgKiBAcGFyYW0gcmVzb2x2ZWRVcmxTdHJpbmcNCi0JICogQHJldHVybiBTdHJpbmcNCi0JICovDQotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVQbGF0ZnJvbUNvbmZpZ3VyYXRpb24oU3RyaW5nIHJlc29sdmVkVXJsU3RyaW5nKSB7DQotCQlpbnQgb3NJbmRleCA9IHJlc29sdmVkVXJsU3RyaW5nLmluZGV4T2YoIiRvcyQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKG9zSW5kZXggIT0gLTEpDQotCQkJcmV0dXJuIGdldEV4dGVuZGVkU3RyaW5nKHJlc29sdmVkVXJsU3RyaW5nKTsNCi0NCi0JCWludCB3c0luZGV4ID0gcmVzb2x2ZWRVcmxTdHJpbmcuaW5kZXhPZigiJHdzJCIpOyAvLyROT04tTkxTLTEkDQotCQlpZiAod3NJbmRleCAhPSAtMSkNCi0JCQlyZXR1cm4gZ2V0RXh0ZW5kZWRTdHJpbmcocmVzb2x2ZWRVcmxTdHJpbmcpOw0KLQ0KLQkJaW50IG5sSW5kZXggPSByZXNvbHZlZFVybFN0cmluZy5pbmRleE9mKCIkbmwkIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmIChubEluZGV4ICE9IC0xKQ0KLQkJCXJldHVybiBnZXRFeHRlbmRlZFN0cmluZyhyZXNvbHZlZFVybFN0cmluZyk7DQotDQotCQlpbnQgYXJjaEluZGV4ID0gcmVzb2x2ZWRVcmxTdHJpbmcuaW5kZXhPZigiJGFyY2gkIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmIChhcmNoSW5kZXggIT0gLTEpDQotCQkJcmV0dXJuIGdldEV4dGVuZGVkU3RyaW5nKHJlc29sdmVkVXJsU3RyaW5nKTsNCi0NCi0JCXJldHVybiByZXNvbHZlZFVybFN0cmluZzsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBnZXRFeHRlbmRlZFN0cmluZyhTdHJpbmcgcmVzb2x2ZWRVcmxTdHJpbmcpIHsNCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChyZXNvbHZlZFVybFN0cmluZyk7DQotCQlwYXRoID0gZ2V0RXhwYW5kZWRQYXRoKHBhdGgpOw0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1dBUk5JTkdTKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJSZXNvbHZlZCA6IiArIHJlc29sdmVkVXJsU3RyaW5nICsgIiBhczoiICsgcGF0aC50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0NCi0JCXJldHVybiBwYXRoLnRvT1NTdHJpbmcoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElQYXRoIGdldEV4cGFuZGVkUGF0aChJUGF0aCBwYXRoKSB7DQotCQlTdHJpbmcgZmlyc3QgPSBwYXRoLnNlZ21lbnQoMCk7DQotCQlpZiAoZmlyc3QgIT0gbnVsbCkgew0KLQkJCUlQYXRoIHJlc3QgPSBnZXRFeHBhbmRlZFBhdGgocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsNCi0JCQlpZiAoZmlyc3QuZXF1YWxzKCIkd3MkIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlwYXRoID0gbmV3IFBhdGgoU2l0ZU1hbmFnZXIuZ2V0V1MoKSkuYXBwZW5kKHJlc3QpOw0KLQkJCX0gZWxzZSBpZiAoZmlyc3QuZXF1YWxzKCIkb3MkIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlwYXRoID0gbmV3IFBhdGgoU2l0ZU1hbmFnZXIuZ2V0T1MoKSkuYXBwZW5kKHJlc3QpOw0KLQkJCX0gZWxzZSBpZiAoZmlyc3QuZXF1YWxzKCIkbmwkIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlwYXRoID0gbmV3IFBhdGgoU2l0ZU1hbmFnZXIuZ2V0TkwoKSkuYXBwZW5kKHJlc3QpOw0KLQkJCX0gZWxzZSBpZiAoZmlyc3QuZXF1YWxzKCIkYXJjaCQiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCXBhdGggPSBuZXcgUGF0aChTaXRlTWFuYWdlci5nZXRPU0FyY2goKSkuYXBwZW5kKHJlc3QpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBwYXRoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgcmVzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGFyZ3VtZW50IA0KLQkgKiB2YWx1ZSBhbmQgYnVuZGxlLg0KLQkgKiBJZiB0aGUgYXJndW1lbnQgdmFsdWUgc3BlY2lmaWVzIGEgcmVzb3VyY2Uga2V5LCB0aGUgc3RyaW5nDQotCSAqIGlzIGxvb2tlZCB1cCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYnVuZGxlLiBJZiB0aGUgYXJndW1lbnQgZG9lcyBub3QNCi0JICogc3BlY2lmeSBhIHZhbGlkIGtleSwgdGhlIGFyZ3VtZW50IGl0c2VsZiBpcyByZXR1cm5lZCBhcyB0aGUNCi0JICogcmVzb3VyY2Ugc3RyaW5nLiBUaGUga2V5IGxvb2t1cCBpcyBwZXJmb3JtZWQgYWdhaW5zdCB0aGUNCi0JICogc3BlY2lmaWVkIHJlc291cmNlIGJ1bmRsZS4gSWYgYSByZXNvdXJjZSBzdHJpbmcgDQotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleSBpcyBub3QgZm91bmQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZQ0KLQkgKiB0aGUga2V5IHZhbHVlLCBvciBhbnkgZGVmYXVsdCB0ZXh0IGZvbGxvd2luZyB0aGUga2V5IGluIHRoZQ0KLQkgKiBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBhcyB0aGUgcmVzb3VyY2Ugc3RyaW5nLg0KLQkgKiBBIGtleSBpcyBpZGVudGlmaWVkIGFzIGEgc3RyaW5nIGJlZ2luaW5nIHdpdGggdGhlICIlIiBjaGFyYWN0ZXIuDQotCSAqIE5vdGUgdGhhdCB0aGUgIiUiIGNoYXJhY3RlciBpcyBzdHJpcHBlZCBvZmYgcHJpb3IgdG8gbG9va3VwDQotCSAqIGluIHRoZSByZXNvdXJjZSBidW5kbGUuDQotCSAqIDxwPg0KLQkgKiBGb3IgZXhhbXBsZSwgYXNzdW1lIHJlc291cmNlIGJ1bmRsZSBwbHVnaW4ucHJvcGVydGllcyBjb250YWlucw0KLQkgKiBuYW1lID0gUHJvamVjdCBOYW1lDQotCSAqIDxwcmU+DQotCSAqICAgICByZXNvbHZlTkxTdHJpbmcoYiwiSGVsbG8gV29ybGQiKSByZXR1cm5zICJIZWxsbyBXb3JsZCI8L2xpPg0KLQkgKiAgICAgcmVzb2x2ZU5MU3RyaW5nKGIsIiVuYW1lIikgcmV0dXJucyAiUHJvamVjdCBOYW1lIjwvbGk+DQotCSAqICAgICByZXNvbHZlTkxTdHJpbmcoYiwiJW5hbWUgSGVsbG8gV29ybGQiKSByZXR1cm5zICJQcm9qZWN0IE5hbWUiPC9saT4NCi0JICogICAgIHJlc29sdmVOTFN0cmluZyhiLCIlYWJjZCBIZWxsbyBXb3JsZCIpIHJldHVybnMgIkhlbGxvIFdvcmxkIjwvbGk+DQotCSAqICAgICByZXNvbHZlTkxTdHJpbmcoYiwiJWFiY2QiKSByZXR1cm5zICIlYWJjZCI8L2xpPg0KLQkgKiAgICAgcmVzb2x2ZU5MU3RyaW5nKGIsIiUlbmFtZSIpIHJldHVybnMgIiVuYW1lIjwvbGk+DQotCSAqIDwvcHJlPg0KLQkgKiA8L3A+DQotCSAqIA0KLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSB1cmwuDQotCSAqIEBwYXJhbSBzdHJpbmcgdHJhbnNsYXRhYmxlIHN0cmluZyBmcm9tIG1vZGVsDQotCSAqIEByZXR1cm4gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVOTFN0cmluZyhVUkwgYnVuZGxlVVJMLCBTdHJpbmcgc3RyaW5nKSB7DQotDQotCQlpZiAoc3RyaW5nID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQlTdHJpbmcgcyA9IHN0cmluZy50cmltKCk7DQotDQotCQlpZiAocy5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuIHN0cmluZzsNCi0NCi0JCWlmICghcy5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKQ0KLQkJCXJldHVybiBzdHJpbmc7DQotDQotCQlpZiAocy5zdGFydHNXaXRoKEtFWV9ET1VCTEVfUFJFRklYKSkNCi0JCQlyZXR1cm4gcy5zdWJzdHJpbmcoMSk7DQotDQotCQlpbnQgaXggPSBzLmluZGV4T2YoIiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIGtleSA9IGl4ID09IC0xID8gcyA6IHMuc3Vic3RyaW5nKDAsIGl4KTsNCi0JCVN0cmluZyBkZmx0ID0gaXggPT0gLTEgPyBzIDogcy5zdWJzdHJpbmcoaXggKyAxKTsNCi0NCi0JCVJlc291cmNlQnVuZGxlIGIgPSBnZXRSZXNvdXJjZUJ1bmRsZShidW5kbGVVUkwpOw0KLQ0KLQkJaWYgKGIgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZGZsdDsNCi0NCi0JCXRyeSB7DQotCQkJcmV0dXJuIGIuZ2V0U3RyaW5nKGtleS5zdWJzdHJpbmcoMSkpOw0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gZGZsdDsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIGNvbmNyZXRlIGFycmF5IHR5cGUgZm9yIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkDQotCSAqIGxpc3QuIFRoZSBtZXRob2QgYXNzdW1lcyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGFyZSB0aGUgc2FtZQ0KLQkgKiBjb25jcmV0ZSB0eXBlIGFzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBsaXN0Lg0KLQkgKiANCi0JICogQHBhcmFtIGwgbGlzdA0KLQkgKiBAcmV0dXJuIGNvbmNyZXRlIGFycmF5IHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhcnJheSB0eXBlDQotCSAqIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkICh0aGUgbGlzdCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIE9iamVjdFtdIGFycmF5VHlwZUZvcihMaXN0IGwpIHsNCi0JCWlmIChsID09IG51bGwgfHwgbC5zaXplKCkgPT0gMCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCXJldHVybiAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGwuZ2V0KDApLmdldENsYXNzKCksIDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgY29uY3JldGUgYXJyYXkgdHlwZSBmb3IgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQNCi0JICogc2V0LiBUaGUgbWV0aG9kIGFzc3VtZXMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgc2V0IGFyZSB0aGUgc2FtZQ0KLQkgKiBjb25jcmV0ZSB0eXBlIGFzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcyBzZXQNCi0JICogQHJldHVybiBjb25jcmV0ZSBhcnJheSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXJyYXkgdHlwZQ0KLQkgKiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAodGhlIHNldCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIE9iamVjdFtdIGFycmF5VHlwZUZvcihTZXQgcykgew0KLQkJaWYgKHMgPT0gbnVsbCB8fCBzLnNpemUoKSA9PSAwKQ0KLQkJCXJldHVybiBudWxsOw0KLQkJSXRlcmF0b3IgaSA9IHMuaXRlcmF0b3IoKTsNCi0JCXJldHVybiAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGkubmV4dCgpLmdldENsYXNzKCksIDApOw0KLQl9DQotDQotCS8qKg0KLQkJKiBIZWxwZXIgbWV0aG9kIHRvIGFjY2VzcyByZXNvdWNlIGJ1bmRsZSBmb3IgZmVhdHVyZS4gVGhlIGRlZmF1bHQgDQotCQkqIGltcGxlbWVudGF0aW9uIGF0dGVtcHRzIHRvIGxvYWQgdGhlIGFwcHJvcHJpYXRlbHkgbG9jYWxpemVkIA0KLQkJKiBmZWF0dXJlLnByb3BlcnRpZXMgZmlsZS4NCi0JCSogDQotCQkqIEBwYXJhbSB1cmwgYmFzZSBVUkwgdXNlZCB0byBsb2FkIHRoZSByZXNvdXJjZSBidW5kbGUuDQotCQkqIEByZXR1cm4gcmVzb3VyY2UgYnVuZGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JCSogQHNpbmNlIDIuMA0KLQkJKi8NCi0JcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKFVSTCB1cmwpIHsNCi0NCi0JCWlmICh1cmwgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0NCi0JCWlmIChidW5kbGVzID09IG51bGwpIHsNCi0JCQlidW5kbGVzID0gbmV3IEhhc2hNYXAoKTsNCi0JCX0gZWxzZSB7DQotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gKFJlc291cmNlQnVuZGxlKSBidW5kbGVzLmdldCh1cmwudG9FeHRlcm5hbEZvcm0oKSk7DQotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQ0KLQkJCQlyZXR1cm4gYnVuZGxlOw0KLQkJfQ0KLQ0KLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmFzRGlyZWN0b3J5VVJMKHVybCk7DQotCQkJQ2xhc3NMb2FkZXIgbCA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyB1cmwgfSwgbnVsbCk7DQotCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGdldFByb3BlcnR5TmFtZSgpLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBsKTsNCi0JCQlidW5kbGVzLnB1dCh1cmwudG9FeHRlcm5hbEZvcm0oKSwgYnVuZGxlKTsNCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIjoiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkDQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBidW5kbGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIE1ldGhvZCBnZXRQcm9wZXJ0eU5hbWUuDQotCSAqIEByZXR1cm4gU3RyaW5nDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsNCi0JCXJldHVybiBGZWF0dXJlLkZFQVRVUkVfRklMRTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL05vblBsdWdpbkVudHJ5TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvTm9uUGx1Z2luRW50cnlNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGM1NmFlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvTm9uUGx1Z2luRW50cnlNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotLyoqDQotICogTm9uLXBsdWctaW4gZW50cnkgbW9kZWwgb2JqZWN0Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgDQotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgDQotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuTm9uUGx1Z2luRW50cnkNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIE5vblBsdWdpbkVudHJ5TW9kZWwgZXh0ZW5kcyBDb250ZW50RW50cnlNb2RlbCB7DQotDQotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSB1bmluaXRpYWxpemVkIG5vbi1wbHVnLWluIGVudHJ5IG1vZGVsIG9iamVjdC4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBOb25QbHVnaW5FbnRyeU1vZGVsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZW50cnkgaWRlbnRpZmllci4NCi0JICoNCi0JICogQHJldHVybiBlbnRyeSBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7DQotCQlyZXR1cm4gaWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGVudHJ5IGlkZW50aWZpZXIuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSBpZCBlbnRyeSBpZGVudGlmaWVyLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpZCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuaWQgPSBpZDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL1BsdWdpbkVudHJ5TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvUGx1Z2luRW50cnlNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTE1NGQwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvUGx1Z2luRW50cnlNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLQ0KLS8qKg0KLSAqIFBsdWctaW4gZW50cnkgbW9kZWwgb2JqZWN0Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgDQotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgDQotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuUGx1Z2luRW50cnkNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIFBsdWdpbkVudHJ5TW9kZWwgZXh0ZW5kcyBDb250ZW50RW50cnlNb2RlbCB7DQotDQotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOw0KLQlwcml2YXRlIFN0cmluZyBwbHVnaW5WZXJzaW9uOw0KLQlwcml2YXRlIGJvb2xlYW4gaXNGcmFnbWVudCA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gdW5wYWNrID0gdHJ1ZTsNCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgdW5pbml0aWFsaXplZCBwbHVnLWluIGVudHJ5IG1vZGVsIG9iamVjdC4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBQbHVnaW5FbnRyeU1vZGVsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29tcGFyZXMgdHdvIHBsdWctaW4gbW9kZWxzIGZvciBlcXVhbGl0eQ0KLQkgKiANCi0JICogQHBhcmFtIG9iaiBvdGhlciBtb2RlbCB0byBjb21wYXJlIHRvDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZGVscyBhcmUgZXF1YWwsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFBsdWdpbkVudHJ5TW9kZWwpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCVBsdWdpbkVudHJ5TW9kZWwgbW9kZWwgPSAoUGx1Z2luRW50cnlNb2RlbCkgb2JqOw0KLQkJDQotCQlyZXR1cm4gKA0KLQkJCShnZXRQbHVnaW5JZGVudGlmaWVyKCkuZXF1YWxzKG1vZGVsLmdldFBsdWdpbklkZW50aWZpZXIoKSkpDQotCQkJCSYmIChnZXRQbHVnaW5WZXJzaW9uKCkuZXF1YWxzKG1vZGVsLmdldFBsdWdpblZlcnNpb24oKSkpDQotCQkJCSYmIChpc0ZyYWdtZW50KCkgPT0gbW9kZWwuaXNGcmFnbWVudCgpKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBsdWctaW4gaWRlbnRpZmllciBmb3IgdGhpcyBlbnRyeS4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIHBsdWctaW4gaWRlbnRpZmllciwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWRlbnRpZmllcigpIHsNCi0JCXJldHVybiBwbHVnaW5JZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGx1Zy1pbiB2ZXJzaW9uIGZvciB0aGlzIGVudHJ5Lg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgcGx1Zy1pbiB2ZXJzaW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5WZXJzaW9uKCkgew0KLQkJcmV0dXJuIHBsdWdpblZlcnNpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnRyeSBkZXNjcmliZXMgYSBmdWxsIHBsdWctaW4sIG9yIA0KLQkgKiBhIHBsdWctaW4gZnJhZ21lbnQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbnRyeSBpcyBhIHBsdWctaW4gZnJhZ21lbnQsIA0KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGVudHJ5IGlzIGEgcGx1Zy1pbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsNCi0JCXJldHVybiBpc0ZyYWdtZW50Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBlbnRyeSBwbHVnLWluIGlkZW50aWZpZXIuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSBwbHVnaW5JZCB0aGUgZW50cnkgaWRlbnRpZmllci4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UGx1Z2luSWRlbnRpZmllcihTdHJpbmcgcGx1Z2luSWQpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGVudHJ5IHBsdWctaW4gdmVyc2lvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIHBsdWdpblZlcnNpb24gdGhlIGVudHJ5IHZlcnNpb24uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBsdWdpblZlcnNpb24oU3RyaW5nIHBsdWdpblZlcnNpb24pIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLnBsdWdpblZlcnNpb24gPSBwbHVnaW5WZXJzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGVudHJ5IHJlcHJlc2VudHMgYSBmcmFnbWVudCBvciBwbHVnLWluLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gaXNGcmFnbWVudCBmcmFnbWVudCBzZXR0aW5nDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGlzRnJhZ21lbnQoYm9vbGVhbiBpc0ZyYWdtZW50KSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiBJbmRpY2F0ZXMgd2hldGhlciBwbHVnaW4gc2hvdWxkIGJlIHVucGFja2VkIGR1cmluZyBpbnN0YWxsYXRpb24NCi0JICogb3IgY2FuIHJ1biBmcm9tIGEgamFyDQotCSAqIEBzaW5jZSAzLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzVW5wYWNrKCkgew0KLQkJLy8gVE9ETyB0aGlzIGlzIGEgY2FuZGlkYXRlIGZvciBJUGx1Z2luRW50cnkgQVBJDQotCQlyZXR1cm4gdW5wYWNrOw0KLQl9DQotCS8qKg0KLQkgKiBAcGFyYW0gdW5wYWNrIFNldHMgd2hldGhlciBwbHVnaW4gc2hvdWxkIGJlIHVucGFja2VkIGR1cmluZyBpbnN0YWxsYXRpb24NCi0JICogb3IgY2FuIHJ1biBmcm9tIGEgamFyDQotCSAqIEBzaW5jZSAzLjANCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFVucGFjayhib29sZWFuIHVucGFjaykgew0KLQkJLy8gVE9ETyB0aGlzIGlzIGEgY2FuZGlkYXRlIGZvciBJUGx1Z2luRW50cnkgQVBJDQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy51bnBhY2sgPSB1bnBhY2s7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlTdHJpbmcgbXNnID0gKGdldFBsdWdpbklkZW50aWZpZXIoKSE9bnVsbCk/Z2V0UGx1Z2luSWRlbnRpZmllcigpLnRvU3RyaW5nKCk6IiI7IC8vJE5PTi1OTFMtMSQNCi0JCW1zZyArPSBnZXRQbHVnaW5WZXJzaW9uKCkhPW51bGw/IiAiK2dldFBsdWdpblZlcnNpb24oKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCW1zZyArPSBpc0ZyYWdtZW50KCk/IiBmcmFnbWVudCI6IiBwbHVnaW4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXJldHVybiBtc2c7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9TaXRlTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvU2l0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjQwZGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9TaXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7Ci0KLS8qKgotICogU2l0ZSBtb2RlbCBvYmplY3QuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgCi0gKiBjYXNlcyBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCAKLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kZWwuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlTW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCXByaXZhdGUgVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIExpc3QgLypvZiBGZWF0dXJlUmVmZXJlbmNlTW9kZWwqLwotCWZlYXR1cmVSZWZlcmVuY2VzOwotCXByaXZhdGUgTGlzdCAvKm9mIEFyY2hpdmVSZWZlcmVuY2VNb2RlbCovCi0JYXJjaGl2ZVJlZmVyZW5jZXM7Ci0JcHJpdmF0ZSBTZXQgLypvZiBDYXRlZ29yeU1vZGVsKi8KLQljYXRlZ29yaWVzOwotCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nOwotCXByaXZhdGUgVVJMIGxvY2F0aW9uVVJMOwotCXByaXZhdGUgQ29uZmlndXJlZFNpdGVNb2RlbCBjb25maWd1cmVkU2l0ZU1vZGVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIHNpdGUgbW9kZWwgb2JqZWN0LgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKiAKLQkgKiBSZXR1cm5zIHRoZSBzaXRlIHR5cGUuCi0JICogCi0JICogQHJldHVybiBzaXRlIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpdGUgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiBzaXRlIGRlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFVSTEVudHJ5TW9kZWwgZ2V0RGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWxzIG9uIHRoaXMgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVscywgb3IgYW4gZW1wdHkgYXJyYXkuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpIHsKLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2VzID09IG51bGwgfHwgZmVhdHVyZVJlZmVyZW5jZXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbMF07Ci0KLQkJcmV0dXJuIChTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10pIGZlYXR1cmVSZWZlcmVuY2VzLnRvQXJyYXkoYXJyYXlUeXBlRm9yKGZlYXR1cmVSZWZlcmVuY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBwbHVnLWluIGFuZCBub24tcGx1Zy1pbiBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbHMKLQkgKiBvbiB0aGlzIHNpdGUKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVscywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlCi0JICogbm8gYXJjaGl2ZXMga25vd24gdG8gdGhpcyBzaXRlLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpIHsKLQkJaWYgKGFyY2hpdmVSZWZlcmVuY2VzID09IG51bGwgfHwgYXJjaGl2ZVJlZmVyZW5jZXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IEFyY2hpdmVSZWZlcmVuY2VNb2RlbFswXTsKLQotCQlyZXR1cm4gKEFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdKSBhcmNoaXZlUmVmZXJlbmNlcy50b0FycmF5KGFycmF5VHlwZUZvcihhcmNoaXZlUmVmZXJlbmNlcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0ZWdvcnkgbW9kZWxzIGZvciB0aGlzIHNpdGUuCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiBzaXRlIGNhdGVnb3J5IG1vZGVscywgb3IgYW4gZW1wdHkgYXJyYXkuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBDYXRlZ29yeU1vZGVsW10gZ2V0Q2F0ZWdvcnlNb2RlbHMoKSB7Ci0JCWlmIChjYXRlZ29yaWVzID09IG51bGwgfHwgY2F0ZWdvcmllcy5zaXplKCk9PTApCi0JCQlyZXR1cm4gbmV3IENhdGVnb3J5TW9kZWxbMF07Ci0KLQkJcmV0dXJuIChDYXRlZ29yeU1vZGVsW10pIGNhdGVnb3JpZXMudG9BcnJheShhcnJheVR5cGVGb3IoY2F0ZWdvcmllcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVucmVzb2x2ZWQgVVJMIHN0cmluZyBmb3IgdGhlIHNpdGUuCi0JICoKLQkgKiBAcmV0dXJuIHVybCBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkxTdHJpbmcoKSB7Ci0JCXJldHVybiBsb2NhdGlvblVSTFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBVUkwgZm9yIHRoZSBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdXJsLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgVVJMIGdldExvY2F0aW9uVVJMKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l0ZSB0eXBlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIHR5cGUgc2l0ZSB0eXBlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXRlIGRlc2NyaXB0aW9uLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIHNpdGUgZGVzY3JpcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25Nb2RlbChVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWF0dXJlIHJlZmVyZW5jZXMgZm9yIHRoaXMgc2l0ZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlUmVmZXJlbmNlcyBhbiBhcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbHMKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscyhGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmZXJlbmNlcykgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAoZmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMuZmVhdHVyZVJlZmVyZW5jZXMgPSBudWxsOwotCQllbHNlCi0JCQl0aGlzLmZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZlYXR1cmVSZWZlcmVuY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXJjaGl2ZSByZWZlcmVuY2VzIGZvciB0aGlzIHNpdGUuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZVJlZmVyZW5jZXMgYW4gYXJyYXkgb2YgYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWxzCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZVJlZmVyZW5jZXMpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKGFyY2hpdmVSZWZlcmVuY2VzID09IG51bGwpCi0JCQl0aGlzLmFyY2hpdmVSZWZlcmVuY2VzID0gbnVsbDsKLQkJZWxzZQotCQkJdGhpcy5hcmNoaXZlUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChhcmNoaXZlUmVmZXJlbmNlcykpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUgY2F0ZWdvcmllcy4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yaWVzIGFuIGFycmF5IG9mIGNhdGVnb3J5IG1vZGVscwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeU1vZGVscyhDYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcykgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsKQotCQkJdGhpcy5jYXRlZ29yaWVzID0gbnVsbDsKLQkJZWxzZSB7Ci0JCQl0aGlzLmNhdGVnb3JpZXMgPSBuZXcgVHJlZVNldChDYXRlZ29yeU1vZGVsLmdldENvbXBhcmF0b3IoKSk7Ci0JCQl0aGlzLmNhdGVnb3JpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2F0ZWdvcmllcykpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdW5yZXNvbHZlZCBVUkwgZm9yIHRoZSBzaXRlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uVVJMU3RyaW5nIHVybCBmb3IgdGhlIHNpdGUgKGFzIGEgc3RyaW5nKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVSTFN0cmluZyhTdHJpbmcgbG9jYXRpb25VUkxTdHJpbmcpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5sb2NhdGlvblVSTFN0cmluZyA9IGxvY2F0aW9uVVJMU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbCB0byBzaXRlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZmVyZW5jZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodGhpcy5mZWF0dXJlUmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5mZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gUEVSRjogZG8gbm90IGNoZWNrIGlmIGFscmVhZHkgcHJlc2VudCAKLQkJLy9pZiAoIXRoaXMuZmVhdHVyZVJlZmVyZW5jZXMuY29udGFpbnMoZmVhdHVyZVJlZmVyZW5jZSkpCi0JCQl0aGlzLmZlYXR1cmVSZWZlcmVuY2VzLmFkZChmZWF0dXJlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVsIHRvIHNpdGUuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJjaGl2ZVJlZmVyZW5jZSBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBcmNoaXZlUmVmZXJlbmNlTW9kZWwoQXJjaGl2ZVJlZmVyZW5jZU1vZGVsIGFyY2hpdmVSZWZlcmVuY2UpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKHRoaXMuYXJjaGl2ZVJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMuYXJjaGl2ZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghdGhpcy5hcmNoaXZlUmVmZXJlbmNlcy5jb250YWlucyhhcmNoaXZlUmVmZXJlbmNlKSkKLQkJCXRoaXMuYXJjaGl2ZVJlZmVyZW5jZXMuYWRkKGFyY2hpdmVSZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBjYXRlZ29yeSBtb2RlbCB0byBzaXRlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5IGNhdGVnb3J5IG1vZGVsCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5TW9kZWwoQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodGhpcy5jYXRlZ29yaWVzID09IG51bGwpCi0JCQl0aGlzLmNhdGVnb3JpZXMgPSBuZXcgVHJlZVNldChDYXRlZ29yeU1vZGVsLmdldENvbXBhcmF0b3IoKSk7Ci0JCWlmICghdGhpcy5jYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkKLQkJCXRoaXMuY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbCBmcm9tIHNpdGUuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKHRoaXMuZmVhdHVyZVJlZmVyZW5jZXMgIT0gbnVsbCkKLQkJCXRoaXMuZmVhdHVyZVJlZmVyZW5jZXMucmVtb3ZlKGZlYXR1cmVSZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWwgZnJvbSBzaXRlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGFyY2hpdmVSZWZlcmVuY2UgYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKEFyY2hpdmVSZWZlcmVuY2VNb2RlbCBhcmNoaXZlUmVmZXJlbmNlKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCWlmICh0aGlzLmFyY2hpdmVSZWZlcmVuY2VzICE9IG51bGwpCi0JCQl0aGlzLmFyY2hpdmVSZWZlcmVuY2VzLnJlbW92ZShhcmNoaXZlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgY2F0ZWdvcnkgbW9kZWwgZnJvbSBzaXRlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5IGNhdGVnb3J5IG1vZGVsCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNhdGVnb3J5TW9kZWwoQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodGhpcy5jYXRlZ29yaWVzICE9IG51bGwpCi0JCQl0aGlzLmNhdGVnb3JpZXMucmVtb3ZlKGNhdGVnb3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgbW9kZWwgb2JqZWN0IGFzIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgbWFya1JlYWRPbmx5KCkgewotCQlzdXBlci5tYXJrUmVhZE9ubHkoKTsKLQkJbWFya1JlZmVyZW5jZVJlYWRPbmx5KGdldERlc2NyaXB0aW9uTW9kZWwoKSk7Ci0JCW1hcmtMaXN0UmVmZXJlbmNlUmVhZE9ubHkoZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpKTsKLQkJbWFya0xpc3RSZWZlcmVuY2VSZWFkT25seShnZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCkpOwotCQltYXJrTGlzdFJlZmVyZW5jZVJlYWRPbmx5KGdldENhdGVnb3J5TW9kZWxzKCkpOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIG1vZGVsIG9iamVjdC4KLQkgKiBBbnkgVVJMIHN0cmluZ3MgaW4gdGhlIG1vZGVsIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgCi0JICogYmFzZSBVUkwgYXJndW1lbnQuIEFueSB0cmFuc2xhdGFibGUgc3RyaW5ncyBpbiB0aGUgbW9kZWwgdGhhdCBhcmUKLQkgKiBzcGVjaWZpZWQgYXMgdHJhbnNsYXRpb24ga2V5cyBhcmUgbG9jYWxpemVkIHVzaW5nIHRoZSBzdXBwbGllZCAKLQkgKiByZXNvdXJjZSBidW5kbGUuCi0JICogCi0JICogQHBhcmFtIGJhc2UgVVJMCi0JICogQHBhcmFtIGJ1bmRsZVVSTCByZXNvdXJjZSBidW5kbGUgVVJMCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSwgVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0KLQkJLy8gQXJjaGl2ZXMgYW5kIGZlYXR1cmUgYXJlIHJlbGF0aXZlIHRvIGxvY2F0aW9uIFVSTAotCQkvLyBpZiB0aGUgU2l0ZSBlbGVtZW50IGhhcyBhIFVSTCB0YWc6IHNlZSBzcGVjCQotCQlsb2NhdGlvblVSTCA9IHJlc29sdmVVUkwoYmFzZSwgYnVuZGxlVVJMLCBnZXRMb2NhdGlvblVSTFN0cmluZygpKTsKLQkJaWYgKGxvY2F0aW9uVVJMID09IG51bGwpCi0JCQlsb2NhdGlvblVSTCA9IGJhc2U7Ci0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKSwgbG9jYXRpb25VUkwsIGJ1bmRsZVVSTCk7Ci0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKSwgbG9jYXRpb25VUkwsIGJ1bmRsZVVSTCk7Ci0KLQkJcmVzb2x2ZVJlZmVyZW5jZShnZXREZXNjcmlwdGlvbk1vZGVsKCksIGJhc2UsIGJ1bmRsZVVSTCk7Ci0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldENhdGVnb3J5TW9kZWxzKCksIGJhc2UsIGJ1bmRsZVVSTCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWwgZ2V0Q29uZmlndXJlZFNpdGVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29uZmlndXJlZFNpdGVNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmVkU2l0ZU1vZGVsKENvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlndXJlZFNpdGVNb2RlbCkgewotCQl0aGlzLmNvbmZpZ3VyZWRTaXRlTW9kZWwgPSBjb25maWd1cmVkU2l0ZU1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuTW9kZWxPYmplY3QjZ2V0UHJvcGVydHlOYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIFNpdGUuU0lURV9GSUxFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9TaXRlTW9kZWxGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL1NpdGVNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkNTc0NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL1NpdGVNb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguKjsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IHNpdGUgbW9kZWwgZmFjdG9yeS4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IA0KLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGJhc2UgaW1wbGVtZW50YXRpb24gDQotICogb2YgdGhpcyBmYWN0b3J5Lg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlU2l0ZUZhY3RvcnkNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIFNpdGVNb2RlbEZhY3Rvcnkgew0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgZGVmYXVsdCBzaXRlIGZhY3RvcnkuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU2l0ZU1vZGVsRmFjdG9yeSgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBjYW4gaGFuZGxlIHRoZSBzcGVjaWZpZWQgc2l0ZSB0eXBlLiBUaGlzDQotCSAqIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZSBzaXRlIHR5cGUgaWRlbnRpZmllcg0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0eXBlIGNhbiBiZSBoYW5kbGVkLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGNhblBhcnNlU2l0ZVR5cGUoU3RyaW5nIHR5cGUpIHsNCi0JCS8vIHJldHVybiB0cnVlIGlmIHR5cGUgd2FzIG5vdCBzcGVjaWZpZWQgKGllLiBpcyBudWxsIG9yIGVtcHR5IHN0cmluZykNCi0JCXJldHVybiAodHlwZSA9PSBudWxsIHx8IHR5cGUudHJpbSgpLmVxdWFscygiIikpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW5kIHBvcHVsYXRlcyBhIGRlZmF1bHQgc2l0ZSBmcm9tIHN0cmVhbS4NCi0JICogVGhlIHBhcnNlciBhc3N1bWVzIHRoZSBzdHJlYW0gY29udGFpbnMgYSBkZWZhdWx0IHNpdGUgbWFuaWZlc3QNCi0JICogKHNpdGUueG1sKSBhcyBkb2N1bWVudGVkIGJ5IHRoZSBwbGF0Zm9ybS4NCi0JICogDQotCSAqIEBwYXJhbSBzdHJlYW0gc2l0ZSBzdHJlYW0NCi0JICogQHJldHVybiBwb3B1bGF0ZWQgc2l0ZSBtb2RlbA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQGV4Y2VwdGlvbiBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFNpdGVNb2RlbCBwYXJzZVNpdGUoSW5wdXRTdHJlYW0gc3RyZWFtKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotCQlTaXRlTW9kZWwgcmVzdWx0ID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcGFyc2VyLmluaXQodGhpcyk7DQotCQkJcmVzdWx0ID0gcGFyc2VyLnBhcnNlKHN0cmVhbSk7DQotCQkJaWYgKHBhcnNlci5nZXRTdGF0dXMoKSE9bnVsbCkgew0KLQkJCQkvLyBzb21lIGludGVybmFsRXJyb3Igd2VyZSBkZXRlY3RlZA0KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHBhcnNlci5nZXRTdGF0dXMoKTsNCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsNCi0JCQl9DQotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgew0KLQkJCS8vIGludmFsaWQgU2l0ZSB0eXBlDQotCQkJaWYgKGUuZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24pIHsNCi0JCQkJdGhyb3cgKEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsNCi0JCQl9DQotDQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVNb2RlbE9iamVjdC5FcnJvclBhcnNpbmdTaXRlU3RyZWFtIiksZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlTW9kZWxPYmplY3QuRXJyb3JBY2Nlc3NpbmdTaXRlU3RyZWFtIiksZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgc2l0ZSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgU2l0ZU1vZGVsDQotCSAqIEByZXR1cm4gc2l0ZSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU2l0ZU1vZGVsIGNyZWF0ZVNpdGVNYXBNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgU2l0ZU1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgc2l0ZSBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbA0KLQkgKiBAcmV0dXJuIHNpdGUgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIEFyY2hpdmVSZWZlcmVuY2VNb2RlbA0KLQkgKiBAcmV0dXJuIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBBcmNoaXZlUmVmZXJlbmNlTW9kZWwgY3JlYXRlQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBBcmNoaXZlUmVmZXJlbmNlTW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgZGVmYXVsdCBhbm5vdGF0ZWQgVVJMIG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBVUkxFbnRyeU1vZGVsDQotCSAqIEByZXR1cm4gYW5ub3RhdGVkIFVSTCBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMRW50cnlNb2RlbCBjcmVhdGVVUkxFbnRyeU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBVUkxFbnRyeU1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgY2F0ZWdvcnkgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIENhdGVnb3J5TW9kZWwNCi0JICogQHJldHVybiBjYXRlZ29yeSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgQ2F0ZWdvcnlNb2RlbCBjcmVhdGVTaXRlQ2F0ZWdvcnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgQ2F0ZWdvcnlNb2RlbCgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvVVJMRW50cnlNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9VUkxFbnRyeU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmODFlNmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9VUkxFbnRyeU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogQW5ub3RhdGVkIFVSTCBtb2RlbCBvYmplY3QuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gSG93ZXZlciwgaW4gbW9zdCANCi0gKiBjYXNlcyBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCANCi0gKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1vZGVsLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VUkxFbnRyeQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVVJMRW50cnlNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsNCi0JDQotCXByaXZhdGUgU3RyaW5nIGFubm90YXRpb247DQotCXByaXZhdGUgU3RyaW5nIGxvY2FsaXplZEFubm90YXRpb247DQotCXByaXZhdGUgU3RyaW5nIHVybFN0cmluZzsNCi0JcHJpdmF0ZSBVUkwgdXJsOw0KLQkNCi0JcHJpdmF0ZSBpbnQgdHlwZSA9IElVUkxFbnRyeS5VUERBVEVfU0lURTsNCi0JDQotCS8vcGVyZm9ybWFuY2UNCi0JcHJpdmF0ZSBVUkwgYnVuZGxlVVJMOw0KLQlwcml2YXRlIFVSTCBiYXNlOw0KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZWQ9ZmFsc2U7DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIHVuaW5pdGlhbGl6ZWQgYW5ub3RhdGVkIFVSTCBtb2RlbCBvYmplY3QuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMRW50cnlNb2RlbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0JCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdXJsIGFubm90YXRpb24uIElmIHRoZSBtb2RlbCBvYmplY3QgaGFzIGJlZW4gcmVzb2x2ZWQsIA0KLQkgKiB0aGUgYW5ub3RhdGlvbiBpcyBsb2NhbGl6ZWQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHVybCBhbm5vdGF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uKCkgew0KLQkJZGVsYXllZFJlc29sdmUoKTsNCi0JCWlmIChsb2NhbGl6ZWRBbm5vdGF0aW9uICE9IG51bGwpDQotCQkJcmV0dXJuIGxvY2FsaXplZEFubm90YXRpb247DQotCQllbHNlDQotCQkJcmV0dXJuIGFubm90YXRpb247DQotCX0NCi0JCQ0KLQkvKioNCi0JICogcmV0dXJucyB0aGUgbm9uLWxvY2FsaXplZCB1cmwgYW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gbm9uLWxvY2FsaXplZCB1cmwgYW5ub3RhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5vbkxvY2FsaXplZCgpIHsNCi0JCXJldHVybiBhbm5vdGF0aW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB1bnJlc29sdmVkIHVybCBzdHJpbmcuDQotCSAqDQotCSAqIEByZXR1cm4gdXJsIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRVUkxTdHJpbmcoKSB7DQotCQlkZWxheWVkUmVzb2x2ZSgpOw0KLQkJcmV0dXJuIHVybFN0cmluZzsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIFVSTC4NCi0JICogDQotCSAqIEByZXR1cm4gdXJsLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCWRlbGF5ZWRSZXNvbHZlKCk7DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgYW5ub3RhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIGFubm90YXRpb24gYW5ub3RhdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLwkNCi0JcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbikgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247DQotCQl0aGlzLmxvY2FsaXplZEFubm90YXRpb24gPSBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdXJsIHN0cmluZw0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gdXJsU3RyaW5nIHVybCBzdHJpbmcNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8JDQotCXB1YmxpYyB2b2lkIHNldFVSTFN0cmluZyhTdHJpbmcgdXJsU3RyaW5nKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy51cmxTdHJpbmcgPSB1cmxTdHJpbmc7DQotCQl0aGlzLnVybCA9IG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuDQotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSANCi0JICogYmFzZSBVUkwgYXJndW1lbnQuIEFueSB0cmFuc2xhdGFibGUgc3RyaW5ncyBpbiB0aGUgbW9kZWwgdGhhdCBhcmUNCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgDQotCSAqIHJlc291cmNlIGJ1bmRsZS4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlIFVSTA0KLQkgKiBAcGFyYW0gYnVuZGxlVVJMICByZXNvdXJjZSBidW5kbGUgdXJsDQotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsIFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJdGhpcy5iYXNlID0gYmFzZTsNCi0JCXRoaXMuYnVuZGxlVVJMID0gYnVuZGxlVVJMOw0KLQl9DQotDQotDQotCXByaXZhdGUgdm9pZCBkZWxheWVkUmVzb2x2ZSgpIHsNCi0JCQ0KLQkJLy9QRVJGOiBkZWxheSByZXNvbHV0aW9uDQotCQlpZiAocmVzb2x2ZWQpcmV0dXJuOw0KLQkJDQotCQlyZXNvbHZlZD0gdHJ1ZTsNCi0JCS8vIHJlc29sdmUgbG9jYWwgZWxlbWVudHMNCi0JCWxvY2FsaXplZEFubm90YXRpb24gPSByZXNvbHZlTkxTdHJpbmcoYnVuZGxlVVJMLCBhbm5vdGF0aW9uKTsNCi0JCXRyeSB7DQotCQkJdXJsID0gcmVzb2x2ZVVSTChiYXNlLGJ1bmRsZVVSTCwgdXJsU3RyaW5nKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIiIsZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIHR5cGUuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7DQotCQlyZXR1cm4gdHlwZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogTWV0aG9kIHNldFR5cGUuDQotCSAqIEBwYXJhbSBpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCBpKSB7DQotCQl0eXBlID0gaTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL3BhY2thZ2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGE2NjVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4NCi08aHRtbD4NCi08aGVhZD4NCi0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+DQotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzIgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPg0KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi1Qcm92aWRlcyBtb2RlbCBzdXBwb3J0IGZvciBleHRlbmRpbmcgdGhlIGJhc2UgaW5zdGFsbGF0aW9uDQotYW5kIHVwZGF0ZSBzZXJ2aWNlcy4NCi08aDI+DQotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4NCi1UaGlzIHBhY2thZ2UgcHJvdmlkZXMgYSBjb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGVmYXVsdCBtb2RlbA0KLW9iamVjdHMgYW5kIHBhcnNlcnMgdXNlZCBmb3Igd3JpdGluZyBwbHVnZ2FibGUgc3VwcG9ydCBvZiBhbHRlcm5hdGUgZmVhdHVyZQ0KLXBhY2thZ2luZyBzY2hlbWVzIGFuZCB1cGRhdGUgc2l0ZSBhY2Nlc3MgbWVjaGFuaXNtcy4gSW4gZ2VuZXJhbCwgbW9zdCBkZXZlbG9wZXJzDQotZG8gbm90IG5lZWQgdG8gZGlyZWN0bHkgdXNlIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gdGhpcyBwYWNrYWdlLiBJbnN0ZWFkLA0KLXRoZXkgY2FuIHVzZSB0aGUgY29ycmVzcG9uZGluZyBkZXJpdmVkIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgY29udGFpbmVkDQotaW4gcGFja2FnZSA8Yj5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvYj4uDQotPHA+Q2xhc3NlcyBpbiB0aGlzIHBhY2thZ2Ugd291bGQgdHlwaWNhbGx5IG9ubHkgYmUgdXNlZCBkaXJlY3RseSB3aGVuIHdyaXRpbmcNCi1hbmQgYWx0ZXJuYXRlIHNldCBvZiBtb2RlbCBvYmplY3RzIGZvciBhIGZlYXR1cmUgYW5kIHR5cGUgaW1wbGVtZW50YXRpb24uDQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL3BhY2thZ2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQxMTQwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4NCi08aHRtbD4NCi08aGVhZD4NCi0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+DQotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzIgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPg0KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi1Qcm92aWRlcyBzdXBwb3J0IGZvciBleHRlbmRpbmcgdGhlIGJhc2UgaW5zdGFsbGF0aW9uDQotYW5kIHVwZGF0ZSBzZXJ2aWNlcy4NCi08aDI+DQotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4NCi1UaGlzIHBhY2thZ2Ugc3BlY2lmaWVzIHRoZSBBUEkgcmVxdWlyZWQgZm9yIHdyaXRpbmcgcGx1Z2dhYmxlIHN1cHBvcnQgb2YNCi1hbHRlcm5hdGUgZmVhdHVyZSBwYWNrYWdpbmcgc2NoZW1lcyBhbmQgdXBkYXRlIHNpdGUgYWNjZXNzIG1lY2hhbmlzbXMuDQotRm9yIHRoZSBtb3N0IHBhcnQsIHRoZSBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIGluIHRoaXMgcGFja2FnZSBpbXBsZW1lbnQNCi1hIGNvZGUgcGF0dGVybiA8dHQ+Y2xhc3MgRm9vIGV4dGVuZHMgRm9vTW9kZWwgaW1wbGVtZW50cyBJRm9vPC90dD4uIFRoZQ0KLWludGVyZmFjZSAoPHR0PklGb288L3R0PiBpbiB0aGUgcGF0dGVybikgZGVmaW5lcyB0aGUgYWN0dWFsIEFQSS4gVGhlIGNvbnZlbmllbmNlDQotY2xhc3NlcyAoPHR0PkZvbzwvdHQ+IGluIHRoZSBwYXR0ZXJuKSBwcm92aWRlIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uDQotb2YgdGhlIEFQSSBiYXNlZCBvbiBhIG1vZGVsICg8dHQ+SUZvb01vZGVsPC90dD4gaW4gdGhlIHBhdHRlcm4pIGNvbnRhaW5lZA0KLWluIHBhY2thZ2UgPGI+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw8L2I+LiBJbiBnZW5lcmFsLCBkZXZlbG9wZXJzDQotc2hvdWxkIGV4dGVuZCB0aGUgY29udmVuaWVuY2UgY2xhc3NlcyByYXRoZXIgdGhhbiBjb21wbGV0ZWx5IHJlaW1wbGVtZW50aW5nDQotdGhlIHNwZWNpZmllZCBpbnRlcmZhY2VzLg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Bc3NlcnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYzgwNGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0gDQotLyoqDQotICogPGNvZGU+QXNzZXJ0PC9jb2RlPiBpcyB1c2VmdWwgZm9yIGZvciBlbWJlZGRpbmcgcnVudGltZSBzYW5pdHkgY2hlY2tzDQotICogaW4gY29kZS4gVGhlIHN0YXRpYyBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZQ0KLSAqIHR5cGUgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGRvZXMgbm90IGhvbGQuDQotICogPHA+DQotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlDQotICogdGhyb3duIHdoZW4gc29tZXRoaW5nIGlzIG1pc2JlaGF2aW5nLiBBc3NlcnRpb24gZmFpbHVyZXMgYXJlIGludmFyaWFibHkNCi0gKiB1bnNwZWNpZmllZCBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uDQotICogdGhlc2UgYmVpbmcgdGhyb3duIChvciBub3QgdGhyb3duKS4gPGI+SWYgeW91IGZpbmQgeW91cnNlbGYgaW4gdGhlDQotICogcG9zaXRpb24gd2hlcmUgeW91IG5lZWQgdG8gY2F0Y2ggYW4gYXNzZXJ0aW9uIGZhaWx1cmUsIHlvdSBoYXZlIG1vc3QgDQotICogY2VydGFpbmx5IHdyaXR0ZW4geW91ciBwcm9ncmFtIGluY29ycmVjdGx5LjwvYj4NCi0gKiA8L3A+DQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7DQotCQ0KLQkvKioNCi0JICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bg0KLQkgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uDQotCSAqIDxwPg0KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zIHRoYXQgY2F0Y2ggDQotCSAqIG9yIG90aGVyd2lzZSBkZXBlbmQgb24gYXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBzdXNjZXB0aWJsZSB0byB1bmV4cGVjdGVkDQotCSAqIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7DQotDQotCQkvKioNCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLg0KLQkJICovDQotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCkgew0KLQkJfQ0KLQkJDQotCQkvKioNCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuDQotCQkgKi8NCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgew0KLQkJICAgIHN1cGVyKGRldGFpbCk7DQotCQl9DQotCX0NCi0vKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQuICovDQotcHJpdmF0ZSBBc3NlcnQoKSB7DQotfQ0KLS8qKg0KLSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMNCi0gKiBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4NCi0gKiBpcyB0aHJvd24uDQotICoNCi0gKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29tZSBvZiB0aGUgY2hlY2sNCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybg0KLSAqICAgIGlmIHRoZSBjaGVjayBmYWlscykNCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQNCi0gKi8NCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24pIHsNCi0JLy8gc3VjY2VlZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlDQotCWlmIChleHByZXNzaW9uKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQlyZXR1cm4gaXNMZWdhbChleHByZXNzaW9uLCAiIik7Ly8kTk9OLU5MUy0xJA0KLX0NCi0vKioNCi0gKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzDQotICogbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+DQotICogaXMgdGhyb3duLg0KLSAqIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLg0KLSAqDQotICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvbWUgb2YgdGhlIGNoZWNrDQotICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uDQotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4NCi0gKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpDQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkDQotICovDQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgew0KLQlpZiAoIWV4cHJlc3Npb24pDQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOw0KLQlyZXR1cm4gZXhwcmVzc2lvbjsNCi19DQotLyoqDQotICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzDQotICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQotICogPHA+DQotICogQXMgYSBnZW5lcmFsIHJ1bGUsIHBhcmFtZXRlcnMgcGFzc2VkIHRvIEFQSSBtZXRob2RzIG11c3Qgbm90IGJlDQotICogPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIDxiPmV4cGxpY2l0bHk8L2I+IGFsbG93ZWQgaW4gdGhlIG1ldGhvZCdzDQotICogc3BlY2lmaWNhdGlvbi4gU2ltaWxhcmx5LCByZXN1bHRzIHJldHVybmVkIGZyb20gQVBJIG1ldGhvZHMgYXJlIG5ldmVyDQotICogPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIDxiPmV4cGxpY2l0bHk8L2I+IGFsbG93ZWQgaW4gdGhlIG1ldGhvZCdzDQotICogc3BlY2lmaWNhdGlvbi4gSW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIG1ha2UgcmVndWxhciB1c2Ugb2YgDQotICogPGNvZGU+QXNzZXJ0LmlzTm90TnVsbDwvY29kZT4gdG8gZW5zdXJlIHRoYXQgPGNvZGU+bnVsbDwvY29kZT4gDQotICogcGFyYW1ldGVycyBhcmUgZGV0ZWN0ZWQgYXMgZWFybHkgYXMgcG9zc2libGUuDQotICogPC9wPg0KLSAqIE1ldGhvZCB0aHJvd3MgYW4gdW5zcGVjaWZpZWQgdW5jaGVja2VkIGV4Y2VwdGlvbiBpZiB0aGUgb2JqZWN0DQotICogICBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLSAqIEBwYXJhbSBvYmplY3QgdGhlIHZhbHVlIHRvIHRlc3QNCi0gKi8NCi1wdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QpIHsNCi0JLy8gc3VjY2VlZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlDQotCWlmIChvYmplY3QgIT0gbnVsbCkgew0KLQkJcmV0dXJuOw0KLQl9DQotCWlzTm90TnVsbChvYmplY3QsICIiKTsvLyROT04tTkxTLTEkDQotfQ0KLS8qKg0KLSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcw0KLSAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLg0KLSAqIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLg0KLSAqIDxwPg0KLSAqIEFzIGEgZ2VuZXJhbCBydWxlLCBwYXJhbWV0ZXJzIHBhc3NlZCB0byBBUEkgbWV0aG9kcyBtdXN0IG5vdCBiZQ0KLSAqIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyA8Yj5leHBsaWNpdGx5PC9iPiBhbGxvd2VkIGluIHRoZSBtZXRob2Qncw0KLSAqIHNwZWNpZmljYXRpb24uIFNpbWlsYXJseSwgcmVzdWx0cyByZXR1cm5lZCBmcm9tIEFQSSBtZXRob2RzIGFyZSBuZXZlcg0KLSAqIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyA8Yj5leHBsaWNpdGx5PC9iPiBhbGxvd2VkIGluIHRoZSBtZXRob2Qncw0KLSAqIHNwZWNpZmljYXRpb24uIEltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byBtYWtlIHJlZ3VsYXIgdXNlIG9mIA0KLSAqIDxjb2RlPkFzc2VydC5pc05vdE51bGw8L2NvZGU+IHRvIGVuc3VyZSB0aGF0IDxjb2RlPm51bGw8L2NvZGU+IA0KLSAqIHBhcmFtZXRlcnMgYXJlIGRldGVjdGVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlLg0KLSAqIDwvcD4NCi0gKiBBbiB1bnNwZWNpZmllZCB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgb2JqZWN0DQotICogICBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLSAqIEBwYXJhbSBvYmplY3QgdGhlIHZhbHVlIHRvIHRlc3QNCi0gKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24NCi0gKi8NCi1wdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7DQotCWlmIChvYmplY3QgPT0gbnVsbCkNCi0JCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oIm51bGwgYXJndW1lbnQ7IiArIG1lc3NhZ2UpOy8vJE5PTi1OTFMtMSQNCi19DQotLyoqDQotICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzDQotICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQotICoNCi0gKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29tZSBvZiB0aGUgY2hlY2sNCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybg0KLSAqICAgIGlmIHRoZSBjaGVjayBmYWlscykNCi0gKi8NCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbikgew0KLQkvLyBzdWNjZWVkIGFzIHF1aWNrbHkgYXMgcG9zc2libGUNCi0JaWYgKGV4cHJlc3Npb24pIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOy8vJE5PTi1OTFMtMSQNCi19DQotLyoqDQotICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzDQotICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQotICogVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuDQotICoNCi0gKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29tZSBvZiB0aGUgY2hlY2sNCi0gKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24NCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybg0KLSAqICAgIGlmIHRoZSBjaGVjayBmYWlscykNCi0gKi8NCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsNCi0JaWYgKCFleHByZXNzaW9uKQ0KLQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigiYXNzZXJ0aW9uIGZhaWxlZDsgIittZXNzYWdlKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBleHByZXNzaW9uOw0KLX0NCi19DQotDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9CYXNlU2l0ZUxvY2FsRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9CYXNlU2l0ZUxvY2FsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Q4NDk4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQmFzZVNpdGVMb2NhbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuKjsNCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgQmFzZVNpdGVMb2NhbEZhY3Rvcnkgew0KLQkvKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNyZWF0ZUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IEluc3RhbGxDb25maWd1cmF0aW9uKCk7DQotCX0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwgY3JlYXRlQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eSgpOw0KLQl9DQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWwgY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgQ29uZmlndXJlZFNpdGUoKTsNCi0JfQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgY3JlYXRlQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uUG9saWN5KCk7DQotCX0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWwgY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbChTaXRlTW9kZWwgc2l0ZSwgaW50IHBvbGljeSkgew0KLQkJLy9jcmVhdGUgY29uZmlnIHNpdGUNCi0JCUNvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlnU2l0ZSA9IHRoaXMuY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgpOw0KLQkJY29uZmlnU2l0ZS5zZXRTaXRlTW9kZWwoc2l0ZSk7DQotCQlDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgcG9saWN5TW9kZWwgPSB0aGlzLmNyZWF0ZUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOw0KLQkJcG9saWN5TW9kZWwuc2V0UG9saWN5KHBvbGljeSk7DQotCQljb25maWdTaXRlLnNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbChwb2xpY3lNb2RlbCk7DQotCQkoKENvbmZpZ3VyYXRpb25Qb2xpY3kpIHBvbGljeU1vZGVsKS5zZXRDb25maWd1cmVkU2l0ZU1vZGVsKGNvbmZpZ1NpdGUpOw0KLQkJcmV0dXJuIGNvbmZpZ1NpdGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmF0aW9uQWN0aXZpdHkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvbkFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzUzYTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmF0aW9uQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBqYXZhLmlvLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOw0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQWN0aXZpdHkNCi0JZXh0ZW5kcyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbA0KLQlpbXBsZW1lbnRzIElBY3Rpdml0eSwgSVdyaXRhYmxlIHsNCi0JCQ0KLQkvKioNCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvcg0KLQkgKi8JCQ0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFjdGl2aXR5KCkgew0KLQl9DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3Igd2l0aCBhY3Rpb24NCi0JICovDQotCXB1YmxpYyBDb25maWd1cmF0aW9uQWN0aXZpdHkoaW50IGFjdGlvbikgew0KLQkJc3VwZXIoKTsNCi0JCXNldEFjdGlvbihhY3Rpb24pOw0KLQkJc2V0U3RhdHVzKFNUQVRVU19OT0spOw0KLQl9DQotCQ0KLQkvKg0KLQkgKiBAc2VlIElXcml0YWJsZSN3cml0ZShpbnQsIFByaW50V3JpdGVyKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGluZGVudCwgUHJpbnRXcml0ZXIgdykgew0KLS8vCQlTdHJpbmcgZ2FwPSAiIjsgLy8kTk9OLU5MUy0xJA0KLS8vCQlmb3IgKGludCBpPSAwOyBpIDwgaW5kZW50OyBpKyspDQotLy8JCQlnYXAgKz0gIiAiOyAvLyROT04tTkxTLTEkDQotLy8JCVN0cmluZyBpbmNyZW1lbnQ9ICIiOyAvLyROT04tTkxTLTEkDQotLy8JCWZvciAoaW50IGk9IDA7IGkgPCBJV3JpdGFibGUuSU5ERU5UOyBpKyspDQotLy8JCQlpbmNyZW1lbnQgKz0gIiAiOyAvLyROT04tTkxTLTEkDQotLy8JCQkNCi0vLwkJLy8gQUNUSVZJVFkJDQotLy8JCXcucHJpbnQoZ2FwICsgIjwiICsgSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIuQUNUSVZJVFkgKyAiICIpOw0KLS8vCQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0vLwkJdy5wcmludGxuKCJhY3Rpb249XCIiICsgZ2V0QWN0aW9uKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLS8vCQlpZiAoZ2V0TGFiZWwoKSAhPSBudWxsKSB7DQotLy8JCQl3LnByaW50bG4oZ2FwICsgaW5jcmVtZW50KyAibGFiZWw9XCIiICsgVXBkYXRlTWFuYWdlclV0aWxzLldyaXRlci54bWxTYWZlKGdldExhYmVsKCkpICsgIlwiICIpOw0KLS8vCQkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotLy8JCX0NCi0vLwkJdy5wcmludGxuKGdhcCArIGluY3JlbWVudCsiZGF0ZT1cIiIgKyBnZXREYXRlKCkuZ2V0VGltZSgpICsgIlwiICIpOw0KLS8vCQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0vLwkJdy5wcmludGxuKGdhcCArIGluY3JlbWVudCsic3RhdHVzPVwiIiArIGdldFN0YXR1cygpICsgIlwiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0vLw0KLS8vCQkvLyBlbmQNCi0vLwkJdy5wcmludGxuKGdhcCArICI8LyIgKyBJbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlci5BQ1RJVklUWSArICI+Iik7DQotLy8JCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLS8vCQl3LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCQkNCi0JfQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJQWN0aXZpdHkjZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKQ0KLQkgKi8NCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpIHsNCi0JCXJldHVybiAoSUluc3RhbGxDb25maWd1cmF0aW9uKSBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCk7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsNCi0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkFjdGl2aXR5KSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlpZiAodGhpcyA9PSBvdGhlcikNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCQ0KLQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gKENvbmZpZ3VyYXRpb25BY3Rpdml0eSkgb3RoZXI7DQotCQlyZXR1cm4gZ2V0QWN0aW9uKCkgPT0gYWN0aXZpdHkuZ2V0QWN0aW9uKCkNCi0JCQkJJiYgZ2V0TGFiZWwoKS5lcXVhbHMoYWN0aXZpdHkuZ2V0TGFiZWwoKSkNCi0JCQkJJiYgZ2V0U3RhdHVzKCkgPT0gYWN0aXZpdHkuZ2V0U3RhdHVzKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmF0aW9uUG9saWN5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyYXRpb25Qb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkN2VhZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyYXRpb25Qb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7DQotDQotLyoqDQotICogDQotICovDQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Qb2xpY3kgZXh0ZW5kcyBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbC4NCi0JICovDQotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5KCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBDb3B5IENvbnN0cnVjdG9yIGZvciBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwuDQotCSAqLw0KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBvbGljeShDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ1BvbGljeSkgew0KLQkJc3VwZXIoKTsNCi0JCXNldFBvbGljeShjb25maWdQb2xpY3kuZ2V0UG9saWN5KCkpOw0KLQkJc2V0Q29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKGNvbmZpZ1BvbGljeS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKSk7DQotCQlzZXRVbmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyhjb25maWdQb2xpY3kuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKSk7DQotCQlzZXRDb25maWd1cmVkU2l0ZU1vZGVsKGNvbmZpZ1BvbGljeS5nZXRDb25maWd1cmVkU2l0ZU1vZGVsKCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmNvbmZpZ3VyZWQoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZmVyZW5jZSkgew0KLQ0KLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQkvLyByZXR1cm5zIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgcGFydCBvZiB0aGUgY29uZmlndXJlZCBsaXN0DQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBnZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGZlYXR1cmVSZWZlcmVuY2UuZXF1YWxzKHJlZnNbaV0pKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UpIHsNCi0NCi0JCWlmIChmZWF0dXJlUmVmZXJlbmNlID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIHBhcnQgb2YgdGhlIGNvbmZpZ3VyZWQgbGlzdA0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoZmVhdHVyZVJlZmVyZW5jZS5lcXVhbHMocmVmc1tpXSkpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBhZGRzIHRoZSBmZWF0dXJlIHRvIHRoZSBsaXN0IG9mIGZlYXR1cmVzIGlmIHRoZSBwb2xpY3kgaXMgVVNFUl9JTkNMVURFDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZmVyZW5jZSwgYm9vbGVhbiBjYWxsSW5zdGFsbEhhbmRsZXIsIGJvb2xlYW4gY3JlYXRlQWN0aXZpdHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChpc0NvbmZpZ3VyZWQoZmVhdHVyZVJlZmVyZW5jZSkpIC8vIGFscmVhZHkgY29uZmlndXJlZA0KLQkJCXJldHVybjsNCi0NCi0JCWlmIChmZWF0dXJlUmVmZXJlbmNlID09IG51bGwpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIlRoZSBmZWF0dXJlIHJlZmVyZW5jZSB0byBjb25maWd1cmUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7DQotCQl0cnkgew0KLQkJCWZlYXR1cmUgPSBmZWF0dXJlUmVmZXJlbmNlLmdldEZlYXR1cmUobnVsbCk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKGZlYXR1cmVSZWZlcmVuY2UpKSB7DQotCQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOw0KLQkJCQlTdHJpbmcgdXJsU3RyaW5nID0gKHVybCAhPSBudWxsKSA/IHVybC50b0V4dGVybmFsRm9ybSgpIDogIjxubyBmZWF0dXJlIHJlZmVyZW5jZSB1cmw+IjsgLy8kTk9OLU5MUy0xJA0KLQkJCQlVcGRhdGVDb3JlLndhcm4oIkVycm9yIHJldHJpZXZpbmcgZmVhdHVyZToiICsgdXJsU3RyaW5nLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgew0KLQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOw0KLQkJCVN0cmluZyB1cmxTdHJpbmcgPSAodXJsICE9IG51bGwpID8gdXJsLnRvRXh0ZXJuYWxGb3JtKCkgOiAiPG5vIGZlYXR1cmUgcmVmZXJlbmNlIHVybD4iOyAvLyROT04tTkxTLTEkDQotCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgZmVhdHVyZSB0byB1bmNvbmZpZ3VyZSBpcyBudWxsOiBmZWF0dXJlIHJlZmVyZW5jZSBpczoiICsgdXJsU3RyaW5nKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJLy8gU2V0dXAgb3B0aW9uYWwgaW5zdGFsbCBoYW5kbGVyDQotCQlJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPSBudWxsOw0KLQkJaWYgKGNhbGxJbnN0YWxsSGFuZGxlciAmJiBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyRW50cnkoKSAhPSBudWxsKQ0KLQkJCWhhbmRsZXIgPSBuZXcgSW5zdGFsbEhhbmRsZXJQcm94eShJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fQ09ORklHVVJFLCBmZWF0dXJlLCBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyRW50cnkoKSwgbnVsbCk7DQotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsNCi0JCVRocm93YWJsZSBvcmlnaW5hbEV4Y2VwdGlvbiA9IG51bGw7DQotDQotCQkvLyBkbyB0aGUgY29uZmlndXJlIGFjdGlvbg0KLQkJdHJ5IHsNCi0JCQlpZiAoaGFuZGxlciAhPSBudWxsKQ0KLQkJCQloYW5kbGVyLmNvbmZpZ3VyZUluaXRpYXRlZCgpOw0KLQ0KLQkJCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7DQotCQkJaWYgKGNyZWF0ZUFjdGl2aXR5KSB7DQotCQkJCWFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRSk7DQotCQkJCWFjdGl2aXR5LnNldExhYmVsKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOw0KLQkJCX0NCi0NCi0JCQlhZGRDb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZSgoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBmZWF0dXJlUmVmZXJlbmNlKTsNCi0NCi0JCQkvLyBldmVyeXRoaW5nIGRvbmUgb2sNCi0JCQlpZiAoYWN0aXZpdHkgIT0gbnVsbCkgew0KLQkJCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBpbnN0YWxsQ29uZmlnID0gKEluc3RhbGxDb25maWd1cmF0aW9uKSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOw0KLQkJCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19PSyk7DQotCQkJCWluc3RhbGxDb25maWcuYWRkQWN0aXZpdHkoYWN0aXZpdHkpOw0KLQkJCX0NCi0NCi0JCQlpZiAoaGFuZGxlciAhPSBudWxsKQ0KLQkJCQloYW5kbGVyLmNvbXBsZXRlQ29uZmlndXJlKCk7DQotDQotCQkJc3VjY2VzcyA9IHRydWU7DQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLQkJCW9yaWdpbmFsRXhjZXB0aW9uID0gdDsNCi0JCX0gZmluYWxseSB7DQotCQkJVGhyb3dhYmxlIG5ld0V4Y2VwdGlvbiA9IG51bGw7DQotCQkJdHJ5IHsNCi0JCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkNCi0JCQkJCWhhbmRsZXIuY29uZmlndXJlQ29tcGxldGVkKHN1Y2Nlc3MpOw0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotCQkJCW5ld0V4Y2VwdGlvbiA9IHQ7DQotCQkJfQ0KLQkJCWlmIChvcmlnaW5hbEV4Y2VwdGlvbiAhPSBudWxsKSAvLyBvcmlnaW5hbCBleGNlcHRpb24gd2lucw0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW5zdGFsbEhhbmRsZXIuZXJyb3IiLCBmZWF0dXJlLmdldExhYmVsKCkpLCBvcmlnaW5hbEV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQNCi0JCQlpZiAobmV3RXhjZXB0aW9uICE9IG51bGwpDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci5lcnJvciIsIGZlYXR1cmUuZ2V0TGFiZWwoKSksIG5ld0V4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogY2hlY2sgaWYgdGhlIHBsdWdpbnMgdG8gdW5jb25maWd1cmUgYXJlIHJlcXVpcmVkIGJ5IG90aGVyIGNvbmZpZ3VyZWQgZmVhdHVyZSBhbmQNCi0JICogYWRkcyB0aGUgZmVhdHVyZSB0byB0aGUgbGlzdCBvZiB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiB1bmNvbmZpZ3VyZShJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlLCBib29sZWFuIGNhbGxJbnN0YWxsSGFuZGxlciwgYm9vbGVhbiBjcmVhdGVBY3Rpdml0eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKGlzVW5jb25maWd1cmVkKGZlYXR1cmVSZWZlcmVuY2UpKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlIGFscmVhZHkgdW5jb25maWd1cmVkIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0NCi0JCWlmIChmZWF0dXJlUmVmZXJlbmNlID09IG51bGwpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIlRoZSBmZWF0dXJlIHJlZmVyZW5jZSB0byB1bmNvbmZpZ3VyZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJZmVhdHVyZSA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0RmVhdHVyZShudWxsKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCWlmICghVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwoZmVhdHVyZVJlZmVyZW5jZSkpIHsNCi0JCQkJVVJMIHVybCA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0VVJMKCk7DQotCQkJCVN0cmluZyB1cmxTdHJpbmcgPSAodXJsICE9IG51bGwpID8gdXJsLnRvRXh0ZXJuYWxGb3JtKCkgOiAiPG5vIGZlYXR1cmUgcmVmZXJlbmNlIHVybD4iOyAvLyROT04tTkxTLTEkDQotCQkJCVVwZGF0ZUNvcmUud2FybigiRXJyb3IgcmV0cmlldmluZyBmZWF0dXJlOiIgKyB1cmxTdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7DQotCQkJVVJMIHVybCA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0VVJMKCk7DQotCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQNCi0JCQlVcGRhdGVDb3JlLndhcm4oIlRoZSBmZWF0dXJlIHRvIHVuY29uZmlndXJlIGlzIG51bGw6IGZlYXR1cmUgcmVmZXJlbmNlIGlzOiIgKyB1cmxTdHJpbmcpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJLy8gU2V0dXAgb3B0aW9uYWwgaW5zdGFsbCBoYW5kbGVyDQotCQlJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPSBudWxsOw0KLQkJaWYgKGNhbGxJbnN0YWxsSGFuZGxlciAmJiBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyRW50cnkoKSAhPSBudWxsKSB7DQotCQkJaGFuZGxlciA9IG5ldyBJbnN0YWxsSGFuZGxlclByb3h5KElJbnN0YWxsSGFuZGxlci5IQU5ETEVSX0FDVElPTl9VTkNPTkZJR1VSRSwgZmVhdHVyZSwgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCksIG51bGwpOw0KLQkJfQ0KLQ0KLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7DQotCQlUaHJvd2FibGUgb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOw0KLQ0KLQkJLy8gZG8gdGhlIHVuY29uZmlndXJlIGFjdGlvbg0KLQkJdHJ5IHsNCi0NCi0JCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOw0KLQkJCWlmIChjcmVhdGVBY3Rpdml0eSkgew0KLQkJCQlhY3Rpdml0eSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9VTkNPTkZJR1VSRSk7DQotCQkJCWFjdGl2aXR5LnNldExhYmVsKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOw0KLQkJCX0NCi0NCi0JCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBpbnN0YWxsQ29uZmlnID0gbnVsbDsNCi0NCi0JCQkvLyBvbmx5IGFzayBmb3IgaW5zdGFsbCBjb25maWcgaXMgYWN0aXZpdHkgY3JlYXRlZC4NCi0JCQkvLyBwcmV2ZW50cyBsb29wcyBkdXJpbmcgcmVjb25jaWxpYXRpb24NCi0JCQlpZiAoYWN0aXZpdHkgIT0gbnVsbCkNCi0JCQkJaW5zdGFsbENvbmZpZyA9ICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpOw0KLQ0KLQkJCS8vIEFsbG93IHVuY29uZmlndXJlIGlmIHRoZSBmZWF0dXJlIGlzIG9wdGlvbmFsIGZyb20gYWxsIHRoZSBwYXJlbnRzDQotCQkJLy8gb3IgaWYgdGhlIGZlYXR1cmUgaXMgbWFuZGF0b3J5IGFuZCBub24gb2YgaXRzIHBhcmVudCBhcmUgY29uZmlndXJlZA0KLQkJCS8vIHJlbW92ZWQsIG5vdCBhIGNvcmUgaXNzdWUgKHNvIGRlZXAgZG93bikNCi0JCQkvL2lmICh2YWxpZGF0ZU5vQ29uZmlndXJlZFBhcmVudHMoZmVhdHVyZSkpIHsNCi0JCQlpZiAoaGFuZGxlciAhPSBudWxsKQ0KLQkJCQloYW5kbGVyLnVuY29uZmlndXJlSW5pdGlhdGVkKCk7DQotCQkJYWRkVW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZSgoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBmZWF0dXJlUmVmZXJlbmNlKTsNCi0JCQlpZiAoaGFuZGxlciAhPSBudWxsKQ0KLQkJCQloYW5kbGVyLmNvbXBsZXRlVW5jb25maWd1cmUoKTsNCi0NCi0JCQkvLyBldmVyeXRoaW5nIGRvbmUgb2sNCi0JCQlpZiAoYWN0aXZpdHkgIT0gbnVsbCkgew0KLQkJCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19PSyk7DQotCQkJCWluc3RhbGxDb25maWcuYWRkQWN0aXZpdHkoYWN0aXZpdHkpOw0KLQkJCX0NCi0JCQlzdWNjZXNzID0gdHJ1ZTsNCi0JCQkvL30gZWxzZSB7DQotCQkJLy8JaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsNCi0JCQkvLwkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfTk9LKTsNCi0JCQkvLwkJaW5zdGFsbENvbmZpZy5hZGRBY3Rpdml0eU1vZGVsKChDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCkgYWN0aXZpdHkpOw0KLQkJCS8vCX0NCi0JCQkvL30NCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotCQkJb3JpZ2luYWxFeGNlcHRpb24gPSB0Ow0KLQkJfSBmaW5hbGx5IHsNCi0JCQlUaHJvd2FibGUgbmV3RXhjZXB0aW9uID0gbnVsbDsNCi0JCQl0cnkgew0KLQkJCQlpZiAoaGFuZGxlciAhPSBudWxsKQ0KLQkJCQkJaGFuZGxlci51bmNvbmZpZ3VyZUNvbXBsZXRlZChzdWNjZXNzKTsNCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLQkJCQluZXdFeGNlcHRpb24gPSB0Ow0KLQkJCX0NCi0JCQlpZiAob3JpZ2luYWxFeGNlcHRpb24gIT0gbnVsbCkgLy8gb3JpZ2luYWwgZXhjZXB0aW9uIHdpbnMNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLmVycm9yIiwgZmVhdHVyZS5nZXRMYWJlbCgpKSwgb3JpZ2luYWxFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkDQotCQkJaWYgKG5ld0V4Y2VwdGlvbiAhPSBudWxsKQ0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW5zdGFsbEhhbmRsZXIuZXJyb3IiLCBmZWF0dXJlLmdldExhYmVsKCkpLCBuZXdFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAoIXN1Y2Nlc3MpIHsNCi0JCQlVUkwgdXJsID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRVUkwoKTsNCi0JCQlTdHJpbmcgdXJsU3RyaW5nID0gKHVybCAhPSBudWxsKSA/IHVybC50b0V4dGVybmFsRm9ybSgpIDogIjxubyBmZWF0dXJlIHJlZmVyZW5jZSB1cmw+IjsgLy8kTk9OLU5MUy0xJA0KLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHVuY29uZmlndXJlOiIgKyB1cmxTdHJpbmcpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gc3VjY2VzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2FsY3VsYXRlcyB0aGUgcGx1Z2luIGxpc3QgZm9yIHRoZSBwb2xpY3kuIEZvciAiSU5DTFVERSIgcG9saWN5LCB0aGlzDQotCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBwbHVnaW5zIGZvciBjb25maWd1cmVkIGZlYXR1cmVzLiBGb3IgIkVYQ0xVREUiDQotCSAqIHBvbGljeSwgdGhpcyBjb3JyZXNwb25kcyB0byB0aGUgcGx1Z2lucyBmb3IgdW5jb25maWd1cmVkIGZlYXR1cmVzIHRoYXQNCi0JICogYXJlIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBjb25maWd1cmVkIGZlYXR1cmVzLg0KLQkgKi8NCi0JcHVibGljIFN0cmluZ1tdIGdldFBsdWdpblBhdGgoSVNpdGUgc2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJU3RyaW5nW10gcGx1Z2luUGF0aHM7DQotCQkvLyBOb3RlOiBTaW5jZSAzLjBNNyB3ZSBsZWF2ZSBwYXRjaGVkIGZlYXR1cmVzIGNvbmZpZ3VyZWQsDQotCQkvLyBhbmQgdGFrZSB0aGlzIGludG8gYWNjb3VudCB3aGVuIGNvbXB1dGluZyBjb25maWd1cmVkIHBsdWdpbnMNCi0JCS8vIGFsbCB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMuIE5vdGUgdGhhdCBwYXRjaGVkIGZlYXR1cmVzIGFyZSBzdGlsbA0KLQkJLy8gY29uZmlndXJlZA0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSB1bmNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7DQotCQkvLyBhbGwgY29uZmlndXJlZCBmZWF0dXJlcywgaW5jbHVkaW5nIHBhdGNoZXMgYW5kIHBhdGNoZWQgZmVhdHVyZXMNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZEZlYXR1cmVzID0gZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7DQotCQlpZiAoIWlzRW5hYmxlZCgpKSB7DQotCQkJaWYgKGdldFBvbGljeSgpID09IElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKSB7DQotCQkJCS8vIGRpc2FibGVkIHNpdGUsIElOQ0xVREUgcG9saWN5DQotCQkJCXBsdWdpblBhdGhzID0gbmV3IFN0cmluZ1swXTsNCi0JCQl9IGVsc2Ugew0KLQkJCQkvLyBkaXNhYmxlZCBzaXRlLCBFWENMVURFIHBvbGljeQ0KLQkJCQlwbHVnaW5QYXRocyA9IGdldEFsbEtub3duUGx1Z2luU3RyaW5ncyhzaXRlLA0KLQkJCQkJCWNvbmZpZ3VyZWRGZWF0dXJlcywgdW5jb25maWd1cmVkRmVhdHVyZXMpOw0KLQkJCX0NCi0JCX0gZWxzZSB7DQotCQkJLy8gUGF0Y2hlZEZlYXR1cmVzIChtYXkgaGF2ZSBubyBwYXRjaGVzKSB3aXRoIGNvcnJlc3BvbmRpbmcgcGF0Y2hlcw0KLQkJCVBhdGNoZWRGZWF0dXJlW10gcGF0Y2hlZEZlYXR1cmVzID0gYnVpbGRQYXRjaGVkRmVhdHVyZXMoY29uZmlndXJlZEZlYXR1cmVzKTsNCi0JCQlpZiAoZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpIHsNCi0JCQkJLy8gZW5hYmxlZCBzaXRlLCBJTkNMVURFIHBvbGljeQ0KLQkJCQlwbHVnaW5QYXRocyA9IGdldENvbmZpZ3VyZWRQbHVnaW5TdHJpbmdzKHNpdGUsIHBhdGNoZWRGZWF0dXJlcyk7DQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gZW5hYmxlZCBzaXRlLCBFWENMVURFIHBvbGljeSAtIHRoZSB1c3VhbCBzY2VuYXJpbyBmb3IgbG9jYWwNCi0JCQkJLy8gc2l0ZS4NCi0JCQkJLy8gcmV0dXJuIGFsbCBrbm93biBNSU5VUyBjb25maWd1cmVkIHBsdWdpbnMNCi0JCQkJcGx1Z2luUGF0aHMgPSBzdWJ0cmFjdChnZXRBbGxLbm93blBsdWdpblN0cmluZ3Moc2l0ZSwNCi0JCQkJCQljb25maWd1cmVkRmVhdHVyZXMsIHVuY29uZmlndXJlZEZlYXR1cmVzKSwNCi0JCQkJCQlnZXRDb25maWd1cmVkUGx1Z2luU3RyaW5ncyhzaXRlLCBwYXRjaGVkRmVhdHVyZXMpKTsNCi0JCQl9DQotCQl9DQotCQkvL1RSQUNFDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgew0KLQkJCVVwZGF0ZUNvcmUNCi0JCQkJCS5kZWJ1ZygiR2V0UGx1Z2luUGF0aCBmb3I6ICIgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkrICgoc2l0ZSA9PSBudWxsKSA/ICI8Tm8gc2l0ZT4iIDogc2l0ZS5nZXRVUkwoKSAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJLnRvU3RyaW5nKCkpKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpblBhdGhzLmxlbmd0aDsgaSsrKSB7DQotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlRvIHdyaXRlOiIgKyBwbHVnaW5QYXRoc1tpXSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gcGx1Z2luUGF0aHM7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBPYnRhaW5zIFBhdGNoZWRGZWF0dXJlcyAtIG5vbiBwYXRjaCBmZWF0dXJlcyB3aXRoIGNvcnJlc3BvbmRpbmcgcGF0Y2hlcyBpZiBhbnkNCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlcw0KLQkgKiAgICAgICAgICAgIGFycmF5IG9mIGZlYXR1cmVzIHRvIG9wZXJhdGUgd2l0aA0KLQkgKiBAcmV0dXJuIFBhdGNoZXMNCi0JICovDQotCXByaXZhdGUgUGF0Y2hlZEZlYXR1cmVbXSBidWlsZFBhdGNoZWRGZWF0dXJlcyhJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzKSB7DQotCQkvLyBQYXRjaGVkRmVhdHVyZXMgYnkgVmVyc2lvbmVkSWRlbnRpZmllcg0KLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7DQotCQkvLyBDcmVhdGUgYSBtYXAgb2YgZmVhdHVyZXMgKG5vdCBwYXRjaGVzKQ0KLQkJZm9yIChpbnQgZiA9IDA7IGYgPCBmZWF0dXJlcy5sZW5ndGg7IGYrKykgew0KLQkJCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYgPSBmZWF0dXJlc1tmXTsNCi0JCQl0cnkgew0KLQkJCQlpZihmZWF0dXJlUmVmLmlzUGF0Y2goKSl7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpID0gZmVhdHVyZVJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQkJCW1hcC5wdXQodmksIG5ldyBQYXRjaGVkRmVhdHVyZShmZWF0dXJlc1tmXSkpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQkJfQ0KLQkJfQ0KLQkJLy8gYXR0YWNoIHBhdGNoZXMgdG8gZmVhdHVyZXMNCi0JCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdHVyZXMubGVuZ3RoOyBmKyspIHsNCi0JCQlJRmVhdHVyZVJlZmVyZW5jZSBwYXRjaENhbmRpZGF0ZSA9IGZlYXR1cmVzW2ZdOw0KLQkJCXRyeSB7DQotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBwYXRjaENhbmRpZGF0ZS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQlJSW1wb3J0W10gaW1wb3J0cyA9IGZlYXR1cmUuZ2V0SW1wb3J0cygpOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsNCi0JCQkJCUlJbXBvcnQgb25lSW1wb3J0ID0gaW1wb3J0c1tpXTsNCi0JCQkJCWlmICghb25lSW1wb3J0LmlzUGF0Y2goKSkNCi0JCQkJCQljb250aW51ZTsNCi0JCQkJCS8vIGl0IGlzIGEgcGF0Y2ggZm9yDQotCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHBhdGNoZWRJZGVudGlmaWVyID0NCi0JCQkJCQlvbmVJbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOw0KLQkJCQkJUGF0Y2hlZEZlYXR1cmUgcGY9KFBhdGNoZWRGZWF0dXJlKSBtYXAuZ2V0KHBhdGNoZWRJZGVudGlmaWVyKTsNCi0JCQkJCWlmIChwZiE9bnVsbCkgew0KLQkJCQkJCXBmLmFkZFBhdGNoKHBhdGNoQ2FuZGlkYXRlKTsNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJLy8gcGF0Y2hlZCBmZWF0dXJlIG5vdCBlbmFibGVkDQotCQkJCQl9DQotCQkJCX0NCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOw0KLQkJCX0NCi0JCX0NCi0JCUNvbGxlY3Rpb24gcGF0Y2hlZEZlYXR1cmVzPW1hcC52YWx1ZXMoKTsNCi0JCXJldHVybiAoUGF0Y2hlZEZlYXR1cmVbXSlwYXRjaGVkRmVhdHVyZXMudG9BcnJheShuZXcgUGF0Y2hlZEZlYXR1cmVbcGF0Y2hlZEZlYXR1cmVzLnNpemUoKV0pOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkgew0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gcmVzdWx0ID0gZ2V0Q29uZmlndXJlZEZlYXR1cmVzTW9kZWwoKTsNCi0JCWlmIChyZXN1bHQubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJRmVhdHVyZVJlZmVyZW5jZVswXTsNCi0JCWVsc2UNCi0JCQlyZXR1cm4gKElGZWF0dXJlUmVmZXJlbmNlW10pIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKSB7DQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSByZXN1bHQgPSBnZXRVbmNvbmZpZ3VyZWRGZWF0dXJlc01vZGVsKCk7DQotCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07DQotCQllbHNlDQotCQkJcmV0dXJuIChJRmVhdHVyZVJlZmVyZW5jZVtdKSByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEdldHMgdGhlIGNvbmZpZ3VyZWRTaXRlLg0KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJQ29uZmlndXJlZFNpdGUNCi0JICovDQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7DQotCQlyZXR1cm4gKElDb25maWd1cmVkU2l0ZSkgZ2V0Q29uZmlndXJlZFNpdGVNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiByZW1vdmVzIGEgZmVhdHVyZSByZWZlcmVuY2UNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZikgew0KLQkJaWYgKGZlYXR1cmVSZWYgaW5zdGFuY2VvZiBGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIHsNCi0JCQlyZW1vdmVGZWF0dXJlUmVmZXJlbmNlKChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGZlYXR1cmVSZWYpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBsdWdpbiBwYXRoIGZvciB0aGUgYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2UuIEZvcg0KLQkgKiAgICAgICAgIGZlYXR1cmVzIHRoYXQgaGF2ZSBwYXRjaGVzLCBwbHVnaW4gcGF0aCB3aWxsDQotCSAqICAgICAgICAgcG9pbnQgdG8gcGx1Z2luIHdpdGggdGhlIHNhbWUgSUQgcHJvdmlkZWQgYnkgdGhlIHBhdGNoIGlmIGl0DQotCSAqICAgICAgICAgZXhpc3RzLiBFYWNoIHBsdWdpbiBwYXRoIG9ubHkgYXBwZWFycyBvbmNlIFtidWcgMjE3NTBdDQotCSAqLw0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRQbHVnaW5TdHJpbmdzKElTaXRlIHNpdGUsIFBhdGNoZWRGZWF0dXJlW10gZmVhdHVyZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKXsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkNPTkZJR1VSRUQgUExVR0lOUyIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQ0KLQkJLy8gVXNlIHNldCB0byBlbGltaW5hdGUgcGx1Z2lucyB3aXRoIHNhbWUgSUQgYW5kIHZlcnNpb24uDQotCQkvLyBEaWZmZXJlbnQgdmVyc2lvbnMgb2YgcGx1Z2lucyB3aXRoIHNhbWUgSUQgYXJlIGFsbG93ZWQgaWYgY29taW5nIGZyb20gZGlmZmVyZW50IGZlYXR1cmVzDQotCQlTZXQgZmVhdHVyZVBsdWdpbnMgPSBuZXcgSGFzaFNldCgpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgew0KLQkJCUZlYXR1cmVQbHVnaW5bXSBwbHVnaW5zID0gZmVhdHVyZXNbaV0uZ2V0UGx1Z2lucygpOw0KLQkJCWZlYXR1cmVQbHVnaW5zLmFkZEFsbChBcnJheXMuYXNMaXN0KHBsdWdpbnMpKTsNCi0JCX0NCi0JCVNldCBwbHVnaW5TdHJpbmdzID0gZ2V0UGx1Z2luU3RyaW5ncyhzaXRlLCAoRmVhdHVyZVBsdWdpbltdKSBmZWF0dXJlUGx1Z2lucy50b0FycmF5KG5ldyBGZWF0dXJlUGx1Z2luW2ZlYXR1cmVQbHVnaW5zLnNpemUoKV0pKTsNCi0JCXJldHVybiAoU3RyaW5nW10pIHBsdWdpblN0cmluZ3MudG9BcnJheShuZXcgU3RyaW5nW3BsdWdpblN0cmluZ3Muc2l6ZSgpXSk7DQotCX0NCi0JLyoqDQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcGx1Z2luIHBhdGggZm9yIGV2ZXJ5IHBsdWdpbiBpbiBrbm93biBmZWF0dXJlcw0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRBbGxLbm93blBsdWdpblN0cmluZ3MoSVNpdGUgc2l0ZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkLElGZWF0dXJlUmVmZXJlbmNlW10gdW5jb25maWd1cmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTil7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBTEwgUExVR0lOUyIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkvLyBBZGQgZmVhdHVyZXMsIHBhdGNoZWQgZmVhdHVyZXMsIG9yIHBhdGNoZXMNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gYWxsPW5ldyBJRmVhdHVyZVJlZmVyZW5jZVtjb25maWd1cmVkLmxlbmd0aCt1bmNvbmZpZ3VyZWQubGVuZ3RoXTsNCi0JCVN5c3RlbS5hcnJheWNvcHkoY29uZmlndXJlZCwgMCwgYWxsLCAwLCBjb25maWd1cmVkLmxlbmd0aCk7DQotCQlTeXN0ZW0uYXJyYXljb3B5KHVuY29uZmlndXJlZCwgMCwgYWxsLCBjb25maWd1cmVkLmxlbmd0aCwgdW5jb25maWd1cmVkLmxlbmd0aCk7DQotCQkvLw0KLQkJU2V0IHBhdGNoZWRQbHVnaW5zID0gbmV3IEhhc2hTZXQoKTsNCi0JCWZvciAoaW50IGk9MDsgaTwgYWxsLmxlbmd0aDsgaSsrKSB7DQotCQkJdHJ5IHsNCi0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGFsbFtpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7DQotCQkJCQlVcGRhdGVDb3JlLndhcm4oIk51bGwgRmVhdHVyZSIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotDQotCQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQkJLy8gYWRkIGV2ZXJ5IHBsdWdpbiB0byB0aGUgbWFwDQotCQkJCWZvciAoaW50IGVudHIgPSAwOyBlbnRyIDwgZW50cmllcy5sZW5ndGg7IGVudHIrKykgew0KLQkJCQkJcGF0Y2hlZFBsdWdpbnMuYWRkKG5ldyBGZWF0dXJlUGx1Z2luKGVudHJpZXNbZW50cl0sIGZlYXR1cmUpKTsNCi0JCQkJfQ0KLQ0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQkJfQ0KLQkJfQ0KLQkJU2V0IHBsdWdpblN0cmluZ3MgPSBnZXRQbHVnaW5TdHJpbmdzKHNpdGUsICAoRmVhdHVyZVBsdWdpbltdKXBhdGNoZWRQbHVnaW5zLnRvQXJyYXkobmV3IEZlYXR1cmVQbHVnaW5bcGF0Y2hlZFBsdWdpbnMuc2l6ZSgpXSkpOw0KLQkJcmV0dXJuIChTdHJpbmdbXSkgcGx1Z2luU3RyaW5ncy50b0FycmF5KG5ldyBTdHJpbmdbcGx1Z2luU3RyaW5ncy5zaXplKCldKTsNCi0JfQ0KLQkvKioNCi0JICogQHBhcmFtIHNpdGUNCi0JICogQHBhcmFtIHBsdWdpbnNbXQ0KLQkgKiBAcmV0dXJuIHZhbGlkIHN0cmluZyBwb2ludGluZyB0byBwbHVnaW5zIGluIGdpdmVuIGZlYXR1cmVzDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBTZXQgZ2V0UGx1Z2luU3RyaW5ncyhJU2l0ZSBzaXRlLCBGZWF0dXJlUGx1Z2luW10gcGx1Z2lucykgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJU2V0IHBsdWdpblN0cmluZ3M9bmV3IEhhc2hTZXQoKTsNCi0JCWZvciAoaW50IGk9MDsgaTwgcGx1Z2lucy5sZW5ndGg7IGkrKykgew0KLQkJCUlQbHVnaW5FbnRyeSBlbnRyeSA9IHBsdWdpbnNbaV0uZ2V0RW50cnkoKTsNCi0JCQlJRmVhdHVyZSBmZWF0dXJlPXBsdWdpbnNbaV0uZ2V0RmVhdHVyZSgpOw0KLQ0KLQkJCS8vIG9idGFpbiB0aGUgcGF0aCBvZiB0aGUgcGx1Z2luIGRpcmVjdG9yaWVzIG9uIHRoZSBzaXRlDQotCQkJQ29udGVudFJlZmVyZW5jZVtdIGZlYXR1cmVDb250ZW50UmVmZXJlbmNlID0gbnVsbDsNCi0JCQl0cnkgew0KLQkJCQlmZWF0dXJlQ29udGVudFJlZmVyZW5jZSA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoZW50cnksIG51bGwgLypJUHJvZ3Jlc3NNb25pdG9yKi8NCi0JCQkJKTsNCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOw0KLQkJCX0NCi0NCi0JCQkvLyB0cmFuc2Zvcm0gaW50byBhIHZhbGlkIFN0cmluZw0KLQkJCWlmIChmZWF0dXJlQ29udGVudFJlZmVyZW5jZSAhPSBudWxsKSB7DQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmVhdHVyZUNvbnRlbnRSZWZlcmVuY2UubGVuZ3RoOyBqKyspIHsNCi0JCQkJCVVSTCB1cmwgPSBzaXRlLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKS5nZXRBcmNoaXZlUmVmZXJlbmNlKGZlYXR1cmVDb250ZW50UmVmZXJlbmNlW2pdLmdldElkZW50aWZpZXIoKSk7DQotCQkJCQlpZiAodXJsICE9IG51bGwpIHsNCi0JCQkJCQkvLyBtYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBzaXRlDQotCQkJCQkJU3RyaW5nIHBhdGggPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMQXNTdHJpbmcoc2l0ZS5nZXRVUkwoKSwgdXJsKTsNCi0JCQkJCQkvLyBhZGQgZW5kICIvIg0KLQkJCQkJCXBhdGggKz0gKHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpIHx8IHBhdGguZW5kc1dpdGgoIi8iKSkgPyAiIiA6ICIvIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJCQlwbHVnaW5TdHJpbmdzLmFkZChwYXRoKTsNCi0JCQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikNCi0JCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJBZGQgcGx1Z2luOiAiICsgcGF0aCArICIgdG8gdGhlIGxpc3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gcGx1Z2luU3RyaW5nczsNCi0JfQ0KLQ0KLQkvKioNCi0JICoJIE9idGFpbnMgc3RyaW5ncyBleGlzdGluZyBpbiB0aGUgYWxsU3RyaW5ncyBhcnJheSwgYnV0IG5vdCBpbiB0aGUgc3RyaW5nc1RvUmVtb3ZlDQotCSAqLw0KLQlwcml2YXRlIFN0cmluZ1tdIHN1YnRyYWN0KFN0cmluZ1tdIGFsbFN0cmluZ3MsIFN0cmluZ1tdIHN0cmluZ3NUb1JlbW92ZSkgew0KLQkJSGFzaFNldCByZXN1bHRMaXN0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChhbGxTdHJpbmdzKSk7DQotCQlyZXN1bHRMaXN0LnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KHN0cmluZ3NUb1JlbW92ZSkpOw0KLQkJcmV0dXJuIChTdHJpbmdbXSlyZXN1bHRMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRMaXN0LnNpemUoKV0pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJlZFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJlZFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3YWVhYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyZWRTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci0KLS8qKgotICogQSBDb25maWd1cmVkIHNpdGUgbWFuYWdlcyB0aGUgQ29uZmlndXJlZCBhbmQgdW5jb25maWd1cmVkIGZlYXR1cmVzIG9mIGEgU2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJlZFNpdGUgZXh0ZW5kcyBDb25maWd1cmVkU2l0ZU1vZGVsIGltcGxlbWVudHMgSUNvbmZpZ3VyZWRTaXRlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NJVEVfTUFSS0VSID0gIi5lY2xpcHNlcHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1NJVEVfTUFSS0VSID0gIi5lY2xpcHNlZXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbGlzdGVuZXJzCQotCXByaXZhdGUgTGlzdGVuZXJzTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJzTGlzdCgpOwotCi0JLy8gdmVyaWZpY2F0aW9uIHN0YXR1cwotCXByaXZhdGUgSVN0YXR1cyB2ZXJpZnlTdGF0dXM7Ci0KLQkvLyB0cmFuc2llbnQ6IHRydWUgaWYgdGhlIHNpdGUgd2FzIGp1c3QgY3JlYXRlZCBzbyB3ZSBjYW4gcmVtb3ZlIGl0Ci0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBqdXN0Q3JlYXRlZCA9IGZhbHNlOwotCi0JLyoKLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlKCkgewotCX0KLQotCS8qCi0JICogQ29weSBDb25zdHJ1Y3RvcgotCSAqIEFzIG9mIG5vdywgY29uZmlnU2l0ZSBjYW4gb25seSBiZSBvZiB0eXBlIENvbmZpZ3VyZWRTaXRlCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlKElDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlKSB7Ci0JCUNvbmZpZ3VyZWRTaXRlIGNTaXRlID0gKENvbmZpZ3VyZWRTaXRlKSBjb25maWdTaXRlOwotCQlzZXRTaXRlTW9kZWwoY1NpdGUuZ2V0U2l0ZU1vZGVsKCkpOwotCQlzZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwobmV3IENvbmZpZ3VyYXRpb25Qb2xpY3koY1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpKSk7Ci0JCXNldFVwZGF0YWJsZShjU2l0ZS5pc1VwZGF0YWJsZSgpKTsKLQkJc2V0RW5hYmxlZChjU2l0ZS5pc0VuYWJsZWQoKSk7Ci0JCXNldFByZXZpb3VzUGx1Z2luUGF0aChjU2l0ZS5nZXRQcmV2aW91c1BsdWdpblBhdGgoKSk7Ci0JCXNldFBsYXRmb3JtVVJMU3RyaW5nKGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkpOwotCX0KLQotCS8qCi0JICogIEFkZHMgYSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI2luc3RhbGwoSUZlYXR1cmUsSVZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIGZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gaW5zdGFsbChmZWF0dXJlLCBudWxsLCB2ZXJpZmljYXRpb25MaXN0ZW5lciwgbW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSNpbnN0YWxsKElGZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIGZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gY2hhbmdlIHRoZSBzdGF0dXMgaWYganVzdENyZWF0ZWQKLQkJaWYgKGp1c3RDcmVhdGVkKSBqdXN0Q3JlYXRlZD1mYWxzZTsKLQotCQkvLyBDb25maWdTaXRlIGlzIHJlYWQgb25seSAKLQkJaWYgKCFpc1VwZGF0YWJsZSgpKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLk5vbkluc3RhbGxhYmxlU2l0ZSIsIGdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJSVN0YXR1cyBzdGF0dXMgPSB2ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQllcnJvck1lc3NhZ2UgKz0gIiAiICsgc3RhdHVzLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oZXJyb3JNZXNzYWdlLCBudWxsKTsKLQkJfQotCi0JCS8vIGZlYXR1cmUgaXMgbnVsbAotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLk51bGxGZWF0dXJlVG9JbnN0YWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQotCQkvLyBmZWF0dXJlIHJlZmVyZW5jZSB0byByZXR1cm4KLQkJSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbGVkRmVhdHVyZVJlZjsKLQkJSUZlYXR1cmUgaW5zdGFsbGVkRmVhdHVyZSA9IG51bGw7Ci0KLQkJLy8gY3JlYXRlIHRoZSBBY3Rpdml0eSAoSU5TVEFMTCkKLQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfSU5TVEFMTCk7Ci0JCWFjdGl2aXR5LnNldExhYmVsKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOwotCi0JCXRyeSB7Ci0JCQlpbnN0YWxsZWRGZWF0dXJlUmVmID0gZ2V0U2l0ZSgpLmluc3RhbGwoZmVhdHVyZSwgb3B0aW9uYWxGZWF0dXJlcywgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIG1vbml0b3IpOwotCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkgewotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlN1Y2Vzc2Z1bGx5IGluc3RhbGxlZDogIiArIGluc3RhbGxlZEZlYXR1cmVSZWYuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKGluc3RhbGxlZEZlYXR1cmVSZWYgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluc3RhbGxlZEZlYXR1cmUgPSBpbnN0YWxsZWRGZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcgZG9uZSBvawotCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOwotCi0JCQkvLyBub3RpZnkgbGlzdGVuZXJzCi0JCQlPYmplY3RbXSBzaXRlTGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGluc3RhbGxlZEZlYXR1cmUgIT0gbnVsbCkgewotCQkJCQlJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikgc2l0ZUxpc3RlbmVyc1tpXSk7Ci0JCQkJCWxpc3RlbmVyLmZlYXR1cmVJbnN0YWxsZWQoaW5zdGFsbGVkRmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vdCBvaywgc2V0IEFjdGl2aXR5IHN0YXR1cwotCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfTk9LKTsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQkoKEluc3RhbGxDb25maWd1cmF0aW9uKSBjdXJyZW50KS5hZGRBY3Rpdml0eShhY3Rpdml0eSk7Ci0JCX0KLQkJLy8gY2FsbCB0aGUgY29uZmlndXJlIHRhc2sJCi0JCWlmIChpbnN0YWxsZWRGZWF0dXJlICE9IG51bGwpCi0JCQljb25maWd1cmUoaW5zdGFsbGVkRmVhdHVyZSwgb3B0aW9uYWxGZWF0dXJlcywgZmFsc2UpOwotCQkvKmNhbGxJbnN0YWxsSGFuZGxlciovCi0KLQkJcmV0dXJuIGluc3RhbGxlZEZlYXR1cmVSZWY7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSNyZW1vdmUoSUZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIENvbmZpZ1NpdGUgaXMgcmVhZCBvbmx5Ci0JCWlmICghaXNVcGRhdGFibGUoKSkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5Ob25Vbmluc3RhbGxhYmxlU2l0ZSIsIGdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oZXJyb3JNZXNzYWdlLCBudWxsKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgQWN0aXZpdHkKLQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfUkVNT1ZFKTsKLQkJYWN0aXZpdHkuc2V0TGFiZWwoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFjdGl2aXR5LnNldERhdGUobmV3IERhdGUoKSk7Ci0KLQkJdHJ5IHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZmVyZW5jZVRvUmVtb3ZlID0gbnVsbDsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWYgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZi5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmZWF0dXJlUmVmW2ldLmVxdWFscyhyZWYpKSB7Ci0JCQkJCXJlZmVyZW5jZVRvUmVtb3ZlID0gZmVhdHVyZVJlZltpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyB3ZSBmb3VuZCBhIGZlYXR1cmUgcmVmZXJlbmNlIG9uIHRoZSBzaXRlIG1hdGNoaW5nIHRoZSBmZWF0dXJlCQkJCi0JCQlpZiAocmVmZXJlbmNlVG9SZW1vdmUgIT0gbnVsbCkgewotCQkJCS8vIENoZWNrIGlmIGZlYXR1cmUgaXMgdW5jb25maWd1cmVkIGJlZm9yZSB3ZSByZW1vdmUgaXQKLQkJCQkvLyBvdXIgVUkgd2lsbCBjaGVjay4KLQkJCQkvLyBGb3Igbm9uLVVJIGFwcGxpY2F0aW9uLCB0aHJvdyBlcnJvciBpcyBmZWF0dXJlIGlzIGNvbmZpZ3VyZWQKLQkJCQlpZiAoZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmlzQ29uZmlndXJlZChyZWZlcmVuY2VUb1JlbW92ZSkpIHsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZVRvUmVtb3ZlID0gKChJRmVhdHVyZVJlZmVyZW5jZSkgcmVmZXJlbmNlVG9SZW1vdmUpLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCVN0cmluZyBmZWF0dXJlTGFiZWwgPSAoZmVhdHVyZVRvUmVtb3ZlID09IG51bGwpID8gbnVsbCA6IGZlYXR1cmVUb1JlbW92ZS5nZXRMYWJlbCgpOwotCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuVW5hYmxlVG9SZW1vdmVDb25maWd1cmVkRmVhdHVyZSIgLy8kTk9OLU5MUy0xJAotCQkJCQksIGZlYXR1cmVMYWJlbCksIG51bGwpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLlVuYWJsZVRvRmluZEZlYXR1cmUiLCBmZWF0dXJlLmdldFVSTCgpLnRvU3RyaW5nKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJbnVsbCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZQotCQkJZ2V0U2l0ZSgpLnJlbW92ZShmZWF0dXJlLCBtb25pdG9yKTsKLQkJCWdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5yZW1vdmVGZWF0dXJlUmVmZXJlbmNlKHJlZmVyZW5jZVRvUmVtb3ZlKTsKLQkJCS8vIGV2ZXJ5dGhpbmcgZG9uZSBvawotCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOwotCQkJLy8gbm90aWZ5IGxpc3RlbmVycwotCQkJT2JqZWN0W10gc2l0ZUxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKSBzaXRlTGlzdGVuZXJzW2ldKS5mZWF0dXJlUmVtb3ZlZChmZWF0dXJlKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19OT0spOwotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50ID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGN1cnJlbnQpLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJQ29uZmlndXJlZFNpdGUjY29uZmlndXJlKElGZWF0dXJlKSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQljb25maWd1cmUoZmVhdHVyZSwgbnVsbCwgdHJ1ZSAvKmNhbGxJbnN0YWxsSGFuZGxlciovCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywgYm9vbGVhbiBjYWxsSW5zdGFsbEhhbmRsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHRpbmcgdG8gY29uZmlndXJlIGEgbnVsbCBmZWF0dXJlIGluIHNpdGU6IiArIGdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWdQb2xpY3kgPSBnZXRDb25maWd1cmF0aW9uUG9saWN5KCk7Ci0JCWlmIChjb25maWdQb2xpY3kgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBib3R0b20gdXAgYXBwcm9hY2gsIHNhbWUgY29uZmlndXJlZFNpdGUKLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuUmVmID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWlmIChvcHRpb25hbEZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuUmVmID0gY2hpbGRyZW5Ub0NvbmZpZ3VyZShjaGlsZHJlblJlZiwgb3B0aW9uYWxGZWF0dXJlcyk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuUmVmLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGNoaWxkID0gY2hpbGRyZW5SZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQljb25maWd1cmUoY2hpbGQsIG9wdGlvbmFsRmVhdHVyZXMsIGNhbGxJbnN0YWxsSGFuZGxlcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3aWxsIHNraXAgYW55IGJhZCBjaGlsZHJlbgotCQkJCWlmICghY2hpbGRyZW5SZWZbaV0uaXNPcHRpb25hbCgpKQotCQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBjb25maWd1cmUgY2hpbGQgZmVhdHVyZTogIiArIGNoaWxkcmVuUmVmW2ldICsgIiAiICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0KLQkJLy8gY29uZmlndXJlIHJvb3QgZmVhdHVyZSAJCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQkJY29uZmlnUG9saWN5LmNvbmZpZ3VyZShmZWF0dXJlUmVmZXJlbmNlLCBjYWxsSW5zdGFsbEhhbmRsZXIsIHRydWUpOwotCi0JCS8vIG5vdGlmeSBsaXN0ZW5lcnMKLQkJT2JqZWN0W10gc2l0ZUxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkoKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikgc2l0ZUxpc3RlbmVyc1tpXSkuZmVhdHVyZUNvbmZpZ3VyZWQoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgb3B0aW9uYWwgY2hpbGRyZW4gdG8gY29uZmlndXJlCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuIGFsbCB0aGUgbmVzdGVkIGZlYXR1cmVzCi0JICogQHBhcmFtIG9wdGlvbmFsZmVhdHVyZXMgb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5zdGFsbAotCSAqIEByZXR1cm4gSUZlYXR1cmVSZWZlcmVuY2VbXQotCSAqLwotCXByaXZhdGUgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuVG9Db25maWd1cmUoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMpIHsKLQotCQlMaXN0IGNoaWxkcmVuVG9JbnN0YWxsID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIG9wdGlvbmFsRmVhdHVyZVRvQ29uZmlndXJlID0gY2hpbGRyZW5baV07Ci0JCQlpZiAoIW9wdGlvbmFsRmVhdHVyZVRvQ29uZmlndXJlLmlzT3B0aW9uYWwoKSkgewotCQkJCWNoaWxkcmVuVG9JbnN0YWxsLmFkZChvcHRpb25hbEZlYXR1cmVUb0NvbmZpZ3VyZSk7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb3B0aW9uYWxmZWF0dXJlcy5sZW5ndGg7IGorKykgewotCQkJCQkvLyBtdXN0IGNvbXBhcmUgZmVhdHVyZSBhcyBvcHRpb25hbEZlYXR1cmVzIGFyZSBmcm9tIHRoZSBpbnN0YWxsIHNpdGUKLQkJCQkJLy8gd2hlcmUgY2hpbGRyZW4gYXJlIG9uIHRoZSBsb2NhbCBzaXRlCi0JCQkJCXRyeSB7Ci0JCQkJCQlJRmVhdHVyZSBpbnN0YWxsZWRDaGlsZHJlbiA9IG9wdGlvbmFsZmVhdHVyZXNbal0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJCWlmIChpbnN0YWxsZWRDaGlsZHJlbi5lcXVhbHMob3B0aW9uYWxGZWF0dXJlVG9Db25maWd1cmUuZ2V0RmVhdHVyZShudWxsKSkpIHsKLQkJCQkJCQljaGlsZHJlblRvSW5zdGFsbC5hZGQob3B0aW9uYWxGZWF0dXJlVG9Db25maWd1cmUpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtjaGlsZHJlblRvSW5zdGFsbC5zaXplKCldOwotCQlpZiAoY2hpbGRyZW5Ub0luc3RhbGwuc2l6ZSgpID4gMCkgewotCQkJY2hpbGRyZW5Ub0luc3RhbGwudG9BcnJheShyZXN1bHQpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI3VuY29uZmlndXJlKElGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gdGhlIGZpcnN0IGNhbGwgc291bGQgZGlzYWJsZSB3aXRob3V0IGNoZWNraW5nIGZvciBlbmFibGUgcGFyZW50Ci0JCXJldHVybiB1bmNvbmZpZ3VyZShmZWF0dXJlLCB0cnVlLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gaW5jbHVkZVBhdGNoZXMsIGJvb2xlYW4gdmVyaWZ5RW5hYmxlUGFyZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQotCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBGZWF0dXJlIFJlZmVyZW5jZSBmb3IgZmVhdHVyZSIgKyBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWdQb2xpY3kgPSBnZXRDb25maWd1cmF0aW9uUG9saWN5KCk7Ci0JCWlmIChjb25maWdQb2xpY3kgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyB2ZXJpZnkgbm8gZW5hYmxlIHBhcmVudAotCQlpZiAodmVyaWZ5RW5hYmxlUGFyZW50ICYmICF2YWxpZGF0ZU5vQ29uZmlndXJlZFBhcmVudHMoZmVhdHVyZSkpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiVGhlIGZlYXR1cmUgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpICsgIiB0byBkaXNhYmxlIGlzIG5lZWRlZCBieSBhbm90aGVyIGVuYWJsZSBmZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJYm9vbGVhbiBzdWNlc3NmdWxseVVuY29uZmlndXJlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3VjZXNzZnVsbHlVbmNvbmZpZ3VyZWQgPSBjb25maWdQb2xpY3kudW5jb25maWd1cmUoZmVhdHVyZVJlZmVyZW5jZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVVJMIHVybCA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0VVJMKCk7Ci0JCQlTdHJpbmcgdXJsU3RyaW5nID0gKHVybCAhPSBudWxsKSA/IHVybC50b0V4dGVybmFsRm9ybSgpIDogIjxubyBmZWF0dXJlIHJlZmVyZW5jZSB1cmw+IjsgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gdW5jb25maWd1cmUiICsgdXJsU3RyaW5nLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQlpZiAoc3VjZXNzZnVsbHlVbmNvbmZpZ3VyZWQpIHsKLQkJCS8vIDIuMC4yOiB1bmNvbmZpZ3VyZSBwYXRjaGVzIHRoYXQgcmVmZXJlbmNlIHRoaXMgZmVhdHVyZS4KLQkJCS8vIEEgcGF0Y2ggaXMgYSBmZWF0dXJlIHRoYXQgY29udGFpbnMgYW4gaW1wb3J0Ci0JCQkvLyBzdGF0ZW1lbnQgd2l0aCBwYXRjaD0idHJ1ZSIgYW5kIGFuIGlkL3ZlcnNpb24KLQkJCS8vIHRoYXQgbWF0Y2hlcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBhbmQgY29uZmlndXJlZAotCQkJLy8gZmVhdHVyZS4gV2hlbiBwYXRjaGVkIGZlYXR1cmUgaXMgdW5jb25maWd1cmVkLAotCQkJLy8gYWxsIHRoZSBwYXRjaGVzIHRoYXQgcmVmZXJlbmNlIGl0IG11c3QgYmUgCi0JCQkvLyB1bmNvbmZpZ3VyZWQgYXMgd2VsbAotCQkJLy8gKGluIGNvbnRyYXN0LCBwYXRjaGVkIGZlYXR1cmVzIGNhbiBiZQotCQkJLy8gY29uZmlndXJlZCB3aXRob3V0IHRoZSBwYXRjaGVzKS4KLQkJCWlmIChpbmNsdWRlUGF0Y2hlcykKLQkJCQl1bmNvbmZpZ3VyZVBhdGNoZXMoZmVhdHVyZSk7Ci0KLQkJCS8vIHRvcCBkb3duIGFwcHJvYWNoLCBzYW1lIGNvbmZpZ3VyZWRTaXRlCi0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW5SZWYgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5SZWYubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNoaWxkcmVuUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7IC8vIGRpc2FibGUgdGhlIGV4YWN0IGZlYXR1cmUKLQkJCQkJdW5jb25maWd1cmUoY2hpbGQsIGluY2x1ZGVQYXRjaGVzLCB0cnVlKTsgLy8gY2hlY2sgZm9yIHBhcmVudCBhcyB3ZSBzaG91bGQgYmUgdGhlIG9ubHkgcGFyZW50LgotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBza2lwIGFueSBiYWQgY2hpbGRyZW4KLQkJCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gdW5jb25maWd1cmUgY2hpbGQgZmVhdHVyZTogIiArIGNoaWxkcmVuUmVmW2ldICsgIiAiICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gbm90aWZ5IGxpc3RlbmVycwotCQkJT2JqZWN0W10gc2l0ZUxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCUlDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9ICgoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKSBzaXRlTGlzdGVuZXJzW2ldKTsKLQkJCQlsaXN0ZW5lci5mZWF0dXJlVW5jb25maWd1cmVkKGZlYXR1cmUpOwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOwotCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHVuY29uZmlndXJlOiIgKyB1cmxTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIExvb2sgZm9yIGZlYXR1cmVzIHRoYXQgaGF2ZSBhbiBpbXBvcnQgcmVmZXJlbmNlCi0JICogdGhhdCBwb2ludHMgdG8gdGhpcyBmZWF0dXJlIGFuZCB3aGVyZSBwYXRjaD10cnVlLgotCSAqIFVuY29uZmlndXJlIGFsbCB0aGUgbWF0Y2hpbmcgcGF0Y2hlcywgYnV0Ci0JICogZG8gbm90IGRvIHRoZSBzYW1lIGxvb2t1cCBmb3IgdGhlbQotCSAqIGJlY2F1c2UgcGF0Y2hlcyBjYW5ub3QgaGF2ZSBwYXRjaGVzIHRoZW1zZWx2ZXMuCi0JICovCi0KLQlwcml2YXRlIHZvaWQgdW5jb25maWd1cmVQYXRjaGVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmcmVmcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSBmcmVmID0gZnJlZnNbaV07Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGNhbmRpZGF0ZSA9IGZyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAoY2FuZGlkYXRlLmVxdWFscyhmZWF0dXJlKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoVXBkYXRlVXRpbHMuaXNQYXRjaChmZWF0dXJlLCBjYW5kaWRhdGUpKQotCQkJCQl1bmNvbmZpZ3VyZShjYW5kaWRhdGUsIGZhbHNlLCBmYWxzZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI2dldENvbmZpZ3VyZWRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkgewotCQlpZiAoaXNFbmFibGVkKCkpCi0JCQlyZXR1cm4gZ2V0UmF3Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgSVNpdGVGZWF0dXJlUmVmZXJlbmNlWzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29uZmlndXJlZFNpdGUjZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0UmF3Q29uZmlndXJlZEZlYXR1cmVzKCkgewotCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ1BvbGljeSA9IGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKLQkJaWYgKGNvbmZpZ1BvbGljeSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbMF07Ci0KLQkJcmV0dXJuIGNvbmZpZ1BvbGljeS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQl9Ci0KLQkvKgotCSAqIGFkZHMgY29uZmlndXJlZCBhbmQgdW5jb25maWd1cmVkIGZlYXR1cmUgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldEZlYXR1cmVSZWZlcmVuY2VzKCkgewotCi0JCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY29uZmlnUG9saWN5ID0gZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOwotCQlpZiAoY29uZmlnUG9saWN5ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElTaXRlRmVhdHVyZVJlZmVyZW5jZVswXTsKLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlpbnQgY29uZkxlbiA9IGNvbmZpZ3VyZWRGZWF0dXJlcy5sZW5ndGg7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gdW5jb25maWd1cmVkRmVhdHVyZXMgPSBjb25maWdQb2xpY3kuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJaW50IHVuY29uZkxlbiA9IHVuY29uZmlndXJlZEZlYXR1cmVzLmxlbmd0aDsKLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlc3VsdCA9IG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtjb25mTGVuICsgdW5jb25mTGVuXTsKLQkJaWYgKGNvbmZMZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGNvbmZpZ3VyZWRGZWF0dXJlcywgMCwgcmVzdWx0LCAwLCBjb25mTGVuKTsKLQkJfQotCQlpZiAodW5jb25mTGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weSh1bmNvbmZpZ3VyZWRGZWF0dXJlcywgMCwgcmVzdWx0LCBjb25mTGVuLCB1bmNvbmZMZW4pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIENvbmZpZ3VyZSBhbmQgdW5jb25maWd1cmUgYXBwcm9wcmlhdGUgZmVhdHVyZSB0bwotCSAqIGJlY29tZSAnbGlrZScgY3VycmVudENvbmZpZ3VyYXRpb24gd2hpY2ggaXMgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiB0aGUgdXNlciB3YW50cyB0byByZXZlcnQgdG8uCi0JICogCi0JICogQWxsIGZlYXR1cmVzIGZyb20gY3VycmVudENvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGNvbmZpZ3VyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXZlcnRUbyhJQ29uZmlndXJlZFNpdGUgb2xkQ29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvYmxlbUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQotCQlDb25maWd1cmVkU2l0ZSBvbGRDb25maWd1cmVkU2l0ZSA9IChDb25maWd1cmVkU2l0ZSkgb2xkQ29uZmlndXJhdGlvbjsKLQotCQkvLyByZXRyaWV2ZSB0aGUgZmVhdHVyZSB0aGF0IHdlcmUgY29uZmlndXJlZAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRGZWF0dXJlcyA9IG9sZENvbmZpZ3VyZWRTaXRlLnZhbGlkQ29uZmlndXJlZEZlYXR1cmVzKGhhbmRsZXIpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlnZXRDb25maWd1cmF0aW9uUG9saWN5KCkuY29uZmlndXJlKGNvbmZpZ3VyZWRGZWF0dXJlc1tpXSwgdHJ1ZSwgdHJ1ZSk7Ci0JCX0KLQotCQkvLyBjYWxjdWxhdGUgYWxsIHRoZSBmZWF0dXJlcyB3ZSBoYXZlIHRvIHVuY29uZmlndXJlIGZyb20gdGhlIGN1cnJlbnQgc3RhdGUgdG8gdGhpcyBzdGF0ZQotCQkvLyBpbiB0aGUgaGlzdG9yeS4gCQkJCQotCQlMaXN0IGZlYXR1cmVUb1VuY29uZmlndXJlID0gb2xkQ29uZmlndXJlZFNpdGUuY2FsY3VsYXRlVW5jb25maWd1cmVkRmVhdHVyZXMoY29uZmlndXJlZEZlYXR1cmVzKTsKLQotCQkvLyBmb3IgZWFjaCB1bmNvbmZpZ3VyZWQgZmVhdHVyZSBjaGVjayBpZiBpdCBzdGlsbCBleGlzdHMKLQkJLy8gaWYgc28gYWRkIGFzIHVuY29uZmlndXJlZAotCQlJdGVyYXRvciBpdGVyID0gZmVhdHVyZVRvVW5jb25maWd1cmUuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSBlbGVtZW50ID0gKElGZWF0dXJlUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJLy8gZG8gbm90IGxvZyBhY3Rpdml0eQotCQkJCWdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS51bmNvbmZpZ3VyZShlbGVtZW50LCB0cnVlLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBubyBmZWF0dXJlIHRvIHVuY29uZmlndXJlCi0JCQkJU3RyaW5nIHVybCA9IGVsZW1lbnQuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCQlJU2l0ZSBzaXRlID0gZWxlbWVudC5nZXRTaXRlKCk7Ci0JCQkJU3RyaW5nIHNpdGVTdHJpbmcgPSAoc2l0ZSAhPSBudWxsKSA/IHNpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSA6IFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5Ob1NpdGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZUNvcmUud2FybihQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuQ2Fubm90RmluZEZlYXR1cmVUb1VuY29uZmlndXJlIiwgdXJsLCBzaXRlU3RyaW5nKSwgZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQl9Ci0JCX0KLQkJLy99IC8vIGVuZCBVU0VSX0VYQ0xVREUKLQl9Ci0KLQkvKgotCSAqIFdlIGhhdmUgdG8ga2VlcCBvdXIgY29uZmlndXJlZCBmZWF0dXJlCi0JICogY2hlY2sgaWYgdGhleSBhcmUgYWxsIHZhbGlkCi0JICogUmV0dXJuIHRoZSB2YWxpZCBjb25maWd1cmVkIGZlYXR1cmVzCi0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZVtdIHZhbGlkQ29uZmlndXJlZEZlYXR1cmVzKElQcm9ibGVtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZEZlYXR1cmVzID0gZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWlmIChjb25maWd1cmVkRmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQotCQkJCS8vIGF0dGVtcHQgdG8gYWNjZXNzIHRoZSBmZWF0dXJlCi0JCQkJdHJ5IHsKLQkJCQkJZmVhdHVyZSA9IGNvbmZpZ3VyZWRGZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3RpZnkgd2UgY2Fubm90IGZpbmQgdGhlIGZlYXR1cmUKLQkJCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOwotCQkJCQlTdHJpbmcgZmVhdHVyZVN0cmluZyA9IGNvbmZpZ3VyZWRGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCQlpZiAoIWhhbmRsZXIucmVwb3J0UHJvYmxlbShQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuQ2Fubm90RmluZEZlYXR1cmVUb0NvbmZpZ3VyZSIsIGZlYXR1cmVTdHJpbmcpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHZlcmlmeSBhbGwgdGhlIHBsdWdpbnMgc3RpbGwgZXhpc3QKLQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGdldCBwbHVnaW4gaWRlbnRpZmllcgotCQkJCQlMaXN0IHNpdGVQbHVnaW5JZGVudGlmaWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJSVNpdGUgc2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpOwotCQkJCQlJUGx1Z2luRW50cnlbXSBzaXRlUGx1Z2luRW50cmllcyA9IG51bGw7Ci0KLQkJCQkJaWYgKHNpdGUgIT0gbnVsbCkgewotCQkJCQkJc2l0ZVBsdWdpbkVudHJpZXMgPSBzaXRlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXRlUGx1Z2luRW50cmllcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJCQlJUGx1Z2luRW50cnkgZW50cnkgPSBzaXRlUGx1Z2luRW50cmllc1tpbmRleF07Ci0JCQkJCQkJc2l0ZVBsdWdpbklkZW50aWZpZXJzLmFkZChlbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHNpdGVQbHVnaW5FbnRyaWVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCUlQbHVnaW5FbnRyeVtdIGZlYXR1cmVQbHVnaW5FbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZmVhdHVyZVBsdWdpbkVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCQkJSVBsdWdpbkVudHJ5IGN1cnJlbnRGZWF0dXJlUGx1Z2luRW50cnkgPSBmZWF0dXJlUGx1Z2luRW50cmllc1tpbmRleF07Ci0JCQkJCQkJaWYgKCFjb250YWlucyhjdXJyZW50RmVhdHVyZVBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKSwgc2l0ZVBsdWdpbklkZW50aWZpZXJzKSkgewotCQkJCQkJCQkvLyB0aGUgcGx1Z2luIGRlZmluZWQgYnkgdGhlIGZlYXR1cmUKLQkJCQkJCQkJLy8gZG9lc24ndCBzZWVtIHRvIGV4aXN0IG9uIHRoZSBzaXRlCi0JCQkJCQkJCVN0cmluZyBtc2cgPSAiRXJyb3IgdmVyaWZ5aW5nIGV4aXN0ZW5jZSBvZiBwbHVnaW46IiArIGN1cnJlbnRGZWF0dXJlUGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJVXBkYXRlQ29yZS5sb2cobXNnLCBuZXcgRXhjZXB0aW9uKCkpOwotCi0JCQkJCQkJCVN0cmluZyBzaXRlU3RyaW5nID0gKHNpdGUgIT0gbnVsbCkgPyBzaXRlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgOiBQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuTm9TaXRlIik7CS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJU3RyaW5nIGVycm9yTGFiZWwgPSBQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuQ2Fubm90RmluZFBsdWdpbkVudHJ5IiwgY3VycmVudEZlYXR1cmVQbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSwgc2l0ZVN0cmluZyk7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oZXJyb3JMYWJlbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCFoYW5kbGVyLnJlcG9ydFByb2JsZW0oUG9saWN5LmJpbmQoZXJyb3JMYWJlbCkpKSB7Ci0JCQkJCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gLy8gZW5kIGlmIG5vdCBmb3VuZCBpbiBzaXRlCi0JCQkJCQl9IC8vIGVuZCBmb3IKLQkJCQkJfQotCQkJCX0KLQkJCX0gLy8gZW5kIGZvciBjb25maWd1cmVkIGZlYXR1cmUKLQkJfQotCQlyZXR1cm4gY29uZmlndXJlZEZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogV2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGNhbGN1bGF0aW5nIHRoZSBkZWx0YSBiZXR3ZWVuIHdoYXQgd2FzIGNvbmZpZ3VyZWQgaW4gdGhlIGN1cnJlbnQKLQkgKiBjb25maWd1cmF0aW9uIHRoYXQgaXMgbm90IGNvbmZpZ3VyZWQgbm93Ci0JICogCi0JICogd2UgaGF2ZSB0byBmaWd1cmUgb3V0IHdoYXQgZmVhdHVyZSBoYXZlIGJlZW4gdW5jb25maWd1cmVkIGZvciB0aGUgd2hvbGUKLQkgKiBoaXN0b3J5IGJldHdlZW4gY3VycmVudCBhbmQgdXMuLi4gCi0JICogCi0JICogaXMgaXQgYXMgc2ltcGxlIGFzICBnZXQgYWxsIGNvbmZpZ3VyZWQsIGFuZCB1bmNvbmZpZ3VyZWQsCi0JICogdGhlIGRvIHRoZSBkZWx0YSB3aXRoIHdoYXQgc2hvdWxkIGJlIGNvbmZpZ3VyZWQKLQkgKiAKLQkgKi8KLQlwcml2YXRlIExpc3QgY2FsY3VsYXRlVW5jb25maWd1cmVkRmVhdHVyZXMoSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkRmVhdHVyZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlTZXQgZmVhdHVyZVRvVW5jb25maWd1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGxvb3AgZm9yIGFsbCBoaXN0b3J5Ci0JCS8vIHRyeSB0byBzZWUgaWYgdGhlIGNvbmZpZ3VyZWQgc2l0ZSBleGlzdGVkCi0JCS8vIGlmIGl0IGRvZXMsIGdldCB0aGUgdW5jb25maWd1cmVkIGZlYXR1cmVzIAotCQkvLyBhbmQgdGhlIGNvbmZpZ3VyZWQgb25lCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbltdIGhpc3RvcnkgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaGlzdG9yeS5sZW5ndGg7IGkrKykgewotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGVsZW1lbnQgPSBoaXN0b3J5W2ldOwotCQkJSUNvbmZpZ3VyZWRTaXRlW10gY29uZmlnU2l0ZXMgPSBlbGVtZW50LmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdTaXRlcy5sZW5ndGg7IGorKykgewotCQkJCUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGNvbmZpZ1NpdGVzW2pdOwotCQkJCWlmIChjb25maWdTaXRlLmdldFNpdGUoKS5lcXVhbHMoZ2V0U2l0ZSgpKSkgewotCQkJCQlmZWF0dXJlVG9VbmNvbmZpZ3VyZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb25maWdTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpKSk7Ci0JCQkJCWZlYXR1cmVUb1VuY29uZmlndXJlU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIHRoZSB1bmNvbmZpZ3VyZWQgZmVhdHVyZSB3ZSBmb3VuZCB0aGF0IGFyZSBub3cgdG8gYmUgY29uZmlndXJlZCAKLQkJLy8gKHRoZXkgbWF5IGhhdmUgYmVlbiB1bmNvbmZpZ3VyZWQgaW4gdGhlIHBhc3QsIGJ1dCB0aGUgcmV2ZXJ0IG1ha2VzIHRoZW0gY29uZmlndXJlZCkKLQkJTGlzdCBmZWF0dXJlVG9VbmNvbmZpZ3VyZUxpc3QgPSByZW1vdmUoY29uZmlndXJlZEZlYXR1cmVzLCBmZWF0dXJlVG9VbmNvbmZpZ3VyZVNldCk7Ci0KLQkJcmV0dXJuIGZlYXR1cmVUb1VuY29uZmlndXJlTGlzdDsKLQl9Ci0KLQkvKgotCSAqIFV0aWxpdGllczogUmVtb3ZlIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlcwotCSAqIGZyb20gYSBsaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IHJlbW92ZShJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWZzLCBTZXQgc2V0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChzZXQgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJLy8gaWYgYW4gZWxlbWVudCBvZiB0aGUgbGlzdCBpcyBOT1QgZm91bmQgaW4gdGhlIGFycmF5LAotCQkvLyBhZGQgaXQgdG8gdGhlIHJlc3VsdCBsaXN0CQkJCi0JCUl0ZXJhdG9yIGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSBlbGVtZW50ID0gKElGZWF0dXJlUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudC5lcXVhbHMoZmVhdHVyZVJlZnNbaV0pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghZm91bmQpCi0JCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogSSBoYXZlIGlzc3VlcyB3aGVuIHJ1bm5pbmcgbGlzdC5jb250YWluKHZlcnNpb25lZElkZW50aWZpZXIpCi0JICogVGhlIGNvZGUgcnVucyB0aGUgT2JqZWN0LmVxdWFscyBpbnN0ZWFkIG9mIHRoZSBWZXJzaW9uZWRJZGVudGlmaWVyLmVxdWFscwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhWZXJzaW9uZWRJZGVudGlmaWVyIGlkLCBMaXN0IGxpc3QpIHsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiAhZm91bmQpIHsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGVsZW1lbnQgPSAoVmVyc2lvbmVkSWRlbnRpZmllcikgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZXF1YWxzKGlkKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5IGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKSB7Ci0JCXJldHVybiAoQ29uZmlndXJhdGlvblBvbGljeSkgZ2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKCk7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpIHsKLQkJcmV0dXJuIChJU2l0ZSkgZ2V0U2l0ZU1vZGVsKCk7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gKElJbnN0YWxsQ29uZmlndXJhdGlvbikgZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0QnJva2VuU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQotCQlJU3RhdHVzIGZlYXR1cmVTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgSUZlYXR1cmUuU1RBVFVTX0hBUFBZLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBjaGVjayB0aGUgUGx1Z2lucyBvZiBhbGwgdGhlIGZlYXR1cmVzCi0JCS8vIGV2ZXJ5IHBsdWdpbiBvZiB0aGUgZmVhdHVyZSBtdXN0IGJlIG9uIHRoZSBzaXRlCi0JCUlQbHVnaW5FbnRyeVtdIHNpdGVFbnRyaWVzID0gZ2V0U2l0ZSgpLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJSVBsdWdpbkVudHJ5W10gZmVhdHVyZXNFbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIHJlc3VsdCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5kaWZmKGZlYXR1cmVzRW50cmllcywgc2l0ZUVudHJpZXMpOwotCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgKHJlc3VsdC5sZW5ndGggIT0gMCkpIHsKLQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLkZlYXR1cmVVbkhhcHB5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKGZlYXR1cmVTdGF0dXMuZ2V0UGx1Z2luKCksIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZLCBtc2csIG51bGwpOwotCi0JCQlmb3IgKGludCBrID0gMDsgayA8IHJlc3VsdC5sZW5ndGg7IGsrKykgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaWQgPSByZXN1bHRba10uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCU9iamVjdFtdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7ICIiLCAiIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCQl2YWx1ZXMgPSBuZXcgT2JqZWN0W10geyBpZC5nZXRJZGVudGlmaWVyKCksIGlkLmdldFZlcnNpb24oKX07Ci0JCQkJfQotCQkJCVN0cmluZyBtc2cxID0gUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLk1pc3NpbmdQbHVnaW5zQnJva2VuRmVhdHVyZSIsIHZhbHVlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVDb3JlLndhcm4obXNnMSk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFksIG1zZzEsIG51bGwpOwotCQkJCW11bHRpLmFkZChzdGF0dXMpOwotCQkJfQotCQkJcmV0dXJuIG11bHRpOwotCQl9Ci0KLQkJLy8gY2hlY2sgb3MsIGFyY2gsIGFuZCB3cwotCi0JCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLkZlYXR1cmVIYXBweSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgSUZlYXR1cmUuU1RBVFVTX0hBUFBZLCBtc2csIG51bGwpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKCFpc0VuYWJsZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1dBUk5JTkdTKQotCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIGZlYXR1cmVSZWZlcmVuY2UgZm9yIGZlYXR1cmU6IiArIGZlYXR1cmUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5pc0NvbmZpZ3VyZWQoZmVhdHVyZVJlZmVyZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChnZXRTaXRlKCkgPT0gbnVsbCkKLQkJCXJldHVybiAiTm8gU2l0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGdldFNpdGUoKS5nZXRVUkwoKSA9PSBudWxsKQotCQkJcmV0dXJuICJObyBVUkwiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSN2ZXJpZnlVcGRhdGFibGVTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeVVwZGF0YWJsZVN0YXR1cygpIHsKLQotCQlpZiAodmVyaWZ5U3RhdHVzICE9IG51bGwpCi0JCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOwotCi0JCVVSTCBzaXRlVVJMID0gZ2V0U2l0ZSgpLmdldFVSTCgpOwotCQlpZiAoc2l0ZVVSTCA9PSBudWxsKSB7Ci0JCQl2ZXJpZnlTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLlNpdGVVUkxOdWxsIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOwotCQl9Ci0KLQkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShzaXRlVVJMLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZlcmlmeVN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuTm9uTG9jYWxTaXRlIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOwotCQl9Ci0KLQkJU3RyaW5nIHNpdGVMb2NhdGlvbiA9IHNpdGVVUkwuZ2V0RmlsZSgpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzaXRlTG9jYXRpb24pOwotCi0JCS8vIGdldCB0aGUgcHJvZHVjdCBuYW1lIG9mIHRoZSBwcml2YXRlIG1hcmtlcgotCQkvLyBpZiB0aGVyZSBpcyBubyBwcml2YXRlIG1hcmtlciwgY2hlY2sgaWYgdGhlIHNpdGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZQotCQkvLyBpZiB0aGVyZSBpcyBhIG1hcmtlciBhbmQgdGhpcyBpcyBhIGRpZmZlcmVudCBwcm9kdWN0LCByZXR1cm4gZmFsc2UKLQkJLy8gb3RoZXJ3aXNlIGRvbid0IGNoZWNrIGlmIHdlIGFyZSBjb250YWluZWQgaW4gYW5vdGhlciBzaXRlCi0JCVN0cmluZyBwcm9kdWN0TmFtZSA9IGdldFByb2R1Y3ROYW1lKGZpbGUpOwotCQlpZiAocHJvZHVjdE5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCFwcm9kdWN0TmFtZS5lcXVhbHMoZ2V0UHJvZHVjdElkZW50aWZpZXIoImlkIiwgZ2V0UHJvZHVjdEZpbGUoKSkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2ZXJpZnlTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLk5vdFNhbWVQcm9kdWN0SWQiLCBwcm9kdWN0TmFtZSksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHZlcmlmeVN0YXR1czsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUZpbGUgY29udGFpbmVyID0gZ2V0U2l0ZUNvbnRhaW5pbmcoZmlsZSk7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQl2ZXJpZnlTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLkNvbnRhaW5lZEluQW5vdGhlclNpdGUiLCBjb250YWluZXIuZ2V0QWJzb2x1dGVQYXRoKCkpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB2ZXJpZnlTdGF0dXM7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNhbldyaXRlKGZpbGUpKSB7Ci0JCQl2ZXJpZnlTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLlJlYWRPbmx5U2l0ZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHZlcmlmeVN0YXR1czsKLQkJfQotCi0JCXZlcmlmeVN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VXBkYXRhYmxlKHRydWUpOwotCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOwotCX0KLQotCS8qCi0JICogVmVyaWZ5IHdlIGNhbiB3cml0ZSBvbiB0aGUgZmlsZSBzeXN0ZW0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbldyaXRlKEZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSAmJiBmaWxlLmdldFBhcmVudEZpbGUoKSAhPSBudWxsKSB7Ci0JCQlmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQotCQlGaWxlIHRyeUZpbGUgPSBudWxsOwotCQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnlGaWxlID0gbmV3IEZpbGUoZmlsZSwgInRvRGVsZXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRyeUZpbGUpOwotCQkJb3V0LndyaXRlKDApOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlpZiAodHJ5RmlsZSAhPSBudWxsKQotCQkJCXRyeUZpbGUuZGVsZXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zIGEgbWFya2VyCi0JICogaWYgbm90IGFzayBhbGwgZGlyZWN0b3J5IGNoaWxkcmVuIHRvIGNoZWNrCi0JICogaWYgb25lIHZhbGlkYXRlcyB0aGUgY29uZGl0aW9uLCByZXR1cm5zIHRoZSBtYXJrZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGaWxlIGdldFNpdGVDb250YWluaW5nKEZpbGUgZmlsZSkgewotCi0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlVcGRhdGVDb3JlLndhcm4oIklzQ29udGFpbmVkOiBDaGVja2luZyBmb3IgbWFya2VycyBhdDoiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlIHByb2R1Y3RGaWxlID0gbmV3IEZpbGUoZmlsZSwgUFJPRFVDVF9TSVRFX01BUktFUik7Ci0JCQlGaWxlIGV4dGVuc2lvbkZpbGUgPSBuZXcgRmlsZShmaWxlLCBFWFRFTlNJT05fU0lURV9NQVJLRVIpOwotCQkJaWYgKHByb2R1Y3RGaWxlLmV4aXN0cygpIHx8IGV4dGVuc2lvbkZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIGZpbGU7Ci0vLwkJCS8vIGRvIG5vdCBjaGVjayBpZiBhIG1hcmtlciBleGlzdHMgaW4gdGhlIGN1cnJlbnQgYnV0IHN0YXJ0IGZyb20gdGhlIHBhcmVudAotLy8JCQkvLyB0aGUgY3VycmVudCBpcyBhbmFseXplIGJ5IGdldFByb2R1Y3RuYW1lKCkKLS8vCQkJaWYgKGZpbGUuZ2V0UGFyZW50RmlsZSgpICE9IG51bGwpIHsKLS8vCQkJCUZpbGUgcHJpdmF0ZUZpbGUgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudEZpbGUoKSwgUFJJVkFURV9TSVRFX01BUktFUik7Ci0vLwkJCQlpZiAocHJpdmF0ZUZpbGUuZXhpc3RzKCkpCi0vLwkJCQkJcmV0dXJuIGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotLy8JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFNpdGVDb250YWluaW5nKGZpbGUuZ2V0UGFyZW50RmlsZSgpKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2R1Y3QgaWYgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHByaXZhdGUgU2l0ZSBtYXJrdXAgaXMgbm90Ci0JICogdGhlIHNhbWUgYXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHByb2R1Y3QgdGhlIHdvcmtiZW5jaCB3YXMgc3RhcnRlZCB3aXRoLgotCSAqIElmIHRoZSBwcm9kdWN0IGlzIHRoZSBzYW1lLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJvZHVjdE5hbWUoRmlsZSBmaWxlKSB7Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUZpbGUgbWFya2VyRmlsZSA9IG5ldyBGaWxlKGZpbGUsIEVYVEVOU0lPTl9TSVRFX01BUktFUiApOwotCQlpZiAoIW1hcmtlckZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRmlsZSBwcm9kdWN0RmlsZSA9IGdldFByb2R1Y3RGaWxlKCk7Ci0JCVN0cmluZyBwcm9kdWN0SWQgPSBudWxsOwotCQlTdHJpbmcgcHJpdmF0ZUlkID0gbnVsbDsKLQkJaWYgKHByb2R1Y3RGaWxlICE9IG51bGwpIHsKLQkJCXByb2R1Y3RJZCA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJpZCIsIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJpdmF0ZUlkID0gZ2V0UHJvZHVjdElkZW50aWZpZXIoImlkIiwgbWFya2VyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwcm9kdWN0SWQgPT0gbnVsbCkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiUHJvZHVjdCBJRCBpcyBudWxsIGF0OiIgKyBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmICghcHJvZHVjdElkLmVxdWFsc0lnbm9yZUNhc2UocHJpdmF0ZUlkKSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiUHJvZHVjdCBpZCBhdCIgKyBwcm9kdWN0RmlsZSArICIgRGlmZmVyZW50IHRoYW46IiArIG1hcmtlckZpbGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgbmFtZSA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJuYW1lIiwgbWFya2VyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdmVyc2lvbiA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJ2ZXJzaW9uIiwgbWFya2VyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbWFya2VySUQgPSAobmFtZSA9PSBudWxsKSA/IHZlcnNpb24gOiBuYW1lICsgIjoiICsgdmVyc2lvbjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChtYXJrZXJJRCA9PSBudWxsKQotCQkJCQltYXJrZXJJRCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG1hcmtlcklEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcHJpdmF0ZUlkOwotCQkJfQotCQl9IGVsc2UgewotCQkJVXBkYXRlQ29yZS53YXJuKCJQcm9kdWN0IE1hcmtlciBkb2Vzbid0IGV4aXN0OiIgKyBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcHJvZHVjdCBmcm9tIHRoZSBwcm9wZXJ0eSBmaWxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb2R1Y3RJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyLCBGaWxlIHByb3BlcnR5RmlsZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wZXJ0eUZpbGUpOwotCQkJUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShpbik7Ci0JCQlyZXN1bHQgPSBidW5kbGUuZ2V0U3RyaW5nKGlkZW50aWZpZXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJFeGNlcHRpb24gcmVhZGluZyBwcm9wZXJ0eSBmaWxlOiIgKyBwcm9wZXJ0eUZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJFeGNlcHRpb24gcmVhZGluZyAnIiArIGlkZW50aWZpZXIgKyAiJyBmcm9tIHByb3BlcnR5IGZpbGU6IiArIHByb3BlcnR5RmlsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluID09IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcHJvZHVjdCBmcm9tIHRoZSBwcm9wZXJ0eSBmaWxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRQcm9kdWN0RmlsZSgpIHsKLQotCQlTdHJpbmcgcHJvZHVjdEluc3RhbGxEaXJlY3RvcnkgPSBDb25maWd1cmF0b3JVdGlscy5nZXRJbnN0YWxsVVJMKCkuZ2V0RmlsZSgpOwotCQlpZiAocHJvZHVjdEluc3RhbGxEaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJRmlsZSBwcm9kdWN0RmlsZSA9IG5ldyBGaWxlKHByb2R1Y3RJbnN0YWxsRGlyZWN0b3J5LCBQUk9EVUNUX1NJVEVfTUFSS0VSKTsKLQkJCWlmIChwcm9kdWN0RmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBwcm9kdWN0RmlsZTsKLQkJCX0gZWxzZSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKCJQcm9kdWN0IG1hcmtlciBkb2Vzbid0IGV4aXN0OiIgKyBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQ2Fubm90IHJldHJpZXZlIGluc3RhbGwgVVJMIGZyb20gQm9vdExvYWRlciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQkvKnBhY2thZ2UqLwotCWJvb2xlYW4gY3JlYXRlUHJpdmF0ZVNpdGVNYXJrZXIoKSB7Ci0JCVVSTCBzaXRlVVJMID0gZ2V0U2l0ZSgpLmdldFVSTCgpOwotCQlpZiAoc2l0ZVVSTCA9PSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgbWFya2VyLiBUaGUgU2l0ZSB1cmwgaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShzaXRlVVJMLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGNyZWF0ZSBwcml2YXRlIG1hcmtlci4gVGhlIFNpdGUgaXMgbm90IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHNpdGVMb2NhdGlvbiA9IHNpdGVVUkwuZ2V0RmlsZSgpOwotCQlGaWxlIHByb2R1Y3RGaWxlID0gZ2V0UHJvZHVjdEZpbGUoKTsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCWlmIChwcm9kdWN0RmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJvZHVjdElkID0gZ2V0UHJvZHVjdElkZW50aWZpZXIoImlkIiwgcHJvZHVjdEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcHJvZHVjdE5hbWUgPSBnZXRQcm9kdWN0SWRlbnRpZmllcigibmFtZSIsIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHByb2R1Y3RWZXIgPSBnZXRQcm9kdWN0SWRlbnRpZmllcigidmVyc2lvbiIsIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHByb2R1Y3RJZCAhPSBudWxsKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2F0aW9uLCBFWFRFTlNJT05fU0lURV9NQVJLRVIpOwotCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFdyaXRlciA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCQkJCW91dFdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiVVRGOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlvdXRXcml0ZXIud3JpdGUoImlkPSIgKyBwcm9kdWN0SWQrIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJaWYgKHByb2R1Y3ROYW1lICE9IG51bGwpCi0JCQkJCQkJb3V0V3JpdGVyLndyaXRlKCJuYW1lPSIgKyBwcm9kdWN0TmFtZSsiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlpZiAocHJvZHVjdFZlciAhPSBudWxsKQotCQkJCQkJCW91dFdyaXRlci53cml0ZSgidmVyc2lvbj0iICsgcHJvZHVjdFZlcisiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQkJCWp1c3RDcmVhdGVkID0gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGNyZWF0ZSBwcml2YXRlIE1hcmtlciBhdDoiICsgZmlsZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKG91dFdyaXRlciAhPSBudWxsKQotCQkJCQkJCQlvdXRXcml0ZXIuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQl9Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpcmVjdG9yeSBvZiB0aGUgU2l0ZSBjb250YWlucwotCSAqIC5lY2xpcHNlZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25TaXRlKCkgewotCQlyZXR1cm4gY29udGFpbnNNYXJrZXIoRVhURU5TSU9OX1NJVEVfTUFSS0VSKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBTaXRlIGNvbnRhaW5zCi0JICogLmVjbGlwc2VleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2R1Y3RTaXRlKCkgewotCQlyZXR1cm4gY29udGFpbnNNYXJrZXIoUFJPRFVDVF9TSVRFX01BUktFUik7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpcmVjdG9yeSBvZiB0aGUgU2l0ZSBjb250YWlucwotCSAqIC5lY2xpcHNlZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlU2l0ZSgpIHsKLQkJcmV0dXJuIGlzRXh0ZW5zaW9uU2l0ZSgpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTWFya2VyKFN0cmluZyBtYXJrZXIpIHsKLQkJSVNpdGUgc2l0ZSA9IGdldFNpdGUoKTsKLQkJaWYgKHNpdGUgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDb250YWlucyBNYXJrZXJzOlRoZSBzaXRlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVVJMIHVybCA9IHNpdGUuZ2V0VVJMKCk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDb250YWlucyBNYXJrZXJzOlNpdGUgVVJMIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UodXJsLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiQ29udGFpbnMgTWFya2VyczpOb24gZmlsZSBwcm90b2NvbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDb250YWlucyBNYXJrZXJzOlRoZSBzaXRlIGRvZXNuJ3QgZXhpc3Q6IiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRmlsZSBleHRlbnNpb24gPSBuZXcgRmlsZShmaWxlLCBtYXJrZXIpOwotCQlpZiAoIWV4dGVuc2lvbi5leGlzdHMoKSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDb250YWlucyBNYXJrZXJzOlRoZSBleHRlbnNpb25maWxlIGRvZXMgbm90IGV4aXN0OiIgKyBleHRlbnNpb24pOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFNpdGUgaXMgYWxyZWFkeSBuYXRpdmVseSBsaW5rZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZWx5TGlua2VkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgcGxhdGZvcm1TdHJpbmcgPSBnZXRQbGF0Zm9ybVVSTFN0cmluZygpOwotCQlpZiAocGxhdGZvcm1TdHJpbmcgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gcmV0cmlldmUgcGxhdGZvcm1TdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVVJMIHNpdGVVUkwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gY2hlY2sgaWYgdGhlIHNpdGUgZXhpc3RzIGFuZCBpcyB1cGRhdGFibGUKLQkJCS8vIHVwZGF0ZSBjb25maWdTaXRlCi0JCQlVUkwgdXJsVG9DaGVjayA9IG5ldyBVUkwocGxhdGZvcm1TdHJpbmcpOwotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5IGVudHJ5ID0gcnVudGltZUNvbmZpZy5maW5kQ29uZmlndXJlZFNpdGUodXJsVG9DaGVjayk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCXJldHVybiBlbnRyeS5pc05hdGl2ZWx5TGlua2VkKCk7Ci0JCQl9IGVsc2UgewotCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIHNpdGU6IiArIHBsYXRmb3JtU3RyaW5nICsgIiBmcm9tIHBsYXRmb3JtLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJLy8gY2hlY2sgYnkgY29tcGFyaW5nIFVSTHMKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeVtdIHNpdGVzID0gcnVudGltZUNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzaXRlVVJMID0gc2l0ZXNbaV0uZ2V0VVJMKCk7Ci0JCQkJVVJMIHJlc29sdmVkVVJMID0gUGxhdGZvcm0ucmVzb2x2ZShzaXRlVVJMKTsKLQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwocmVzb2x2ZWRVUkwsIHVybFRvQ2hlY2spKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuVW5hYmxlUmVzb2x2ZVVSTCIsIHBsYXRmb3JtU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLCBlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5VbmFibGVUb0FjY2Vzc1NpdGUiLCBuZXcgT2JqZWN0W10geyBzaXRlVVJMIH0pOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihtc2csIGUpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JKiB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgbm8gY29uZmlndXJlZC9lbmFibGUgcGFyZW50IGluY2x1ZGUgdGhpcyBmZWF0dXJlCi0JKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVOb0NvbmZpZ3VyZWRQYXJlbnRzKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDb25maWd1cmF0aW9uUG9saWN5OiB2YWxpZGF0ZSBGZWF0dXJlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHBhcmVudHMgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0UGFyZW50RmVhdHVyZXMoZmVhdHVyZSwgZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCksIGZhbHNlKTsKLQkJcmV0dXJuIChwYXJlbnRzLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29ubmVjdGlvblRocmVhZE1hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29ubmVjdGlvblRocmVhZE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0ODFiZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0Nvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRocmVhZHMgdGhhdCBhcmUgZGlzcGF0Y2hlZCB0byAKLSAqIG9idGFpbmVkIGEgdmFsaWQgaW5wdXQgc3RyZWFtIGZyb20gYW4gSFRUUCBjb25uZWN0aW9uLgotICogU2luY2Ugb2J0YWluaW5nIGFuIGlucHV0IHN0cmVhbSBpcyBhbiBJL08gb3BlcmF0aW9uCi0gKiB0aGF0IG1heSBibG9jayBmb3IgYSBsb25nIHRpbWUsIGl0IGlzIHBlcmZvcm1lZAotICogb24gYSBzZXBhcmF0ZSB0aHJlYWQgdG8ga2VlcCB0aGUgVUkgcmVzcG9uc2l2ZS4KLSAqIDxwPgotICogSW4gY2FzZSB0aGF0IGEgY29ubmVjdGlvbiBibG9ja3MgYW5kIGRvZXMgbm90Ci0gKiB0ZXJtaW5hdGUgd2l0aCBhbiBJT0V4Y2VwdGlvbiBhZnRlciBhIHRpbWVvdXQsIAotICogYWN0aXZlIHRocmVhZHMgbWF5IGFjY3VtdWxhdGUuIFRoZSBtYW5hZ2VyIHdpbGwKLSAqIHJlZnVzZSB0byBjcmVhdGUgbW9yZSB0aGFuIE1BWF9DT1VOVCB0aHJlYWRzIGFuZAotICogaW5zdGVhZCB3aWxsIHRocm93IGEgQ29yZUV4Y2VwdGlvbiB3aXRoIGEgY2hpbGQKLSAqIHN0YXR1cyBvYmplY3QgZm9yIGVhY2ggY29ubmVjdGlvbiB0aGF0IGlzIHN0aWxsIHBlbmRpbmcuCi0gKiA8cD4KLSAqIElmIHRoZSBjb25uZWN0aW9uIGlzIHJlc3BvbnNpdmUgYnV0IHNsb3csIHRoZSB1c2VyCi0gKiBtYXkgY2FuY2VsIGl0LiBJbiB0aGF0IGNhc2UsIHRoZSBtYW5hZ2VyIHdpbGwKLSAqIGNsb3NlIHRoZSBzdHJlYW0gdG8gYXZvaWQgcmVzb3VyY2UgbGVhay4KLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyIHsKLQkvLyBzZXQgY29ubmVjdGlvbiB0aW1lb3V0IHRvIDEgbWludXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RfVElNRU9VVCA9ICI2MDAwMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBzZXQgcmVhZCB0aW1lb3V0IHRvIDEgbWludXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfVElNRU9VVCA9ICI2MDAwMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXggbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9DT1VOVCA9IDk7Ci0JcHJpdmF0ZSBWZWN0b3IgdGhyZWFkczsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyZWFtUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByaXZhdGUgSHR0cFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbjsKLQkJcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uOwotCQlwcml2YXRlIElucHV0U3RyZWFtIGlzOwotCQlwcml2YXRlIGJvb2xlYW4gZGlzY29ubmVjdGVkOwotCi0JCXB1YmxpYyBTdHJlYW1SdW5uYWJsZShIdHRwVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uKSB7Ci0JCQl0aGlzLnVybENvbm5lY3Rpb24gPSB1cmxDb25uZWN0aW9uOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgewotCQkJcmV0dXJuIGlzOwotCQl9Ci0KLQkJcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCQlyZXR1cm4gdXJsQ29ubmVjdGlvbi5nZXRVUkwoKTsKLQkJfQotCi0JCXB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgewotCQkJcmV0dXJuIGV4Y2VwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCQl1cmxDb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTsKLQkJCWRpc2Nvbm5lY3RlZCA9IHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWlzID0gdXJsQ29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCWlmIChkaXNjb25uZWN0ZWQpIHsKLQkJCQkJLy8gVGhlIGNvbm5lY3Rpb24gd2FzIHNsb3csIGJ1dCByZXR1cm5lZAotCQkJCQkvLyBhIHZhbGlkIGlucHV0IHN0cmVhbS4gSG93ZXZlciwKLQkJCQkJLy8gdGhlIHVzZXIgY2FuY2VsZWQgdGhlIGNvbm5lY3Rpb24KLQkJCQkJLy8gc28gd2UgbXVzdCBjbG9zZSB0byBhdm9pZCAKLQkJCQkJLy8gcmVzb3VyY2UgbGVhay4KLQkJCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJLy8gYXQgdGhpcyBwb2ludCwgd2UgZG9uJ3QgY2FyZQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlpcyA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBDb25uZWN0aW9uVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHJpdmF0ZSBTdHJlYW1SdW5uYWJsZSBydW5uYWJsZTsKLQkJcHVibGljIENvbm5lY3Rpb25UaHJlYWQoU3RyZWFtUnVubmFibGUgcnVubmFibGUpIHsKLQkJCXN1cGVyKHJ1bm5hYmxlLCAidXBkYXRlLWNvbm5lY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5ydW5uYWJsZSA9IHJ1bm5hYmxlOwotCQl9Ci0KLQkJcHVibGljIFN0cmVhbVJ1bm5hYmxlIGdldFJ1bm5hYmxlKCkgewotCQkJcmV0dXJuIHJ1bm5hYmxlOwotCQl9Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyKCkgewotCQkvLyBJbiBjYXNlIHdlIGFyZSBydW5uaW5nIFN1bidzIGNvZGUuCi0JCXNldElmTm90RGVmYXVsdFByb3BlcnR5KCJzdW4ubmV0LmNsaWVudC5kZWZhdWx0Q29ubmVjdFRpbWVvdXQiLCBDT05ORUNUX1RJTUVPVVQpOyAvLyROT04tTkxTLTEkCi0JCXNldElmTm90RGVmYXVsdFByb3BlcnR5KCJzdW4ubmV0LmNsaWVudC5kZWZhdWx0UmVhZFRpbWVvdXQiLCBSRUFEX1RJTUVPVVQpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0SWZOb3REZWZhdWx0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAob2xkVmFsdWU9PW51bGwgfHwgb2xkVmFsdWUuZXF1YWxzKCItMSIpKSAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFRocmVhZCBjcmVhdGVUaHJlYWQoU3RyZWFtUnVubmFibGUgcnVubmFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdmFsaWRhdGVFeGlzdGluZ1RocmVhZHMoKTsKLQkJaWYgKHRocmVhZHMgPT0gbnVsbCkKLQkJCXRocmVhZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCVRocmVhZCB0ID0gbmV3IENvbm5lY3Rpb25UaHJlYWQocnVubmFibGUpOwotCQl0LnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkcy5hZGQodCk7Ci0JCXJldHVybiB0OwotCX0KLQotCS8qCi0JICogUmVtb3ZlcyB0aHJlYWRzIHRoYXQgYXJlIG5vdCBhbGl2ZSBhbnkgbW9yZSBmcm9tIHRoZSAKLQkgKiBsaXN0IGFuZCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIGF0IG1vc3QgTUFYX0NPVU5UIHRocmVhZHMKLQkgKiBzdGlsbCB3b3JraW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUV4aXN0aW5nVGhyZWFkcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHRocmVhZHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCQotCQlpbnQgYWxpdmVDb3VudCA9IHB1cmdlVGVybWluYXRlZFRocmVhZHMoKTsKLQotCQlpZiAoYWxpdmVDb3VudCA+IE1BWF9DT1VOVCkgewotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJU3RyaW5nIHBsdWdpbklkID0KLQkJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ29ubmVjdGlvblRocmVhZCB0ID0gKENvbm5lY3Rpb25UaHJlYWQpIHRocmVhZHMuZ2V0KGkpOwotCQkJCVN0cmluZyB1cmwgPSB0LmdldFJ1bm5hYmxlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJcGx1Z2luSWQsCi0JCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJUG9saWN5LmJpbmQoCi0JCQkJCQkJIkNvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLnVucmVzcG9uc2l2ZVVSTCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl1cmwpLAotCQkJCQkJbnVsbCk7Ci0JCQkJY2hpbGRyZW4uYWRkKHN0YXR1cyk7Ci0JCQl9Ci0JCQlNdWx0aVN0YXR1cyBwYXJlbnRTdGF0dXMgPQotCQkJCW5ldyBNdWx0aVN0YXR1cygKLQkJCQkJcGx1Z2luSWQsCi0JCQkJCUlTdGF0dXMuT0ssCi0JCQkJCShJU3RhdHVzW10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IElTdGF0dXNbY2hpbGRyZW4uc2l6ZSgpXSksCi0JCQkJCVBvbGljeS5iaW5kKCJDb25uZWN0aW9uVGhyZWFkTWFuYWdlci50b29NYW55Q29ubmVjdGlvbnMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHBhcmVudFN0YXR1cyk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBSZW1vdmVzIHRlcm1pbmF0ZWQgdGhyZWFkcyBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zCi0JICogdGhlIG51bWJlciBvZiB0aG9zZSBzdGlsbCBhY3RpdmUuCi0JICovCi0JCi0JcHJpdmF0ZSBpbnQgcHVyZ2VUZXJtaW5hdGVkVGhyZWFkcygpIHsKLQkJaW50IGFsaXZlQ291bnQgPSAwOwotCi0JCU9iamVjdFtdIGFycmF5ID0gdGhyZWFkcy50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVRocmVhZCB0ID0gKFRocmVhZCkgYXJyYXlbaV07Ci0JCQlpZiAoIXQuaXNBbGl2ZSgpKQotCQkJCXRocmVhZHMucmVtb3ZlKHQpOwotCQkJZWxzZQotCQkJCWFsaXZlQ291bnQrKzsKLQkJfQotCQlyZXR1cm4gYWxpdmVDb3VudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJLy8gV2UgbWlnaHQgd2FudCB0byBraWxsIHRoZSBhY3RpdmUgdGhyZWFkcyBidXQKLQkJLy8gdGhpcyBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSBzaW5jZSB0aGV5IGFyZSBhbGwKLQkJLy8gZGFlbW9ucyBhbmQgd2lsbCBub3QgcHJldmVudCBKVk0gdG8gdGVybWluYXRlLgotCQl0aHJlYWRzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzE5MzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJRmVhdHVyZUNvbnRlbnRDb25zdW1lcgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50Q29uc3VtZXIgaW1wbGVtZW50cyBJQ29udGVudENvbnN1bWVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWZhdWx0SW5zdGFsbEhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGVmYXVsdEluc3RhbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZmNkOGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWZhdWx0SW5zdGFsbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJDb250ZW50UmVmZXJlbmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLQotLyoqCi0gKiBEZWZhdWx0IEltcGxlbWVudGF0aW9uIG9mIEluc3RhbGxIYW5kbGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SW5zdGFsbEhhbmRsZXIgZXh0ZW5kcyBCYXNlSW5zdGFsbEhhbmRsZXIgewotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNub25QbHVnaW5EYXRhRG93bmxvYWRlZChJTm9uUGx1Z2luRW50cnlbXSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vblBsdWdpbkRhdGFEb3dubG9hZGVkKAotCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5EYXRhLAotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyB2ZXJpZnkgbm9uLXBsdWdpbiBhcmNoaXZlcy4gVGhlIERlZmF1bHRJbnN0YWxsSGFuZGxlciBhc3N1bWVzCi0JCS8vIHRoZSB2ZXJpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIGZlYXR1cmUgaXMgYWJsZSB0byB2ZXJpZnkgdGhlCi0JCS8vIGRhdGEgYXJjaGl2ZXMuCi0JCWlmIChub25QbHVnaW5EYXRhID09IG51bGwgfHwgbm9uUGx1Z2luRGF0YS5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQl0aGlzLm5vblBsdWdpbkVudHJpZXMgPSBub25QbHVnaW5EYXRhOwotCQlJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IHRoaXMuZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7Ci0JCUlWZXJpZmllciB2ZXJpZmllciA9IHByb3ZpZGVyLmdldFZlcmlmaWVyKCk7Ci0JCWlmICh2ZXJpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5ub25QbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250ZW50UmVmZXJlbmNlW10gYXJjaGl2ZXMgPQotCQkJCXByb3ZpZGVyLmdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobm9uUGx1Z2luRW50cmllc1tpXSwgdGhpcy5tb25pdG9yKTsKLQkJCUlWZXJpZmljYXRpb25SZXN1bHQgcmVzdWx0OwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhcmNoaXZlcy5sZW5ndGg7IGorKykgewotCi0JCQkJLy8gc2VlIGlmIHRoZSBkYXRhIGVudHJ5IGlzIGEgamFyCi0JCQkJQ29udGVudFJlZmVyZW5jZSBhcmNoaXZlID0gYXJjaGl2ZXNbal07Ci0JCQkJaWYgKCEoYXJjaGl2ZXNbal0gaW5zdGFuY2VvZiBKYXJDb250ZW50UmVmZXJlbmNlKQotCQkJCQkmJiBhcmNoaXZlc1tqXS5nZXRJZGVudGlmaWVyKCkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlhcmNoaXZlID0KLQkJCQkJCQluZXcgSmFyQ29udGVudFJlZmVyZW5jZShhcmNoaXZlc1tqXS5nZXRJZGVudGlmaWVyKCksIGFyY2hpdmVzW2pdLmFzRmlsZSgpKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmVzdWx0ID0gdmVyaWZpZXIudmVyaWZ5KHRoaXMuZmVhdHVyZSwgYXJjaGl2ZSwgZmFsc2UsIHRoaXMubW9uaXRvcik7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQlwcm9tcHRGb3JWZXJpZmljYXRpb24ocmVzdWx0LCBsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlSW5zdGFsbChJRmVhdHVyZUNvbnRlbnRDb25zdW1lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBwbHVnaW5zIGhhdmUgYmVlbiBpbnN0YWxsZWQuIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFueQotCQkvLyBub24tcGx1Z2luIGVudHJpZXMgdGhhdCBuZWVkIHRvIGJlIGhhbmRsZWQuCi0JCWlmICh0aGlzLm5vblBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCB0aGlzLm5vblBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJLy8gaW5zdGFsbCBub24tcGx1Z2luIGFyY2hpdmVzCi0JCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5mZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm5vblBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRlbnRSZWZlcmVuY2VbXSBhcmNoaXZlID0KLQkJCQlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG5vblBsdWdpbkVudHJpZXNbaV0sIHRoaXMubW9uaXRvcik7Ci0JCQlJQ29udGVudENvbnN1bWVyIG5vblBsdWdpbkNvbnN1bWVyID0gY29uc3VtZXIub3Blbihub25QbHVnaW5FbnRyaWVzW2ldKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXJjaGl2ZS5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBpZCA9IGFyY2hpdmVbal0uZ2V0SWRlbnRpZmllcigpOwotCQkJCWlmIChpZC5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gdGhlIG5vbi1wbHVnaW4gYXJjaGl2ZSBpcyBhIGphci4gVW5wYWNrIGl0IGludG8KLQkJCQkJLy8gYSBkaXJlY3RvcnkgY29uc3RydWN0ZWQgdXNpbmcgdGhlIGFyY2hpdmUgaWQKLQkJCQkJdHJ5IHsKLQkJCQkJCWZpbmFsIFN0cmluZyBwcmVmaXggPSBpZC5zdWJzdHJpbmcoMCwgaWQubGVuZ3RoKCkgLSA0KSArICIvIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSmFyQ29udGVudFJlZmVyZW5jZSBqYXJSZWYgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiIiwgYXJjaGl2ZVtqXS5hc0ZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNvbnRlbnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKSB7Ci0JCQkJCQkJcHVibGljIFN0cmluZyBkZWZpbmVJZGVudGlmaWVyKEphckVudHJ5IGVudHJ5KSB7Ci0JCQkJCQkJCWlmIChlbnRyeSA9PSBudWxsKQotCQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCXJldHVybiBwcmVmaXggKyBlbnRyeS5nZXROYW1lKCk7Ci0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJCUNvbnRlbnRSZWZlcmVuY2VbXSBlbnRyaWVzID0gamFyUmVmLnBlZWsoc2VsZWN0b3IsIHRoaXMubW9uaXRvcik7Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGVudHJpZXMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCQlub25QbHVnaW5Db25zdW1lci5zdG9yZShlbnRyaWVzW2tdLCB0aGlzLm1vbml0b3IpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBVdGlsaXRpZXMKLQkJCQkJCQkubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSmFyVmVyaWZpY2F0aW9uU2VydmljZS5DYW5jZWxJbnN0YWxsIiwgaWQpLAkvLyROT04tTkxTLTEkCi0JCQkJCQllKTsKLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gdGhlIG5vbi1wbHVnaW4gYXJjaGl2ZSBpcyBub3QgYSBqYXIuIEluc3RhbGwgaXQgYXNpcy4KLQkJCQkJbm9uUGx1Z2luQ29uc3VtZXIuc3RvcmUoYXJjaGl2ZVtqXSwgdGhpcy5tb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCQlub25QbHVnaW5Db25zdW1lci5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvbXB0Rm9yVmVyaWZpY2F0aW9uKAotCQlJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmaWNhdGlvblJlc3VsdCwKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCByZXN1bHQgPSBsaXN0ZW5lci5wcm9tcHQodmVyaWZpY2F0aW9uUmVzdWx0KTsKLQotCQlpZiAocmVzdWx0ID09IElWZXJpZmljYXRpb25MaXN0ZW5lci5DSE9JQ0VfQUJPUlQpIHsKLQkJCUV4Y2VwdGlvbiBlID0gdmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJdGhyb3cgbmV3IEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJKYXJWZXJpZmljYXRpb25TZXJ2aWNlLkNhbmNlbEluc3RhbGwiKSxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChyZXN1bHQgPT0gSVZlcmlmaWNhdGlvbkxpc3RlbmVyLkNIT0lDRV9FUlJPUikgewotCQkJdGhyb3cgVXRpbGl0aWVzCi0JCQkJLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkphclZlcmlmaWNhdGlvblNlcnZpY2UuVW5zdWNlc3NmdWxWZXJpZmljYXRpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJdmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkV4Y2VwdGlvbigpKTsKLQkJfQotCi0JCXJldHVybjsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0RlbHRhSW5zdGFsbEhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGVsdGFJbnN0YWxsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDNiOGNjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGVsdGFJbnN0YWxsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIEluc3RhbGwgaGFuZGxlciBmb3IgcGFydGlhbCBwbHVnaW4gZGVsaXZlcnk6IGNvcHkgZGVsdGEgY29udGVudCBmcm9tIG9sZCBwbHVnaW4gaW50byB0aGUgbmV3IG9uZS4KLSAqIFRoZSBuZXcgcGx1Z2luIHNob3VsZCBvbmx5IGNvbnRhaW4gZmlsZXMgdGhhdCBoYXZlIGNoYW5nZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWx0YUluc3RhbGxIYW5kbGVyIGV4dGVuZHMgQmFzZUluc3RhbGxIYW5kbGVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX1hNTCA9ICJwbHVnaW4ueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGUkFHTUVOVF9YTUwgPSAiZnJhZ21lbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNRVRBX01BTklGRVNUID0gIk1FVEEtSU5GL01BTklGRVNULk1GIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElGZWF0dXJlIG9sZEZlYXR1cmU7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjY29tcGxldGVJbnN0YWxsKG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudENvbnN1bWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlSW5zdGFsbChJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb25zdW1lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmICghZmVhdHVyZS5pc1BhdGNoKCkpIHsKLQkJCQkvLyBHZXQgdGhlIG9sZCBmZWF0dXJlCi0JCQkJSUZlYXR1cmVbXSBvbGRGZWF0dXJlcyA9IFVwZGF0ZVV0aWxzCi0JCQkJCQkuZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZSk7Ci0JCQkJaWYgKG9sZEZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQkJb2xkRmVhdHVyZSA9IG9sZEZlYXR1cmVzWzBdOwotCQkJfSBlbHNlIHsKLQkJCQlvbGRGZWF0dXJlID0gVXBkYXRlVXRpbHMuZ2V0UGF0Y2hlZEZlYXR1cmUoZmVhdHVyZSk7Ci0JCQkJaWYgKG9sZEZlYXR1cmUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlJUGx1Z2luRW50cnlbXSBvbGRQbHVnaW5zID0gb2xkRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUGx1Z2luRW50cnkgbmV3UGx1Z2luID0gcGx1Z2luRW50cmllc1tpXTsKLQkJCQlJUGx1Z2luRW50cnkgb2xkUGx1Z2luID0KLQkJCQkJZ2V0UGx1Z2luRW50cnkoCi0JCQkJCQlvbGRQbHVnaW5zLAotCQkJCQkJbmV3UGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOwotCQkJCWlmIChvbGRQbHVnaW4gPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJdHJ5IHsKLQkJCQkJb3ZlcmxheVBsdWdpbihvbGRQbHVnaW4sIG5ld1BsdWdpbiwgY29uc3VtZXIpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlVcGRhdGVVdGlscy5nZXRQbHVnaW5JZCgpLAotCQkJCQkJCTEsCi0JCQkJCQkJIiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllKSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy9pZiAoY29udGVudENvbnN1bWVyICE9IG51bGwpCi0JCQkvLwljb250ZW50Q29uc3VtZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJUGx1Z2luRW50cnkgZ2V0UGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5W10gcGx1Z2lucywgU3RyaW5nIGlkKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykKLQkJCWlmIChwbHVnaW5zW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGlkKSkKLQkJCQlyZXR1cm4gcGx1Z2luc1tpXTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVmZXJlbmNlRXhpc3RzKAotCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcywKLQkJQ29udGVudFJlZmVyZW5jZSByZWYpIHsKLQkJU3RyaW5nIGlkID0gcmVmLmdldElkZW50aWZpZXIoKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGlkLmVxdWFscyhyZWZlcmVuY2VzW2ldLmdldElkZW50aWZpZXIoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvdmVybGF5UGx1Z2luKAotCQlJUGx1Z2luRW50cnkgb2xkUGx1Z2luLAotCQlJUGx1Z2luRW50cnkgbmV3UGx1Z2luLAotCQlJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb25zdW1lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYobmV3UGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luRW50cnkgJiYgISgoUGx1Z2luRW50cnkpbmV3UGx1Z2luKS5pc1VucGFjaygpKXsKLQkJCS8vIHBhcnRpYWwgcGx1Zy1pbnMgKGluIHBhdGNoZXMpIG11c3QgYWx3YXlzIGJlIHVucGFja2VkCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGNvcHkgdGhlIGNvbnRlbnQgb2YgdGhlIG9sZCBwbHVnaW4gb3ZlciB0aGUgbmV3IG9uZSwgYnV0IG9ubHkKLQkJLy8gdGhvc2UgZmlsZXMgdGhhdCBkbyBub3QgZXhpc3Qgb24gdGhlIHRhcmdldAotCQlDb250ZW50UmVmZXJlbmNlW10gb2xkUmVmZXJlbmNlcyA9Ci0JCQlvbGRGZWF0dXJlCi0JCQkJLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKQotCQkJCS5nZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKAotCQkJCW9sZFBsdWdpbiwKLQkJCQludWxsKTsKLQkJQ29udGVudFJlZmVyZW5jZVtdIG5ld1JlZmVyZW5jZXMgPQotCQkJZmVhdHVyZQotCQkJCS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkKLQkJCQkuZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcygKLQkJCQluZXdQbHVnaW4sCi0JCQkJbnVsbCk7Ci0KLQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoY29uc3VtZXIuZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRVUkwoKSwKLQkJCQlTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgKLQkJCQkJCSsgbmV3UGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc1BsdWdpbk1hbmlmZXN0KG9sZFJlZmVyZW5jZXNbaV0pCi0JCQkJfHwgcmVmZXJlbmNlRXhpc3RzKG5ld1JlZmVyZW5jZXMsIG9sZFJlZmVyZW5jZXNbaV0pKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlucHV0ID0gb2xkUmVmZXJlbmNlc1tpXS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCUZpbGUgdGFyZ2V0RmlsZSA9Ci0JCQkJCW5ldyBGaWxlKHBsdWdpblBhdGgsIG9sZFJlZmVyZW5jZXNbaV0uZ2V0SWRlbnRpZmllcigpKTsKLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoCi0JCQkJCWlucHV0LAotCQkJCQl0YXJnZXRGaWxlLmdldEFic29sdXRlUGF0aCgpLAotCQkJCQludWxsKTsKLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tQZXJtaXNzaW9ucygKLQkJCQkJb2xkUmVmZXJlbmNlc1tpXSwKLQkJCQkJcGx1Z2luUGF0aCk7Ci0JCQkJLy8gMjAzMDUKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYoaW5wdXQgIT0gbnVsbCl7Ci0JCQkJCXRyeXsKLQkJCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQbHVnaW5NYW5pZmVzdChDb250ZW50UmVmZXJlbmNlIHJlZikgewotCQlTdHJpbmcgaWQgPSByZWYuZ2V0SWRlbnRpZmllcigpOwotCQlyZXR1cm4gUExVR0lOX1hNTC5lcXVhbHMoaWQpIHx8IEZSQUdNRU5UX1hNTC5lcXVhbHMoaWQpIHx8IE1FVEFfTUFOSUZFU1QuZXF1YWxzKGlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0Vycm9yUmVjb3ZlcnlMb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXJyb3JSZWNvdmVyeUxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2QyNTEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXJyb3JSZWNvdmVyeUxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotCi0KLS8qKgotICogc2luZ2xldG9uIHBhdHRlcm4uCi0gKiBtYW5hZ2VzIHRoZSBlcnJvci9yZWNvdmVyIGxvZyBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvclJlY292ZXJ5TG9nIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRUNPVkVSWV9PTiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1JFQ09WRVJZX0xPRyA9ICJlcnJvcl9yZWNvdmVyeS5sb2ciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19FTlRSWV9LRVkgPSAiTG9nRW50cnkuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk5fQ0FSUklBR0UgPSAiXHJcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX09GX0ZJTEUgPSAiZW9mPWVvZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfSU5TVEFMTF9MT0cgPSAJIlNUQVJUX0lOU1RBTExfTE9HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9FTlRSWSA9IAkJIlBMVUdJTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9FTlRSWSA9IAkJIkZSQUdNRU5UIjsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTUFOSUZFU1RfRU5UUlkgPSAJCSJCVU5ETEVfTUFOSUZFU1QiOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9KQVJfRU5UUlkgPSAJCQkiQlVORExFIjsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0VOVFJZID0gCQkiRkVBVFVSRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfSU5TVEFMTEVEID0gCQkiQUxMX0ZFQVRVUkVTX0lOU1RBTExFRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfRU5UUlkgPSAJCSJSRU5BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX0lOU1RBTExfTE9HID0gCSJFTkRfSU5TVEFMTF9MT0ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfUkVNT1ZFX0xPRyA9IAkiUkVNT1ZFX0xPRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfQUJPVVRfUkVNT1ZFID0JIkVORF9BQk9VVF9UT19SRU1PVkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0VOVFJZID0gCQkiREVMRVRFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9SRU1PVkVfTE9HID0gCQkiRU5EX1JFTU9WRV9MT0ciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZm9yY2VSZW1vdmUgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIEVycm9yUmVjb3ZlcnlMb2cgaW5zdDsKLQlwcml2YXRlIEZpbGVXcml0ZXIgb3V0OwotCXByaXZhdGUgaW50IGluZGV4OwotCXByaXZhdGUgTGlzdCBwYXRoczsKLQkKLQlwcml2YXRlIGJvb2xlYW4gb3BlbiA9IGZhbHNlOwotCXByaXZhdGUgaW50IG5iT2ZPcGVuID0gMDsKLQkKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFcnJvclJlY292ZXJ5TG9nLgotCSAqLwotCXByaXZhdGUgRXJyb3JSZWNvdmVyeUxvZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVycm9yUmVjb3ZlcnlMb2cgZ2V0TG9nKCkgewotCQlpZiAoaW5zdCA9PSBudWxsKXsKLQkJCWluc3QgPSBuZXcgRXJyb3JSZWNvdmVyeUxvZygpOwotCQl9Ci0JCXJldHVybiBpbnN0OwotCX0KLQotCS8qKgotCSAqIGdldCBhIHVuaXF1ZSBpZGVudGlmZXIgZm9yIHRoZSBmaWxlLCBlbnN1cmUgdW5pcXVlbmVzcyB1cCB0byBub3cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIoU3RyaW5nIHBhdGgpIHsKLQkJCi0JCWlmIChwYXRoPT1udWxsKSByZXR1cm4gbnVsbDsKLQkJCi0JCS8vIHZlcmlmeSBpZiBpdCB3aWxsIGJlIGEgZGlyZWN0b3J5IHdpdGhvdXQgY3JlYXRpbmcgdGhlIGZpbGUKLQkJLy8gYXMgaXQgZG9lc24ndCBleGlzdCB5ZXQKLQkJaWYgKHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpIHx8IHBhdGguZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHBhdGg7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQlTdHJpbmcgbmV3TmFtZSA9Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKGZpbGUuZ2V0TmFtZSgpLCBuZXcgRGF0ZSgpKTsKLQkJd2hpbGUgKG5ldyBGaWxlKG5ld05hbWUpLmV4aXN0cygpKSB7Ci0JCQluZXdOYW1lID0KLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKGZpbGUuZ2V0TmFtZSgpLCBuZXcgRGF0ZSgpKTsKLQkJfQotCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudEZpbGUoKSxuZXdOYW1lKTsKLQkJcmV0dXJuIG5ld0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgbG9nIGZpbGUgCi0JICogV2UgZG8gbm90IGNoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cwotCSAqLwotCXB1YmxpYyBGaWxlIGdldFJlY292ZXJ5TG9nRmlsZSgpIHsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0KLQkJCUNvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJVVJMIGxvY2F0aW9uID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gbG9jYXRpb24uZ2V0RmlsZSgpOwotCQlGaWxlIHBsYXRmb3JtQ29uZmlndXJhdGlvbiA9IG5ldyBGaWxlKGxvY2F0aW9uU3RyaW5nKTsKLQkJaWYgKCFwbGF0Zm9ybUNvbmZpZ3VyYXRpb24uaXNEaXJlY3RvcnkoKSkgcGxhdGZvcm1Db25maWd1cmF0aW9uID0gcGxhdGZvcm1Db25maWd1cmF0aW9uLmdldFBhcmVudEZpbGUoKTsKLQkJcmV0dXJuIG5ldyBGaWxlKHBsYXRmb3JtQ29uZmlndXJhdGlvbiwgRVJST1JfUkVDT1ZFUllfTE9HKTsKLQl9Ci0KLQotCS8qKgotCSAqIE9wZW4gdGhlIGxvZwotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW4oU3RyaW5nIGxvZ0VudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChvcGVuKSB7Ci0JCQluYk9mT3BlbisrOwkJCQotCQkJVXBkYXRlQ29yZS53YXJuKCJPcGVuIG5lc3RlZCBFcnJvci9SZWNvdmVyeSBsb2cgIyIrbmJPZk9wZW4rIjoiK2xvZ0VudHJ5KTsJCQkJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlGaWxlIGxvZ0ZpbGUgPSBudWxsOwkJCi0JCXRyeSB7Ci0JCQlsb2dGaWxlID0gZ2V0UmVjb3ZlcnlMb2dGaWxlKCk7Ci0JCQlvdXQgPSBuZXcgRmlsZVdyaXRlcihsb2dGaWxlKTsKLQkJCWluZGV4ID0gMDsKLQkJCXBhdGhzPW51bGw7Ci0JCQlvcGVuPXRydWU7Ci0JCQluYk9mT3Blbj0wOwotCQkJVXBkYXRlQ29yZS53YXJuKCJTdGFydCBuZXcgRXJyb3IvUmVjb3ZlcnkgbG9nICMiK25iT2ZPcGVuKyI6Iitsb2dFbnRyeSk7CQkJCQkJCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJUG9saWN5LmJpbmQoIlVwZGF0ZU1hbmFnZXJVdGlscy5VbmFibGVUb0xvZyIsIG5ldyBPYmplY3RbXSB7IGxvZ0ZpbGUgfSksIC8vJE5PTi1OTFMtMSQKLQkJCQllKTsKLQkJfQotCQkKLQkJYXBwZW5kKGxvZ0VudHJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHN0cmluZyB0byB0aGUgbG9nIGFuZCBmbHVzaAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmcgbG9nRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJRmlsZSBsb2dGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICghb3BlbikgewotCQkJCVVwZGF0ZUNvcmUud2FybigiSW50ZXJuYWwgRXJyb3I6IFRoZSBFcnJvci9SZWNvdmVyeSBsb2cgaXMgbm90IG9wZW46Iitsb2dFbnRyeSk7CQkJCSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihMT0dfRU5UUllfS0VZKTsKLQkJCWJ1ZmZlci5hcHBlbmQoaW5kZXgpOwotCQkJYnVmZmVyLmFwcGVuZCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGxvZ0VudHJ5KTsKLQkJCWJ1ZmZlci5hcHBlbmQoUkVUVVJOX0NBUlJJQUdFKTsKLQotCQkJb3V0LndyaXRlKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCW91dC5mbHVzaCgpOwotCQkJaW5kZXgrKzsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJUG9saWN5LmJpbmQoIlVwZGF0ZU1hbmFnZXJVdGlscy5VbmFibGVUb0xvZyIsIG5ldyBPYmplY3RbXSB7IGxvZ0ZpbGUgfSksIC8vJE5PTi1OTFMtMSQKLQkJCQllKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3RyaW5nIHRvIHRoZSBsb2cgYW5kIGZsdXNoCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kUGF0aChTdHJpbmcgbG9nRW50cnksIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxvZ0VudHJ5KTsKLQkJYnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQocGF0aCk7Ci0JCWFwcGVuZChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQotCQlhZGRQYXRoKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIENsb3NlIGFueSBvcGVuIHJlY292ZXJ5IGxvZwotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKFN0cmluZyBsb2dFbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJaWYgKG5iT2ZPcGVuPjApewotCQkJVXBkYXRlQ29yZS53YXJuKCJDbG9zZSBuZXN0ZWQgRXJyb3IvUmVjb3ZlcnkgbG9nICMiK25iT2ZPcGVuKyI6Iitsb2dFbnRyeSk7CQkJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbmJPZk9wZW4tLTsJCQkKLQkJCXJldHVybjsKLQkJfQkJCQotCQkKLQkJVXBkYXRlQ29yZS53YXJuKCJDbG9zZSBFcnJvci9SZWNvdmVyeSBsb2cgIyIrbmJPZk9wZW4rIjoiK2xvZ0VudHJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFwcGVuZChsb2dFbnRyeSk7Ci0JCWlmIChvdXQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlvdXQud3JpdGUoRU5EX09GX0ZJTEUpOwotCQkJCW91dC5mbHVzaCgpOwotCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyAvL2VhdCB0aGUgZXhjZXB0aW9uCi0JCQl9IGZpbmFsbHkgewotCQkJCW91dCA9IG51bGw7Ci0JCQkJb3Blbj1mYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZSB0aGUgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLQkJLy9GaWxlIGxvZ0ZpbGUgPSBnZXRSZWNvdmVyeUxvZ0ZpbGUoKTsKLQkJZ2V0UmVjb3ZlcnlMb2dGaWxlKCk7Ci0JCS8vaWYgKGxvZ0ZpbGUuZXhpc3RzKCkpCi0JCQkvL2xvZ0ZpbGUuZGVsZXRlKCk7CQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQYXRoKFN0cmluZyBwYXRoKXsKLQkJaWYgKHBhdGhzPT1udWxsKSBwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0aHMuYWRkKHBhdGgpOwotCX0KLQkKLQkvKiogCi0JICogcmVjb3ZlciBhbiBpbnN0YWxsIG9yIHJlbW92ZSB0aGF0IGRpZG4ndCBmaW5pc2gKLQkgKiBEZWxldGUgZmlsZSBmb3IgYW4gdW5maW5pc2hlZCBkZWxldGUKLQkgKiBEZWxldGUgZmlsZSBmb3IgYW4gdW5maW5zaGVkIGluc3RhbGwgaWYgbm90IGFsbCB0aGUgZmlsZXMgd2VyZSBpbnN0YWxsZWQKLQkgKiBSZW5hbWUgWE1MIGZpbGVzIGZvciBhbiBpbnN0YWxsIGlmIGFsbCB0aGUgZmlsZXMgd2VyZSBpbnN0YWxsZWQgYnV0IG5vdCByZW5hbWVkCi0JICovCi0JcHVibGljIElTdGF0dXMgcmVjb3ZlcigpewotCQkKLQkJSVN0YXR1cyBtYWluU3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cucmVjb3ZlcmluZ1N0YXR1cyIpLG51bGwpOyAvLyROT04tTkxTLTEkCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKG1haW5TdGF0dXMuZ2V0UGx1Z2luKCksbWFpblN0YXR1cy5nZXRDb2RlKCksbWFpblN0YXR1cy5nZXRNZXNzYWdlKCksbnVsbCk7Ci0KLQkJLy9jaGVjayBpZiByZWNvdmVyeSBpcyBvbgotCQlpZiAoIVJFQ09WRVJZX09OKXsKLQkJCVVwZGF0ZUNvcmUud2FybigiUmVjb3ZlcmluZyBpcyB0dXJuZWQgb2ZmLiBBYm9ydCByZWNvdmVyeSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbXVsdGk7Ci0JCX0KLQkJCi0JCUZpbGUgbG9nRmlsZSA9IGdldFJlY292ZXJ5TG9nRmlsZSgpOwotCQlpZiAoIWxvZ0ZpbGUuZXhpc3RzKCkpewotCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLmNhbm5vdEZpbmRMb2dGaWxlIikrbG9nRmlsZSxudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBtdWx0aTsKLQkJfQotCQkKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlQcm9wZXJ0aWVzIHByb3AgPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ0ZpbGUpOwotCQkJcHJvcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwcm9wLmxvYWQoaW4pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHJlYWQ6Iitsb2dGaWxlLGUpOyAvLyROT04tTkxTLTEkCi0JCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cubm9Qcm9wZXJ0eUZpbGUiKStsb2dGaWxlLGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG11bHRpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIGVvZiA9IHByb3AuZ2V0UHJvcGVydHkoImVvZiIpOyAvLyROT04tTkxTLTEkCi0JCWlmKGVvZiE9bnVsbCAmJiBlb2YuZXF1YWxzKCJlb2YiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGFsbCBpcyBnb29kCi0JCQlkZWxldGUoKTsKLQkJCVVwZGF0ZUNvcmUud2FybigiRm91bmQgbG9nIGZpbGUuIExvZyBmaWxlIGNvbnRhaW5zIGVuZC1vZi1maWxlLiBObyBuZWVkIHRvIHByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLG51bGwsbnVsbCkpOwotCQkJcmV0dXJuIG11bHRpOwotCQl9Ci0JCQotCQlTdHJpbmcgcmVjb3ZlcnkgPSBwcm9wLmdldFByb3BlcnR5KExPR19FTlRSWV9LRVkrIjAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVjb3Zlcnk9PW51bGwpewotCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLm5vTG9nRW50cnkiKStsb2dGaWxlLG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG11bHRpOwkJCQotCQl9Ci0JCi0JCWlmKHJlY292ZXJ5LmVxdWFsc0lnbm9yZUNhc2UoU1RBUlRfSU5TVEFMTF9MT0cpKXsKLQkJCW11bHRpLmFkZEFsbChwcm9jZXNzUmVjb3Zlckluc3RhbGwocHJvcCkpOwotCQkJcmV0dXJuIG11bHRpOwotCQl9Ci0JCQotCQlpZihyZWNvdmVyeS5lcXVhbHNJZ25vcmVDYXNlKFNUQVJUX1JFTU9WRV9MT0cpKXsKLQkJCW11bHRpLmFkZEFsbChwcm9jZXNzUmVjb3ZlclJlbW92ZShwcm9wKSk7Ci0JCQlyZXR1cm4gbXVsdGk7Ci0JCX0KLQotCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cubm9SZWNvdmVyeVRvRXhlY3V0ZSIpK2xvZ0ZpbGUsbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBtdWx0aTsJCi0JfQotCQotCS8qCi0JICogY3JlYXRlcyBhIFN0YXR1cwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHN0YXR1c1NldmVyaXR5LCBTdHJpbmcgbXNnLCBFeGNlcHRpb24gZSl7Ci0JCVN0cmluZyBpZCA9Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQotCQlTdHJpbmdCdWZmZXIgY29tcGxldGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobXNnIT1udWxsKQotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKG1zZyk7Ci0JCWlmIChlIT1udWxsKXsKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXHJcblsiKTsgLy8kTk9OLU5MUy0xJAotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKGUudG9TdHJpbmcoKSk7Ci0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIl1cclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhzdGF0dXNTZXZlcml0eSwgaWQsIElTdGF0dXMuT0ssIGNvbXBsZXRlU3RyaW5nLnRvU3RyaW5nKCksIGUpOwotCX0JCi0JCi0JLyoKLQkgKiAKLQkgKi8KLQkgcHJpdmF0ZSBJU3RhdHVzIHByb2Nlc3NSZWNvdmVySW5zdGFsbChQcm9wZXJ0aWVzIHByb3ApewotCSAJCi0JCUlTdGF0dXMgbWFpblN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCIiLG51bGwpOyAvLyROT04tTkxTLTEkCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKG1haW5TdGF0dXMuZ2V0UGx1Z2luKCksbWFpblN0YXR1cy5nZXRDb2RlKCksIiIsbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkgCQotCSAJQ29sbGVjdGlvbiB2YWx1ZXMgPSBwcm9wLnZhbHVlcygpOwotCSAJCi0JIAlpZih2YWx1ZXMuY29udGFpbnMoRU5EX0lOU1RBTExfTE9HKSl7Ci0JCQkvLyBhbGwgaXMgZ29vZAotCQkJZGVsZXRlKCk7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkZvdW5kIGxvZyBmaWxlLiBMb2cgZmlsZSBjb250YWlucyBFTkRfSU5TVEFMTF9MT0cuIE5vIG5lZWQgdG8gcHJvY2VzcyByZW5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLG51bGwsbnVsbCkpOwotCQkJcmV0dXJuIG11bHRpOwotCSAJfQotCSAJCi0JIAlpZiAodmFsdWVzLmNvbnRhaW5zKEFMTF9JTlNUQUxMRUQpICYmICFmb3JjZVJlbW92ZSl7Ci0JIAkJLy8gZmluaXNoIGluc3RhbGwgYnkgcmVuYW1pbmcKLQkgCQlpbnQgaW5kZXggPSAwOwotCSAJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkgCQlTdHJpbmcgdmFsID0gcHJvcC5nZXRQcm9wZXJ0eShMT0dfRU5UUllfS0VZK2luZGV4KTsKLQkgCQl3aGlsZSh2YWwhPW51bGwgJiYgIWZvdW5kKXsKLQkgCQkJaWYodmFsLmVxdWFsc0lnbm9yZUNhc2UoQUxMX0lOU1RBTExFRCkpIGZvdW5kID0gdHJ1ZTsKLQkgCQkJSVN0YXR1cyByZW5hbWVTdGF0dXMgPSBwcm9jZXNzUmVuYW1lKHZhbCk7Ci0JIAkJCVVwZGF0ZUNvcmUubG9nKHJlbmFtZVN0YXR1cyk7Ci0JIAkJCWlmKHJlbmFtZVN0YXR1cy5nZXRTZXZlcml0eSgpIT1JU3RhdHVzLk9LKXsKLQkgCQkJCW11bHRpLmFkZChyZW5hbWVTdGF0dXMpOwotCSAJCQl9Ci0JIAkJCWluZGV4Kys7Ci0JIAkJCXZhbCA9IHByb3AuZ2V0UHJvcGVydHkoTE9HX0VOVFJZX0tFWStpbmRleCk7CSAJCQkKLQkgCQl9Ci0JIAkJaWYgKHZhbD09bnVsbCl7Ci0JIAkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGZpbmQgdmFsdWUgZm9yIDoiK0xPR19FTlRSWV9LRVkraW5kZXgpOyAvLyROT04tTkxTLTEkCi0JIAkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy53cm9uZ0xvZ0ZpbGUiKStMT0dfRU5UUllfS0VZK2luZGV4LG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBtdWx0aTsKLQkgCQl9Ci0JIAkJLy8gcHJvY2VzcyByZWNvdmVyeSBmaW5pc2hlZAotCSAJCWRlbGV0ZSgpOwotCQkJVXBkYXRlQ29yZS53YXJuKCJGb3VuZCBsb2cgZmlsZS4gU3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCBieSByZW5hbWluZy4gRmVhdHVyZSBpcyBpbnN0YWxsZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSyxudWxsLG51bGwpKTsKLQkgCX0gZWxzZSB7Ci0JIAkJLy8gcmVtb3ZlIGFsbCBiZWNhdXNlIGluc3RhbGwgZGlkIG5vdCBsYXkgb3V0IGFsbCB0aGUgZmlsZXMKLQkgCQkvLyBvciByZWNvdmVyeSBpcyBub3QgYWxsb3dlZAotCSAJCWludCBpbmRleCA9IDA7Ci0JIAkJU3RyaW5nIHZhbCA9IHByb3AuZ2V0UHJvcGVydHkoTE9HX0VOVFJZX0tFWStpbmRleCk7Ci0JIAkJd2hpbGUodmFsIT1udWxsKXsKLQkgCQkJSVN0YXR1cyByZW1vdmVTdGF0dXMgPSBwcm9jZXNzUmVtb3ZlKHZhbCk7Ci0JIAkJCVVwZGF0ZUNvcmUubG9nKHJlbW92ZVN0YXR1cyk7Ci0JIAkJCWlmKHJlbW92ZVN0YXR1cy5nZXRTZXZlcml0eSgpIT1JU3RhdHVzLk9LKXsKLQkgCQkJCW11bHRpLmFkZEFsbChyZW1vdmVTdGF0dXMpOwotCSAJCQl9Ci0JIAkJCWluZGV4Kys7Ci0JIAkJCXZhbCA9IHByb3AuZ2V0UHJvcGVydHkoTE9HX0VOVFJZX0tFWStpbmRleCk7CSAJCQkKLQkgCQl9Ci0JIAkJLy8gcHJvY2VzcyByZWNvdmVyeSBmaW5pc2hlZAotCSAJCWRlbGV0ZSgpOwotCQkJVXBkYXRlQ29yZS53YXJuKCJGb3VuZCBsb2cgZmlsZS4gU3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCBieSByZW1vdmluZy4gRmVhdHVyZSBpcyByZW1vdmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssbnVsbCxudWxsKSk7Ci0JIAl9Ci0JIAlyZXR1cm4gbXVsdGk7Ci0JIH0KLQkgCi0JIC8qCi0JICAqIAotCSAgKi8KLQkgIHByaXZhdGUgSVN0YXR1cyBwcm9jZXNzUmVuYW1lKFN0cmluZyB2YWwpewotCSAgCQotCQkvLyBnZXQgdGhlIHBhdGgKLQkJaW50IGluZGV4ID0gLTE7Ci0JCVN0cmluZyBuZXdGaWxlTmFtZSA9IG51bGw7Ci0JICAJaWYgKHZhbC5zdGFydHNXaXRoKFBMVUdJTl9FTlRSWSkpewotCSAgCQlpbmRleCA9IFBMVUdJTl9FTlRSWS5sZW5ndGgoKTsKLQkgIAkJbmV3RmlsZU5hbWU9ICJwbHVnaW4ueG1sIjsgLy8kTk9OLU5MUy0xJAotCSAgCX0gZWxzZSBpZiAodmFsLnN0YXJ0c1dpdGgoQlVORExFX01BTklGRVNUX0VOVFJZKSl7Ci0JICAJCWluZGV4ID0gQlVORExFX01BTklGRVNUX0VOVFJZLmxlbmd0aCgpOwotCSAgCQluZXdGaWxlTmFtZT0gIk1FVEEtSU5GL01BTklGRVNULk1GIjsgLy8kTk9OLU5MUy0xJAotCSAgCX1lbHNlIGlmICh2YWwuc3RhcnRzV2l0aChGUkFHTUVOVF9FTlRSWSkpewotCSAgCQlpbmRleCA9IEZSQUdNRU5UX0VOVFJZLmxlbmd0aCgpOwotCSAgCQluZXdGaWxlTmFtZT0gImZyYWdtZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkgIAl9IGVsc2UgaWYgKHZhbC5zdGFydHNXaXRoKEZFQVRVUkVfRU5UUlkpKXsKLQkgIAkJaW5kZXggPSBGRUFUVVJFX0VOVFJZLmxlbmd0aCgpOwotCSAgCQluZXdGaWxlTmFtZT0gImZlYXR1cmUueG1sIjsgLy8kTk9OLU5MUy0xJAotCSAgCX0gZWxzZSBpZiAodmFsLnN0YXJ0c1dpdGgoQlVORExFX0pBUl9FTlRSWSkpewotCSAgCQlpbmRleCA9IEJVTkRMRV9KQVJfRU5UUlkubGVuZ3RoKCk7Ci0JICAJfQotCSAgCQotCSAgCWlmIChpbmRleD09LTEpewotCSAgCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cubm9BY3Rpb24iKSt2YWwsbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkgIAl9Ci0JICAJCi0JICAJU3RyaW5nIG9sZE5hbWUgPSB2YWwuc3Vic3RyaW5nKGluZGV4KzEpOwotCSAgCS8vIG9sZG5hbWUgaXMgY29tLnBpZC9wbHVnaW4jIyMjIy54bWwKLQkgIAkvLyBvciBvbGRuYW1lIGlzIGNvbS5waWQvcGlkX3B2ZXIuamFyIyMjIyMjLnRtcAotCSAgCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKG9sZE5hbWUpOwotCSAgCUZpbGUgbmV3RmlsZTsKLQkgIAlpZih2YWwuc3RhcnRzV2l0aChCVU5ETEVfSkFSX0VOVFJZKSl7Ci0JICAJCW5ld0ZpbGUgPSBuZXcgRmlsZShvbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZygwLCBvbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLmxhc3RJbmRleE9mKCIuamFyIikrIi5qYXIiLmxlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgCX1lbHNlewotCSAgCQluZXdGaWxlID0gbmV3IEZpbGUob2xkRmlsZS5nZXRQYXJlbnRGaWxlKCksbmV3RmlsZU5hbWUpOwotCSAgCX0KLQkgIAlpZiAoIW9sZEZpbGUuZXhpc3RzKCkpewotCSAgCQlpZiAobmV3RmlsZS5leGlzdHMoKSl7Ci0JICAJCQkvLyBvayB0aGUgZmlsZSBoYXMgYmVlbiByZW5hbWVkIGFwcGFyZW50bHkKLQkJCSAgCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSyxQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy5maWxlQWxyZWFkeVJlbmFtZWQiKStuZXdGaWxlLG51bGwpOwkgIAkJCQkgLy8kTk9OLU5MUy0xJAotCSAgCQl9IGVsc2UgewotCSAgCQkJLy8gdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgbG9nIGFzIHByb2JsZW0sIGFuZCBmb3JjZSB0aGUgcmVtb3ZhbCBvZiB0aGUgZmVhdHVyZQotCQkgIAkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLmNhbm5vdEZpbmRGaWxlIikrb2xkRmlsZSxudWxsKTsJICAJCQkgLy8kTk9OLU5MUy0xJAotCSAgCQl9Ci0JICAJfSAJCi0JICAJCi0JCWJvb2xlYW4gc3VjZXNzID0gZmFsc2U7Ci0JCWlmIChuZXdGaWxlLmV4aXN0cygpKSB7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3RmlsZSk7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIlJlbW92aW5nIGFscmVhZHkgZXhpc3RpbmcgZmlsZToiK25ld0ZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc3VjZXNzID0gb2xkRmlsZS5yZW5hbWVUbyhuZXdGaWxlKTsKLQkJCQotCQlpZighc3VjZXNzKXsKLQkJCVN0cmluZyBtc2cgPShQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy5vbGRUb05ldyIpK29sZEZpbGUrbmV3RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixtc2csbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLnJlbmFtZWQiKStvbGRGaWxlK1BvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLnRvIikrbmV3RmlsZSxudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JICB9Ci0JICAKLQkgLyoKLQkgICogCi0JICAqLwotCSAgcHJpdmF0ZSBJU3RhdHVzIHByb2Nlc3NSZW1vdmUoU3RyaW5nIHZhbCl7Ci0JICAJCi0JCUlTdGF0dXMgbWFpblN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCIiLG51bGwpOyAvLyROT04tTkxTLTEkCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKG1haW5TdGF0dXMuZ2V0UGx1Z2luKCksbWFpblN0YXR1cy5nZXRDb2RlKCksIiIsbnVsbCk7CSAgCSAvLyROT04tTkxTLTEkCi0JICAJCi0JCS8vIGdldCB0aGUgcGF0aAotCQlpbnQgaW5kZXggPSAtMTsKLQkJaWYgKHZhbC5zdGFydHNXaXRoKEJVTkRMRV9KQVJfRU5UUlkpKXsKLQkgIAkJaW5kZXggPSBCVU5ETEVfSkFSX0VOVFJZLmxlbmd0aCgpOwotCSAgCX0KLQkgIAkKLQkgIAlpZiAoaW5kZXg9PS0xKXsKLQkgIAkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLm5vQWN0aW9uIikrdmFsLG51bGwpOyAvLyROT04tTkxTLTEkCi0JICAJfQotCSAgCQotCSAgCVN0cmluZyBvbGROYW1lID0gdmFsLnN1YnN0cmluZyhpbmRleCsxKTsKLQkgIAlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShvbGROYW1lKTsKLQkgIAlpZiAoIW9sZEZpbGUuZXhpc3RzKCkpewotICAJCQkvLyB0aGUgamFyIG9yIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBsb2cgYXMgcHJvYmxlbSwgYW5kIGZvcmNlIHRoZSByZW1vdmFsIG9mIHRoZSBmZWF0dXJlCi0JICAJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy5jYW5ub3RGaW5kRmlsZSIpK29sZEZpbGUsbnVsbCkpOwkgIAkJCSAvLyROT04tTkxTLTEkCi0JICAJCXJldHVybiBtdWx0aTsKLQkgIAl9IAkJICAJCi0JCW11bHRpLmFkZEFsbChyZW1vdmVGcm9tRmlsZVN5c3RlbShvbGRGaWxlKSk7Ci0KLQkJcmV0dXJuIG11bHRpOwotCSAgfQkKLQkgIAotCS8qKgotCSAqIHJldHVybiBhIG11bHRpIHN0YXR1cywgCi0JICogdGhlIGNoaWxkcmVuIGFyZSB0aGUgZmlsZSB0aGF0IGNvdWxkbid0IGJlIHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZW1vdmVGcm9tRmlsZVN5c3RlbShGaWxlIGZpbGUpIHsKLQkJCi0JCUlTdGF0dXMgbWFpblN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCIiLG51bGwpOyAvLyROT04tTkxTLTEkCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKG1haW5TdGF0dXMuZ2V0UGx1Z2luKCksbWFpblN0YXR1cy5nZXRDb2RlKCksIiIsbnVsbCk7CQkgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKCFmaWxlLmV4aXN0cygpKXsKLQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy5ub0ZpbGV0b1JlbW92ZSIpK2ZpbGUsbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbXVsdGk7Ci0JCX0KLQkJCQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmdbXSBmaWxlcyA9IGZpbGUubGlzdCgpOwotCQkJaWYgKGZpbGVzICE9IG51bGwpIC8vIGJlIGNhcmVmdWwgc2luY2UgZmlsZS5saXN0KCkgY2FuIHJldHVybiBudWxsCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSl7Ci0JCQkJCW11bHRpLmFkZEFsbChyZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCBmaWxlc1tpXSkpKTsKLQkJCQl9Ci0JCX0KLQkJCi0JCWlmICghZmlsZS5kZWxldGUoKSkgewotCQkJU3RyaW5nIG1zZyA9ICJVbmFibGUgdG8gcmVtb3ZlIGZpbGUiICtmaWxlLmdldEFic29sdXRlUGF0aCgpOyAvLyROT04tTkxTLTEkIAotCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLG1zZyxudWxsKSk7Ci0JCX0KLQkJcmV0dXJuIG11bHRpOwotCX0JCi0JCi0JLyoKLQkgKiAKLQkgKi8KLQkgcHJpdmF0ZSBJU3RhdHVzIHByb2Nlc3NSZWNvdmVyUmVtb3ZlKFByb3BlcnRpZXMgcHJvcCl7Ci0JIAkKLQkJSVN0YXR1cyBtYWluU3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIiIsbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMobWFpblN0YXR1cy5nZXRQbHVnaW4oKSxtYWluU3RhdHVzLmdldENvZGUoKSwiIixudWxsKTsgLy8kTk9OLU5MUy0xJAotCSAJCi0JIAlDb2xsZWN0aW9uIHZhbHVlcyA9IHByb3AudmFsdWVzKCk7Ci0JIAkKLQkgCWlmKHZhbHVlcy5jb250YWlucyhFTkRfUkVNT1ZFX0xPRykpewotCQkJLy8gYWxsIGlzIGdvb2QKLQkJCWRlbGV0ZSgpOwotCQkJVXBkYXRlQ29yZS53YXJuKCJGb3VuZCBsb2cgZmlsZS4gTG9nIGZpbGUgY29udGFpbnMgRU5EX1JFTU9WRV9MT0cuIE5vIG5lZWQgdG8gcHJvY2VzcyByZW5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLG51bGwsbnVsbCkpOwotCQkJcmV0dXJuIG11bHRpOwotCSAJfQotCSAJCi0JIAlpZiAoIXZhbHVlcy5jb250YWlucyhFTkRfQUJPVVRfUkVNT1ZFKSl7Ci0JIAkJLy8gZmluaXNoIGluc3RhbGwgYnkgcmVuYW1pbmcKLSAJCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cucmVtb3ZlRmVhdHVyZSIpLG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBtdWx0aTsKLQkgCX0gZWxzZSB7Ci0JIAkJLy8gZmluaXNoIGluc3RhbGwgYnkgcmVuYW1pbmcKLQkgCQlpbnQgaW5kZXggPSAwOwotCSAJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkgCQlTdHJpbmcgdmFsID0gcHJvcC5nZXRQcm9wZXJ0eShMT0dfRU5UUllfS0VZK2luZGV4KTsKLQkgCQl3aGlsZSh2YWwhPW51bGwgJiYgIWZvdW5kKXsKLQkgCQkJaWYodmFsLmVxdWFsc0lnbm9yZUNhc2UoRU5EX0FCT1VUX1JFTU9WRSkpIGZvdW5kID0gdHJ1ZTsKLQkgCQkJSVN0YXR1cyByZW5hbWVTdGF0dXMgPSBwcm9jZXNzUmVtb3ZlKHZhbCk7Ci0JIAkJCVVwZGF0ZUNvcmUubG9nKHJlbmFtZVN0YXR1cyk7Ci0JIAkJCWlmKHJlbmFtZVN0YXR1cy5nZXRTZXZlcml0eSgpIT1JU3RhdHVzLk9LKXsKLQkgCQkJCW11bHRpLmFkZChyZW5hbWVTdGF0dXMpOwotCSAJCQl9Ci0JIAkJCWluZGV4Kys7Ci0JIAkJCXZhbCA9IHByb3AuZ2V0UHJvcGVydHkoTE9HX0VOVFJZX0tFWStpbmRleCk7CSAJCQkKLQkgCQl9Ci0JIAkJaWYgKHZhbD09bnVsbCl7Ci0JIAkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGZpbmQgdmFsdWUgZm9yIDoiK0xPR19FTlRSWV9LRVkraW5kZXgpOyAvLyROT04tTkxTLTEkCi0JIAkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy53cm9uZ0xvZ0ZpbGUiKStMT0dfRU5UUllfS0VZK2luZGV4LG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBtdWx0aTsKLQkgCQl9Ci0JIAkJLy8gcHJvY2VzcyByZWNvdmVyeSBmaW5pc2hlZAotCSAJCWRlbGV0ZSgpOwotCQkJVXBkYXRlQ29yZS53YXJuKCJGb3VuZCBsb2cgZmlsZS4gU3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCBieSBkZWxldGluZy4gRmVhdHVyZSBpcyByZW1vdmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssbnVsbCxudWxsKSk7Ci0JIAl9Ci0JIAlyZXR1cm4gbXVsdGk7Ci0JIH0JICAgIAotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVDb250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4OWYxZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVDb250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLQotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElGZWF0dXJlQ29udGVudENvbnN1bWVyCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVDb250ZW50Q29uc3VtZXIgZXh0ZW5kcyBNb2RlbE9iamVjdAotCWltcGxlbWVudHMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgewotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRG93bmxvYWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4ZjY3OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBJT0V4Y2VwdGlvbiBkdXJpbmcgZG93bmxvYWRpbmcgZmVhdHVyZXMKLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uIGV4dGVuZHMgQ29yZUV4Y2VwdGlvbiB7Ci0JLyoqCi0JICogQ29uc3RydWN0IHRoZSBleGNlcHRpb24gaW5kaWNhdGluZyBlbmNsb3NpbmcgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uKFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKAotCQkJbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLklORk8sCi0JCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIiwgLy8kTk9OLU5MUy0xJAotCQkJCUlTdGF0dXMuT0ssCi0JCQkJbXNnLAotCQkJCWUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkMTU0MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotDQotIA0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogQ29udGVudENvbnN1bWVyIEltcGxlbWVudGF0aW9uIGZvciBhIEZlYXR1cmVFeGVjdXRhYmxlDQotICovDQotDQotcHVibGljIGNsYXNzIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyIGV4dGVuZHMgRmVhdHVyZUNvbnRlbnRDb25zdW1lciB7DQotDQotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZTsNCi0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZD0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiBhYm9ydGVkPSBmYWxzZTsJDQotCXByaXZhdGUgSVNpdGVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyOw0KLQlwcml2YXRlIElGZWF0dXJlQ29udGVudENvbnN1bWVyIHBhcmVudCA9IG51bGw7DQotCXByaXZhdGUgTGlzdCAvKiBvZiBJRmVhdHVyZUNvbnRlbnRDT25zdW1lciAqLyBjaGlsZHJlbjsNCi0NCi0JLyoNCi0JICogQHNlZSBJQ29udGVudENvbnN1bWVyI29wZW4oSU5vblBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnkpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlDb250ZW50Q29uc3VtZXIgY29ucyA9IG5ldyBOb25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lcigNCi0JCQlnZXRDb250ZW50Q29uc3VtZXIoKS5vcGVuKG5vblBsdWdpbkVudHJ5KSk7DQotCQlyZXR1cm4gY29uczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElDb250ZW50Q29uc3VtZXIjb3BlbihJUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgSUNvbnRlbnRDb25zdW1lciBvcGVuKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJQ29udGVudENvbnN1bWVyIGNvbnMgPSBuZXcgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIoZ2V0Q29udGVudENvbnN1bWVyKCkub3BlbihwbHVnaW5FbnRyeSkpOw0KLQkJcmV0dXJuIGNvbnM7CQkNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElDb250ZW50Q29uc3VtZXIjYWRkQ2hpbGQoSUZlYXR1cmUpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChJRmVhdHVyZSBjaGlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY2hpbGRDb25zdW1lciA9IGNoaWxkLmdldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKTsNCi0JCWNoaWxkQ29uc3VtZXIuc2V0UGFyZW50KHRoaXMpOw0KLQkJaWYgKGNoaWxkcmVuPT1udWxsKSBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWNoaWxkcmVuLmFkZChjaGlsZENvbnN1bWVyKTsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWdldENvbnRlbnRDb25zdW1lcigpLnN0b3JlKGNvbnRlbnRSZWZlcmVuY2UsIG1vbml0b3IpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjY2xvc2UoKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJDQotCQlpZiAoIWNsb3NlZCAmJiBnZXRQYXJlbnQoKSE9bnVsbCl7DQotCQkJY2xvc2VkPXRydWU7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCS8vIHBhcmVudCBjb25zdW1lciwgbG9nIHdlIGFyZSBhYm91dCB0byByZW5hbWUNCi0JCS8vIGxvZyBmaWxlcyBoYXZlIGJlZW4gZG93bmxvYWRlZA0KLQkJaWYgKGdldFBhcmVudCgpPT1udWxsKXsNCi0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZChFcnJvclJlY292ZXJ5TG9nLkFMTF9JTlNUQUxMRUQpOw0KLQkJfQ0KLQkJDQotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWY9IG51bGw7DQotCQlpZiAoY29udGVudENvbnN1bWVyICE9IG51bGwpDQotCQkJcmVmID0gY29udGVudENvbnN1bWVyLmNsb3NlKCk7DQotCQkNCi0JCS8vIGNsb3NlIG5lc3RlZCBmZWF0dXJlDQotCQlJRmVhdHVyZUNvbnRlbnRDb25zdW1lcltdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCi0JCQljaGlsZHJlbltpXS5jbG9zZSgpOw0KLQkJfQ0KLQkJCQkJCQkNCi0JCXJldHVybiByZWY7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNzZXRGZWF0dXJlKElGZWF0dXJlKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl0aGlzLmZlYXR1cmU9IGZlYXR1cmU7DQotCX0NCi0NCi0JLyoNCi0JICogU2V0cyB0aGUgcGFyZW50IA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KElGZWF0dXJlQ29udGVudENvbnN1bWVyIGZlYXR1cmVDb250ZW50Q29uc3VtZXIpIHsNCi0JCXRoaXMucGFyZW50PSBmZWF0dXJlQ29udGVudENvbnN1bWVyOw0KLQl9DQotDQotCS8qDQotCSAqIHJldHVybnMgdGhlIENvbnRlbnQgQ29uc3VtZXIgZm9yIHRoZSBmZWF0dXJlDQotCSAqIA0KLQkgKiBSaWdodCBub3cgd2UgYXJlIHRoZSBvbmx5IG9uZSB0byBpbXBsZW1lbnQgU2l0ZUNvbnRlbnRDb25zdW1lcg0KLQkgKiBOZWVkIHRvIGJlIGV4cG9zZWQgYXMgQVBJIHBvc3QgdjIuMA0KLQkgKi8NCi0JcHJpdmF0ZSBJU2l0ZUNvbnRlbnRDb25zdW1lciBnZXRDb250ZW50Q29uc3VtZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoY29udGVudENvbnN1bWVyID09IG51bGwpDQotCQkJaWYgKGZlYXR1cmUuZ2V0U2l0ZSgpIGluc3RhbmNlb2YgU2l0ZUZpbGUpIHsNCi0JCQkJU2l0ZUZpbGUgc2l0ZT0gKFNpdGVGaWxlKSBmZWF0dXJlLmdldFNpdGUoKTsNCi0JCQkJY29udGVudENvbnN1bWVyPSBzaXRlLmNyZWF0ZVNpdGVDb250ZW50Q29uc3VtZXIoZmVhdHVyZSk7DQotCQkJfSBlbHNlIHsNCi0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCQkJfQ0KLQkJcmV0dXJuIGNvbnRlbnRDb25zdW1lcjsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI2Fib3J0KCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGFib3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKGFib3J0ZWQpIHJldHVybjsNCi0JCQ0KLQkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXJbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJdHJ5IHsNCi0JCQljaGlsZHJlbltpXS5hYm9ydCgpOw0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsNCi0JCQkJLy9kbyBOb3RoaW5nDQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gZG8gbm90IGNsb3NlIHBsdWdpbiBhbmQgbm9uIHBsdWdpbiBjb250ZW50IGNvbnN1bWVyDQotCQkvLyB0aGUgY29udGVudENvbnN1bWVyIHdpbGwgYWJvcnQgdGhlbQ0KLQkJLy8gd2UgZG8gbm90IG5lZWQgdG8gYWJvcnQgdGhlIE5vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyIGFuZCBQbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lDQotDQotCQkvL2ltcGxlbWVudCB0aGUgY2xlYW51cA0KLQkJaWYgKGNvbnRlbnRDb25zdW1lciE9bnVsbCkNCi0JCQljb250ZW50Q29uc3VtZXIuYWJvcnQoKTsNCi0JCQ0KLQkJYWJvcnRlZCA9IHRydWU7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNnZXRGZWF0dXJlKCkNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCl7DQotCQlyZXR1cm4gZmVhdHVyZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI2dldFBhcmVudCgpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgZ2V0UGFyZW50KCl7DQotCQlyZXR1cm4gcGFyZW50Ow0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjZ2V0Q2hpbGRyZW4oKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyW10gZ2V0Q2hpbGRyZW4oKXsNCi0JCWlmIChjaGlsZHJlbj09bnVsbCB8fCBjaGlsZHJlbi5zaXplKCkgPT0gMCkNCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlQ29udGVudENvbnN1bWVyWzBdOw0KLQ0KLQkJcmV0dXJuIChJRmVhdHVyZUNvbnRlbnRDb25zdW1lcltdKSBjaGlsZHJlbi50b0FycmF5KGFycmF5VHlwZUZvcihjaGlsZHJlbikpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2NjMwZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotDQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYSBFeGVjdXRhYmxlIEZlYXR1cmUgQ29udGVudCBQcm92aWRlcg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEZlYXR1cmVDb250ZW50UHJvdmlkZXIgew0KLQ0KLQkvKg0KLQkgKiBDb25zdHJ1Y3RvciANCi0JICovDQotCXB1YmxpYyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcihVUkwgdXJsKSB7DQotCQlzdXBlcih1cmwpOw0KLQl9DQotDQotCS8qDQotCSAqIFJldHVybiB0aGUgcGF0aCBmb3IgYSBwbHVnaW5FbnRyeQ0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpDQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gZ2V0IHRoZSBVUkwgb2YgdGhlIEFyY2hpdmUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBwbHVnaW4gZW50cnkNCi0JCUlTaXRlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7DQotCQlVUkwgZmlsZVVSTCA9IHByb3ZpZGVyLmdldEFyY2hpdmVSZWZlcmVuY2UoZ2V0UGF0aElEKHBsdWdpbkVudHJ5KSk7DQotCQlTdHJpbmcgcmVzdWx0ID0gZmlsZVVSTC5nZXRGaWxlKCk7DQotDQotCQlpZiAoIXJlc3VsdC5lbmRzV2l0aCgiLmphciIpICYmICFyZXN1bHQuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSAvLyROT04tTkxTLTEkDQotCQkJcmVzdWx0ICs9IEZpbGUuc2VwYXJhdG9yOw0KLQkJRmlsZSBwbHVnaW5QYXRoID0gbmV3IEZpbGUocmVzdWx0KTsNCi0JCWlmICghcGx1Z2luUGF0aC5leGlzdHMoKSkNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oDQotCQkJCVBvbGljeS5iaW5kKCJGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5GaWxlRG9lc05vdEV4aXN0IiwgcmVzdWx0KSk7CS8vJE5PTi1OTFMtMSQNCi0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoNCi0JICogUmV0dXJucyB0aGUgcGF0aCBmb3IgdGhlIEZlYXR1cmUNCi0JICovDQotCXByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVQYXRoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCVN0cmluZyByZXN1bHQgPSBnZXRGZWF0dXJlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQ0KLQkJLy8gcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzdWJkaXJlY3Rvcmllcw0KLQkJaWYgKCEocmVzdWx0LmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSB8fCByZXN1bHQuZW5kc1dpdGgoIi8iKSkpIC8vJE5PTi1OTFMtMSQNCi0JCQlyZXN1bHQgKz0gRmlsZS5zZXBhcmF0b3I7DQotCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKHJlc3VsdCk7DQotCQlpZiAoIXBsdWdpbkRpci5leGlzdHMoKSkNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oDQotCQkJCVBvbGljeS5iaW5kKCJGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5GaWxlRG9lc05vdEV4aXN0IiwgcmVzdWx0KSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoNCi0JICogUmV0dXJucyBhbGwgdGhlIGZpbGVzIHVuZGVyIHRoZSBkaXJlY3RvcnkNCi0JICogUmVjdXJzaXZlIGNhbGwNCi0JICovDQotCXByaXZhdGUgTGlzdCBnZXRGaWxlcyhGaWxlIGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLQkJaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkgew0KLQkJCVN0cmluZyBtc2cgPQ0KLQkJCQlQb2xpY3kuYmluZCgNCi0JCQkJCSJGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5JbnZhbGlkRGlyZWN0b3J5IiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJZGlyLmdldEFic29sdXRlUGF0aCgpKTsNCi0NCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24obXNnKTsNCi0NCi0JCX0NCi0NCi0JCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsNCi0JCWlmIChmaWxlcyAhPSBudWxsKQ0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsNCi0JCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQkJCXJlc3VsdC5hZGRBbGwoZ2V0RmlsZXMoZmlsZXNbaV0pKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCXJlc3VsdC5hZGQoZmlsZXNbaV0pOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFZlcmlmaWVyKCkNCi0JICovDQotCXB1YmxpYyBJVmVyaWZpZXIgZ2V0VmVyaWZpZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZSgpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUNvbnRlbnRSZWZlcmVuY2UgcmVzdWx0ID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcmVzdWx0ID0gbmV3IENvbnRlbnRSZWZlcmVuY2UoRmVhdHVyZS5GRUFUVVJFX1hNTCwgbmV3IFVSTChnZXRVUkwoKSwgRmVhdHVyZS5GRUFUVVJFX1hNTCkpOw0KLQ0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJUG9saWN5LmJpbmQoDQotCQkJCQkiRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9DcmVhdGVVUkxGb3IiLCAvLyROT04tTkxTLTEkDQotCQkJCQlnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpICsgIiAiICsgRmVhdHVyZS5GRUFUVVJFX1hNTCksIC8vJE5PTi1OTFMtMSQNCi0JCQkJZSk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJLy8gZXhlY3V0YWJsZSBmZWF0dXJlIGRvZXMgbm90IGNvbnRhaW4gYXJjaGl2ZXMNCi0JCXJldHVybiBuZXcgQ29udGVudFJlZmVyZW5jZVswXTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKA0KLQkJSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LA0KLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsNCi0JCVN0cmluZyBhcmNoaXZlSUQgPSBnZXRQYXRoSUQocGx1Z2luRW50cnkpOw0KLQkJdHJ5IHsNCi0JCQlGaWxlIGFyY2hpdmVGaWxlID0gbmV3IEZpbGUoZ2V0UGF0aChwbHVnaW5FbnRyeSkpOw0KLQkJCWlmKCFhcmNoaXZlRmlsZS5pc0RpcmVjdG9yeSgpICYmIGFyY2hpdmVGaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpKXsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXN1bHRbMF0gPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZShhcmNoaXZlSUQsIGFyY2hpdmVGaWxlKTsJCQkJDQotCQkJfSBlbHNlIHsNCi0JCQkJcmVzdWx0WzBdID0NCi0JCQkJCW5ldyBDb250ZW50UmVmZXJlbmNlKGFyY2hpdmVJRCwgYXJjaGl2ZUZpbGUpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJCVBvbGljeS5iaW5kKA0KLQkJCQkJCSJGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb1JldHJpZXZlUGx1Z2luRW50cnkiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLA0KLQkJCQkJZSk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJTm9uUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoDQotCQlJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnksDQotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlc3VsdCA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzFdOw0KLQkJVVJMIGZpbGVVUkw7DQotDQotCQkvL3RyeSB7DQotCQkvLyBnZXQgdGhlIFVSTCBvZiB0aGUgQXJjaGl2ZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHBsdWdpbiBlbnRyeQ0KLQkJSVNpdGVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsNCi0JCWZpbGVVUkwgPSBwcm92aWRlci5nZXRBcmNoaXZlUmVmZXJlbmNlKGdldFBhdGhJRChub25QbHVnaW5FbnRyeSkpOw0KLQ0KLQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBmaWxlVVJMLmdldEZpbGUoKTsNCi0JCUZpbGUgbm9uUGx1Z2luRGF0YSA9IG5ldyBGaWxlKGZpbGVTdHJpbmcpOw0KLQkJaWYgKCFub25QbHVnaW5EYXRhLmV4aXN0cygpKQ0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQlQb2xpY3kuYmluZCgiRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuRmlsZURvZXNOb3RFeGlzdCIsIGZpbGVTdHJpbmcpLCAvLyROT04tTkxTLTEkDQotCQkJCW51bGwpOyANCi0NCi0JCXRyeSB7DQotCQkJcmVzdWx0WzBdID0NCi0JCQkJbmV3IENvbnRlbnRSZWZlcmVuY2Uobm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpLCBub25QbHVnaW5EYXRhLnRvVVJMKCkpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJUG9saWN5LmJpbmQoDQotCQkJCQkiRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9SZXRyaWV2ZU5vblBsdWdpbkVudHJ5IiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJbm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLA0KLQkJCQllKTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlDb250ZW50UmVmZXJlbmNlW10gY29udGVudFJlZmVyZW5jZXMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsNCi0JCWNvbnRlbnRSZWZlcmVuY2VzWzBdID0gbmV3IENvbnRlbnRSZWZlcmVuY2UobnVsbCwgZ2V0VVJMKCkpOw0KLQkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2VzOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZXNDb250ZW50UmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVzdWx0ID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07DQotCQl0cnkgew0KLQkJCUZpbGUgZmVhdHVyZURpciA9IG5ldyBGaWxlKGdldEZlYXR1cmVQYXRoKCkpOw0KLQkJCUxpc3QgZmlsZXMgPSBnZXRGaWxlcyhmZWF0dXJlRGlyKTsNCi0JCQlyZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVtmaWxlcy5zaXplKCldOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7DQotCQkJCUZpbGUgY3VycmVudEZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOw0KLQkJCQlyZXN1bHRbaV0gPSBuZXcgQ29udGVudFJlZmVyZW5jZShjdXJyZW50RmlsZS5nZXROYW1lKCksIGN1cnJlbnRGaWxlLnRvVVJMKCkpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJUG9saWN5LmJpbmQoDQotCQkJCQkiRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9SZXRyaWV2ZUZlYXR1cmVFbnRyeUNvbnRlbnRSZWYiLCAvLyROT04tTkxTLTEkDQotCQkJCQlnZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLA0KLQkJCQllKTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcygNCi0JCUlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwNCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMocGx1Z2luRW50cnksIG1vbml0b3IpOw0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlc3VsdCA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzBdOw0KLQ0KLQkJdHJ5IHsNCi0JCQlpZiAocmVmZXJlbmNlc1swXSBpbnN0YW5jZW9mIEphckNvbnRlbnRSZWZlcmVuY2UpIHsNCi0JCQkJcmVzdWx0ID0gKChKYXJDb250ZW50UmVmZXJlbmNlKXJlZmVyZW5jZXNbMF0pLnBlZWsobnVsbCwgbW9uaXRvcik7DQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzdWJkaXJlY3Rvcmllcw0KLQkJCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKGdldFBhdGgocGx1Z2luRW50cnkpKTsNCi0JCQkJVVJMIHBsdWdpblVSTCA9IHBsdWdpbkRpci50b1VSTCgpOw0KLQkJCQlMaXN0IGZpbGVzID0gZ2V0RmlsZXMocGx1Z2luRGlyKTsNCi0JCQkJcmVzdWx0ID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbZmlsZXMuc2l6ZSgpXTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsNCi0JCQkJCUZpbGUgY3VycmVudEZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOw0KLQkJCQkJU3RyaW5nIHJlbGF0aXZlU3RyaW5nID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTEFzU3RyaW5nKHBsdWdpblVSTCwgY3VycmVudEZpbGUudG9VUkwoKSk7DQotCQkJCQlyZXN1bHRbaV0gPSBuZXcgQ29udGVudFJlZmVyZW5jZShyZWxhdGl2ZVN0cmluZywgY3VycmVudEZpbGUudG9VUkwoKSk7DQotCQkJCX0NCi0JCQl9DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCVBvbGljeS5iaW5kKA0KLQkJCQkJIkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLlVuYWJsZVRvUmV0cml2ZUFyY2hpdmVDb250ZW50UmVmIikgLy8kTk9OLU5MUy0xJA0KLQkJCQkJKyBwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSwNCi0JCQkJZSk7DQotCQl9DQotCQkNCi0JCS8vWzIwODY2XSB3ZSBkaWQgbm90IHByZXNlcnZlIGV4ZWN1dGFibGUgYml0DQotCQl2YWxpZGF0ZVBlcm1pc3Npb25zKHJlc3VsdCk7DQotCQkNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODQ3MWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi0NCi0vKioNCi0gKiBGZWF0dXJlRmFjdG9yeSBmb3IgRXhlY3V0YWJsZSBGZWF0dXJlcw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkgZXh0ZW5kcyBCYXNlRmVhdHVyZUZhY3Rvcnkgew0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlRmFjdG9yeSNjcmVhdGVGZWF0dXJlKFVSTCxJU2l0ZSxJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoVVJMIHVybCwgSVNpdGUgc2l0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlUYXJnZXRGZWF0dXJlIGZlYXR1cmUgPSBudWxsOw0KLQkJSW5wdXRTdHJlYW0gZmVhdHVyZVN0cmVhbSA9IG51bGw7DQotCQlpZiAobW9uaXRvciA9PSBudWxsKQ0KLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQ0KLQkJaWYgKHVybCA9PSBudWxsKQ0KLQkJCXJldHVybiBjcmVhdGVGZWF0dXJlKHNpdGUpOw0KLQ0KLQkJLy8gdGhlIFVSTCBzaG91bGQgcG9pbnQgdG8gYSBkaXJlY3RvcnkNCi0JCXVybCA9IHZhbGlkYXRlKHVybCk7DQotDQotCQl0cnkgew0KLQkJCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcih1cmwpOw0KLQkJCS8vIFBFUkY6IERvIG5vdCBjcmVhdGUgRmVhdHVyZUNvbnRlbnRDb25zdW1lcg0KLQkJCS8vSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyID1uZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50Q29uc3VtZXIoKTsNCi0NCi0JCQlVUkwgbm9uUmVzb2x2ZWRVUkwgPSBjb250ZW50UHJvdmlkZXIuZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKG51bGwpLmFzVVJMKCk7DQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUobm9uUmVzb2x2ZWRVUkwpOw0KLQkJCWZlYXR1cmVTdHJlYW0gPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChyZXNvbHZlZFVSTCkuZ2V0SW5wdXRTdHJlYW0oKTsNCi0NCi0JCQlmZWF0dXJlID0gKFRhcmdldEZlYXR1cmUpIHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmVTdHJlYW0pOw0KLQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCWZlYXR1cmUuc2V0U2l0ZShzaXRlKTsNCi0NCi0JCQlmZWF0dXJlLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCi0JCQkvLyBQRVJGOiBGZWF0dXJlQ29udGVudENvbnN1bWVyDQotCQkJLy9mZWF0dXJlLnNldENvbnRlbnRDb25zdW1lcihjb250ZW50Q29uc3VtZXIpOw0KLQ0KLQkJCWZlYXR1cmUucmVzb2x2ZSh1cmwsIHVybCk7DQotCQkJZmVhdHVyZS5tYXJrUmVhZE9ubHkoKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IGU7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJGZWF0dXJlRmFjdG9yeS5DcmVhdGluZ0Vycm9yIiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCBlKTsJLy8kTk9OLU5MUy0xJA0KLQkJfSBmaW5hbGx5IHsNCi0JCQl0cnkgew0KLQkJCQlpZiAoZmVhdHVyZVN0cmVhbSAhPSBudWxsKQ0KLQkJCQkJZmVhdHVyZVN0cmVhbS5jbG9zZSgpOw0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZmVhdHVyZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIEZlYXR1cmVNb2RlbEZhY3RvcnkjY3JlYXRlRmVhdHVyZU1vZGVsKCkNCi0JICovDQotCXB1YmxpYyBGZWF0dXJlTW9kZWwgY3JlYXRlRmVhdHVyZU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBUYXJnZXRGZWF0dXJlKCk7DQotCX0NCi0NCi0JLyoNCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBmZWF0dXJlIG9uIHRoZSBzaXRlIA0KLQkgKi8NCi0JcHJpdmF0ZSBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCVRhcmdldEZlYXR1cmUgZmVhdHVyZSA9IG51bGw7DQotDQotCQlJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIobnVsbCk7DQotCQlJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb250ZW50Q29uc3VtZXIgPSBuZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50Q29uc3VtZXIoKTsNCi0JCWZlYXR1cmUgPSAoVGFyZ2V0RmVhdHVyZSkgY3JlYXRlRmVhdHVyZU1vZGVsKCk7DQotCQlmZWF0dXJlLnNldFNpdGUoc2l0ZSk7DQotCQlmZWF0dXJlLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCi0JCWZlYXR1cmUuc2V0Q29udGVudENvbnN1bWVyKGNvbnRlbnRDb25zdW1lcik7DQotDQotCQkvLyBkbyBub3QgbWFyayByZWFkIG9ubHkgeWV0Li4uCQ0KLQkJcmV0dXJuIGZlYXR1cmU7DQotCX0NCi0NCi0JLyoNCi0JICogdmFsaWRhdGVzIGEgVVJMIGFzIGEgZGlyZWN0b3J5IFVSTA0KLQkgKi8NCi0JcHJpdmF0ZSBVUkwgdmFsaWRhdGUoVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKHVybCA9PSBudWxsKQ0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkuTnVsbFVSTCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaWYgKCEodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpIHx8IHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpIHx8IHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoRmVhdHVyZS5GRUFUVVJFX1hNTCkpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQl0cnkgew0KLQkJCQlTdHJpbmcgcGF0aCA9IHVybC5nZXRGaWxlKCkgKyAiLyI7IC8vJE5PTi1OTFMtMSQNCi0JCQkJdXJsID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgcGF0aCk7DQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeS5DYW5ub3RDcmVhdGVVUkwiLCB1cmwudG9FeHRlcm5hbEZvcm0oKSksIGUpOwkvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHVybDsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWExZjg5Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5Lio7DQotDQotLyoqDQotICogQ29udGVudCBQcm92aWRlciBvZiBhIEZlYXR1cmUgUGFja2FnZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBGZWF0dXJlQ29udGVudFByb3ZpZGVyIHsNCi0NCi0JcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlIGxvY2FsTWFuaWZlc3QgPSBudWxsOw0KLQlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVGaWxlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzBdOw0KLQlwcml2YXRlIElWZXJpZmllciBqYXJWZXJpZmllciA9IG51bGw7DQotDQotCS8qDQotCSAqIGZpbHRlciBmb3IgZmlsZSB3aXRoIC5qYXINCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZW5hbWVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgew0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgew0KLQkJCXJldHVybiBuYW1lLmVuZHNXaXRoKEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5KQVJfRVhURU5TSU9OKTsNCi0JCX0NCi0JfTsNCi0NCi0JLyoNCi0JICogQ29uc3RydWN0b3IgDQotCSAqLw0KLQlwdWJsaWMgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCi0JCXN1cGVyKHVybCk7DQotCX0NCi0NCi0JLyoNCi0JICogUmV0dXJucyBhIG5ldyB2ZXJpZmllciBmb3IgZWFjaCB0b3AtbGV2ZWwgaW5zdGFsbA0KLQkgKiAoaWYgdGhlIHZlcmlmaWVyIGhhcyBhIHBhcmVudCwgcmV0dXJuIHRoZSB2ZXJpZmllcg0KLQkgKiBvdGhlcndpc2UgcmVpbml0aWFsaXplKQ0KLQkgKi8NCi0JcHVibGljIElWZXJpZmllciBnZXRWZXJpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChqYXJWZXJpZmllciA9PSBudWxsIHx8IGphclZlcmlmaWVyLmdldFBhcmVudCgpID09IG51bGwpIHsNCi0JCQlqYXJWZXJpZmllciA9IG5ldyBKYXJWZXJpZmllcigpOw0KLQkJCXJldHVybiBqYXJWZXJpZmllcjsNCi0JCX0NCi0NCi0JCS8vIHJlLWluaXQgd2lsbCBiZSBkb25lIGlmIHRoZSBwYXJlbnQgY2hhbmdlcw0KLQkJcmV0dXJuIGphclZlcmlmaWVyOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKCkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlIGdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQkvLyBjaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGxvY2FsIGNvcHkgb2YgdGhlIG1hbmlmZXN0DQotCQlpZiAobG9jYWxNYW5pZmVzdCAhPSBudWxsKQ0KLQkJCXJldHVybiBsb2NhbE1hbmlmZXN0Ow0KLQkJQ29udGVudFJlZmVyZW5jZVtdIGZlYXR1cmVBcmNoaXZlUmVmZXJlbmNlID0gZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobW9uaXRvcik7DQotCQlKYXJDb250ZW50UmVmZXJlbmNlIGZlYXR1cmVKYXJSZWZlcmVuY2UgPSBudWxsOw0KLQkJdHJ5IHsNCi0NCi0JCQkvLyBmb3JjZSBmZWF0dXJlIGFyY2hpdmUgdG8gbG9jYWwuDQotCQkJLy8gVGhpcyBjb250ZW50IHByb3ZpZGVyIGFsd2F5cyBhc3N1bWVzIGV4YWN0bHkgMSBhcmNoaXZlIGZpbGUgKGluZGV4IFswXSkJCQ0KLQkJCWZlYXR1cmVKYXJSZWZlcmVuY2UgPSAoSmFyQ29udGVudFJlZmVyZW5jZSkgYXNMb2NhbFJlZmVyZW5jZShmZWF0dXJlQXJjaGl2ZVJlZmVyZW5jZVswXSwgbnVsbCk7DQotCQkJLy8gd2UgbmVlZCB0byB1bnBhY2sgYXJjaGl2ZSBsb2NhbGx5IGZvciBVSSBicm93c2VyIHJlZmVyZW5jZXMgdG8gYmUgcmVzb2x2ZWQgY29ycmVjdGx5DQotCQkJbG9jYWxGZWF0dXJlRmlsZXMgPSBmZWF0dXJlSmFyUmVmZXJlbmNlLnVucGFjayhnZXRXb3JraW5nRGlyZWN0b3J5KCksIG51bGwsIG1vbml0b3IpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IGVycm9yUmV0cmlldmluZyhGZWF0dXJlLkZFQVRVUkVfWE1MLCBmZWF0dXJlSmFyUmVmZXJlbmNlLCBnZXRVUkwoKSwgZSk7IC8vJE5PTi1OTFMtMSQgDQotCQl9DQotDQotCQkvLyBmaW5kIHRoZSBtYW5pZmVzdCBpbiB0aGUgdW5wYWNrZWQgZmVhdHVyZSBmaWxlcw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVGaWxlcy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChsb2NhbEZlYXR1cmVGaWxlc1tpXS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKEZlYXR1cmUuRkVBVFVSRV9YTUwpKSB7DQotCQkJCWxvY2FsTWFuaWZlc3QgPSBsb2NhbEZlYXR1cmVGaWxlc1tpXTsNCi0JCQkJLy8gY2FjaGUgcmVmZXJlbmNlIHRvIG1hbmlmZXN0DQotCQkJCXJldHVybiBsb2NhbE1hbmlmZXN0Ow0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIHRoZSBtYW5pZmVzdCBoYXMgbm90IGJlZW4gZm91bmQNCi0JCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7IEZlYXR1cmUuRkVBVFVSRV9YTUwsIGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCl9Ow0KLQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5Ob01hbmlmZXN0RmlsZSIsIHZhbHVlcyksIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQgDQotDQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRBcmNoaXZlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBnZXRGZWF0dXJlKCkuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uRW50cmllcyA9IGdldEZlYXR1cmUoKS5nZXROb25QbHVnaW5FbnRyaWVzKCk7DQotCQlMaXN0IGxpc3RBbGxDb250ZW50UmVmID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJQ29udGVudFJlZmVyZW5jZVtdIGFsbENvbnRlbnRSZWYgPSBuZXcgQ29udGVudFJlZmVyZW5jZVswXTsNCi0NCi0JCS8vIGZlYXR1cmUNCi0JCWxpc3RBbGxDb250ZW50UmVmLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpKSk7DQotDQotCQkvLyBwbHVnaW5zDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlsaXN0QWxsQ29udGVudFJlZi5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKGVudHJpZXNbaV0sIG1vbml0b3IpKSk7DQotCQl9DQotDQotCQkvLyBub24gcGx1Z2lucw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25FbnRyaWVzLmxlbmd0aDsgaSsrKSB7DQotCQkJbGlzdEFsbENvbnRlbnRSZWYuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhub25FbnRyaWVzW2ldLCBtb25pdG9yKSkpOw0KLQkJfQ0KLQ0KLQkJLy8gdHJhbnNmb3JtIExpc3QgaW4gQXJyYXkNCi0JCWlmIChsaXN0QWxsQ29udGVudFJlZi5zaXplKCkgPiAwKSB7DQotCQkJYWxsQ29udGVudFJlZiA9IG5ldyBDb250ZW50UmVmZXJlbmNlW2xpc3RBbGxDb250ZW50UmVmLnNpemUoKV07DQotCQkJbGlzdEFsbENvbnRlbnRSZWYudG9BcnJheShhbGxDb250ZW50UmVmKTsNCi0JCX0NCi0NCi0JCXJldHVybiBhbGxDb250ZW50UmVmOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQkvLzEgamFyIGZpbGUgPC0+IDEgZmVhdHVyZQ0KLQkJLy8gd2Ugd2lsbCByZXR1cm4gdGhlIEpBUiBmaWxlIA0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsNCi0JCUNvbnRlbnRSZWZlcmVuY2UgY3VycmVudFJlZmVyZW5jZSA9IG51bGw7DQotCQlTdHJpbmcgYXJjaGl2ZUlEID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotCQkJYXJjaGl2ZUlEID0gKGdldEZlYXR1cmUoKSAhPSBudWxsKSA/IGdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSA6ICIiOwkvLyROT04tTkxTLTEkDQotCQkJY3VycmVudFJlZmVyZW5jZSA9IG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKGFyY2hpdmVJRCwgZ2V0VVJMKCkpOw0KLQkJCWN1cnJlbnRSZWZlcmVuY2UgPSBhc0xvY2FsUmVmZXJlbmNlKGN1cnJlbnRSZWZlcmVuY2UsIG1vbml0b3IpOw0KLQkJCXJlZmVyZW5jZXNbMF0gPSBjdXJyZW50UmVmZXJlbmNlOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IGVycm9yUmV0cmlldmluZyhhcmNoaXZlSUQsIGN1cnJlbnRSZWZlcmVuY2UsIGdldEZlYXR1cmUoKS5nZXRVUkwoKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiByZWZlcmVuY2VzOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQkvLyAxIHBsdWdpbiA8LT4gMSBqYXINCi0JCS8vIHdlIHJldHVybiB0aGUgSkFSIGZpbGUJDQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzFdOw0KLQkJU3RyaW5nIGFyY2hpdmVJRCA9IGdldFBhdGhJRChwbHVnaW5FbnRyeSk7DQotCQlJU2l0ZSBzaXRlID0gKGdldEZlYXR1cmUoKSA9PSBudWxsKSA/IG51bGwgOiBnZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpOw0KLQkJSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlciA9IChzaXRlID09IG51bGwpID8gbnVsbCA6IHNpdGUuZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpOw0KLQkJVVJMIHVybCA9IChzaXRlQ29udGVudFByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6IHNpdGVDb250ZW50UHJvdmlkZXIuZ2V0QXJjaGl2ZVJlZmVyZW5jZShhcmNoaXZlSUQpOw0KLQ0KLQkJdHJ5IHsNCi0JCQlyZWZlcmVuY2VzWzBdID0gYXNMb2NhbFJlZmVyZW5jZShuZXcgSmFyQ29udGVudFJlZmVyZW5jZShhcmNoaXZlSUQsIHVybCksIG1vbml0b3IpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IGVycm9yUmV0cmlldmluZyhhcmNoaXZlSUQsIHJlZmVyZW5jZXNbMF0sIGdldEZlYXR1cmUoKS5nZXRVUkwoKSwgZSk7DQotCQl9DQotCQlyZXR1cm4gcmVmZXJlbmNlczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSU5vblBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gYXJjaGl2ZSA9IGZlYXR1cmUvPGlkPl88dmVyPi88ZmlsZT4NCi0JCVN0cmluZyBhcmNoaXZlSUQgPSBTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIICsgKChnZXRGZWF0dXJlKCkgIT0gbnVsbCkgPyBnZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFyY2hpdmVJRCArPSAiLyIgKyBub25QbHVnaW5FbnRyeS5nZXRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMV07DQotCQlDb250ZW50UmVmZXJlbmNlIGN1cnJlbnRSZWZlcmVuY2UgPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQlJU2l0ZSBzaXRlID0gKGdldEZlYXR1cmUoKSA9PSBudWxsKSA/IG51bGwgOiBnZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpOw0KLQkJCUlTaXRlQ29udGVudFByb3ZpZGVyIHNpdGVDb250ZW50UHJvdmlkZXIgPSAoc2l0ZSA9PSBudWxsKSA/IG51bGwgOiBzaXRlLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsNCi0JCQlVUkwgdXJsID0gKHNpdGVDb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogc2l0ZUNvbnRlbnRQcm92aWRlci5nZXRBcmNoaXZlUmVmZXJlbmNlKGFyY2hpdmVJRCk7DQotDQotCQkJY3VycmVudFJlZmVyZW5jZSA9IG5ldyBDb250ZW50UmVmZXJlbmNlKG5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKSwgdXJsKTsNCi0JCQljdXJyZW50UmVmZXJlbmNlID0gYXNMb2NhbFJlZmVyZW5jZShjdXJyZW50UmVmZXJlbmNlLCBtb25pdG9yKTsNCi0JCQlyZWZlcmVuY2VzWzBdID0gY3VycmVudFJlZmVyZW5jZTsNCi0NCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBlcnJvclJldHJpZXZpbmcoYXJjaGl2ZUlELCBjdXJyZW50UmVmZXJlbmNlLCBnZXRGZWF0dXJlKCkuZ2V0VVJMKCksIGUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlZmVyZW5jZXM7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCXJldHVybiBsb2NhbEZlYXR1cmVGaWxlczsgLy8gcmV0dXJuIGNhY2hlZCBmZWF0dXJlIHJlZmVyZW5jZXMNCi0JCS8vIE5vdGU6IGFzc3VtZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIGlzIGFsd2F5cyBjYWxsZWQgZmlyc3QgdG8NCi0JCS8vICAgICAgIGdldCB0aGUgZmVhdHVyZSBtYW5pZmVzdC4gVGhpcyBmb3JjZXMgdGhlIGZlYXR1cmUgZmlsZXMNCi0JCS8vICAgICAgIHRvIGJlIHVucGFja2VkIGFuZCBjYWNoZXMgdGhlIHJlZmVyZW5jZXMNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKHBsdWdpbkVudHJ5LCBtb25pdG9yKTsNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSBwbHVnaW5SZWZlcmVuY2VzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07DQotDQotCQl0cnkgew0KLQkJCWlmIChyZWZlcmVuY2VzWzBdIGluc3RhbmNlb2YgSmFyQ29udGVudFJlZmVyZW5jZSkgew0KLQkJCQlKYXJDb250ZW50UmVmZXJlbmNlIGxvY2FsUmVmID0gKEphckNvbnRlbnRSZWZlcmVuY2UpIGFzTG9jYWxSZWZlcmVuY2UocmVmZXJlbmNlc1swXSwgbW9uaXRvcik7DQotCQkJCXBsdWdpblJlZmVyZW5jZXMgPSBsb2NhbFJlZi5wZWVrKG51bGwsIG1vbml0b3IpOw0KLQkJCX0gZWxzZSB7DQotCQkJCS8vIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc3ViZGlyZWN0b3JpZXMNCi0JCQkJTGlzdCBmaWxlcyA9IGdldEZpbGVzKHJlZmVyZW5jZXNbMF0uYXNGaWxlKCkpOw0KLQkJCQlwbHVnaW5SZWZlcmVuY2VzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbZmlsZXMuc2l6ZSgpXTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5SZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlGaWxlIGN1cnJlbnRGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsNCi0JCQkJCXBsdWdpblJlZmVyZW5jZXNbaV0gPSBuZXcgQ29udGVudFJlZmVyZW5jZShudWxsLCBjdXJyZW50RmlsZS50b1VSTCgpKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvL1syMDg2Nl0gd2UgZGlkIG5vdCBwcmVzZXJ2ZSBleGVjdXRhYmxlIGJpdA0KLQkJCXZhbGlkYXRlUGVybWlzc2lvbnMocGx1Z2luUmVmZXJlbmNlcyk7DQotDQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgZXJyb3JSZXRyaWV2aW5nKHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLCByZWZlcmVuY2VzWzBdLCBnZXRGZWF0dXJlKCkuZ2V0VVJMKCksIGUpOw0KLQkJfQ0KLQkJcmV0dXJuIHBsdWdpblJlZmVyZW5jZXM7DQotCX0NCi0NCi0JLyoNCi0JICogcmV0dXJuIGFsbCB0aGUgZmlsZXMgdW5kZXIgdGhlIGRpcmVjdG9yeQ0KLQkgKi8NCi0JcHJpdmF0ZSBMaXN0IGdldEZpbGVzKEZpbGUgZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotCQlpZiAoIWRpci5pc0RpcmVjdG9yeSgpKQ0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihQb2xpY3kuYmluZCgiRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLkludmFsaWREaXJlY3RvcnkiLCBkaXIuZ2V0UGF0aCgpKSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsNCi0JCWlmIChmaWxlcyAhPSBudWxsKSAvLyBiZSBjYXJlZnVsIHNpbmNlIGl0IGNhbiBiZSBudWxsDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgew0KLQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgew0KLQkJCQkJcmVzdWx0LmFkZEFsbChnZXRGaWxlcyhmaWxlc1tpXSkpOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJcmVzdWx0LmFkZChmaWxlc1tpXSk7DQotCQkJCX0NCi0JCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSBDb3JlRXhjZXB0aW9uIGVycm9yUmV0cmlldmluZyhTdHJpbmcgb2JqLCBDb250ZW50UmVmZXJlbmNlIGFyY2hpdmUsIFVSTCB1cmwsIEV4Y2VwdGlvbiBlKSB7DQotDQotCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyBvYmogfTsNCi0NCi0JCXJldHVybiBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLkVycm9yUmV0cmlldmluZyIsIHZhbHVlcyksIGUpOyAvLyROT04tTkxTLTEkCSAJDQotDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGFja2FnZWRGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkN2RlNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgZm9yIEZlYXR1cmUgUGFja2FnZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVBhY2thZ2VkRmFjdG9yeSBleHRlbmRzIEJhc2VGZWF0dXJlRmFjdG9yeSB7DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVGYWN0b3J5I2NyZWF0ZUZlYXR1cmUoVVJMLElTaXRlLElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShVUkwgdXJsLElTaXRlIHNpdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsNCi0JCUlucHV0U3RyZWFtIGZlYXR1cmVTdHJlYW0gPSBudWxsOw0KLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkNCi0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0JCW1vbml0b3IuYmVnaW5UYXNrKG51bGwsMik7DQotCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkNCi0JCQkJCQ0KLQkJdHJ5IHsJDQotCQkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcih1cmwpOwkNCi0JCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0ID0gY29udGVudFByb3ZpZGVyLmdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShudWxsLypJUHJvZ3Jlc3NNb25pdG9yKi8pOw0KLQkJCWZlYXR1cmVTdHJlYW0gPSBtYW5pZmVzdC5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJCWZlYXR1cmUgPSAoRmVhdHVyZSlwYXJzZUZlYXR1cmUoZmVhdHVyZVN0cmVhbSk7DQotCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQ0KLQkJCS8vIGlmIHRoZXJlIGlzIG5vIHVwZGF0ZSBVUkwgZm9yIHRoZSBGZWF0dXJlDQotCQkJLy8gdXNlIHRoZSBTaXRlIFVSTA0KLQkJCWlmIChmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeSgpPT1udWxsKXsNCi0JCQkJVVJMRW50cnlNb2RlbCBlbnRyeU1vZGVsID0gY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KLQkJCQlVUkwgc2l0ZVVybCA9IHNpdGUuZ2V0VVJMKCk7DQotCQkJCWlmIChzaXRlVXJsIT1udWxsKXsNCi0JCQkJCWVudHJ5TW9kZWwuc2V0VVJMU3RyaW5nKHNpdGVVcmwudG9FeHRlcm5hbEZvcm0oKSk7DQotCQkJCQllbnRyeU1vZGVsLnJlc29sdmUoc2l0ZVVybCxudWxsKTsNCi0JCQkJCWZlYXR1cmUuc2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoZW50cnlNb2RlbCk7DQotCQkJCX0NCi0JCQl9CQ0KLQkJCWZlYXR1cmUuc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOw0KLQkJCWZlYXR1cmUuc2V0U2l0ZShzaXRlKTsJCQkJCQkNCi0JCQlVUkwgYmFzZVVybCA9IG51bGw7DQotCQkJdHJ5IHsNCi0JCQkJYmFzZVVybCA9IG5ldyBVUkwobWFuaWZlc3QuYXNVUkwoKSwiLiIpOyAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBVUkwgdG8gZmVhdHVyZSBkaXJlY3RvcnkgLy8kTk9OLU5MUy0xJA0KLQkJCX0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsJDQotCQkJfQ0KLQkJCWZlYXR1cmUucmVzb2x2ZShiYXNlVXJsLCBiYXNlVXJsKTsNCi0JCQlmZWF0dXJlLm1hcmtSZWFkT25seSgpOwkJCQ0KLQkJfSAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7DQotCQkJdGhyb3cgZTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IA0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJGZWF0dXJlRmFjdG9yeS5DcmVhdGluZ0Vycm9yIiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfWZpbmFsbHkgew0KLQkJCXRyeSB7DQotCQkJCWlmIChmZWF0dXJlU3RyZWFtIT1udWxsKQkNCi0JCQkJCWZlYXR1cmVTdHJlYW0uY2xvc2UoKTsNCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZlYXR1cmU7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGx1Z2luLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzZDg1NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLS8qKgotICogQW4gSVBsdWdpbkVudHJ5IC0gSUZlYXR1cmUgcGFpci4KLSAqIFRoZSBJRmVhdHVyZSBpcyBhIGZlYXR1ZSBvciBhIHBhdGNoIHdpY2ggZGVsaXZlcmVkIHRoZSBwbHVnaW4KLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVQbHVnaW4gewotCXByaXZhdGUgSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5OwotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZTsKLQlwdWJsaWMgRmVhdHVyZVBsdWdpbihJUGx1Z2luRW50cnkgZW50cnksIElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcGx1Z2luRW50cnkgPSBlbnRyeTsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0JcHVibGljIElQbHVnaW5FbnRyeSBnZXRFbnRyeSgpIHsKLQkJcmV0dXJuIHBsdWdpbkVudHJ5OwotCX0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCS8qKgotCSAqIFBsdWdpbnMgYXJlIGVxdWFsIGlmIHRoZWlyIElEcyBhbmQgdmVyc2lvbnMgYXJlIHRoZSBzYW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIEZlYXR1cmVQbHVnaW4pIHsKLQkJCUZlYXR1cmVQbHVnaW4gcCA9IChGZWF0dXJlUGx1Z2luKSBvOwotCQkJcmV0dXJuIGdldEVudHJ5KCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhwLmdldEVudHJ5KCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXRFbnRyeSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5oYXNoQ29kZSgpOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gcGx1Z2luRW50cnkgKyAiIGluICIgKyBmZWF0dXJlOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZVR5cGVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVUeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFkMjlmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZVR5cGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIE1hbmFnZXMgRmVhdHVyZUZhY3RvcnkgZXh0ZW5zaW9uIHBvaW50DQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVUeXBlRmFjdG9yeSB7DQotDQotCXByaXZhdGUgc3RhdGljIEZlYXR1cmVUeXBlRmFjdG9yeSBpbnN0Ow0KLQlwcml2YXRlIE1hcCBmYWN0b3JpZXM7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1QTEVfRVhURU5TSU9OX0lEID0gImZlYXR1cmVUeXBlcyI7CS8vJE5PTi1OTFMtMSQJDQotDQotCS8qDQotCSAqIGhpZGUgY29uc3RydWN0b3INCi0JICovDQotCXByaXZhdGUgRmVhdHVyZVR5cGVGYWN0b3J5KCkgew0KLQl9DQotDQotCS8qDQotCSAqIFNpbmdsZXRvbiBwYXR0ZXJuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVUeXBlRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsNCi0JCWlmIChpbnN0ID09IG51bGwpDQotCQkJaW5zdCA9IG5ldyBGZWF0dXJlVHlwZUZhY3RvcnkoKTsNCi0JCXJldHVybiBpbnN0Ow0KLQl9DQotDQotCS8qDQotCSAqIHJldHVybiB0aGUgZmFjdG9yeSBmb3IgdGhlIGFzc29jaWF0ZWQgdHlwZQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlRmFjdG9yeSBnZXRGYWN0b3J5KFN0cmluZyB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkvLw0KLQkJT2JqZWN0IGluc3RhbmNlID0gZ2V0RmFjdG9yaWVzKCkuZ2V0KHR5cGUpOw0KLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsNCi0JCQlpbnN0YW5jZSA9IGNyZWF0ZUZhY3RvcnlGb3IodHlwZSk7DQotCQkJZ2V0RmFjdG9yaWVzKCkucHV0KHR5cGUsIGluc3RhbmNlKTsNCi0JCX0NCi0JCXJldHVybiAoSUZlYXR1cmVGYWN0b3J5KSBpbnN0YW5jZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBjcmVhdGVzIGEgZmFjdG9yeSBmb3IgdGhlIGFzc29jaWF0ZWQgdHlwZSBhbmQgY2FjaGUgaXQgDQotCSAqLw0KLQlwcml2YXRlIElGZWF0dXJlRmFjdG9yeSBjcmVhdGVGYWN0b3J5Rm9yKFN0cmluZyB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJRmVhdHVyZUZhY3RvcnkgcmVzdWx0ID0gbnVsbDsNCi0NCi0JCVN0cmluZyBwbHVnaW5JRCA9DQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsNCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7DQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9DQotCQkJcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKHBsdWdpbklELCBTSU1QTEVfRVhURU5TSU9OX0lELCB0eXBlKTsNCi0NCi0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCQlQb2xpY3kuYmluZCgiRmVhdHVyZVR5cGVGYWN0b3J5LlVuYWJsZVRvRmluZEZlYXR1cmVGYWN0b3J5IiwgdHlwZSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJCW51bGwpOw0KLQkJfSANCi0NCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbMF07DQotCQlyZXN1bHQgPSAoSUZlYXR1cmVGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CS8vJE5PTi1OTFMtMSQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIE1hcCBnZXRGYWN0b3JpZXMoKSB7DQotCQlpZiAoZmFjdG9yaWVzID09IG51bGwpDQotCQkJZmFjdG9yaWVzID0gbmV3IEhhc2hNYXAoKTsNCi0JCXJldHVybiBmYWN0b3JpZXM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GaWxlRnJhZ21lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmlsZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODI3MDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GaWxlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZUZyYWdtZW50ewotCXByaXZhdGUgRmlsZSBmaWxlOwotCXByaXZhdGUgbG9uZyBieXRlczsKLQlwdWJsaWMgRmlsZUZyYWdtZW50KEZpbGUgZmlsZSwgbG9uZyBzaXplKXsKLQkJdGhpcy5maWxlPWZpbGU7Ci0JCXRoaXMuYnl0ZXM9c2l6ZTsKLQl9Ci0JcHVibGljIEZpbGUgZ2V0RmlsZSgpewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JcHVibGljIGxvbmcgZ2V0U2l6ZSgpewotCQlyZXR1cm4gYnl0ZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmlsZVJlc3BvbnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZpbGVSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWJmMDIxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmlsZVJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlUmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7Ci0KLQlwcm90ZWN0ZWQgVVJMIHVybDsKLQlwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQ7Ci0KLQlwdWJsaWMgRmlsZVJlc3BvbnNlKFVSTCB1cmwpIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHVybC5vcGVuU3RyZWFtKCk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldElucHV0U3RyZWFtKCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgewotCQlyZXR1cm4gSVN0YXR1c0NvZGVzLkhUVFBfT0s7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGF0dXNNZXNzYWdlKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCWlmIChsYXN0TW9kaWZpZWQgPT0gMCkgewotCQkJRmlsZSBmID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpKQotCQkJCWYgPSBuZXcgRmlsZShmLCAic2l0ZS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJbGFzdE1vZGlmaWVkID0gZi5sYXN0TW9kaWZpZWQoKTsKLQkJfQotCQlyZXR1cm4gbGFzdE1vZGlmaWVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRnJhZ21lbnRFbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GcmFnbWVudEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZmFjNzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GcmFnbWVudEVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBmcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgRnJhZ21lbnRFbnRyeSB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luVmVyc2lvbjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOyAKLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQkKLQlwdWJsaWMgRnJhZ21lbnRFbnRyeShTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCXRoaXMucGx1Z2luSWQgPSBpZDsKLQkJdGhpcy5wbHVnaW5WZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHBsdWdpbiB0cmFuc2xhdGFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWctaW4gaWRlbnRpZmllciBmb3IgdGhpcyBlbnRyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwbHVnLWluIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZGVudGlmaWVyKCkgewotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Zy1pbiB2ZXJzaW9uIGZvciB0aGlzIGVudHJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBsdWctaW4gdmVyc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpblZlcnNpb24oKSB7Ci0JCXJldHVybiBwbHVnaW5WZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgbXNnID0gKGdldFBsdWdpbklkZW50aWZpZXIoKSE9bnVsbCk/Z2V0UGx1Z2luSWRlbnRpZmllcigpLnRvU3RyaW5nKCk6IiI7IC8vJE5PTi1OTFMtMSQKLQkJbXNnICs9IGdldFBsdWdpblZlcnNpb24oKSE9bnVsbD8iICIrZ2V0UGx1Z2luVmVyc2lvbigpLnRvU3RyaW5nKCk6IiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gbXNnOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0h0dHBSZXNwb25zZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9IdHRwUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhYzExOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0h0dHBSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1wdWJsaWMgY2xhc3MgSHR0cFJlc3BvbnNlIGltcGxlbWVudHMgUmVzcG9uc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUE9MTElOR19JTlRFUlZBTCA9IDIwMDsKLQlwcm90ZWN0ZWQgVVJMIHVybDsKLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW47Ci0JcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQlwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQ7Ci0JcHJvdGVjdGVkIGxvbmcgb2Zmc2V0OwotCi0JcHVibGljIEh0dHBSZXNwb25zZShVUkwgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbiA9PSBudWxsICYmIHVybCAhPSBudWxsKSB7Ci0JCQljb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQlpZiAob2Zmc2V0ID4gMCkKLQkJCQljb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiUmFuZ2UiLCAiYnl0ZXM9IiArIG9mZnNldCArICItIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlpbiA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCWNoZWNrT2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGluOwotCX0KLQkvKioKLQkgKiBAc2VlIFJlc3BvbnNlI2dldElucHV0U3RyZWFtKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGluID09IG51bGwgJiYgdXJsICE9IG51bGwpIHsKLQkJCWNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCWlmIChvZmZzZXQgPiAwKQotCQkJCWNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJSYW5nZSIsICJieXRlcz0iICsgb2Zmc2V0ICsgIi0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCXRoaXMuaW4gPQotCQkJCQlvcGVuU3RyZWFtV2l0aENhbmNlbCgKLQkJCQkJCShIdHRwVVJMQ29ubmVjdGlvbikgY29ubmVjdGlvbiwKLQkJCQkJCW1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmluID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJfQotCQkJLy8gdGhpcyBjYW4gYWxzbyBiZSBydW4gaW5zaWRlIGEgbW9uaXRvcmluZyB0aHJlYWQsIGJ1dCBpdCBpcyBzYWZlCi0JCQkvLyB0bwotCQkJLy8ganVzdCBjYWxsIGl0IG5vdywgaWYgdGhlIGlucHV0IHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIG9idGFpbmVkCi0JCQljaGVja09mZnNldCgpOwotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0aGlzLmxhc3RNb2RpZmllZCA9IGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7Ci0JCWlmIChjb25uZWN0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gY29ubmVjdGlvbi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKLQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChIdHRwVVJMQ29ubmVjdGlvbikgY29ubmVjdGlvbikuZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBJU3RhdHVzQ29kZXMuSFRUUF9PSzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKSB7Ci0JCWlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm5lY3Rpb24pLmdldFJlc3BvbnNlTWVzc2FnZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCWlmIChsYXN0TW9kaWZpZWQgPT0gMCkgewotCQkJaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQljb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCWlmIChjb25uZWN0aW9uICE9IG51bGwpCi0JCQkJbGFzdE1vZGlmaWVkID0gY29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJfQotCQlyZXR1cm4gbGFzdE1vZGlmaWVkOwotCX0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gb3BlblN0cmVhbVdpdGhDYW5jZWwoCi0JCUh0dHBVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb24sCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQ29ubmVjdGlvblRocmVhZE1hbmFnZXIuU3RyZWFtUnVubmFibGUgcnVubmFibGUgPQotCQkJbmV3IENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLlN0cmVhbVJ1bm5hYmxlKHVybENvbm5lY3Rpb24pOwotCQlUaHJlYWQgdCA9Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuY3JlYXRlVGhyZWFkKAotCQkJCXJ1bm5hYmxlKTsKLQkJdC5zdGFydCgpOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb3IgKDs7KSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJ1bm5hYmxlLmRpc2Nvbm5lY3QoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChydW5uYWJsZS5nZXRJbnB1dFN0cmVhbSgpICE9IG51bGwpIHsKLQkJCQkJaXMgPSBydW5uYWJsZS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJ1bm5hYmxlLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJaWYgKHJ1bm5hYmxlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pCi0JCQkJCQl0aHJvdyAoSU9FeGNlcHRpb24pIHJ1bm5hYmxlLmdldEV4Y2VwdGlvbigpOwotCQkJCQllbHNlCi0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkKLQkJCQkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssCi0JCQkJCQkJCXJ1bm5hYmxlLmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSwgcnVubmFibGUKLQkJCQkJCQkJCQkuZ2V0RXhjZXB0aW9uKCkpKTsKLQkJCQl9Ci0JCQkJdC5qb2luKFBPTExJTkdfSU5URVJWQUwpOwotCQkJfQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGlzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQobG9uZyBvZmZzZXQpIHsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCXByaXZhdGUgdm9pZCBjaGVja09mZnNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChvZmZzZXQgPT0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHJhbmdlID0gY29ubmVjdGlvbi5nZXRIZWFkZXJGaWVsZCgiQ29udGVudC1SYW5nZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJDb250ZW50LVJhbmdlPSIgKyByYW5nZSk7Ci0JCWlmIChyYW5nZSA9PSBudWxsKSB7Ci0JCQkvL1N5c3RlbS5lcnIucHJpbnRsbigiU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgcmFuZ2VzIik7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oUG9saWN5LmJpbmQoIkh0dHBSZXNwb25zZS5yYW5nZUV4cGVjdGVkIikpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoIXJhbmdlLnN0YXJ0c1dpdGgoImJ5dGVzICIgKyBvZmZzZXQgKyAiLSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciByZXR1cm5lZCB3cm9uZyByYW5nZSIpOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJIdHRwUmVzcG9uc2Uud3JvbmdSYW5nZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MThhMTdkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVNpdGVDb250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotIAotIC8qKgotICAqIEEgc2l0ZSBjb250ZW50IGNvbnN1bWVyIG1hbmFnZXMgdGhlIHN0b3JhZ2Ugb3IgYXJjaGl2ZXMsIHBsdWdpbnMgYW5kCi0gICogZmVhdHVyZSBpbnNpZGUgYW4gPGNvZGU+IElTaXRlPC9jb2RlPgotICAqLwotIAotcHVibGljIGludGVyZmFjZSBJU2l0ZUNvbnRlbnRDb25zdW1lciB7Ci0KLQkvKioKLQkgKiBTdG9yZXMgYSBjb250ZW50IHJlZmVyZW5jZSBpbnRvIHRoZSBTaXRlQ29udGVudENvbnN1bWVyCi0JICogQHBhcmFtIGNvbnRlbnRSZWZlcmVuY2UgdGhlIGNvbnRlbnQgcmVmZXJlbmNlIHRvIHN0b3JlCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHN0b3JpbmcgdGhlIGNvbnRlbnQgcmVmZXJlbmNlCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVucyBhIE5vbiBwbHVnaW4gRW50cnkgZm9yIHN0b3JhZ2UKLQkgKiBAcmV0dXJuIHRoZSBuZXcgRmVhdHVyZUNvbnRlbnRDb25zdW1lciBmb3IgdGhpcyA8Y29kZT5JTm9uUGx1Z2luRW50cnk8L2NvZGU+Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVucyBpcyBkb25lIG9uIGEgRmVhdHVyZUNvbnRlbnRDb25zdW1lciBwYXJlbnQgb3RoZXIgdGhhbiBhbiBJRmVhdHVyZS4KLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBJQ29udGVudENvbnN1bWVyIG9wZW4oSU5vblBsdWdpbkVudHJ5IG5vblBsdWdpbkVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIG9wZW5zIGEgTm9uIHBsdWdpbiBFbnRyeSBmb3Igc3RvcmFnZQotCSAqIEByZXR1cm4gdGhlIG5ldyBGZWF0dXJlQ29udGVudENvbnN1bWVyIGZvciB0aGlzIDxjb2RlPklQbHVnaW5FbnRyeTwvY29kZT4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIG9wZW5zIGlzIGRvbmUgb24gYSBGZWF0dXJlQ29udGVudENvbnN1bWVyIHBhcmVudCBvdGhlciB0aGFuIGFuIElGZWF0dXJlLgotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIGNsb3NlcyB0aGUgb3BlbmVkIFNpdGVDb250ZW50Q29uc3VtZXIKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIDsJCi0JCi0KLQkvKioKLQkgKiBhYm9ydHMgdGhlIG9wZW5lZCBTaXRlQ29udGVudENvbnN1bWVyCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm9ydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwkJCi0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JU3RhdHVzQ29kZXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVN0YXR1c0NvZGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODJkN2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JU3RhdHVzQ29kZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLS8qKgotICogSFRUUCBzdGF0dXMgY29kZXMuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gCi0gKiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIAotICogYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgCi0gKiBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXR1c0NvZGVzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0NPTlRJTlVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfU1dJVENISU5HX1BST1RPQ09MUyA9IDEwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX09LID0gMjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfQ1JFQVRFRCA9IDIwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0FDQ0VQVEVEID0gMjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04gPSAyMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9OT19DT05URU5UID0gMjA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUkVTRVRfQ09OVEVOVCA9IDIwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1BBUlRJQUxfQ09OVEVOVCA9IDIwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX01VTFRJUExFX0NIT0lDRVMgPSAzMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9NT1ZFRF9QRVJNQU5FTlRMWSA9IDMwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX01PVkVEX1RFTVBPUkFSSUxZID0gMzAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfU0VFX09USEVSID0gMzAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTk9UX01PRElGSUVEID0gMzA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfVVNFX1BST1hZID0gMzA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfVEVNUE9SQVJZX1JFRElSRUNUID0gMzA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfQkFEX1JFUVVFU1QgPSA0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9VTkFVVEhPUklaRUQgPSA0MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QQVlNRU5UX1JFUVVJUkVEID0gNDAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfRk9SQklEREVOID0gNDAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTk9UX0ZPVU5EID0gNDA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTUVUSE9EX05PVF9BTExPV0VEID0gNDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTk9UX0FDQ0VQVEFCTEUgPSA0MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCA9IDQwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1JFUVVFU1RfVElNRU9VVCA9IDQwODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0NPTkZMSUNUID0gNDA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfR09ORSA9IDQxMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0xFTkdUSF9SRVFVSVJFRCA9IDQxMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1BSRUNPTkRJVElPTl9GQUlMRUQgPSA0MTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9SRVFVRVNUX1RPT19MT05HID0gNDEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUkVRVUVTVF9VUklfVE9PX0xPTkcgPSA0MTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9VTlNVUFBPUlRFRF9NRURJQV9UWVBFID0gNDE1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSA9IDQxNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0VYUEVDVEFUSU9OX0ZBSUxFRCA9IDQxNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiA9IDUwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX05PVF9JTVBMRU1FTlRFRCA9IDUwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0JBRF9HQVRFV0FZID0gNTAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfU0VSVklDRV9VTkFWQUlMQUJMRSA9IDUwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0dBVEVXQVlfVElNRU9VVCA9IDUwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0hUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEID0gNTA1OwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JV3JpdGFibGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVdyaXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjNkODQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JV3JpdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotDQotLyoqDQotICogQ2FsbGVkIHdoZW4gd2Ugd2FudCB0aGUgbW9kZWwgdG8gcGVyc2lzdCBhcyBYTUwNCi0gKi8NCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElXcml0YWJsZSB7DQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkRFTlQgPSAzOw0KLQ0KLQl2b2lkIHdyaXRlKGludCBpbmRlbnQsIFByaW50V3JpdGVyIHcpOw0KLQ0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxDb25maWd1cmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZmU5N2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuKjsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7DQotDQotLyoqDQotICogTWFuYWdlcyBDb25maWd1cmVkU2l0ZXMNCi0gKg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsQ29uZmlndXJhdGlvbiBleHRlbmRzIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaW1wbGVtZW50cyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gew0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luZG93cyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnN0YXJ0c1dpdGgoIldpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JcHJpdmF0ZSBMaXN0ZW5lcnNMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lcnNMaXN0KCk7DQotDQotCS8qDQotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IuDQotCSAqLw0KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7DQotCX0NCi0NCi0JLyoNCi0JICogQ29weSBjb25zdHJ1Y3RvciANCi0JICogQHNpbmNlIDMuMA0KLQkgKi8NCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQkJdGhpcyhjb25maWcsIG51bGwsIG51bGwpOw0KLQl9DQotCQ0KLQkvKg0KLQkgKiBjb3B5IGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb24oSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywgVVJMIG5ld0xvY2F0aW9uLCBTdHJpbmcgbGFiZWwpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJLy8gc2V0IGN1cnJlbnQgZGF0ZSBhbmQgdGltZWxpbmUgYXMgY2FsbGVyIGNhbiBjYWxsIHNldERhdGUgaWYgdGhlDQotCQkvLyBkYXRlIG9uIHRoZSBVUkwgc3RyaW5nIGhhcyB0byBiZSB0aGUgc2FtZQ0KLQkJRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOw0KLQkJc2V0Q3JlYXRpb25EYXRlKG5vdyk7DQotCQlzZXRDdXJyZW50KGZhbHNlKTsNCi0JCQ0KLQkJaWYgKG5ld0xvY2F0aW9uID09IG51bGwpIHsNCi0JCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKFNpdGVMb2NhbC5DT05GSUdfRklMRSwgbm93KTsNCi0JCQluZXdMb2NhdGlvbiA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCksIG5ld0ZpbGVOYW1lLCBudWxsKTsNCi0JCX0NCi0JCXNldExvY2F0aW9uVVJMU3RyaW5nKG5ld0xvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJDQotCQlpZiAobGFiZWwgPT0gbnVsbCkNCi0JCQlsYWJlbCA9IFV0aWxpdGllcy5mb3JtYXQobm93KTsNCi0JCXNldExhYmVsKGxhYmVsKTsNCi0NCi0JCS8vIGRvIG5vdCBjb3B5IGxpc3Qgb2YgbGlzdGVuZXJzIG5vciBhY3Rpdml0aWVzDQotCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgc2l0ZUNvbmZpZ3VyYXRpb24gb2JqZWN0DQotCQlpZiAoY29uZmlnICE9IG51bGwpIHsNCi0JCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQkJaWYgKGNzaXRlcyAhPSBudWxsKSB7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gbmV3IENvbmZpZ3VyZWRTaXRlKGNzaXRlc1tpXSk7DQotCQkJCQlhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKGNvbmZpZ1NpdGUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmVzb2x2ZShuZXdMb2NhdGlvbiwgbnVsbCk7DQotCQkvLyBubyBuZWVkIHRvIHBhcnNlIGZpbGUsIGFsbCBkYXRhIGFyZSBpbml0aWFsaXplZA0KLQkJaW5pdGlhbGl6ZWQgPSB0cnVlOw0KLQl9DQotCQ0KLQ0KLQkvKg0KLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNvbmZpZ3VyZWQgc2l0ZXMgb3IgYW4gZW1wdHkgYXJyYXkNCi0JICovDQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGVbXSBnZXRDb25maWd1cmVkU2l0ZXMoKSB7DQotCQlDb25maWd1cmVkU2l0ZU1vZGVsW10gcmVzdWx0ID0gZ2V0Q29uZmlndXJhdGlvblNpdGVzTW9kZWwoKTsNCi0JCWlmIChyZXN1bHQubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJQ29uZmlndXJlZFNpdGVbMF07DQotCQllbHNlDQotCQkJcmV0dXJuIChJQ29uZmlndXJlZFNpdGVbXSkgcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2l0ZSBwb2xpY3kNCi0JICovDQotCXByaXZhdGUgaW50IGdldERlZmF1bHRQb2xpY3koKSB7DQotCQlyZXR1cm4gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREU7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBDb25maWd1cmF0aW9uIFNpdGUgYW5kIGEgbmV3IFNpdGUNCi0JICogVGhlIHBvbGljeSBpcyBmcm9tIDxjb2RlPiBvcmcuZWNsaXBzZS5jb3JlLmJvb3QuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjwvY29kZT4NCi0JICovDQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgY3JlYXRlQ29uZmlndXJlZFNpdGUoRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlpZiAoIWZpbGUuZ2V0TmFtZSgpLmVxdWFscygiZWNsaXBzZSIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlmaWxlID0gbmV3IEZpbGUoZmlsZSwgImVjbGlwc2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZpbGUubWtkaXJzKCk7DQotCQl9DQotCQkNCi0JCWlmIChpc0R1cGxpY2F0ZVNpdGUoZmlsZSkpDQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxDb25maWd1cmF0aW9uLmxvY2F0aW9uLmV4aXN0cyIsIGZpbGUuZ2V0UGF0aCgpKSxudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQkJSVNpdGUgc2l0ZSA9IEludGVybmFsU2l0ZU1hbmFnZXIuY3JlYXRlU2l0ZShmaWxlKTsNCi0NCi0JCS8vY3JlYXRlIGEgY29uZmlnIHNpdGUgYXJvdW5kIHRoZSBzaXRlDQotCQkvLyBldmVuIGlmIHRoZSBzaXRlID09IG51bGwNCi0JCUJhc2VTaXRlTG9jYWxGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKTsNCi0JCUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgoU2l0ZU1vZGVsKSBzaXRlLCBnZXREZWZhdWx0UG9saWN5KCkpOw0KLQ0KLQkJaWYgKGNvbmZpZ1NpdGUuaXNOYXRpdmVseUxpbmtlZCgpKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxDb25maWd1cmF0aW9uLkFscmVhZHlOYXRpdmVseUxpbmtlZCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlpZiAoY29uZmlnU2l0ZS5pc1Byb2R1Y3RTaXRlKCkpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW5zdGFsbENvbmZpZ3VyYXRpb24uQWxyZWFkeVByb2R1Y3RTaXRlIiksIG51bGwpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCWlmIChzaXRlICE9IG51bGwpIHsNCi0JCQljb25maWdTaXRlLnNldFBsYXRmb3JtVVJMU3RyaW5nKHNpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7DQotDQotCQkJLy8gb2J0YWluIHRoZSBsaXN0IG9mIHBsdWdpbnMNCi0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOw0KLQkJCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY29uZmlndXJhdGlvblBvbGljeSA9IGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOw0KLQkJCVN0cmluZ1tdIHBsdWdpblBhdGggPSBuZXcgU3RyaW5nWzBdOw0KLQkJCWlmIChjb25maWd1cmF0aW9uUG9saWN5LmdldFBvbGljeSgpID09IElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKQ0KLQkJCQlwbHVnaW5QYXRoID0gY29uZmlndXJhdGlvblBvbGljeS5nZXRQbHVnaW5QYXRoKHNpdGUpOw0KLQ0KLQkJCS8vIGNyZWF0ZSBuZXcgU2l0ZSBpbiBjb25maWd1cmF0aW9uDQotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeSBzaXRlUG9saWN5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZVBvbGljeShjb25maWd1cmF0aW9uUG9saWN5LmdldFBvbGljeSgpLCBwbHVnaW5QYXRoKTsNCi0NCi0JCQkvLyBjaGFuZ2UgcnVudGltZQ0KLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBzaXRlRW50cnkgPSBydW50aW1lQ29uZmlndXJhdGlvbi5jcmVhdGVTaXRlRW50cnkoc2l0ZS5nZXRVUkwoKSwgc2l0ZVBvbGljeSk7DQotCQkJcnVudGltZUNvbmZpZ3VyYXRpb24uY29uZmlndXJlU2l0ZShzaXRlRW50cnkpOw0KLQ0KLQkJCS8vIGlmIHRoZSBwcml2YXRyZSBtYXJrZXIgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGNyZWF0ZSBpdA0KLQkJCWNvbmZpZ1NpdGUuY3JlYXRlUHJpdmF0ZVNpdGVNYXJrZXIoKTsNCi0JCX0NCi0JCS8vIGNvbmZpZ3VyZSBhbGwgZmVhdHVyZXMgYXMgZW5hYmxlDQotCQljb25maWd1cmUoY29uZmlnU2l0ZSk7DQotCQkNCi0JCXJldHVybiBjb25maWdTaXRlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgQ29uZmlndXJhdGlvbiBTaXRlIGFuZCBhIG5ldyBTaXRlIGFzIGEgcHJpdmF0ZSBsaW5rIHNpdGUNCi0JICogVGhlIHBvbGljeSBpcyBmcm9tIDxjb2RlPiBvcmcuZWNsaXBzZS5jb3JlLmJvb3QuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjwvY29kZT4NCi0JICovDQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgY3JlYXRlTGlua2VkQ29uZmlndXJlZFNpdGUoRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7DQotLy8JCWlmIChpc0R1cGxpY2F0ZVNpdGUoZmlsZSkpDQotLy8JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihVcGRhdGVVdGlscy5nZXRGb3JtYXR0ZWRNZXNzYWdlKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5sb2NhdGlvbi5leGlzdHMiLCBmaWxlLmdldFBhdGgoKSksbnVsbCk7DQotLy8JCQ0KLS8vCQlJU2l0ZSBzaXRlID0gSW50ZXJuYWxTaXRlTWFuYWdlci5jcmVhdGVTaXRlKGZpbGUpOw0KLS8vDQotLy8JCS8vY3JlYXRlIGEgY29uZmlnIHNpdGUgYXJvdW5kIHRoZSBzaXRlDQotLy8JCS8vIGV2ZW4gaWYgdGhlIHNpdGUgPT0gbnVsbA0KLS8vCQlCYXNlU2l0ZUxvY2FsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCk7DQotLy8JCUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgoU2l0ZU1vZGVsKSBzaXRlLCBnZXREZWZhdWx0UG9saWN5KCkpOw0KLS8vDQotLy8JCWlmICghY29uZmlnU2l0ZS5pc0V4dGVuc2lvblNpdGUoKSkgew0KLS8vCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5Ob3RBbkV4dGVuc2lvblNpdGUiKTsNCi0vLwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKG1zZywgbnVsbCk7DQotLy8JCX0NCi0vLw0KLS8vCQlpZiAoY29uZmlnU2l0ZS5pc05hdGl2ZWx5TGlua2VkKCkpIHsNCi0vLwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5BbHJlYWR5TmF0aXZlbHlMaW5rZWQiLCBudWxsKTsNCi0vLwkJfQ0KLS8vDQotLy8JCWlmIChzaXRlICE9IG51bGwpIHsNCi0vLwkJCWNvbmZpZ1NpdGUuc2V0UGxhdGZvcm1VUkxTdHJpbmcoc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsNCi0vLw0KLS8vCQkJLy8gb2J0YWluIHRoZSBsaXN0IG9mIHBsdWdpbnMNCi0vLwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7DQotLy8JCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ3VyYXRpb25Qb2xpY3kgPSBjb25maWdTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsNCi0vLwkJCVN0cmluZ1tdIHBsdWdpblBhdGggPSBuZXcgU3RyaW5nWzBdOw0KLS8vCQkJaWYgKGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpDQotLy8JCQkJcGx1Z2luUGF0aCA9IGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UGx1Z2luUGF0aChzaXRlKTsNCi0vLw0KLS8vCQkJLy8gY3JlYXRlIG5ldyBTaXRlIGluIGNvbmZpZ3VyYXRpb24NCi0vLwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kgc2l0ZVBvbGljeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZVNpdGVQb2xpY3koY29uZmlndXJhdGlvblBvbGljeS5nZXRQb2xpY3koKSwgcGx1Z2luUGF0aCk7DQotLy8NCi0vLwkJCS8vIGNoYW5nZSBydW50aW1lDQotLy8JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnkgc2l0ZUVudHJ5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZUVudHJ5KHNpdGUuZ2V0VVJMKCksIHNpdGVQb2xpY3kpOw0KLS8vCQkJcnVudGltZUNvbmZpZ3VyYXRpb24uY29uZmlndXJlU2l0ZShzaXRlRW50cnkpOw0KLS8vDQotLy8JCX0NCi0vLw0KLS8vCQkvLyBjb25maWd1cmUgYWxsIGZlYXR1cmVzIGFzIGVuYWJsZQ0KLS8vCQljb25maWd1cmUoY29uZmlnU2l0ZSk7DQotLy8NCi0vLwkJcmV0dXJuIGNvbmZpZ1NpdGU7DQotCX0NCi0NCi0JLyoNCi0JICpDb25maWd1cmUgYWxsIGZlYXR1cmVzIGFzIEVuYWJsZSBDaGVjayB3ZSBvbmx5IGVuYWJsZSBoaWdoZXN0IHZlcnNpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCBjb25maWd1cmUoQ29uZmlndXJlZFNpdGUgbGlua2VkU2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSVNpdGUgc2l0ZSA9IGxpbmtlZFNpdGUuZ2V0U2l0ZSgpOw0KLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gbmV3RmVhdHVyZXNSZWYgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0ZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7DQotCQkJLy8gVFJBQ0UNCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgew0KLQkJCQlTdHJpbmcgcmVjb25jaWxpYXRpb25UeXBlID0gImVuYWJsZSAob3B0aW1pc3RpYykiOyAvLyROT04tTkxTLTEkDQotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIk5ldyBMaW5rZWQgU2l0ZTpOZXcgRmVhdHVyZTogIiArIG5ld0ZlYXR1cmVzUmVmW2ldLmdldFVSTCgpICsgIiBhcyAiICsgcmVjb25jaWxpYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJfQ0KLQkJCUNvbmZpZ3VyYXRpb25Qb2xpY3kgcG9saWN5ID0gbGlua2VkU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCk7DQotCQkJcG9saWN5LmNvbmZpZ3VyZShuZXdGZWF0dXJlc1JlZltpXSwgdHJ1ZSwgZmFsc2UpOw0KLQkJfQ0KLQkJU2l0ZVJlY29uY2lsZXIuY2hlY2tDb25maWd1cmVkRmVhdHVyZXMobGlua2VkU2l0ZSk7DQotCX0NCi0NCi0JLyoNCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRTaXRlKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7DQotCQlpZiAoIWlzQ3VycmVudCgpICYmIGlzUmVhZE9ubHkoKSkNCi0JCQlyZXR1cm47DQotDQotCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYWN0aXZpdHkgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KElBY3Rpdml0eS5BQ1RJT05fU0lURV9JTlNUQUxMKTsNCi0JCWFjdGl2aXR5LnNldExhYmVsKHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJYWN0aXZpdHkuc2V0RGF0ZShuZXcgRGF0ZSgpKTsNCi0JCUNvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlnU2l0ZU1vZGVsID0gKENvbmZpZ3VyZWRTaXRlTW9kZWwpIHNpdGU7DQotCQlhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKGNvbmZpZ1NpdGVNb2RlbCk7DQotCQljb25maWdTaXRlTW9kZWwuc2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCh0aGlzKTsNCi0NCi0JCS8vIG5vdGlmeSBsaXN0ZW5lcnMNCi0JCU9iamVjdFtdIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25MaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsNCi0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcikgY29uZmlndXJhdGlvbkxpc3RlbmVyc1tpXSk7DQotCQkJbGlzdGVuZXIuaW5zdGFsbFNpdGVBZGRlZChzaXRlKTsNCi0JCX0NCi0NCi0JCS8vIGV2ZXJ5dGhpbmcgZG9uZSBvaw0KLQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOw0KLQkJdGhpcy5hZGRBY3Rpdml0eShhY3Rpdml0eSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIE1ldGhvZCBhZGRBY3Rpdml0eS4NCi0JICogQHBhcmFtIGFjdGl2aXR5DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpdml0eShJQWN0aXZpdHkgYWN0aXZpdHkpIHsNCi0JCWFkZEFjdGl2aXR5TW9kZWwoKENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsKWFjdGl2aXR5KTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJlZFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsNCi0JCWlmICghaXNDdXJyZW50KCkgJiYgaXNSZWFkT25seSgpKQ0KLQkJCXJldHVybjsNCi0NCi0JCWlmIChyZW1vdmVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKChDb25maWd1cmVkU2l0ZU1vZGVsKSBzaXRlKSkgew0KLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMNCi0JCQlPYmplY3RbXSBjb25maWd1cmF0aW9uTGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbkxpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcikgY29uZmlndXJhdGlvbkxpc3RlbmVyc1tpXSk7DQotCQkJCWxpc3RlbmVyLmluc3RhbGxTaXRlUmVtb3ZlZChzaXRlKTsNCi0JCQl9DQotCQkJDQotCQkJLy9hY3Rpdml0eQ0KLQkJCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhY3Rpdml0eSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9TSVRFX1JFTU9WRSk7DQotCQkJYWN0aXZpdHkuc2V0TGFiZWwoc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7DQotCQkJYWN0aXZpdHkuc2V0RGF0ZShuZXcgRGF0ZSgpKTsNCi0JCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19PSyk7DQotCQkJdGhpcy5hZGRBY3Rpdml0eShhY3Rpdml0eSk7DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24jYWRkSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIoSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIoSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgew0KLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOw0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUluc3RhbGxDb25maWd1cmF0aW9uI3JlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsNCi0JCX0NCi0JfQ0KLQ0KLQ0KLQkvKg0KLQkgKiBEZWxldGVzIHRoZSBjb25maWd1cmF0aW9uIGZyb20gaXRzIFVSTC9sb2NhdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgew0KLQkJLy8gc2F2ZSB0aGUgY29uZmlndXJhdGlvbg0KLQkJaWYgKCJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKGdldFVSTCgpLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkvLyB0aGUgbG9jYXRpb24gcG9pbnRzIHRvIGEgZmlsZQ0KLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldFVSTCgpLmdldEZpbGUoKSk7DQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBTYXZlcyB0aGUgY29uZmlndXJhdGlvbiBpbnRvIGl0cyBVUkwvbG9jYXRpb24NCi0JICogYW5kIGNoYW5nZXMgdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uDQotCSAqIFRoZSBydW50aW1lIHNpdGUgZW50cmllcyBmcm9tIHBsYXRmb3JtLnhtbCBhcmUgdXBkYXRlZCBhcyByZXF1aXJlZA0KLQkgKiAoY2Fubm90IHJlY3JlYXRlIHRoZXNlIGJlY2F1c2UgbXVzdCBwcmVzZXJ2ZSBvdGhlciBydW50aW1lIHN0YXRlKSBbMTg1MjBdDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiByZXN0YXJ0IGlzIG5lZWRlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gc2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCQ0KLQkJLy8gV3JpdGUgaW5mbyAgaW50byBwbGF0Zm9ybSBmb3IgdGhlIG5leHQgcnVudGltZQ0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsNCi0JCUNvbmZpZ3VyZWRTaXRlTW9kZWxbXSBjb25maWd1cmF0aW9uU2l0ZXMgPSBnZXRDb25maWd1cmF0aW9uU2l0ZXNNb2RlbCgpOw0KLQ0KLQkJLy8gY2xlYW4gY29uZmlndXJlZCBFbnRyaWVzIGZyb20gcGxhdGZvcm0gcnVudGltZQ0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JRmVhdHVyZUVudHJ5W10gY29uZmlndXJlZEZlYXR1cmVFbnRyaWVzID0gcnVudGltZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZEZlYXR1cmVFbnRyaWVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyZWRGZWF0dXJlRW50cmllcy5sZW5ndGg7IGkrKykgew0KLQkJCXJ1bnRpbWVDb25maWd1cmF0aW9uLnVuY29uZmlndXJlRmVhdHVyZUVudHJ5KGNvbmZpZ3VyZWRGZWF0dXJlRW50cmllc1tpXSk7DQotCQl9DQotDQotCQkvLyBbMTk5NThdIHJlbWVtYmVyIHNpdGVzIGN1cnJlbnRseSBjb25maWd1cmVkIGJ5IHJ1bnRpbWUgKHVzZQ0KLQkJLy8gdGVtcCBjb25maWd1cmF0aW9uIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmFpZ2h0IGxpc3QgdG8gZW5zdXJlDQotCQkvLyBjb3JyZWN0IGxvb2t1cCkNCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gdGVtcENvbmZpZyA9IG51bGw7DQotCQl0cnkgew0KLQkJCXRlbXBDb25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24obnVsbCk7DQotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5W10gdG1wU2l0ZXMgPSBydW50aW1lQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRtcFNpdGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJCXRlbXBDb25maWcuY29uZmlndXJlU2l0ZSh0bXBTaXRlc1tpXSk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCS8vIGFzc3VtZSBubyBjdXJyZW50bHkgY29uZmlndXJlZCBzaXRlcw0KLQkJfQ0KLQ0KLQkJLy9jaGVjayBzaXRlcw0KLQkJY2hlY2tTaXRlcyhjb25maWd1cmF0aW9uU2l0ZXMsIHJ1bnRpbWVDb25maWd1cmF0aW9uKTsNCi0NCi0JCS8vIFNhdmUgdGhlIHBsdWdpbiBwYXRoLCBwcmltYXJ5IGZlYXR1cmUgYW5kIHBsYXRmb3JtDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25TaXRlcy5sZW5ndGg7IGkrKykgew0KLQkJCUNvbmZpZ3VyZWRTaXRlIGNTaXRlID0gKChDb25maWd1cmVkU2l0ZSkgY29uZmlndXJhdGlvblNpdGVzW2ldKTsNCi0JCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ3VyYXRpb25Qb2xpY3kgPSBjU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCk7DQotDQotCQkJc2F2ZVBsdWdpblBhdGgoY1NpdGUsIHJ1bnRpbWVDb25maWd1cmF0aW9uLCB0ZW1wQ29uZmlnKTsNCi0NCi0JCQkvLyBJRiBwcmltYXJ5IGZlYXR1cmUgVVJMIG9yIHBsYXRmb3JtIGZlYXR1cmUgVVJMIHRoYXQgd2UgbmVlZCB0byBwYXNzIHRvIHJ1bnRpbWUgY29uZmlnDQotCQkJLy8gaXMgcGFydCBvZiBwbGF0Zm9ybTpiYXNlOiwgd3JpdGUgaXQgYXMgcGxhdGZvcm06YmFzZTogVVJMDQotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkRmVhdHVyZXNSZWYgPSBjb25maWd1cmF0aW9uUG9saWN5LmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlndXJlZEZlYXR1cmVzUmVmLmxlbmd0aDsgaisrKSB7DQotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOw0KLQkJCQl0cnkgew0KLQkJCQkJZmVhdHVyZSA9IGNvbmZpZ3VyZWRGZWF0dXJlc1JlZltqXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQkJfQ0KLQkJCQlzYXZlRmVhdHVyZUVudHJ5KGNTaXRlLCBmZWF0dXJlLCBydW50aW1lQ29uZmlndXJhdGlvbik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gWzE5OTU4XSByZW1vdmUgYW55IGV4dHJhIHNpdGUgZW50cmllcyBmcm9tIHJ1bnRpbWUgY29uZmlndXJhdGlvbg0KLQkJLy8gKHNpdGUgZW50cmllcyB0aGF0IG5vIGxvbmdlciBleGlzdCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24pDQotCQlpZiAodGVtcENvbmZpZyAhPSBudWxsKSB7DQotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5W10gdG1wU2l0ZXMgPSB0ZW1wQ29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG1wU2l0ZXMubGVuZ3RoOyBpKyspIHsNCi0JCQkJcnVudGltZUNvbmZpZ3VyYXRpb24udW5jb25maWd1cmVTaXRlKHRtcFNpdGVzW2ldKTsNCi0JCQl9DQotCQl9DQotDQotCQl0cnkgew0KLQkJCXJ1bnRpbWVDb25maWd1cmF0aW9uLnNhdmUoKTsNCi0JCQkvLyBsb2cgY29uZmlndXJhdGlvbiBhbmQgYWN0aXZpdGllcw0KLQkJCXRoaXMuZGF0ZSA9IG5ldyBEYXRlKHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENoYW5nZVN0YW1wKCkpOw0KLQkJCWlmICgiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShnZXRVUkwoKS5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQlVcGRhdGVDb3JlLmxvZyh0aGlzKTsNCi0JCQlyZXNldEFjdGl2aXRpZXMoKTsNCi0JCQlyZXR1cm4gaXNSZXN0YXJ0TmVlZGVkKHJ1bnRpbWVDb25maWd1cmF0aW9uKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQlDb3JlRXhjZXB0aW9uIGV4YyA9IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5VbmFibGVUb1NhdmVQbGF0Zm9ybUNvbmZpZ3VyYXRpb24iLCBydW50aW1lQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpKSwgZSk7CS8vJE5PTi1OTFMtMSQNCi0JCQlVcGRhdGVDb3JlLndhcm4oIiIsZXhjKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoNCi0JICogV3JpdGUgdGhlIHBsdWdpbiBwYXRoIGZvciBlYWNoIHNpdGUNCi0JICogRG8gbm90IGNoZWNrIGlmIHRoZSBzaXRlIGFscmVhZHkgZXhpc3RlZCBiZWZvcmUgWzE2Njk2XS4NCi0JICogUmV1c2UgYW55IHJ1bnRpbWUgc2l0ZSBvYmplY3RzIGluIHBsYXRmb3JtLmNmZyAodG8gcHJlc2VydmUgc3RhdGUpIFsxODUyMF0uDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgc2F2ZVBsdWdpblBhdGgoQ29uZmlndXJlZFNpdGUgY1NpdGUsIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24sIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gdGVtcENvbmZpZykgLy8gWzE5OTU4XQ0KLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ3VyYXRpb25Qb2xpY3kgPSBjU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCk7DQotDQotCQkvLyBjcmVhdGUgYSBJU2l0ZVBvbGljeSAocG9saWN5LCBwbHVnaW5QYXRoKQ0KLQkJLy8gZm9yIHRoZSBzaXRlDQotCQlTdHJpbmdbXSBwbHVnaW5QYXRoID0gY29uZmlndXJhdGlvblBvbGljeS5nZXRQbHVnaW5QYXRoKGNTaXRlLmdldFNpdGUoKSk7DQotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5IHNpdGVQb2xpY3kgPSBydW50aW1lQ29uZmlndXJhdGlvbi5jcmVhdGVTaXRlUG9saWN5KGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UG9saWN5KCksIHBsdWdpblBhdGgpOw0KLQ0KLQkJLy8gZ2V0IHRoZSBVUkwgb2YgdGhlIHNpdGUgdGhhdCBtYXRjaGVzIHRoZSBvbmUgcGxhdGZvcm0uY2ZnIGdhdmUgdXMNCi0JCVVSTCB1cmxUb0NoZWNrID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJdXJsVG9DaGVjayA9IG5ldyBVUkwoY1NpdGUuZ2V0UGxhdGZvcm1VUkxTdHJpbmcoKSk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5VbmFibGVUb0NyZWF0ZVVSTCIsIGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW5zdGFsbENvbmZpZ3VyYXRpb24uVW5hYmxlVG9DYXN0IiksIGUpOwkvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQkvLyB1cGRhdGUgcnVudGltZSBjb25maWd1cmF0aW9uIFsxODUyMF0NCi0JCS8vIE5vdGU6IHdlIG11c3Qgbm90IGJsaW5kbHkgcmVwbGFjZSB0aGUgc2l0ZSBlbnRyaWVzIGJlY2F1c2UgdGhleQ0KLQkJLy8gICAgICAgY29udGFpbiBhZGRpdGlvbmFsIHJ1bnRpbWUgc3RhdGUgdGhhdCBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQuDQotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnkgc2l0ZUVudHJ5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uZmluZENvbmZpZ3VyZWRTaXRlKHVybFRvQ2hlY2spOw0KLQkJaWYgKHNpdGVFbnRyeSA9PSBudWxsKQ0KLQkJCXNpdGVFbnRyeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZVNpdGVFbnRyeSh1cmxUb0NoZWNrLCBzaXRlUG9saWN5KTsNCi0JCWVsc2Ugew0KLQkJCXNpdGVFbnRyeS5zZXRTaXRlUG9saWN5KHNpdGVQb2xpY3kpOw0KLQkJCSgoU2l0ZUVudHJ5KXNpdGVFbnRyeSkucmVmcmVzaFBsdWdpbnMoKTsNCi0JCQlpZiAodGVtcENvbmZpZyAhPSBudWxsKSAvLyBbMTk5NThdIHJlbW92ZSByZXVzZWQgZW50cmllcyBmcm9tIGxpc3QNCi0JCQkJdGVtcENvbmZpZy51bmNvbmZpZ3VyZVNpdGUoc2l0ZUVudHJ5KTsNCi0JCX0NCi0JCSgoU2l0ZUVudHJ5KXNpdGVFbnRyeSkuc2V0RW5hYmxlZChjU2l0ZS5pc0VuYWJsZWQoKSk7DQotCQlydW50aW1lQ29uZmlndXJhdGlvbi5jb25maWd1cmVTaXRlKHNpdGVFbnRyeSwgdHJ1ZSAvKnJlcGxhY2UgaWYgZXhpc3RzKi8pOw0KLQl9DQotDQotCS8qDQotCSAqIFNhdmUgdGhlIEZlYXR1cmUgZW50cnkNCi0JICogVGhlIGZlYXR1cmUgY2FuIGJlIGEgcHJpbWFyeSBmZWF0dXJlIGFuZC9vciBhIHBsYXRmb3JtIGZlYXR1cmUNCi0JICovDQotCXByaXZhdGUgdm9pZCBzYXZlRmVhdHVyZUVudHJ5KENvbmZpZ3VyZWRTaXRlIGNTaXRlLCBJRmVhdHVyZSBmZWF0dXJlLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0NCi0JCS8vIGdldCB0aGUgVVJMIG9mIHRoZSBwbHVnaW4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZmVhdHVyZSAocGx1Z2luaWQgPSBmZWF0dXJlaWQpDQotCQlTdHJpbmcgaWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7DQotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQlVUkwgdXJsID0gbnVsbDsNCi0JCUlQbHVnaW5FbnRyeSBmZWF0dXJlUGx1Z2luID0gbnVsbDsNCi0JCWZvciAoaW50IGsgPSAwOyBrIDwgZW50cmllcy5sZW5ndGg7IGsrKykgew0KLQkJCWlmIChpZC5lcXVhbHNJZ25vcmVDYXNlKGVudHJpZXNba10uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkpIHsNCi0JCQkJdXJsID0gZ2V0UnVudGltZUNvbmZpZ3VyYXRpb25VUkwoZW50cmllc1trXSwgY1NpdGUpOw0KLQkJCQlmZWF0dXJlUGx1Z2luID0gZW50cmllc1trXTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJU3RyaW5nIHBsdWdpblZlcnNpb24gPSBudWxsOw0KLQkJaWYgKGZlYXR1cmVQbHVnaW4gIT0gbnVsbCkNCi0JCQlwbHVnaW5WZXJzaW9uID0gZmVhdHVyZVBsdWdpbi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7DQotDQotCQkvLyB3cml0ZSB0aGUgcHJpbWFyeSBmZWF0dXJlcw0KLQkJaWYgKGZlYXR1cmUuaXNQcmltYXJ5KCkpIHsNCi0JCQkvLyBnZXQgYW55IGZyYWdtZW50cyBmb3IgdGhlIGZlYXR1cmUgcGx1Z2luDQotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQkJaWYgKHVybCAhPSBudWxsKQ0KLQkJCQlsaXN0LmFkZCh1cmwpOw0KLQkJCWlmIChmZWF0dXJlUGx1Z2luICE9IG51bGwpIHsNCi0JCQkJVVJMW10gZnJhZ21lbnRzID0gZ2V0UnVudGltZUZyYWdtZW50VVJMcyhmZWF0dXJlUGx1Z2luKTsNCi0JCQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChmcmFnbWVudHMpKTsNCi0JCQl9DQotCQkJVVJMW10gcm9vdHMgPSAoVVJMW10pIGxpc3QudG9BcnJheShuZXcgVVJMWzBdKTsNCi0JCQlTdHJpbmcgcGx1Z2luSWRlbnRpZmllciA9IGZlYXR1cmUuZ2V0UHJpbWFyeVBsdWdpbklEKCk7DQotDQotCQkJLy8gc2F2ZSBpbmZvcm1hdGlvbiBpbiBydW50aW1lIHBsYXRmb3JtIHN0YXRlDQotCQkJU3RyaW5nIHZlcnNpb24gPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsNCi0JCQlTdHJpbmcgYXBwbGljYXRpb24gPSBmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCk7DQotCQkJRmVhdHVyZUVudHJ5IGZlYXR1cmVFbnRyeSA9IChGZWF0dXJlRW50cnkpcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlRmVhdHVyZUVudHJ5KGlkLCB2ZXJzaW9uLCBwbHVnaW5JZGVudGlmaWVyLCBwbHVnaW5WZXJzaW9uLCB0cnVlLCBhcHBsaWNhdGlvbiwgcm9vdHMpOw0KLQkJCWZlYXR1cmVFbnRyeS5zZXRVUkwoZ2V0RmVhdHVyZVJlbGF0aXZlVVJMKGZlYXR1cmUpKTsNCi0JCQlTaXRlRW50cnkgc2l0ZUVudHJ5ID0gKFNpdGVFbnRyeSlydW50aW1lQ29uZmlndXJhdGlvbi5maW5kQ29uZmlndXJlZFNpdGUoY1NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpKTsNCi0JCQlzaXRlRW50cnkuYWRkRmVhdHVyZUVudHJ5KGZlYXR1cmVFbnRyeSk7DQotCQl9IGVsc2Ugew0KLQkJCS8vIHdyaXRlIG5vbi1wcmltYXJ5IGZlYXR1cmUgZW50cmllcw0KLQkJCVN0cmluZyB2ZXJzaW9uID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7DQotCQkJU3RyaW5nIHBsdWdpbklkZW50aWZpZXIgPSBmZWF0dXJlLmdldFByaW1hcnlQbHVnaW5JRCgpOw0KLQkJCUZlYXR1cmVFbnRyeSBmZWF0dXJlRW50cnkgPSAoRmVhdHVyZUVudHJ5KXJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZUZlYXR1cmVFbnRyeShpZCwgdmVyc2lvbiwgcGx1Z2luSWRlbnRpZmllciwgcGx1Z2luVmVyc2lvbiwgZmFsc2UsIG51bGwsIG51bGwpOw0KLQkJCWZlYXR1cmVFbnRyeS5zZXRVUkwoZ2V0RmVhdHVyZVJlbGF0aXZlVVJMKGZlYXR1cmUpKTsNCi0JCQlTaXRlRW50cnkgc2l0ZUVudHJ5ID0gKFNpdGVFbnRyeSlydW50aW1lQ29uZmlndXJhdGlvbi5maW5kQ29uZmlndXJlZFNpdGUoY1NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpKTsNCi0JCQlzaXRlRW50cnkuYWRkRmVhdHVyZUVudHJ5KGZlYXR1cmVFbnRyeSk7DQotCQl9DQotDQotCQkvLyB3cml0ZSB0aGUgcGxhdGZvcm0gZmVhdHVyZXMgKGZlYXR1cmVzIHRoYXQgY29udGFpbiBzcGVjaWFsIHBsYXRmb3JtIHBsdWdpbnMpDQotCQlJUGx1Z2luRW50cnlbXSBwbGF0Zm9ybVBsdWdpbnMgPSBnZXRQbGF0Zm9ybVBsdWdpbnMoZmVhdHVyZSwgcnVudGltZUNvbmZpZ3VyYXRpb24pOw0KLQkJZm9yIChpbnQgayA9IDA7IGsgPCBwbGF0Zm9ybVBsdWdpbnMubGVuZ3RoOyBrKyspIHsNCi0JCQlpZCA9IHBsYXRmb3JtUGx1Z2luc1trXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOw0KLQkJCXVybCA9IGdldFJ1bnRpbWVDb25maWd1cmF0aW9uVVJMKHBsYXRmb3JtUGx1Z2luc1trXSwgY1NpdGUpOw0KLQkJCWlmICh1cmwgIT0gbnVsbCkgew0KLQkJCQlydW50aW1lQ29uZmlndXJhdGlvbi5zZXRCb290c3RyYXBQbHVnaW5Mb2NhdGlvbihpZCwgdXJsKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogTG9nIGlmIHdlIGFyZSBhYm91dCB0byBjcmVhdGUgYSBzaXRlIHRoYXQgZGlkbid0IGV4aXN0IGJlZm9yZQ0KLQkgKiBpbiBwbGF0Zm9ybS5jZmcgWzE2Njk2XS4NCi0JICovDQotCXByaXZhdGUgdm9pZCBjaGVja1NpdGVzKENvbmZpZ3VyZWRTaXRlTW9kZWxbXSBjb25maWd1cmF0aW9uU2l0ZXMsIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGNoZWNrIGFsbCB0aGUgc2l0ZXMgd2UgYXJlIGFib3V0IHRvIHdyaXRlIGFscmVhZHkgZXhpc3RlZA0KLQkJLy8gdGhleSBzaG91bGQgaGF2ZSBleGlzdGVkIGVpdGhlciBiZWNhdXNlIHRoZXkgd2VyZSBjcmVhdGVkIGJ5DQotCQkvLyB1cGRhdGVNYW5hZ2VyIG9yIGJlY2F1c2Ugd2UgcmVhZCB0aGVtIGZyb20gcGxhdGZvcm0uY2ZnDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25TaXRlcy5sZW5ndGg7IGkrKykgew0KLQkJCS8vIGdldCB0aGUgVVJMIG9mIHRoZSBzaXRlIHRoYXQgbWF0Y2hlcyB0aGUgb25lIHBsYXRmb3JtLmNmZyBnYXZlIHVzDQotCQkJVVJMIHVybFRvQ2hlY2sgPSBudWxsOw0KLQkJCXRyeSB7DQotCQkJCXVybFRvQ2hlY2sgPSBuZXcgVVJMKGNvbmZpZ3VyYXRpb25TaXRlc1tpXS5nZXRQbGF0Zm9ybVVSTFN0cmluZygpKTsNCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVDb3JlLndhcm4oUG9saWN5LmJpbmQoIkluc3RhbGxDb25maWd1cmF0aW9uLlVuYWJsZVRvQ3JlYXRlVVJMIiwgY29uZmlndXJhdGlvblNpdGVzW2ldLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7DQotCQkJCVVwZGF0ZUNvcmUud2FybihQb2xpY3kuYmluZCgiSW5zdGFsbENvbmZpZ3VyYXRpb24uVW5hYmxlVG9DYXN0IiksIGUpOy8vJE5PTi1OTFMtMSQNCi0JCQl9DQotDQotCQkJLy8gaWYgdGhlIFVSTCBkb2Vzbid0IGV4aXRzIGxvZyBpdA0KLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBzaXRlRW50cnkgPSBydW50aW1lQ29uZmlndXJhdGlvbi5maW5kQ29uZmlndXJlZFNpdGUodXJsVG9DaGVjayk7DQotCQkJaWYgKHNpdGVFbnRyeSA9PSBudWxsKSB7DQotCQkJCVVwZGF0ZUNvcmUud2FybihQb2xpY3kuYmluZCgiVW5hYmxlIHRvIGZpbmQgc2l0ZSB7MH0gaW4gcGxhdGZvcm0gY29uZmlndXJhdGlvbiB7MX0uIiwgdXJsVG9DaGVjay50b0V4dGVybmFsRm9ybSgpLCBydW50aW1lQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0NCi0JLyoNCi0JICogcmV2ZXJ0cyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gdGhlIG1hdGNoIHRoZSBuZXcgb25lDQotCSAqDQotCSAqIENvbXBhcmUgdGhlIG9sZFNpdGVzIHdpdGggdGhlIGN1cnJlbnRPbmUuIHRoZSBvbGQgc3RhdGUgaXMgdGhlIHN0YXRlIHdlIHdhbnQgdG8gcmV2ZXJ0IHRvLg0KLQkgKg0KLQkgKiBJZiBhIHNpdGUgd2FzIGluIG9sZCBzdGF0ZSwgYnV0IG5vdCBpbiB0aGUgY3VycmVudE9uZSwga2VlcCBpdCBpbiB0aGUgaGFzaC4NCi0JICogSWYgYSBzaXRlIGlzIGluIHRoZSBjdXJyZW50T25lIGJ1dCB3YXMgbm90IGluIHRoZSBvbGQgc3RhdGUsIHVuY29uZmlndXJlIGFsbCBmZWF0dXJlcyBhbmQgYWRkIGl0IGluIHRoZSBoYXNoDQotCSAqIElmIGEgc2l0ZSB3YXMgaW4gYmFvdGggc3RhdGUsIGNhbGN1bGF0ZSB0aGUgJ2RlbHRhJyBhbmQgcmUtc2V0IGl0IGluIHRoZSBoYXNoIG1hcA0KLQkgKg0KLQkgKiBBdCB0aGUgZW5kLCBzZXQgdGhlIGNvbmZpZ3VyZWQgc2l0ZSBmcm9tIHRoZSBuZXcgc2l0ZXMgaGFzaCBtYXANCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHJldmVydFRvKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9ibGVtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gew0KLQ0KLQkJSUNvbmZpZ3VyZWRTaXRlW10gb2xkQ29uZmlnU2l0ZXMgPSBjb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQkJSUNvbmZpZ3VyZWRTaXRlW10gbm93Q29uZmlnU2l0ZXMgPSB0aGlzLmdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQ0KLQkJLy8gY3JlYXRlIGEgaGFzaHRhYmxlIG9mIHRoZSAqb2xkKiBhbmQgKm5ldyogc2l0ZXMNCi0JCU1hcCBvbGRTaXRlc01hcCA9IG5ldyBIYXNodGFibGUoMCk7DQotCQlNYXAgbmV3U2l0ZXNNYXAgPSBuZXcgSGFzaHRhYmxlKDApOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRDb25maWdTaXRlcy5sZW5ndGg7IGkrKykgew0KLQkJCUlDb25maWd1cmVkU2l0ZSBlbGVtZW50ID0gb2xkQ29uZmlnU2l0ZXNbaV07DQotCQkJb2xkU2l0ZXNNYXAucHV0KGVsZW1lbnQuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCksIGVsZW1lbnQpOw0KLQkJCW5ld1NpdGVzTWFwLnB1dChlbGVtZW50LmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLCBlbGVtZW50KTsNCi0JCX0NCi0JCS8vIGNyZWF0ZSBsaXN0IG9mIGFsbCB0aGUgc2l0ZXMgdGhhdCBtYXAgdGhlICpvbGQqIHNpdGVzDQotCQkvLyB3ZSB3YW50IHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgb2xkIHNpdGVzIGFuZCB0aGUgY3VycmVudCBzaXRlcw0KLQkJaWYgKG5vd0NvbmZpZ1NpdGVzICE9IG51bGwpIHsNCi0JCQlTdHJpbmcga2V5ID0gbnVsbDsNCi0NCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vd0NvbmZpZ1NpdGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJCWtleSA9IG5vd0NvbmZpZ1NpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJCQlJQ29uZmlndXJlZFNpdGUgb2xkU2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpIG9sZFNpdGVzTWFwLmdldChrZXkpOw0KLQkJCQlpZiAob2xkU2l0ZSAhPSBudWxsKSB7DQotCQkJCQkvLyB0aGUgU2l0ZSBleGlzdGVkIGJlZm9yZSwgY2FsY3VsYXRlIHRoZSBkZWx0YSBiZXR3ZWVuIGl0cyBjdXJyZW50IHN0YXRlIGFuZCB0aGUNCi0JCQkJCS8vIHN0YXRlIHdlIGFyZSByZXZlcnRpbmcgdG8gYW5kIHB1dCBpdCBiYWNrIGludG8gdGhlIG1hcA0KLQkJCQkJICgoQ29uZmlndXJlZFNpdGUpIG5vd0NvbmZpZ1NpdGVzW2ldKS5yZXZlcnRUbyhvbGRTaXRlLCBtb25pdG9yLCBoYW5kbGVyKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCS8vIHRoZSBzaXRlIGRpZG4ndCBleGlzdCBpbiB0aGUgSW5zdGFsbENvbmZpZ3VyYXRpb24gd2UgYXJlIHJldmVydGluZyB0bw0KLQkJCQkJLy8gdW5jb25maWd1cmUgZXZlcnl0aGluZyBmcm9tIHRoaXMgc2l0ZSBzbyBpdCBpcyBzdGlsbCBwcmVzZW50DQotCQkJCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1RvVW5jb25maWd1cmUgPSBub3dDb25maWdTaXRlc1tpXS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmVhdHVyZXNUb1VuY29uZmlndXJlLmxlbmd0aDsgaisrKSB7DQotCQkJCQkJSUZlYXR1cmUgZmVhdHVyZVRvVW5jb25maWd1cmUgPSBudWxsOw0KLQkJCQkJCXRyeSB7DQotCQkJCQkJCWZlYXR1cmVUb1VuY29uZmlndXJlID0gZmVhdHVyZXNUb1VuY29uZmlndXJlW2pdLmdldEZlYXR1cmUobnVsbCk7DQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQkJCQl9DQotCQkJCQkJaWYgKGZlYXR1cmVUb1VuY29uZmlndXJlICE9IG51bGwpDQotCQkJCQkJCW5vd0NvbmZpZ1NpdGVzW2ldLnVuY29uZmlndXJlKGZlYXR1cmVUb1VuY29uZmlndXJlKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQluZXdTaXRlc01hcC5wdXQoa2V5LG5vd0NvbmZpZ1NpdGVzW2ldKTsNCi0JCQl9DQotDQotCQkJLy8gdGhlIG5ldyBjb25maWd1cmF0aW9uIGhhcyB0aGUgZXhhY3Qgc2FtZSBzaXRlcyBhcyB0aGUgb2xkIGNvbmZpZ3VyYXRpb24NCi0JCQkvLyB0aGUgb2xkIGNvbmZpZ3VyYXRpb24gaW4gdGhlIE1hcCBhcmUgZWl0aGVyIGFzLWlzIGJlY2F1c2UgdGhleSBkb24ndCBleGlzdA0KLQkJCS8vIGluIHRoZSBjdXJyZW50IG9uZSwgb3IgdGhleSBhcmUgdGhlIGRlbHRhIGZyb20gdGhlIGN1cnJlbnQgb25lIHRvIHRoZSBvbGQgb25lDQotCQkJQ29sbGVjdGlvbiBzaXRlcyA9IG5ld1NpdGVzTWFwLnZhbHVlcygpOw0KLQkJCWlmIChzaXRlcyAhPSBudWxsICYmICFzaXRlcy5pc0VtcHR5KCkpIHsNCi0JCQkJQ29uZmlndXJlZFNpdGVNb2RlbFtdIHNpdGVzTW9kZWwgPSBuZXcgQ29uZmlndXJlZFNpdGVNb2RlbFtzaXRlcy5zaXplKCldOw0KLQkJCQlzaXRlcy50b0FycmF5KHNpdGVzTW9kZWwpOw0KLQkJCQlzZXRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKHNpdGVzTW9kZWwpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElJbnN0YWxsQ29uZmlndXJhdGlvbiNnZXRBY3Rpdml0aWVzKCkNCi0JICovDQotCXB1YmxpYyBJQWN0aXZpdHlbXSBnZXRBY3Rpdml0aWVzKCkgew0KLQkJaWYgKGdldEFjdGl2aXR5TW9kZWwoKS5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm4gbmV3IElBY3Rpdml0eVswXTsNCi0JCXJldHVybiAoSUFjdGl2aXR5W10pIGdldEFjdGl2aXR5TW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiByZXR1cm5zIHRoZSBsaXN0IG9mIHBsYXRmb3JtIHBsdWdpbnMgb2YgdGhlIGZlYXR1cmUgb3IgYW4gZW1wdHkgbGlzdA0KLQkgKiBpZiB0aGUgZmVhdHVyZSBkb2Vzbid0IGNvbnRhaW4gYW55IHBsYXRmb3JtIHBsdWdpbnMNCi0JICovDQotCXByaXZhdGUgSVBsdWdpbkVudHJ5W10gZ2V0UGxhdGZvcm1QbHVnaW5zKElGZWF0dXJlIGZlYXR1cmUsIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24pIHsNCi0JCU1hcCBmZWF0dXJlUGxhdGZvcm1QbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsNCi0JCVN0cmluZ1tdIHBsYXRmb3JtUGx1Z2luSUQgPSBydW50aW1lQ29uZmlndXJhdGlvbi5nZXRCb290c3RyYXBQbHVnaW5JZGVudGlmaWVycygpOw0KLQkJSVBsdWdpbkVudHJ5W10gZmVhdHVyZVBsdWdpbnMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGxhdGZvcm1QbHVnaW5JRC5sZW5ndGg7IGkrKykgew0KLQkJCVN0cmluZyBmZWF0dXJlUGx1Z2luSWQgPSBudWxsOw0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmVhdHVyZVBsdWdpbnMubGVuZ3RoOyBqKyspIHsNCi0JCQkJZmVhdHVyZVBsdWdpbklkID0gZmVhdHVyZVBsdWdpbnNbal0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsNCi0JCQkJaWYgKHBsYXRmb3JtUGx1Z2luSURbaV0uZXF1YWxzKGZlYXR1cmVQbHVnaW5JZCkpIHsNCi0JCQkJCWZlYXR1cmVQbGF0Zm9ybVBsdWdpbnMucHV0KHBsYXRmb3JtUGx1Z2luSURbaV0sIGZlYXR1cmVQbHVnaW5zW2pdKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCUNvbGxlY3Rpb24gdmFsdWVzID0gZmVhdHVyZVBsYXRmb3JtUGx1Z2lucy52YWx1ZXMoKTsNCi0JCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDApDQotCQkJcmV0dXJuIG5ldyBJUGx1Z2luRW50cnlbMF07DQotDQotCQlJUGx1Z2luRW50cnlbXSByZXN1bHQgPSBuZXcgSVBsdWdpbkVudHJ5W3ZhbHVlcy5zaXplKCldOw0KLQkJSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOw0KLQkJaW50IGluZGV4ID0gMDsNCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KLQkJCXJlc3VsdFtpbmRleF0gPSAoKElQbHVnaW5FbnRyeSkgaXRlci5uZXh0KCkpOw0KLQkJCWluZGV4Kys7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIHJldHVybnMgdGhlIFVSTCBvZiB0aGUgcGx1Z2luRW50cnkgb24gdGhlIHNpdGUNCi0JICogVHJhbnNmb3JtIHRoZSBVUkwgdG8gdXNlIHBsYXRmb3JtOiBwcm90b2NvbCBpZiBuZWVkZWQNCi0JICogcmV0dXJuIG51bGwgaWYgdGhlIFVSTCB0byB3cml0ZSBpcyBub3QgdmFsaWQNCi0JICovDQotCXByaXZhdGUgVVJMIGdldFJ1bnRpbWVDb25maWd1cmF0aW9uVVJMKElQbHVnaW5FbnRyeSBlbnRyeSwgQ29uZmlndXJlZFNpdGUgY1NpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCVN0cmluZyByb290U3RyaW5nID0gY1NpdGUuZ2V0UGxhdGZvcm1VUkxTdHJpbmcoKTsNCi0JCVN0cmluZyBwbHVnaW5QYXRoSUQgPSBnZXRQYXRoSUQoZW50cnkpOw0KLQkJdHJ5IHsNCi0JCQlJU2l0ZUNvbnRlbnRQcm92aWRlciBzaXRlQ29udGVudFByb3ZpZGVyID0gY1NpdGUuZ2V0U2l0ZSgpLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsNCi0JCQlVUkwgcGx1Z2luRW50cnlmdWxsVVJMID0gc2l0ZUNvbnRlbnRQcm92aWRlci5nZXRBcmNoaXZlUmVmZXJlbmNlKHBsdWdpblBhdGhJRCk7DQotDQotCQkJLy8NCi0JCQlpZiAoIXJvb3RTdHJpbmcuc3RhcnRzV2l0aCgicGxhdGZvcm0iKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCS8vIERFQlVHOg0KLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikNCi0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoImdldFJ1bnRpbWVDb25maWd1cmF0aW9uIFBsdWdpbiBFbnRyeSBGdWxsIFVSTDoiICsgcGx1Z2luRW50cnlmdWxsVVJMICsgIiBQbGF0Zm9ybSBTdHJpbmc6IiArIHJvb3RTdHJpbmcgKyAiIFtOT04gUExBVEZPUk0gVVJMXS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJcmV0dXJuIHBsdWdpbkVudHJ5ZnVsbFVSTDsNCi0JCQl9DQotDQotCQkJLy9VUkwgcGx1Z2luRW50cnlSb290VVJMID0gUGxhdGZvcm0ucmVzb2x2ZShuZXcgVVJMKHJvb3RTdHJpbmcpKTsNCi0JCQkvLyBEbyBub3QgcmVzb2x2ZSBbMTY1MDddLCBqdXN0IHVzZSBwbGF0Zm9ybTpiYXNlLyBhcyBhIHJvb3QNCi0JCQkvLyByb290U3RyaW5nID0gcGxhdGZvcm06YmFzZQ0KLQkJCS8vIHBsdWdpblJvb3QgPSAvaG9tZS9hDQotCQkJLy8gcGx1Z2luRnVsbCA9IC9ob21lL2EvYy9ib290Lmphcg0KLQkJCS8vIHJlbGF0aXZlID0gcGxhdGZvcm06L2Jhc2UvYy9ib290Lmphcg0KLQkJCVVSTCBwbHVnaW5FbnRyeVJvb3RVUkwgPSBjU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCk7DQotCQkJU3RyaW5nIHJlbGF0aXZlU3RyaW5nID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTEFzU3RyaW5nKHBsdWdpbkVudHJ5Um9vdFVSTCwgcGx1Z2luRW50cnlmdWxsVVJMKTsNCi0JCQlVUkwgcmVzdWx0ID0gbmV3IFVSTChuZXcgVVJMKHJvb3RTdHJpbmcpLCByZWxhdGl2ZVN0cmluZyk7DQotDQotCQkJLy8gREVCVUc6DQotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pDQotCQkJCVVwZGF0ZUNvcmUuZGVidWcoImdldFJ1bnRpbWVDb25maWd1cmF0aW9uIHBsdWdpbiBFbnRyeSBGdWxsIFVSTDoiICsgcGx1Z2luRW50cnlmdWxsVVJMICsgIiBQbGF0Zm9ybSBTdHJpbmc6IiArIHJvb3RTdHJpbmcgKyAiIFNpdGUgVVJMOiIgKyBwbHVnaW5FbnRyeVJvb3RVUkwgKyAiIFJlbGF0aXZlOiIgKyByZWxhdGl2ZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQNCi0NCi0JCQkvLyB2ZXJpZnkgd2UgYXJlIGFib3V0IHRvIHdyaXRlIGEgdmFsaWQgZmlsZSBVUkwNCi0JCQkvLyBjaGVjayB3aXRoIGZ1bGxVUkwgYXMgaXQgaXMgbm90IHJlc29sdmVkIHRvIHBsYXRmb3JtOmJhc2UvDQotCQkJaWYgKHBsdWdpbkVudHJ5ZnVsbFVSTCAhPSBudWxsKSB7DQotCQkJCWlmICgiZmlsZSIuZXF1YWxzKHBsdWdpbkVudHJ5ZnVsbFVSTC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCQlTdHJpbmcgZmlsZVN0cmluZyA9IHBsdWdpbkVudHJ5ZnVsbFVSTC5nZXRGaWxlKCk7DQotCQkJCQlpZiAoIW5ldyBGaWxlKGZpbGVTdHJpbmcpLmV4aXN0cygpKSB7DQotCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgVVJMOiIgKyByZXN1bHQgKyAiIGRvZXNuJ3QgcG9pbnQgdG8gYSB2YWxpZCBwbGF0Zm9ybSBwbHVnaW4uVGhlIFVSTCB3aWxsIG5vdCBiZSB3cml0dGVuIGluIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotDQotCQkJcmV0dXJuIHJlc3VsdDsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW5zdGFsbENvbmZpZ3VyYXRpb24uVW5hYmxlVG9DcmVhdGVVUkwiLCByb290U3RyaW5nKSwgZSk7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBSZXR1cm4gVVJMcyBmb3IgYW55IGZyYWdtZW50cyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwbHVnaW4gZW50cnkNCi0JICovDQotCXByaXZhdGUgVVJMW10gZ2V0UnVudGltZUZyYWdtZW50VVJMcyhJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGdldCB0aGUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5DQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0NCi0JCS8vIGdldCB0aGUgcGx1Z2luIGRlc2NyaXB0b3IgZnJvbSB0aGUgcmVnaXN0cnkNCi0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUodmlkLmdldElkZW50aWZpZXIoKSk7DQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWlmIChidW5kbGUgIT0gbnVsbCAmJiBidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuVU5JTlNUQUxMRUQgJiYgYnVuZGxlLmdldFN0YXRlKCkgIT0gQnVuZGxlLklOU1RBTExFRCkgew0KLQkJCUZyYWdtZW50RW50cnlbXSBmcmFnbWVudHMgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGZyYWdtZW50cyAhPSBudWxsICYmIGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQkJU3RyaW5nIGxvY2F0aW9uID0gZnJhZ21lbnRzW2ldLmdldExvY2F0aW9uKCk7DQotCQkJCXRyeSB7DQotCQkJCQlVUkwgbG9jYXRpb25VUkwgPSBuZXcgVVJMKGxvY2F0aW9uKTsNCi0JCQkJCWxvY2F0aW9uVVJMID0gUGxhdGZvcm0uYXNMb2NhbFVSTChQbGF0Zm9ybS5yZXNvbHZlKGxvY2F0aW9uVVJMKSk7DQotCQkJCQlsaXN0LmFkZChhc0luc3RhbGxSZWxhdGl2ZVVSTChsb2NhdGlvblVSTCkpOw0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyBza2lwIGJhZCBmcmFnbWVudHMNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiAoVVJMW10pIGxpc3QudG9BcnJheShuZXcgVVJMWzBdKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGF0aCBpZGVudGlmaWVyIGZvciBhIHBsdWdpbiBlbnRyeS4NCi0JICogPGNvZGU+cGx1Z2lucy8mbHQ7cGx1Z2luSWQ+XyZsdDtwbHVnaW5WZXJzaW9uPi5qYXI8L2NvZGU+DQotCSAqIEByZXR1cm4gdGhlIHBhdGggaWRlbnRpZmllcg0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aElEKElQbHVnaW5FbnRyeSBlbnRyeSkgew0KLQkJcmV0dXJuIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIGVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpICsgRmVhdHVyZUNvbnRlbnRQcm92aWRlci5KQVJfRVhURU5TSU9OOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUcnkgdG8gcmVjYXN0IFVSTCBhcyBwbGF0Zm9ybTovYmFzZS8NCi0JICovDQotCXByaXZhdGUgVVJMIGFzSW5zdGFsbFJlbGF0aXZlVVJMKFVSTCB1cmwpIHsNCi0JCS8vIGdldCBsb2NhdGlvbiBvZiBpbnN0YWxsDQotCQlVUkwgaW5zdGFsbCA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEluc3RhbGxVUkwoKTsNCi0NCi0JCS8vIHRyeSB0byBkZXRlcm1pbmUgaWYgc3VwcGxpZWQgVVJMIGNhbiBiZSByZWNhc3QgYXMgaW5zdGFsbC1yZWxhdGl2ZQ0KLQkJaWYgKGluc3RhbGwuZ2V0UHJvdG9jb2woKS5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7DQotCQkJaWYgKGluc3RhbGwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCVN0cmluZyBpbnN0YWxsUyA9IG5ldyBGaWxlKGluc3RhbGwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsNCi0JCQkJaWYgKCFpbnN0YWxsUy5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkDQotCQkJCQlpbnN0YWxsUyArPSAiLyI7IC8vJE5PTi1OTFMtMSQNCi0JCQkJU3RyaW5nIHVybFMgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsNCi0JCQkJaWYgKCF1cmxTLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCXVybFMgKz0gIi8iOyAvLyROT04tTkxTLTEkDQotCQkJCWludCBpeCA9IGluc3RhbGxTLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJaWYgKGl4ICE9IC0xKSB7DQotCQkJCQlpbnN0YWxsUyA9IGluc3RhbGxTLnN1YnN0cmluZygwLCBpeCArIDEpOw0KLQkJCQkJaWYgKHVybFMuc3RhcnRzV2l0aChpbnN0YWxsUykpIHsNCi0JCQkJCQl0cnkgew0KLQkJCQkJCQlyZXR1cm4gbmV3IFVSTCgicGxhdGZvcm06L2Jhc2UvIiArIHVybFMuc3Vic3RyaW5nKGluc3RhbGxTLmxlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiB1cmw7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBpc0R1cGxpY2F0ZVNpdGUoRmlsZSBzaXRlRGlyZWN0b3J5KSB7DQotCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQkJVVJMIGZpbGVVUkw7DQotCQl0cnkgew0KLQkJCWZpbGVVUkwgPSBzaXRlRGlyZWN0b3J5LnRvVVJMKCk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlVUkwgdXJsID0gc2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpOw0KLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChmaWxlVVJMLCB1cmwpKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSB1cmwgcmVsYXRpdmUgdG8gdGhlIHNpdGUuDQotCSAqLw0KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlUmVsYXRpdmVVUkwoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJU3RyaW5nIHVybCA9IGZlYXR1cmUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCVN0cmluZyBzaXRlVVJMID0gZmVhdHVyZS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCS8vIFRPRE8gZml4IHRoaXMuIHRvVVJMKCkgcmV0dXJucyBmaWxlOi9kOi9lY2xpcHNlL2V0Yy4uLiB3aGVhcmVhcyB0aGUgDQotCQkvLyBwbGF0Zm9ybS5hc0xvY2FsVVJMKCkgcmV0dXJucyBmaWxlOmQ6L2VjbGlwc2UvZXRjLi4uIChubyBsZWFkaW5nIC8gKQ0KLS8vCQlpZiAodXJsLnN0YXJ0c1dpdGgoImZpbGU6LyIpICYmIFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKCJ3aW4zMiIpKQ0KLS8vCQkJdXJsID0gImZpbGU6IiArIHVybC5zdWJzdHJpbmcoNik7DQotCQkNCi0JCWlmICh1cmwuc3RhcnRzV2l0aChzaXRlVVJMKSkNCi0JCQlyZXR1cm4gdXJsLnN1YnN0cmluZyhzaXRlVVJMLmxlbmd0aCgpKTsNCi0JCWVsc2UNCi0JCQlyZXR1cm4gdXJsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0cnVlIGlmIHJlc3RhcnQgaXMgbmVlZGVkDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNSZXN0YXJ0TmVlZGVkKElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZykgew0KLQ0KLQkJLy8gRmlyc3QsIGNyZWF0ZSBhIG1hcCBmb3IgZmFzdGVyIGxvb2t1cHMNCi0JCVVSTFtdIG5ld0J1bmRsZVBhdGhzID0gcnVudGltZUNvbmZpZy5nZXRQbHVnaW5QYXRoKCk7DQotCQlIYXNoU2V0IG5ld1BsdWdpbnNTZXQgPSBuZXcgSGFzaFNldChuZXdCdW5kbGVQYXRocy5sZW5ndGgpOw0KLQkJZm9yIChpbnQgaT0wOyBpPG5ld0J1bmRsZVBhdGhzLmxlbmd0aDsgaSsrKSB7DQotCQkJDQotCQkJU3RyaW5nIHBsdWdpbkxvY2F0aW9uID0gbmV3QnVuZGxlUGF0aHNbaV0uZ2V0RmlsZSgpOw0KLQkJCW5ld1BsdWdpbnNTZXQuYWRkKHBsdWdpbkxvY2F0aW9uKTsNCi0JCQkvLyBPbiB3aW5kb3dzLCB3ZSB3aWxsIGJlIGRvaW5nIGNhc2UgaW5zZW5zaXRpdmUgc2VhcmNoIGFzIHdlbGwsIHNvIGxvd2VyIGl0IG5vdw0KLQkJCWlmIChpc1dpbmRvd3MpDQotCQkJCW5ld1BsdWdpbnNTZXQuYWRkKHBsdWdpbkxvY2F0aW9uLnRvTG93ZXJDYXNlKCkpOw0KLQkJfQ0KLQkJDQotCQlQbGF0Zm9ybUFkbWluIHBsYXRmb3JtQWRtaW4gPSBQbGF0Zm9ybS5nZXRQbGF0Zm9ybUFkbWluKCk7DQotCQlTdGF0ZSBzdGF0ZSA9IHBsYXRmb3JtQWRtaW4uZ2V0U3RhdGUoKTsNCi0JCUJ1bmRsZURlc2NyaXB0aW9uW10gb2xkQnVuZGxlcyA9IHN0YXRlLmdldEJ1bmRsZXMoKTsNCi0NCi0JCWludCBvZmZzZXQgPSBDb25maWd1cmF0aW9uQWN0aXZhdG9yLlVQREFURV9QUkVGSVgubGVuZ3RoKCk7DQotCQlmb3IgKGludCBpPTA7IGk8b2xkQnVuZGxlcy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChvbGRCdW5kbGVzW2ldLmdldEJ1bmRsZUlkKCkgPT0gMCkNCi0JCQkJY29udGludWU7IC8vIHNraXAgdGhlIHN5c3RlbSBidW5kbGUNCi0JCQlTdHJpbmcgb2xkQnVuZGxlTG9jYXRpb24gPSBvbGRCdW5kbGVzW2ldLmdldExvY2F0aW9uKCk7DQotCQkJLy8gRG9uJ3Qgd29ycnkgYWJvdXQgYnVuZGxlcyB3ZSBkaWQgbm90IGluc3RhbGwNCi0JCQlpZiAoIW9sZEJ1bmRsZUxvY2F0aW9uLnN0YXJ0c1dpdGgoQ29uZmlndXJhdGlvbkFjdGl2YXRvci5VUERBVEVfUFJFRklYKSkNCi0JCQkJY29udGludWU7DQotCQkJb2xkQnVuZGxlTG9jYXRpb24gPSBvbGRCdW5kbGVMb2NhdGlvbi5zdWJzdHJpbmcob2Zmc2V0KTsNCi0JCQkNCi0JCQlpZiAobmV3UGx1Z2luc1NldC5jb250YWlucyhvbGRCdW5kbGVMb2NhdGlvbikpDQotCQkJCWNvbnRpbnVlOw0KLQkJCWlmIChpc1dpbmRvd3MgJiYgbmV3UGx1Z2luc1NldC5jb250YWlucyhvbGRCdW5kbGVMb2NhdGlvbi50b0xvd2VyQ2FzZSgpKSkNCi0JCQkJY29udGludWU7DQotCQkJDQotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pDQotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkJ1bmRsZSAiICsgb2xkQnVuZGxlTG9jYXRpb24gKyAiIGhhcyBiZWVuIHJlbW92ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBUbyBiZSBjYWxsZWQgd2hlbiBjb21taXR0aW5nIHRoZSB1cGRhdGUgY2hhbmdlcyB0byBjdXJyZW50IGNvbmZpZ3VyYXRpb24NCi0JICoNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseUNoYW5nZXMoKSB7DQotCQlDb25maWd1cmF0aW9uQWN0aXZhdG9yIGNvbmZpZ3VyYXRvciA9IENvbmZpZ3VyYXRpb25BY3RpdmF0b3IuZ2V0Q29uZmlndXJhdG9yKCk7DQotCQljb25maWd1cmF0b3IuaW5zdGFsbEJ1bmRsZXMoKTsNCi0JfQ0KLQkNCi0JDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIEluc3RhbGxDb25maWd1cmF0aW9uKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQkNCi0JCUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IChJbnN0YWxsQ29uZmlndXJhdGlvbilvYmo7DQotCQ0KLQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpLmVxdWFscyhjb25maWcuZ2V0Q3JlYXRpb25EYXRlKCkpICYmIA0KLQkJCQlnZXRMYWJlbCgpLmVxdWFscyhjb25maWcuZ2V0TGFiZWwoKSkgJiYNCi0JCQkJZ2V0TG9jYXRpb25VUkxTdHJpbmcoKS5lcXVhbHMoY29uZmlnLmdldExvY2F0aW9uVVJMU3RyaW5nKCkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbEhhbmRsZXJQcm94eS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsSGFuZGxlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWExMzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsSGFuZGxlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotcHVibGljIGNsYXNzIEluc3RhbGxIYW5kbGVyUHJveHkgaW1wbGVtZW50cyBJSW5zdGFsbEhhbmRsZXIgewotCi0JcHJpdmF0ZSBJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQlwcml2YXRlIGludCB0eXBlOwotCXByaXZhdGUgSUluc3RhbGxIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCXByaXZhdGUgSVN0YXR1cyBzYXZlZFN0YXR1cyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUX1BMVUdJTiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUX1BPSU5UID0gImluc3RhbGxIYW5kbGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW5zdGFsbEhhbmRsZXJQcm94eSgpIHsKLQl9Ci0KLQlwdWJsaWMgSW5zdGFsbEhhbmRsZXJQcm94eSgKLQkJaW50IHR5cGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlJbnN0YWxsSGFuZGxlckVudHJ5IGVudHJ5LAotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaW5pdGlhbGl6ZSh0eXBlLCBmZWF0dXJlLCBlbnRyeSwgbW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNpbml0aWFsaXplCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLQkJaW50IHR5cGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlJbnN0YWxsSGFuZGxlckVudHJ5IGVudHJ5LAotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJREVCVUcgPSBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSUhBTkRMRVI7Ci0JCS8vIHZhbGlkYXRlIGFyZ3VtZW50cwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCi0JCS8vICBjaGVjayBpZiB3ZSBoYXZlIGEgaGFuZGxlciBlbnRyeSBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUueG1sCi0JCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJZGVidWcoIm5vdCBzcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOyAvLyBubyBoYW5kbGVyIGVudHJ5Ci0JCX0KLQotCQlTdHJpbmcgbGlicmFyeSA9IGVudHJ5LmdldExpYnJhcnkoKTsKLQkJU3RyaW5nIGhhbmRsZXJOYW1lID0gZW50cnkuZ2V0SGFuZGxlck5hbWUoKTsKLQkJaWYgKGhhbmRsZXJOYW1lID09IG51bGwgfHwgaGFuZGxlck5hbWUudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKERFQlVHKQotCQkJCWRlYnVnKCJub3Qgc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsgLy8gbm8gaGFuZGxlciBjbGFzcyBzcGFjaWZpZWQgaW4gZW50cnkKLQkJfQotCQlpZiAoREVCVUcpIHsKLQkJCWRlYnVnKCJoYW5kbGVyPSIgKyBoYW5kbGVyTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlYnVnKCJwYXRoPSAgICIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gZ2V0IGhhbmRsZXIgaW5zdGFuY2UKLQkJdHJ5IHsKLQkJCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMuaGFuZGxlciA9IGdldEdsb2JhbEhhbmRsZXIoaGFuZGxlck5hbWUpOwotCQkJZWxzZQotCQkJCXRoaXMuaGFuZGxlciA9IGdldExvY2FsSGFuZGxlcihsaWJyYXJ5LCBoYW5kbGVyTmFtZSk7Ci0JCQlpZiAodGhpcy5oYW5kbGVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaGFuZGxlci5pbml0aWFsaXplKHR5cGUsIGZlYXR1cmUsIGVudHJ5LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb25JbkluaXQoCi0JCQkJUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLm5vdEZvdW5kIiwgZmVhdHVyZS5nZXRMYWJlbCgpKSwgLy8kTk9OLU5MUy0xJAotCQkJCWUpOwotCi0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb25JbkluaXQoCi0JCQkJUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLmludmFsaWRIYW5kbGVyIiwgZmVhdHVyZS5nZXRMYWJlbCgpKSwgLy8kTk9OLU5MUy0xJAotCQkJCWUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbkluSW5pdChudWxsLCBlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbkluSW5pdCgKLQkJCQlQb2xpY3kuYmluZCgiSW5zdGFsbEhhbmRsZXIudW5hYmxlVG9DcmVhdGVIYW5kbGVyIiwgZmVhdHVyZS5nZXRMYWJlbCgpKSwgLy8kTk9OLU5MUy0xJAotCQkJCWUpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2luc3RhbGxJbml0aWF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyBpbnN0YWxsSW5pdGlhdGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuaW5zdGFsbEluaXRpYXRlZCgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2FsbFBsdWdpbnNEb3dubG9hZGVkCi0JICovCi0JcHVibGljIHZvaWQgcGx1Z2luc0Rvd25sb2FkZWQoSVBsdWdpbkVudHJ5W10gcGx1Z2lucykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyBwbHVnaW5zRG93bmxvYWRlZCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLnBsdWdpbnNEb3dubG9hZGVkKHBsdWdpbnMpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2FsbFBsdWdpbnNJbnN0YWxsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29tcGxldGVJbnN0YWxsKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuY29tcGxldGVJbnN0YWxsKGNvbnN1bWVyKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNhbGxEYXRhRG93bmxvYWRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vblBsdWdpbkRhdGFEb3dubG9hZGVkKAotCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5EYXRhLAotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgbm9uUGx1Z2luRGF0YURvd25sb2FkZWQoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci5ub25QbHVnaW5EYXRhRG93bmxvYWRlZChub25QbHVnaW5EYXRhLCBsaXN0ZW5lcik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjaW5zdGFsbENvbXBsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIGluc3RhbGxDb21wbGV0ZWQoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci5pbnN0YWxsQ29tcGxldGVkKHN1Y2Nlc3MpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbmZpZ3VyZUluaXRpYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29uZmlndXJlSW5pdGlhdGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuY29uZmlndXJlSW5pdGlhdGVkKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjY29tcGxldGVDb25maWd1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29tcGxldGVDb25maWd1cmUoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci5jb21wbGV0ZUNvbmZpZ3VyZSgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbmZpZ3VyZUNvbXBsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29uZmlndXJlQ29tcGxldGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuY29uZmlndXJlQ29tcGxldGVkKHN1Y2Nlc3MpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI3VuY29uZmlndXJlSW5pdGlhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmVJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIHVuY29uZmlndXJlSW5pdGlhdGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIudW5jb25maWd1cmVJbml0aWF0ZWQoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZVVuY29uZmlndXJlCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVVbmNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29tcGxldGVVbmNvbmZpZ3VyZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLmNvbXBsZXRlVW5jb25maWd1cmUoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciN1bmNvbmZpZ3VyZUNvbXBsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoc2F2ZWRTdGF0dXMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc2F2ZWRTdGF0dXMpOyAvLyBkZWxheWVkIGV4Y2VwdGlvbgotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIHVuY29uZmlndXJlQ29tcGxldGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIudW5jb25maWd1cmVDb21wbGV0ZWQoc3VjY2Vzcyk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJCWlmIChzYXZlZFN0YXR1cyAhPSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHNhdmVkU3RhdHVzKTsgLy8gZGVsYXllZCBleGNlcHRpb24KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5pbnN0YWxsSW5pdGlhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyB1bmluc3RhbGxJbml0aWF0ZWQoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci51bmluc3RhbGxJbml0aWF0ZWQoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZVVuaW5zdGFsbAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlVW5pbnN0YWxsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyBjb21wbGV0ZVVuaW5zdGFsbCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLmNvbXBsZXRlVW5pbnN0YWxsKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5pbnN0YWxsQ29tcGxldGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoc2F2ZWRTdGF0dXMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc2F2ZWRTdGF0dXMpOyAvLyBkZWxheWVkIGV4Y2VwdGlvbgotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIHVuaW5zdGFsbENvbXBsZXRlZCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLnVuaW5zdGFsbENvbXBsZXRlZChzdWNjZXNzKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQkJaWYgKHNhdmVkU3RhdHVzICE9IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc2F2ZWRTdGF0dXMpOyAvLyBkZWxheWVkIGV4Y2VwdGlvbgotCQl9Ci0JfQotCi0JLyoKLQkgKiBjb21tb24gZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBpbml0aWFsaXphdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb25JbkluaXQoU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ29yZUV4Y2VwdGlvbiBjZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJY2UgPSAoQ29yZUV4Y2VwdGlvbikgZTsKLQkJZWxzZQotCQkJY2UgPSBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihzLCBlKTsKLQotCQlpZiAoaXNVbmRvQWN0aW9uKCkpIHsKLQkJCS8vIGZvciAidW5kbyIgb3BlcmF0aW9ucywgZGVhY3RpdmF0ZSBoYW5kbGVyIGFuZCBsb2cgZXJyb3IKLQkJCVN0cmluZyBpZCA9Ci0JCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGlkLCAwLCAiSW5zdGFsbEhhbmRsZXIuZGVhY3RpdmF0ZWQiLCBjZSk7CS8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQloYW5kbGVyID0gbnVsbDsgLy8gZGlzYWJsZSBzdWJzZXF1ZW50IGhhbmRsZXIgY2FsbHMKLQkJCXNhdmVkU3RhdHVzID0gc3RhdHVzOwotCQl9IGVsc2UKLQkJCS8vIGZvciAiZG8iIG9wZXJhdGlvbnMsIGh1cmwgLi4uCi0JCQl0aHJvdyBjZTsKLQl9Ci0KLQkvKgotCSAqIGNvbW1vbiBleGNlcHRpb24gaGFuZGxpbmcgZm9yIGNhbGxzIHRvIGluc3RhbGwgaGFuZGxlcgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb25JbkNhbGwoVGhyb3dhYmxlIGUsIElGZWF0dXJlIGZlYXR1cmUpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlDb3JlRXhjZXB0aW9uIGNlOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0JCQljZSA9IChDb3JlRXhjZXB0aW9uKSBlOwotCQllbHNlCi0JCQljZSA9Ci0JCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCVBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci5jYWxsRXhjZXB0aW9uIiwgZmVhdHVyZS5nZXRMYWJlbCgpKSwgLy8kTk9OLU5MUy0xJAotCQkJCQllKTsKLQkJCi0JCWlmIChpc1VuZG9BY3Rpb24oKSkgewotCQkJLy8gZm9yICJ1bmRvIiBvcGVyYXRpb25zLCBkZWFjdGl2YXRlIGhhbmRsZXIgYW5kIGxvZyBlcnJvcgotCQkJU3RyaW5nIGlkID0KLQkJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgaWQsIDAsICJJbnN0YWxsSGFuZGxlci5kZWFjdGl2YXRlZCIsIGNlKTsJLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCWhhbmRsZXIgPSBudWxsOyAvLyBkaXNhYmxlIHN1YnNlcXVlbnQgaGFuZGxlciBjYWxscwotCQkJc2F2ZWRTdGF0dXMgPSBzdGF0dXM7Ci0JCX0gZWxzZQotCQkJLy8gZm9yICJkbyIgb3BlcmF0aW9ucywgaHVybCAuLi4KLQkJCXRocm93IGNlOwotCX0KLQotCS8qCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGRvaW5nIChpbnN0YWxsLCBjb25maWd1cmUpIG9yIAotCSAqIHVuZG9pbmcgKHVuaW5zdGFsbCwgdW5jb25maWd1cmUpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5kb0FjdGlvbigpIHsKLQkJaWYgKHRoaXMudHlwZSA9PSBJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fSU5TVEFMTAotCQkJfHwgdGhpcy50eXBlID09IElJbnN0YWxsSGFuZGxlci5IQU5ETEVSX0FDVElPTl9DT05GSUdVUkUpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGNhdXNlcyBleGNlcHRpb24gdG8gYmUgdGhyb3duIGFuZCBhY3Rpb24gYWJvcnRlZAotCQllbHNlCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gY2F1c2VzIGV4Y2VwdGlvbiB0byBiZSBsb2dnZWQgYW5kIGFjdGlvbiBjb250aW51ZXMKLQl9Ci0KLQkvKgotCSAqIGdldCBhbiBpbnN0YW5jZSBvZiBoYW5kbGVyIGRvd25sb2FkZWQgYXMgcGFydCBvZiB0aGUgZmVhdHVyZQotCSAqLwotCXByaXZhdGUgSUluc3RhbGxIYW5kbGVyIGdldExvY2FsSGFuZGxlcihTdHJpbmcgbGliLCBTdHJpbmcgbmFtZSkKLQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gR2V0IGJhc2VsaW5lIFVSTCBmb3IgaGFuZGxlciAocmVsYXRpdmUgdG8gZmVhdHVyZS54bWwpLiBGb3IKLQkJLy8gZmVhdHVyZXMgYmVpbmcgaW5zdGFsbGVkIGZyb20gYSBzZXJ2ZXIgKGVnLiBodHRwIHByb3RvY29sKQotCQkvLyB0aGUgVVJMIHdpbGwgbW9zdCBsaWtlbHkgYmUgdG8gYSBsb2NhbCBmaWxlIGNvcHkgY29udGFpbmluZyB0aGUKLQkJLy8gdW5wYWNrZWQgZmVhdHVyZSBqYXIuCi0JCUNvbnRlbnRSZWZlcmVuY2UgYmFzZVJlZiA9Ci0JCQlmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UobnVsbCk7Ci0JCVVSTCBiYXNlID0gbnVsbDsKLQkJaWYgKGJhc2VSZWYgIT0gbnVsbCkKLQkJCWJhc2UgPSBiYXNlUmVmLmFzVVJMKCk7Ci0JCWlmIChiYXNlID09IG51bGwpCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlQb2xpY3kuYmluZCgiSW5zdGFsbEhhbmRsZXIudW5hYmxlVG9DcmVhdGVIYW5kbGVyIiwgdGhpcy5mZWF0dXJlLmdldExhYmVsKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJbnVsbCk7Ci0KLQotCQkvLyBkZXRlcm1pbmUgbG9hZGVyIGNsYXNzIHBhdGgKLQkJVVJMIGNwID0gbmV3IFVSTChiYXNlLCBsaWIpOwotCQlpZiAodGhpcy50eXBlID09IElJbnN0YWxsSGFuZGxlci5IQU5ETEVSX0FDVElPTl9VTklOU1RBTEwpIHsKLQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBkb2luZyB1bmluc3RhbGwKLQkJCS8vIC4uLiBuZWVkIHRvIG1ha2UgdGVtcCBjb3B5IG9mIGxpYnJhcnkgKGJlaW5nIHJlbW92ZWQpCi0JCQlGaWxlIHRlbXBMaWIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0bXAiLCAiLmphciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRlbXBMaWIuZGVsZXRlT25FeGl0KCk7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBMaWIpOwotCQkJCWlzID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQoY3ApLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJVXRpbGl0aWVzLmNvcHkoaXMsIGZvcywgbnVsbCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChmb3MgIT0gbnVsbCkKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvcy5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlpcy5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQl9Ci0JCQljcCA9IHRlbXBMaWIudG9VUkwoKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBjbGFzcyBsb2FkZXIsIGxvYWQgYW5kIGluc3RhbnRpYXRlIGhhbmRsZXIKLQkJVVJMQ2xhc3NMb2FkZXIgbG9hZGVyID0KLQkJCW5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyBjcCB9LCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCUNsYXNzIGNsYXp6ID0gbG9hZGVyLmxvYWRDbGFzcyhuYW1lKTsKLQkJSUluc3RhbGxIYW5kbGVyIGhhbmRsZXIgPSAoSUluc3RhbGxIYW5kbGVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKgotCSAqIGdldCBpbnN0YW5jZSBvZiBnbG9iYWwgaGFuZGxlciByZWdpc3RlcmVkIHZpYSBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwcml2YXRlIElJbnN0YWxsSGFuZGxlciBnZXRHbG9iYWxIYW5kbGVyKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaGFuZGxlckV4dGVuc2lvbiA9Ci0JCQlyZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKEVYVF9QTFVHSU4sIEVYVF9QT0lOVCwgbmFtZSk7Ci0JCWlmIChoYW5kbGVyRXh0ZW5zaW9uID09IG51bGwgfHwgaGFuZGxlckV4dGVuc2lvbi5sZW5ndGggPD0gMCkKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCVBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci51bmFibGVUb0NyZWF0ZUhhbmRsZXIiLCB0aGlzLmZlYXR1cmUuZ2V0TGFiZWwoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQludWxsKTsKLQotCQlyZXR1cm4gKElJbnN0YWxsSGFuZGxlcikgaGFuZGxlckV4dGVuc2lvblswXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgcykgewotCQlTdHJpbmcgcGZ4ID0gKGZlYXR1cmU9PW51bGwpID8gIiIgOiBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFsbEhhbmRsZXJbIitwZngrIl06ICIgKyBzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsTG9nUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxMb2dQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0ZTA5MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxMb2dQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLQotCi0vKioKLSAqIFBhcnNlcyB0aGUgaW5zdGFsbGF0aW9uIGxvZyBhbmQgY3JlYXRlcyBpbnN0YWxsYXRpb24gY29uZmlndXJhdGlvbiBvYmplY3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsTG9nUGFyc2VyIHsKLQlwcml2YXRlIElQYXRoIGxvZ1BhdGg7Ci0JcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBidWZmUmVhZDsKLQlwcml2YXRlIEluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWd1cmF0aW9uOwotCXByaXZhdGUgSGFzaE1hcCBpbnN0YWxsQ29uZmlnTWFwOwotCXByaXZhdGUgQ29tcGFyYXRvciBjb21wYXJhdG9yOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0lOU1RBTEwgPSAiZmVhdHVyZS1pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1JFTU9WRSA9ICJmZWF0dXJlLXJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9JTlNUQUxMID0gInNpdGUtaW5zdGFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9SRU1PVkUgPSAic2l0ZS1yZW1vdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ09ORklHVVJFID0gImZlYXR1cmUtZGlzYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJFID0gImZlYXR1cmUtZW5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZFUlQgPSAicmV2ZXJ0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNPTkNJTElBVElPTiA9ICJyZWNvbmNpbGlhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VSVkVEID0gInByZXNlcnZlLWNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWSA9ICIhQUNUSVZJVFkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VDQ0VTUyA9ICJzdWNjZXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkUgPSAiZmFpbHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCXB1YmxpYyBJbnN0YWxsTG9nUGFyc2VyKCl7Ci0JCVN0cmluZyBsb2MgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkuZ2V0RmlsZSgpOwotCQlsb2dQYXRoID0gbmV3IFBhdGgobG9jKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKCJpbnN0YWxsLmxvZyIpOyAgLy8kTk9OLU5MUy0xJAotCQlpbnN0YWxsQ29uZmlnTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdHJ5IHsKLQkJCUluc3RhbGxDb25maWd1cmF0aW9uW10gY29uZmlncyA9IChJbnN0YWxsQ29uZmlndXJhdGlvbltdKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCk7Ci0JCQlmb3IgKGludCBpPTA7aTxjb25maWdzLmxlbmd0aDsgaSsrKXsKLQkJCQlpZiAoIWNvbmZpZ3NbaV0uaXNDdXJyZW50KCkpCi0JCQkJCWluc3RhbGxDb25maWdNYXAucHV0KG5ldyBMb25nKGNvbmZpZ3NbaV0uZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpKSwgY29uZmlnc1tpXSk7Ci0JCQl9Ci0JCQkvLyBOZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGNvbmZpZyBpbnN0ZWFkCi0JCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWdDb3B5KChJbnN0YWxsQ29uZmlndXJhdGlvbilTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKTsKLQkJCWluc3RhbGxDb25maWdNYXAucHV0KG5ldyBMb25nKGNvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCkpLCBjb25maWcpOwotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9Ci0JCWNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJRGF0ZSBkYXRlMSA9ICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pZTEpLmdldENyZWF0aW9uRGF0ZSgpOwotCQkJCURhdGUgZGF0ZTIgPSAoKEluc3RhbGxDb25maWd1cmF0aW9uKWUyKS5nZXRDcmVhdGlvbkRhdGUoKTsKLQkJCQlyZXR1cm4gZGF0ZTEuYmVmb3JlKGRhdGUyKSA/IDEgOiAtMTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRDb25maWdDb3B5KEluc3RhbGxDb25maWd1cmF0aW9uIG9yaWdDb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb257Ci0JCUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBJbnN0YWxsQ29uZmlndXJhdGlvbihvcmlnQ29uZmlnLCBvcmlnQ29uZmlnLmdldFVSTCgpLCBvcmlnQ29uZmlnLmdldExhYmVsKCkgKTsKLQkJY29uZmlnLnNldENyZWF0aW9uRGF0ZShvcmlnQ29uZmlnLmdldENyZWF0aW9uRGF0ZSgpKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JcHVibGljIHZvaWQgcGFyc2VJbnN0YWxsYXRpb25Mb2coKXsKLQkJdHJ5IHsKLQkJCW9wZW5Mb2coKTsKLQkJCXBhcnNlTG9nKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJY2xvc2VMb2coKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3BlbkxvZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWJ1ZmZSZWFkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGxvZ1BhdGgudG9PU1N0cmluZygpKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvd0NvcmVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRocm93Q29yZUV4Y2VwdGlvbihUaHJvd2FibGUgZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCW5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQlVcGRhdGVVdGlscy5nZXRQbHVnaW5JZCgpLAotCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJUG9saWN5LmJpbmQoIkluc3RhbGxMb2dQYXJzZXIuZXJyb3JzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQllKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYXJzZUxvZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gCQkuaW5zdGFsbC1sb2cgdGVtcGxhdGUKLQkJLy8JCSFDT05GSUdVUkFUSU9OIDxjb25maWd1cmF0aW9uLWRhdGU+Ci0JCS8vCQkhQUNUSVZJVFkgPGRhdGU+IDx0YXJnZXQ+IDxhY3Rpb24+IDxzdGF0dXM+Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyB0eXBlLCBzdGF0dXMsIGFjdGlvbjsKLQkJCVN0cmluZ1Rva2VuaXplciBodG1sQ29kZTsKLQotCQkJd2hpbGUgKGJ1ZmZSZWFkLnJlYWR5KCkpIHsKLQotCQkJCWh0bWxDb2RlID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmUmVhZC5yZWFkTGluZSgpKTsKLQkJCQl3aGlsZSAoIShodG1sQ29kZS5oYXNNb3JlRWxlbWVudHMoKSkpIHsKLQkJCQkJaWYgKCFidWZmUmVhZC5yZWFkeSgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlodG1sQ29kZSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnVmZlJlYWQucmVhZExpbmUoKSk7Ci0JCQkJfQotCi0JCQkJdHlwZSA9IGh0bWxDb2RlLm5leHRUb2tlbigpLnRyaW0oKTsKLQotCQkJCWlmICh0eXBlLmVxdWFscyhBQ1RJVklUWSkpIHsKLQkJCQkJU3RyaW5nIHRpbWUgPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKLQkJCQkJU3RyaW5nIGRhdGU7Ci0JCQkJCVN0cmluZ0J1ZmZlciB0YXJnZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWRhdGUgPSBodG1sQ29kZS5uZXh0VG9rZW4oIi4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJaHRtbENvZGUubmV4dFRva2VuKCIgIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCXdoaWxlIChodG1sQ29kZS5jb3VudFRva2VucygpID4gMil7Ci0JCQkJCQl0YXJnZXQuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRhcmdldC5hcHBlbmQoaHRtbENvZGUubmV4dFRva2VuKCkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlhY3Rpb24gPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKLQkJCQkJc3RhdHVzID0gaHRtbENvZGUubmV4dFRva2VuKCk7Ci0JCQkJCWNyZWF0ZUFjdGl2aXR5KGFjdGlvbiwgdGltZSwgZGF0ZSwgc3RhdHVzLCB0YXJnZXQudG9TdHJpbmcoKSwgY3VycmVudENvbmZpZ3VyYXRpb24pOwotCQkJCX0gIGVsc2UgewotCQkJCQlTdHJpbmcgdGltZSA9IGh0bWxDb2RlLm5leHRUb2tlbigpOwotCQkJCQlTdHJpbmdCdWZmZXIgZGF0ZTsKLQkJCQkJZGF0ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJd2hpbGUgKGh0bWxDb2RlLmNvdW50VG9rZW5zKCkgPiAwKXsKLQkJCQkJCWlmIChkYXRlLmxlbmd0aCgpICE9IDApCi0JCQkJCQkJZGF0ZS5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZGF0ZS5hcHBlbmQoaHRtbENvZGUubmV4dFRva2VuKCkpOwotCQkJCQl9Ci0JCQkJCWN1cnJlbnRDb25maWd1cmF0aW9uID0gKEluc3RhbGxDb25maWd1cmF0aW9uKWluc3RhbGxDb25maWdNYXAuZ2V0KG5ldyBMb25nKHRpbWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvd0NvcmVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNsb3NlTG9nKCkgewotCQl0cnkgewotCQkJaWYgKGJ1ZmZSZWFkICE9IG51bGwpCi0JCQkJYnVmZlJlYWQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJYnVmZlJlYWQgPSBudWxsOwotCQl9Ci0JfQotCXByaXZhdGUgSUFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KFN0cmluZyBhY3Rpb24sIFN0cmluZyB0aW1lLCBTdHJpbmcgZGF0ZSwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIHRhcmdldCwgSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKXsKLQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGEgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KCk7Ci0KLQkJaW50IGNvZGUgPSAwOwotCQlpZiAoRkVBVFVSRV9JTlNUQUxMLmVxdWFscyhhY3Rpb24pKQotCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9JTlNUQUxMOwotCQllbHNlIGlmIChGRUFUVVJFX1JFTU9WRS5lcXVhbHMoYWN0aW9uKSkKLQkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfUkVNT1ZFOwotCQllbHNlIGlmIChTSVRFX0lOU1RBTEwuZXF1YWxzKGFjdGlvbikpCi0JCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9TSVRFX0lOU1RBTEw7Ci0JCWVsc2UgaWYgKFNJVEVfUkVNT1ZFLmVxdWFscyhhY3Rpb24pKQotCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fU0lURV9SRU1PVkU7Ci0JCWVsc2UgaWYgKFVOQ09ORklHVVJFLmVxdWFscyhhY3Rpb24pKQotCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fVU5DT05GSUdVUkU7Ci0JCWVsc2UgaWYgKENPTkZJR1VSRS5lcXVhbHMoYWN0aW9uKSkKLQkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRTsKLQkJZWxzZSBpZiAoUkVWRVJULmVxdWFscyhhY3Rpb24pKQotCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fUkVWRVJUOwotCQllbHNlIGlmIChSRUNPTkNJTElBVElPTi5lcXVhbHMoYWN0aW9uKSkKLQkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX1JFQ09OQ0lMSUFUSU9OOwotCQllbHNlIGlmIChQUkVTRVJWRUQuZXF1YWxzKGFjdGlvbikpCi0JCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9BRERfUFJFU0VSVkVEOwotCQkKLQkJYS5zZXRBY3Rpb24oY29kZSk7Ci0JCXRyeSB7Ci0JCQlsb25nIGFjdGl2aXR5VGltZSA9IExvbmcucGFyc2VMb25nKHRpbWUpOwotCQkJYS5zZXREYXRlKG5ldyBEYXRlKGFjdGl2aXR5VGltZSkpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJYS5zZXREYXRlKG5ldyBEYXRlKGRhdGUpKTsKLQkJfQotCQlhLnNldFN0YXR1cyhTVUNDRVNTLmVxdWFscyhzdGF0dXMpID8gSUFjdGl2aXR5LlNUQVRVU19PSyA6IElBY3Rpdml0eS5TVEFUVVNfTk9LKTsKLQkJYS5zZXRMYWJlbCh0YXJnZXQpOwotCQlhLnNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoY29uZmlnKTsKLQkJCi0JCWlmIChjb25maWcgIT0gbnVsbCAmJiAhY29uZmlnQ29udGFpbnNBY3Rpdml0eShjb25maWcsIGEpKXsKLQkJCWNvbmZpZy5hZGRBY3Rpdml0eShhKTsKLQkJfQotCQkKLQkJcmV0dXJuIGE7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjb25maWdDb250YWluc0FjdGl2aXR5KEluc3RhbGxDb25maWd1cmF0aW9uIGMsIElBY3Rpdml0eSBhKXsKLQkJSUFjdGl2aXR5W10gYWN0aXZpdGllcyA9IGMuZ2V0QWN0aXZpdGllcygpOwotCQlmb3IgKGludCBpID0gMCA7IGk8YWN0aXZpdGllcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoYS5lcXVhbHMoYWN0aXZpdGllc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbltdIGdldENvbmZpZ3VyYXRpb25zKCl7Ci0JCUNvbGxlY3Rpb24gY29uZmlnU2V0ID0gaW5zdGFsbENvbmZpZ01hcC52YWx1ZXMoKTsKLQkJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gKEluc3RhbGxDb25maWd1cmF0aW9uW10pIGNvbmZpZ1NldC50b0FycmF5KG5ldyBJbnN0YWxsQ29uZmlndXJhdGlvbltjb25maWdTZXQuc2l6ZSgpXSk7Ci0JCUFycmF5cy5zb3J0KGNvbmZpZ3MsIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gY29uZmlnczsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxSZWdpc3RyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczODUzZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBLZWVwcyB0cmFjayBvZiBhbGwgdGhlIGZlYXR1cmVzIGFuZCBwbHVnaW5zIGluc3RhbGxlZCBieSBVcGRhdGUgbWdyCi0gKiBzbyB0aGV5IGNhbiBiZSB1bmluc3RhbGxlZCBsYXRlci4KLSAqIFRoZSBpbmZvIGlzIHBlcnNpc3RlZCBpbiB0aGUgLmNvbmZpZy9yZWdpc3RyeSBmaWxlIGFuZCBlYWNoIGVudHJ5IGhhcyBhIGtleT1rZXkgd2hlcmUKLSAqIGZvciBmZWF0dXJlIHRoaXMga2V5IGlzIGZlYXR1cmVfPGlkPl88dmVyc2lvbj4gYW5kIGZvciBwbHVnaW5zCi0gKiBrZXkgaXMgcGx1Z2luXzxpZD5fPHZlcnNpb24+LiBOb3JtYWxseSwgZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpIHdpbGwKLSAqIHJldHVybiA8aWQ+Xzx2ZXJzaW9uPi4gRWc6IGZlYXR1cmVfb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4wLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbFJlZ2lzdHJ5IGV4dGVuZHMgUHJvcGVydGllcyB7Ci0JcHJpdmF0ZSBGaWxlIGZpbGUgPSBudWxsOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSRUdJU1RSWSA9ICJyZWdpc3RyeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBJbnN0YWxsUmVnaXN0cnkgaW5zdGFuY2U7Ci0JCi0JLy8gcGx1Z2lucyBpbnN0YWxsZWQgaW4gdGhpcyBlY2xpcHNlIHNlc3Npb24KLQlwcml2YXRlIEhhc2hNYXAganVzdEluc3RhbGxlZFBsdWdpbnMgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgZW1wdHkgUHJvcGVydGllcy4KLQkgKi8KLQlwcml2YXRlIEluc3RhbGxSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGNvbmZpZ0ZpbGUgPQotCQkJQ29uZmlndXJhdG9yVXRpbHMKLQkJCQkuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpCi0JCQkJLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpCi0JCQkJLmdldEZpbGUoKTsKLQkJZmlsZSA9IG5ldyBGaWxlKGNvbmZpZ0ZpbGUpOwotCQlmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWZpbGUgPSBuZXcgRmlsZShmaWxlLCBSRUdJU1RSWSk7Ci0JCXJlc3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluc3RhbGxSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBJbnN0YWxsUmVnaXN0cnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIGNvbnRlbnRzIG9mIHRoZSBQcm9wZXJ0aWVzIGZyb20gYSBmaWxlLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBwZXJzaXN0YW50IGRhdGEgd2FzIHJlYWQgaW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCWNsZWFyKCk7Ci0JCS8vIFRlc3QgaWYgd2UgaGF2ZSBhIGNvbnRyaWJ1dGlvbiBmaWxlIHRvIHN0YXJ0IHdpdGgKLQkJLy8gSWYgdGhpcyBpcyBhIGNsZWFuIHN0YXJ0LCB0aGVuIHdlIHdpbGwgbm90IGhhdmUgYSAKLQkJLy8gY29udHJpYnV0aW9uIGZpbGUuIHJldHVybiBmYWxzZS4KLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIGxvYWRlZDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCXN1cGVyLmxvYWQoaW4pOwotCQkJbG9hZGVkID0gdHJ1ZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGxvYWRlZDsKLQl9Ci0JLyoqCi0JICogU2F2ZXMgY29udGVudHMgb2YgdGhlIHRhYmxlIHRvIGEgZmlsZS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNhdmUoKSB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQl0cnkgewotCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQlzdXBlci5zdG9yZShvdXQsICJUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0LiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXQgPSB0cnVlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG91dCAhPSBudWxsKSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlcnMgYW4gaW5zdGFsbGVkIGZlYXR1cmUgc28gaXQgY2FuIGJlIHVuaW5zdGFsbGVkIGxhdGVyLgotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUgdG8gcmVnaXN0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3RlckZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlTdHJpbmcgbmFtZSA9ICJmZWF0dXJlXyIrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldChuYW1lKSA9PSBudWxsKSB7Ci0JCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5wdXQobmFtZSwgbmFtZSk7Ci0JCQkvLyB3ZSBzYXZlIGFmdGVyIGVhY2ggcmVnaXN0cmF0aW9uCi0JCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5zYXZlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGluc3RhbGxlZCBmZWF0dXJlIHNvIGl0IGNhbiBiZSB1bmluc3RhbGxlZCBsYXRlci4KLQkgKiBAcGFyYW0gcGx1Z2luRW50cnkgcGx1Z2luIHRvIHJlZ2lzdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXJQbHVnaW4oSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7Ci0JCVN0cmluZyBuYW1lID0gInBsdWdpbl8iK3BsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0KG5hbWUpID09IG51bGwpIHsKLQkJCUluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnB1dChuYW1lLCBuYW1lKTsKLQkJCS8vIHdlIHNhdmUgYWZ0ZXIgZWFjaCByZWdpc3RyYXRpb24KLQkJCUluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnNhdmUoKTsKLQkJfQotCQkKLQkJLy8gYWRkIHBsdWdpbiB0byB0aGUgbGlzdCBvZiBqdXN0IGluc3RhbGxlZCBwbHVnaW5zIC4KLQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuanVzdEluc3RhbGxlZFBsdWdpbnMucHV0KG5hbWUsbmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgc3BlY2lmaWVkIGZlYXR1cmUgZnJvbSByZWdpc3RyeQotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bnJlZ2lzdGVyRmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCVN0cmluZyBuYW1lID0gImZlYXR1cmVfIitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsgLy8kTk9OLU5MUy0xJAotCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZW1vdmUobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgc3BlY2lmaWVkIHBsdWdpbiBmcm9tIHJlZ2lzdHJ5Ci0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHVucmVnaXN0ZXJQbHVnaW4oSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7Ci0JCVN0cmluZyBuYW1lID0gInBsdWdpbl8iK3BsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsgLy8kTk9OLU5MUy0xJAotCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZW1vdmUobmFtZSk7Ci0JCQotCQkvLyByZW1vdmUgdGhlIHBsdWdpbiBmcm9tIHRoZSBsaXN0IG9mIGp1c3QgaW5zdGFsbGVkIHBsdWdpbnMgKGlmIG5lZWRlZCkuCi0JCUluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmp1c3RJbnN0YWxsZWRQbHVnaW5zLnJlbW92ZShuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwbHVnaW4gd2FzIGluc3RhbGxlZCBkdXJpbmcgdGhpcyBlY2xpcHNlIHNlc3Npb24KLQkgKiBAcGFyYW0gcGx1Z2luRW50cnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQbHVnaW5KdXN0SW5zdGFsbGVkKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewotCQlTdHJpbmcgbmFtZSA9ICJwbHVnaW5fIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmp1c3RJbnN0YWxsZWRQbHVnaW5zLmdldChuYW1lKSAhPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIHVwZGF0ZSBKVW5pdCB0ZXN0cy4KLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhbnVwKCkgewotCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5qdXN0SW5zdGFsbGVkUGx1Z2lucy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW50ZXJuYWxTaXRlTWFuYWdlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnRlcm5hbFNpdGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYzNjOTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnRlcm5hbFNpdGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotDQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbFNpdGVNYW5hZ2VyIHsNCi0NCi0JcHVibGljIHN0YXRpYyBJTG9jYWxTaXRlIGxvY2FsU2l0ZTsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TSVRFX1RZUEUgPSBTaXRlVVJMQ29udGVudFByb3ZpZGVyLlNJVEVfVFlQRTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhFQ1VUQUJMRV9TSVRFX1RZUEUgPSBTaXRlRmlsZUNvbnRlbnRQcm92aWRlci5TSVRFX1RZUEU7DQotDQotCXByaXZhdGUgc3RhdGljIE1hcCBlc3RpbWF0ZXM7DQotDQotCS8vIGNhY2hlIGZvdW5kIHNpdGVzDQotCXByaXZhdGUgc3RhdGljIE1hcCBzaXRlcyA9IG5ldyBIYXNoTWFwKCk7DQotCS8vIGNhY2hlIHRpbWVzdGFtcHMNCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHNpdGVUaW1lc3RhbXBzID0gbmV3IEhhc2hNYXAoKTsNCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdsb2JhbFVzZUNhY2hlID0gdHJ1ZTsNCi0NCi0JLy8gdHJ1ZSBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCBjcmVhdGluZyBsb2NhbFNpdGUNCi0JLy8gc28gd2UgY2FjaGUgaXQgYW5kIGRvbid0IGF0dGVtcHQgdG8gY3JlYXRlIGl0IGFnYWluDQotCXByaXZhdGUgc3RhdGljIENvcmVFeGNlcHRpb24gZXhjZXB0aW9uT2NjdXJlZCA9IG51bGw7DQotDQotCS8qDQotCSAqIEBzZWUgU2l0ZU1hbmFnZXIjZ2V0TG9jYWxTaXRlKCkNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUxvY2FsU2l0ZSBnZXRMb2NhbFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gaW50ZXJuYWxHZXRMb2NhbFNpdGUoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBJbnRlcm5hbCBjYWxsIGlmIG9wdGltaXN0aWMgcmVjb25jaWxpYXRpb24gbmVlZGVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBJTG9jYWxTaXRlIGludGVybmFsR2V0TG9jYWxTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gaWYgYW4gZXhjZXB0aW9uIG9jY3VyZWQgd2hpbGUgcmV0cmlldmluZyB0aGUgU2l0ZQ0KLQkJLy8gcmV0aHJvdyBpdA0KLQkJaWYgKGV4Y2VwdGlvbk9jY3VyZWQgIT0gbnVsbCkNCi0JCQl0aHJvdyBleGNlcHRpb25PY2N1cmVkOw0KLQ0KLQkJaWYgKGxvY2FsU2l0ZSA9PSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJbG9jYWxTaXRlID0gU2l0ZUxvY2FsLmludGVybmFsR2V0TG9jYWxTaXRlKCk7DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCWV4Y2VwdGlvbk9jY3VyZWQgPSBlOw0KLQkJCQl0aHJvdyBlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBsb2NhbFNpdGU7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENhY2hlZFNpdGUoVVJMIHNpdGVVUkwpIHsNCi0JCWlmICghc2l0ZXMuY29udGFpbnNLZXkoc2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQkJDQotCQlMb25nIHRpbWVzdGFtcCA9IChMb25nKXNpdGVUaW1lc3RhbXBzLmdldChzaXRlVVJMKTsNCi0JCWlmICh0aW1lc3RhbXAgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlsb25nIGxvY2FsTGFzdE1vZGlmaWVkID0gdGltZXN0YW1wLmxvbmdWYWx1ZSgpOw0KLQkJDQotCQlyZXR1cm4gVXBkYXRlTWFuYWdlclV0aWxzLmlzU2FtZVRpbWVzdGFtcChzaXRlVVJMLCBsb2NhbExhc3RNb2RpZmllZCk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJTG9jYWxTaXRlI2dldFNpdGUoVVJMKQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU2l0ZSBnZXRTaXRlKFVSTCBzaXRlVVJMLCBib29sZWFuIHVzZUNhY2hlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUlTaXRlIHNpdGUgPSBudWxsOw0KLQkJaWYgKG1vbml0b3I9PW51bGwpIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQ0KLQkJaWYgKHNpdGVVUkwgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0NCi0JCS8vIHVzZSBjYWNoZSBpZiBzZXQgdXAgZ2xvYmFsbHkgKGdsb2JhbFVzZUNhY2hlPXRydWUpDQotCQkvLyBhbmQgcGFzc2VkIGFzIHBhcmFtZXRlciAodXNlQ2FjaGU9dHJ1ZSkNCi0JCVN0cmluZyBzaXRlVVJMU3RyaW5nID0gc2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpOw0KLQkJaWYgKCh1c2VDYWNoZSAmJiBnbG9iYWxVc2VDYWNoZSkgJiYgaXNWYWxpZENhY2hlZFNpdGUoc2l0ZVVSTCkpIHsNCi0JCQlzaXRlID0gKElTaXRlKSBzaXRlcy5nZXQoc2l0ZVVSTFN0cmluZyk7DQotCQkJcmV0dXJuIHNpdGU7DQotCQl9DQotCQkNCi0JCS8vIHRyeSBhZGRpbmcgImVjbGlwc2UiIHRvIHRoZSBzaXRlIHVybCwgaW4gY2FzZSB0aGlzIGlzIGFuIGV4dGVuc2lvbiBzaXRlDQotCQlpZiAoImZpbGUiLmVxdWFscyhzaXRlVVJMLmdldFByb3RvY29sKCkpICkgeyAvLyROT04tTkxTLTEkDQotCQkJRmlsZSBmID0gbmV3IEZpbGUoc2l0ZVVSTC5nZXRGaWxlKCkpOw0KLQkJCWlmIChmLmlzRGlyZWN0b3J5KCkgJiYgISJlY2xpcHNlIi5lcXVhbHMoZi5nZXROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJZiA9IG5ldyBGaWxlKGYsICJlY2xpcHNlIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJdHJ5IHsNCi0JCQkJCWlmICgodXNlQ2FjaGUgJiYgZ2xvYmFsVXNlQ2FjaGUpICYmIGlzVmFsaWRDYWNoZWRTaXRlKGYudG9VUkwoKSkpIHsNCi0JCQkJCQlzaXRlID0gKElTaXRlKSBzaXRlcy5nZXQoZi50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJCQkJCXJldHVybiBzaXRlOw0KLQkJCQkJfQ0KLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCQl9CQ0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGNvbnNpZGVyIGZpbGUgcHJvdG9jb2wgYWxzbyBpZiB0aGUgVVJMIHBvaW50cyB0byBhIGRpcmVjdG9yeQ0KLQkJLy8gYW5kIG5vIHNpdGUueG1sIGV4aXN0DQotCQkvLyBpZiB0aGUgdXNlciBwb2ludHMgdG8gYSBmaWxlLCBjb25zaWRlciBERUZBVUxUX1NJVEVfVFlQRQ0KLQkJLy8gc2l0ZS54bWwgd2lsbCBoYXZlIHRvIHNwZWNpZnkgdGhlIHR5cGUNCi0JCWJvb2xlYW4gZmlsZVByb3RvY29sID0gImZpbGUiLmVxdWFsc0lnbm9yZUNhc2Uoc2l0ZVVSTC5nZXRQcm90b2NvbCgpKTsgLy8kTk9OLU5MUy0xJA0KLQkJYm9vbGVhbiBkaXJlY3RvcnlFeGlzdHMgPSBmYWxzZTsNCi0JCWlmIChmaWxlUHJvdG9jb2wpIHsNCi0JCQlGaWxlIGRpcjsNCi0JCQlkaXIgPSBuZXcgRmlsZShzaXRlVVJMLmdldEZpbGUoKSk7DQotCQkJaWYgKGRpciAhPSBudWxsICYmIGRpci5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCWlmICghKG5ldyBGaWxlKGRpciwgU2l0ZS5TSVRFX1hNTCkuZXhpc3RzKCkpKQ0KLQkJCQkJZGlyZWN0b3J5RXhpc3RzID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQkvL1BFUkY6IGlmIGZpbGU6IDxwYXRoPi8gYW5kIGRpcmVjdG9yeSBleGlzdHMgdGhlbiBjb25zaWRlciBleGVjdXRhYmxlDQotCQltb25pdG9yLmJlZ2luVGFzayhQb2xpY3kuYmluZCgiSW50ZXJuYWxTaXRlTWFuYWdlci5Db25uZWN0aW5nVG9TaXRlIiksIDgpOyAvLyROT04tTkxTLTEkDQotCQlpZiAoZmlsZVByb3RvY29sICYmIGRpcmVjdG9yeUV4aXN0cykgew0KLQkJCXNpdGUgPSBhdHRlbXB0Q3JlYXRlU2l0ZShERUZBVUxUX0VYRUNVVEFCTEVfU0lURV9UWVBFLCBzaXRlVVJMLCBtb25pdG9yKTsNCi0JCQltb25pdG9yLndvcmtlZCg0KTsgLy8gb25seSBvbmUgYXR0ZW1wdA0KLQkJfSBlbHNlIHsNCi0JCQl0cnkgew0KLQkJCQltb25pdG9yLndvcmtlZCgzKTsNCi0JCQkJc2l0ZSA9IGF0dGVtcHRDcmVhdGVTaXRlKERFRkFVTFRfU0lURV9UWVBFLCBzaXRlVVJMLCBtb25pdG9yKTsNCi0JCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBwcmVzZXJ2ZWRFeGNlcHRpb24pIHsNCi0JCQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJLy8gYXR0ZW1wdCBhIHJldHJ5IGlzIHRoZSBwcm90b2NvbCBpcyBmaWxlLCB3aXRoIGV4ZWN1dGJhbGUgdHlwZQ0KLQkJCQkJaWYgKCFmaWxlUHJvdG9jb2wpDQotCQkJCQkJdGhyb3cgcHJlc2VydmVkRXhjZXB0aW9uOw0KLQ0KLQkJCQkJdHJ5IHsNCi0JCQkJCQlzaXRlID0gYXR0ZW1wdENyZWF0ZVNpdGUoREVGQVVMVF9FWEVDVVRBQkxFX1NJVEVfVFlQRSwgc2l0ZVVSTCwgbW9uaXRvcik7DQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHJldHJ5RXhjZXB0aW9uKSB7DQotCQkJCQkJSVN0YXR1cyBmaXJzdFN0YXR1cyA9IHByZXNlcnZlZEV4Y2VwdGlvbi5nZXRTdGF0dXMoKTsNCi0JCQkJCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhmaXJzdFN0YXR1cy5nZXRQbHVnaW4oKSwgSVN0YXR1cy5PSywgUG9saWN5LmJpbmQoIkludGVybmFsU2l0ZU1hbmFnZXIuRmFpbGVkUmV0cnlBY2Nlc3NpbmdTaXRlIiksIHJldHJ5RXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCW11bHRpLmFkZEFsbChmaXJzdFN0YXR1cyk7DQotCQkJCQkJdGhyb3cgcHJlc2VydmVkRXhjZXB0aW9uOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKHNpdGUgIT0gbnVsbCkgew0KLQkJCXNpdGVzLnB1dChzaXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCksIHNpdGUpOw0KLQkJCXRyeSB7DQotCQkJCVJlc3BvbnNlIHJlc3BvbnNlID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQoVVJMRW5jb2Rlci5lbmNvZGUoc2l0ZVVSTCkpOw0KLQkJCQlzaXRlVGltZXN0YW1wcy5wdXQoc2l0ZVVSTCwgbmV3IExvbmcocmVzcG9uc2UuZ2V0TGFzdE1vZGlmaWVkKCkpKTsNCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl9DQotCQl9DQotDQotCQkvL2ZsdXNoIHRoZSBKYXJGaWxlIHdlIG1heSBob2xkIG9uIHRvDQotCQkvLyB3ZSBrZWVwIHRoZSB0ZW1wIG5vdCB0byBjcmVhdGUgdGhlbSBhZ2Fpbg0KLQkJSmFyQ29udGVudFJlZmVyZW5jZS5zaHV0ZG93bigpOyAvLyBtYWtlIHN1cmUgd2UgYXJlIG5vdCBsZWF2aW5nIGphcnMgb3BlbiBmb3IgdGhpcyBzaXRlDQotDQotCQkvL2ZsdXNoIG1hcHBpbmcgb2YgZG93bmxvYWRlZCBKQVIgZmlsZXMNCi0JCS8vIEZJWE1FIDogcHJvdmlkZSBiZXR0ZXIgY2FjaGUgZmx1c2hpbmcgYWZ0ZXIgMi4xDQotCQkvLyBGSVhFRDogZXZlcnl0aGluZyBkb3dubG9hZGVkIGlzIGNhY2hlZCBhbmQgdGltZXN0YW1wZWQuDQotCQkvLyAgICAgICAgVGltZXN0YW1wcyBhcmUgY29tcGFyZWQgdG8gbGFzdE1vZGlmZWQgb24gdGhlIHNlcnZlcg0KLQkJLy8gICAgICAgIGFuZCB3ZSBkb3dubG9hZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBkaWZmZXJlbmMNCi0JCS8vIFV0aWxpdGllcy5mbHVzaExvY2FsRmlsZSgpOw0KLQ0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0JLyoNCi0JICogQXR0ZW1wdCB0byBjcmVhdGUgYSBzaXRlDQotCSAqIGlmIHRoZSBzaXRlIGd1ZXNzZWQgaXMgbm90IHRoZSB0eXBlIGZvdW5kLA0KLQkgKiBhdHRlbXB0IHRvIGNyZWF0ZSBhIHR5cGUgd2l0aCB0aGUgdHlwZSBmb3VuZCBpbiB0aGUgc2l0ZS54bWwNCi0JICovDQotCXByaXZhdGUgc3RhdGljIElTaXRlIGF0dGVtcHRDcmVhdGVTaXRlKFN0cmluZyBndWVzc2VkVHlwZVNpdGUsIFVSTCBzaXRlVVJMLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChtb25pdG9yID09IG51bGwpIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQkJSVNpdGUgc2l0ZSA9IG51bGw7DQotDQotCQl0cnkgew0KLQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCXNpdGUgPSBjcmVhdGVTaXRlKGd1ZXNzZWRUeXBlU2l0ZSwgc2l0ZVVSTCwgbW9uaXRvcik7DQotCQkJbW9uaXRvci53b3JrZWQoMSk7IC8vIGlmIG5vIGVycm9yLCBvY2N1cnMgdGhlIHJldHJ5IGJyYW5jaCBkb2Vzbid0IG5lZWQgdG8gYmUgZXhlY3V0ZWQNCi0JCX0gY2F0Y2ggKEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiBlKSB7DQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm4gbnVsbDsNCi0NCi0JCQkvLyB0aGUgdHlwZSBpbiB0aGUgc2l0ZS54bWwgaXMgbm90IHRoZSBvbmUgZXhwZWN0ZWQJDQotCQkJLy8gYXR0ZW1wdCB0byB1c2UgdGhpcyB0eXBlIGluc3RlYWQJDQotCQkJLy9ERUJVRzoNCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfVFlQRSkgew0KLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJUaGUgU2l0ZSA6IiArIHNpdGVVUkwudG9FeHRlcm5hbEZvcm0oKSArICIgaXMgYSBkaWZmZXJlbnQgdHlwZSB0aGFuIHRoZSBndWVzc2VkIHR5cGUgYmFzZWQgb24gdGhlIHByb3RvY29sLiBuZXcgVHlwZToiICsgZS5nZXROZXdUeXBlKCkpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgDQotCQkJfQ0KLQ0KLQkJCXRyeSB7DQotCQkJCWlmIChlLmdldE5ld1R5cGUoKSA9PSBudWxsKQ0KLQkJCQkJdGhyb3cgZTsNCi0JCQkJc2l0ZSA9IGNyZWF0ZVNpdGUoZS5nZXROZXdUeXBlKCksIHNpdGVVUkwsIG1vbml0b3IpOw0KLQkJCX0gY2F0Y2ggKEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0NyZWF0ZVNpdGVXaXRoVHlwZSIsIGUuZ2V0TmV3VHlwZSgpLCBzaXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCkpLCBlMSk7CS8vJE5PTi1OTFMtMSQgDQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0JLyoNCi0JICogY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIElTaXRlDQotCSAqIA0KLQkgKiB0aGUgVVJMIGNhbiBiZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0NCi0JICogMSBwcm90b2NvbDovLy4uLi4uLw0KLQkgKiAyIHByb3RvY29sOi8vLi4uLi4NCi0JICogMyBwcm90b2NvbDovLy4uLi4vc2l0ZS54bWwNCi0JICogNCBwcm90b2NvbDovLy4uLiMuLi4NCi0JICogDQotCSAqIDEgSWYgdGhlIGZpbGUgb2YgdGhlIGZpbGUgb2YgdGVoIHVybCBlbmRzIHdpdGggJy8nLCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbS4NCi0JICogaWYgaXQgZmFpbHMsIGFkZCBzaXRlLnhtbCBhbmQgYXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0NCi0JICogDQotCSAqIDIgYXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0NCi0JICogCWZhaWwNCi0JICogCQlhZGQgJy9zaXRlLnhtbCcgYW5kIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtDQotCSAqIAlzdWNlc3MNCi0JICogCQlhdHRlbXB0IHRvIHBhcnNlLCBpZiBpdCBmYWlscywgYWRkICcvc2l0ZS54bWwnIGFuZCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQ0KLQkgKiANCi0JICogMyBvcGVuIHRoZSBzdHJlYW0NCi0JICogDQotCSAqIDQgb3BlbiB0aGUgc3RyZWFtCQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgSVNpdGUgY3JlYXRlU2l0ZShTdHJpbmcgc2l0ZVR5cGUsIFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotCQlpZiAobW9uaXRvciA9PSBudWxsKSBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0JCUlTaXRlIHNpdGUgPSBudWxsOw0KLQkJSVNpdGVGYWN0b3J5IGZhY3RvcnkgPSBTaXRlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3J5KHNpdGVUeXBlKTsNCi0NCi0JCXRyeSB7DQotCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJc2l0ZSA9IGNyZWF0ZVNpdGUoZmFjdG9yeSwgdXJsLCBtb25pdG9yKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIG51bGw7DQotDQotCQkJLy8gaWYgdGhlIFVSTCBpcyBwb2ludGluZyB0byBlaXRoZXIgYSBmaWxlIA0KLQkJCS8vIG9yIGEgZGlyZWN0b3J5LCB3aXRob3V0IHJlZmVyZW5jZQkJCQ0KLQkJCWlmICh1cmwuZ2V0UmVmKCkgIT0gbnVsbCkgew0KLQkJCQkvLyA0IG5vdGhpbmcgd2UgY2FuIGRvDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnRlcm5hbFNpdGVNYW5hZ2VyLlVuYWJsZVRvQWNjZXNzVVJMIiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0gZWxzZSBpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJLy8gMSB0cnkgdG8gYWRkIHNpdGUueG1sDQotCQkJCVVSTCB1cmxSZXRyeTsNCi0JCQkJdHJ5IHsNCi0JCQkJCXVybFJldHJ5ID0gbmV3IFVSTCh1cmwsIFNpdGUuU0lURV9YTUwpOw0KLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpIHsNCi0JCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnRlcm5hbFNpdGVNYW5hZ2VyLlVuYWJsZVRvQ3JlYXRlVVJMIiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkgKyAiKyIgKyBTaXRlLlNJVEVfWE1MKSwgZTEpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQkJfQ0KLQkJCQl0cnkgew0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQlzaXRlID0gY3JlYXRlU2l0ZShmYWN0b3J5LCB1cmxSZXRyeSwgbW9uaXRvcik7DQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsNCi0JCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnRlcm5hbFNpdGVNYW5hZ2VyLlVuYWJsZVRvQWNjZXNzVVJMIiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCB1cmwudG9FeHRlcm5hbEZvcm0oKSwgdXJsUmV0cnkudG9FeHRlcm5hbEZvcm0oKSwgZSwgZTEpOy8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCX0gZWxzZSBpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aChTaXRlLlNJVEVfWE1MKSkgew0KLQkJCQkvLyAzIG5vdGhpbmcgd2UgY2FuIGRvDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnRlcm5hbFNpdGVNYW5hZ2VyLlVuYWJsZVRvQWNjZXNzVVJMIiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCBlKTsvLyROT04tTkxTLTEkDQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gMiB0cnkgdG8gYWRkIC9zaXRlLnhtbCANCi0JCQkJVVJMIHVybFJldHJ5Ow0KLQkJCQl0cnkgew0KLQkJCQkJdXJsUmV0cnkgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCB1cmwuZ2V0RmlsZSgpICsgIi8iICsgU2l0ZS5TSVRFX1hNTCk7CS8vJE5PTi1OTFMtMSQNCi0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7DQotCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0NyZWF0ZVVSTCIsIHVybC50b0V4dGVybmFsRm9ybSgpICsgIisiICsgU2l0ZS5TSVRFX1hNTCksIGUxKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJCX0NCi0NCi0JCQkJdHJ5IHsNCi0JCQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCQkJc2l0ZSA9IGNyZWF0ZVNpdGUoZmFjdG9yeSwgdXJsUmV0cnksIG1vbml0b3IpOw0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7DQotCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0FjY2Vzc1VSTCIsIHVybC50b0V4dGVybmFsRm9ybSgpKSwgdXJsLnRvRXh0ZXJuYWxGb3JtKCksIHVybFJldHJ5LnRvRXh0ZXJuYWxGb3JtKCksIGUsIGUxKTsvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gc2l0ZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgSVNpdGUgY3JlYXRlU2l0ZShJU2l0ZUZhY3RvcnkgZmFjdG9yeSwgVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsNCi0JCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgSVNpdGVGYWN0b3J5RXh0ZW5zaW9uKQ0KLQkJCXJldHVybiAoKElTaXRlRmFjdG9yeUV4dGVuc2lvbilmYWN0b3J5KS5jcmVhdGVTaXRlKHVybCwgbW9uaXRvcik7DQotCQllbHNlDQotCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwpOw0KLQl9DQotDQotCS8qDQotCSAqIENyZWF0ZXMgYSBuZXcgc2l0ZSBvbiB0aGUgZmlsZSBzeXN0ZW0NCi0JICogVGhpcyBpcyB0aGUgb25seSBTaXRlIHdlIGNhbiBjcmVhdGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2l0ZUxvY2F0aW9uDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU2l0ZSBjcmVhdGVTaXRlKEZpbGUgc2l0ZUxvY2F0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJU2l0ZSBzaXRlID0gbnVsbDsNCi0JCWlmIChzaXRlTG9jYXRpb24gIT0gbnVsbCkgew0KLQkJCXRyeSB7DQotCQkJCVVSTCBzaXRlVVJMID0gc2l0ZUxvY2F0aW9uLnRvVVJMKCk7DQotCQkJCXNpdGUgPSBnZXRTaXRlKHNpdGVVUkwsIGZhbHNlLCBudWxsKTsNCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0NyZWF0ZVVSTCIsIHNpdGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSksIGUpOwkvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIE1ldGhvZCBkb3dubG9hZGVkLg0KLQkgKiBAcGFyYW0gZG93bmxvYWRTaXplIHNpemUgZG93bmxvYWRlZCBpbiBieXRlcw0KLQkgKiBAcGFyYW0gdGltZSB0aW1lIGluIHNlY29uZHMNCi0JICogQHBhcmFtIHVybA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGRvd25sb2FkZWQobG9uZyBkb3dubG9hZFNpemUsIGxvbmcgdGltZSwgVVJMIHVybCkgew0KLQkJaWYgKGRvd25sb2FkU2l6ZSA8PSAwIHx8IHRpbWUgPCAwKQ0KLQkJCXJldHVybjsNCi0JCVN0cmluZyBob3N0ID0gdXJsLmdldEhvc3QoKTsNCi0JCWxvbmcgc2l6ZUJ5VGltZSA9ICh0aW1lID09IDApID8gMCA6IGRvd25sb2FkU2l6ZSAvIHRpbWU7DQotCQlMb25nIHZhbHVlID0gbmV3IExvbmcoc2l6ZUJ5VGltZSk7DQotCQlpZiAoZXN0aW1hdGVzID09IG51bGwpIHsNCi0JCQllc3RpbWF0ZXMgPSBuZXcgSGFzaE1hcCgpOw0KLQkJfSBlbHNlIHsNCi0JCQlMb25nIHByZXZpb3VzID0gKExvbmcpIGVzdGltYXRlcy5nZXQoaG9zdCk7DQotCQkJaWYgKHByZXZpb3VzICE9IG51bGwpIHsNCi0JCQkJdmFsdWUgPSBuZXcgTG9uZygocHJldmlvdXMubG9uZ1ZhbHVlKCkgKyBzaXplQnlUaW1lKSAvIDIpOw0KLQkJCX0NCi0JCX0NCi0JCWVzdGltYXRlcy5wdXQoaG9zdCwgdmFsdWUpOw0KLQl9DQotCS8qKg0KLQkgKiBNZXRob2QgZ2V0RXN0aW1hdGVkVHJhbnNmZXJSYXRlIHJhdGUgYnl0ZXMvc2Vjb25kcy4NCi0JICogQHBhcmFtIGhvc3QNCi0JICogQHJldHVybiBsb25nDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0RXN0aW1hdGVkVHJhbnNmZXJSYXRlKFN0cmluZyBob3N0KSB7DQotCQlpZiAoZXN0aW1hdGVzID09IG51bGwpDQotCQkJcmV0dXJuIDA7DQotCQlMb25nIHZhbHVlID0gKExvbmcpIGVzdGltYXRlcy5nZXQoaG9zdCk7DQotCQlpZiAodmFsdWUgPT0gbnVsbCkNCi0JCQlyZXR1cm4gMDsNCi0JCXJldHVybiB2YWx1ZS5sb25nVmFsdWUoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xpc3RlbmVyc0xpc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTGlzdGVuZXJzTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDZhYmIzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTGlzdGVuZXJzTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBtYWludGFpbiBhIGxpc3Qgb2YgbGlzdGVuZXJzLCBhbmQNCi0gKiBpcyB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2Ygc2V2ZXJhbCBjbGFzc2VzIHdpdGhpbiBKRmFjZQ0KLSAqIHdoaWNoIGFsbG93IHlvdSB0byByZWdpc3RlciBsaXN0ZW5lcnMgb2YgdmFyaW91cyBraW5kcy4NCi0gKiBJdCBpcyBhIGZhaXJseSBsaWdodHdlaWdodCBvYmplY3QsIG9jY3VweWluZyBtaW5pbWFsIHNwYWNlIHdoZW4NCi0gKiBubyBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuDQotICogPHA+DQotICogTm90ZSB0aGF0IHRoZSA8Y29kZT5hZGQ8L2NvZGU+IG1ldGhvZCBjaGVja3MgZm9yIGFuZCBlbGltaW5hdGVzIA0KLSAqIGR1cGxpY2F0ZXMgYmFzZWQgb24gaWRlbnRpdHkgKG5vdCBlcXVhbGl0eSkuICBMaWtld2lzZSwgdGhlDQotICogPGNvZGU+cmVtb3ZlPC9jb2RlPiBtZXRob2QgY29tcGFyZXMgYmFzZWQgb24gaWRlbnRpdHkuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIFVzZSB0aGUgPGNvZGU+Z2V0TGlzdGVuZXJzPC9jb2RlPiBtZXRob2Qgd2hlbiBub3RpZnlpbmcgbGlzdGVuZXJzLg0KLSAqIE5vdGUgdGhhdCBubyBnYXJiYWdlIGlzIGNyZWF0ZWQgaWYgbm8gbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLg0KLSAqIFRoZSByZWNvbW1lbmRlZCBjb2RlIHNlcXVlbmNlIGZvciBub3RpZnlpbmcgYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzDQotICogb2Ygc2F5LCA8Y29kZT5Gb29MaXN0ZW5lci5ldmVudEhhcHBlbmVkPC9jb2RlPiwgaXM6DQotICogPHByZT4NCi0gKiBPYmplY3RbXSBsaXN0ZW5lcnMgPSBteUxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsNCi0gKiBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgew0KLSAqICAgICgoRm9vTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSkuZXZlbnRIYXBwZW5lZChldmVudCk7DQotICogfQ0KLSAqIDwvcHJlPg0KLSAqIDwvcD4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJzTGlzdCB7DQotCS8qKg0KLQkgKiBUaGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgbGlzdC4gQWx3YXlzID49IDEuDQotCSAqLw0KLQlwcml2YXRlIGludCBjYXBhY2l0eTsNCi0NCi0JLyoqDQotCSAqIFRoZSBjdXJyZW50IG51bWJlciBvZiBsaXN0ZW5lcnMuDQotCSAqIE1haW50YWlucyBpbnZhcmlhbnQ6IDAgPD0gc2l6ZSA8PSBsaXN0ZW5lcnMubGVuZ3RoLg0KLQkgKi8NCi0JcHJpdmF0ZSBpbnQgc2l6ZTsNCi0NCi0JLyoqDQotCSAqIFRoZSBsaXN0IG9mIGxpc3RlbmVycy4gIEluaXRpYWxseSA8Y29kZT5udWxsPC9jb2RlPiBidXQgaW5pdGlhbGl6ZWQNCi0JICogdG8gYW4gYXJyYXkgb2Ygc2l6ZSBjYXBhY2l0eSB0aGUgZmlyc3QgdGltZSBhIGxpc3RlbmVyIGlzIGFkZGVkLg0KLQkgKiBNYWludGFpbnMgaW52YXJpYW50OiBsaXN0ZW5lcnMgIT0gbnVsbCBJRkYgc2l6ZSAhPSAwDQotCSAqLw0KLQlwcml2YXRlIE9iamVjdFtdIGxpc3RlbmVycyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgZW1wdHkgYXJyYXkgc2luZ2xldG9uIGluc3RhbmNlLCByZXR1cm5lZCBieSBnZXRMaXN0ZW5lcnMoKQ0KLQkgKiB3aGVuIHNpemUgPT0gMC4NCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVtcHR5QXJyYXkgPSBuZXcgT2JqZWN0WzBdOw0KLS8qKg0KLSAqIENyZWF0ZXMgYSBsaXN0ZW5lciBsaXN0IHdpdGggYW4gaW5pdGlhbCBjYXBhY2l0eSBvZiAzLg0KLSAqLw0KLXB1YmxpYyBMaXN0ZW5lcnNMaXN0KCkgew0KLQl0aGlzKDMpOw0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIGEgbGlzdGVuZXIgbGlzdCB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5Lg0KLSAqDQotICogQHBhcmFtIGNhcGFjaXR5IHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIHdoaWNoIHRoaXMgbGlzdCBjYW4gaW5pdGlhbGx5IGFjY2VwdCANCi0gKiAgICB3aXRob3V0IGdyb3dpbmcgaXRzIGludGVybmFsIHJlcHJlc2VudGF0aW9uOyBtdXN0IGJlIGF0IGxlYXN0IDENCi0gKi8NCi1wdWJsaWMgTGlzdGVuZXJzTGlzdChpbnQgY2FwYWNpdHkpIHsNCi0JQXNzZXJ0LmlzVHJ1ZShjYXBhY2l0eSA+PSAxKTsNCi0JdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5Ow0KLX0NCi0vKioNCi0gKiBBZGRzIHRoZSBnaXZlbiBsaXN0ZW5lciB0byB0aGlzIGxpc3QuIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyDQotICogaXMgYWxyZWFkeSByZWdpc3RlcmVkLg0KLSAqDQotICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcg0KLSAqLw0KLXB1YmxpYyB2b2lkIGFkZChPYmplY3QgbGlzdGVuZXIpIHsNCi0JQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7DQotCWlmIChzaXplID09IDApIHsNCi0JCWxpc3RlbmVycyA9IG5ldyBPYmplY3RbY2FwYWNpdHldOw0KLQl9IGVsc2Ugew0KLQkgICAgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMgdXNpbmcgaWRlbnRpdHkNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7DQotCQkJaWYgKGxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJfQ0KLQkJLy8gZ3JvdyBhcnJheSBpZiBuZWNlc3NhcnkNCi0JCWlmIChzaXplID09IGxpc3RlbmVycy5sZW5ndGgpIHsNCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgMCwgbGlzdGVuZXJzID0gbmV3IE9iamVjdFtzaXplICogMiArIDFdLCAwLCBzaXplKTsNCi0JCX0NCi0JfQ0KLQlsaXN0ZW5lcnNbc2l6ZSsrXSA9IGxpc3RlbmVyOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy4NCi0gKiBUaGUgcmVzdWx0aW5nIGFycmF5IGlzIHVuYWZmZWN0ZWQgYnkgc3Vic2VxdWVudCBhZGRzIG9yIHJlbW92ZXMuDQotICogSWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IGFycmF5DQotICogc2luZ2xldG9uIGluc3RhbmNlIChubyBnYXJiYWdlIGlzIGNyZWF0ZWQpLg0KLSAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIG5vdGlmeWluZyBsaXN0ZW5lcnMsIHNvIHRoYXQgYW55IG1vZGlmaWNhdGlvbnMNCi0gKiB0byB0aGUgbGlzdGVuZXIgbGlzdCBkdXJpbmcgdGhlIG5vdGlmaWNhdGlvbiB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIHRoZQ0KLSAqIG5vdGlmaWNhdGlvbiBpdHNlbGYuDQotICoNCi0gKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgbGlzdGVuZXJzDQotICovDQotcHVibGljIE9iamVjdFtdIGdldExpc3RlbmVycygpIHsNCi0JaWYgKHNpemUgPT0gMCkNCi0JCXJldHVybiBFbXB0eUFycmF5Ow0KLQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpemVdOw0KLQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgMCwgcmVzdWx0LCAwLCBzaXplKTsNCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotLyoqDQotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eS4NCi0gKg0KLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLCBhbmQNCi0gKiAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgew0KLQlyZXR1cm4gc2l6ZSA9PSAwOw0KLX0NCi0vKioNCi0gKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoaXMgbGlzdC4gSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwNCi0gKiBsaXN0ZW5lciB3YXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4NCi0gKg0KLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXINCi0gKi8NCi1wdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IGxpc3RlbmVyKSB7DQotCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgew0KLQkJaWYgKGxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgew0KLQkJCWlmIChzaXplID09IDEpIHsNCi0JCQkJbGlzdGVuZXJzID0gbnVsbDsNCi0JCQkJc2l6ZSA9IDA7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgaSArIDEsIGxpc3RlbmVycywgaSwgLS1zaXplIC0gaSk7DQotCQkJCWxpc3RlbmVyc1tzaXplXSA9IG51bGw7DQotCQkJfQ0KLQkJCXJldHVybjsNCi0JCX0NCi0JfQ0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuDQotICoNCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMNCi0gKi8NCi1wdWJsaWMgaW50IHNpemUoKSB7DQotCXJldHVybiBzaXplOw0KLX0NCi19DQotCQ0KLQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0MTY4Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL05vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogQ29udGVudENvbnN1bWVyIGZvciBhIG5vbiBwbHVnaW4gZW50cnkgb2YgYSBmZWF0dXJlDQotICovDQotDQotcHVibGljIGNsYXNzIE5vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyIGV4dGVuZHMgQ29udGVudENvbnN1bWVyIHsNCi0NCi0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOw0KLQ0KLQlwcml2YXRlIElDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyOw0KLQkJDQotCS8qDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIoSUNvbnRlbnRDb25zdW1lciBjb250ZW50Q29uc3VtZXIpew0KLQkJdGhpcy5jb250ZW50Q29uc3VtZXIgPSBjb250ZW50Q29uc3VtZXI7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoIWNsb3NlZCl7DQotCQkJY29udGVudENvbnN1bWVyLnN0b3JlKCBjb250ZW50UmVmZXJlbmNlLG1vbml0b3IpOw0KLQkJfSBlbHNlIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gc3RvcmUgaW4gYSBjbG9zZWQgTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIiLG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIENvbnRlbnRDb25zdW1lciNjbG9zZSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uICB7DQotCQlpZiAoIWNsb3NlZCl7DQotCQkJY2xvc2VkID0gdHJ1ZTsNCi0JCQljb250ZW50Q29uc3VtZXIuY2xvc2UoKTsNCi0JCX0gZWxzZSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGNsb3NlIGEgY2xvc2VkIE5vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyIixuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9PdGhlclJlc3BvbnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL090aGVyUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzYmVjMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL090aGVyUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1wdWJsaWMgY2xhc3MgT3RoZXJSZXNwb25zZSBpbXBsZW1lbnRzIFJlc3BvbnNlIHsKLQlwcm90ZWN0ZWQgVVJMIHVybDsKLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW47Ci0JcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQlwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQ7Ci0KLQlwdWJsaWMgT3RoZXJSZXNwb25zZShVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLnVybCA9IHVybDsKLQkJY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbiA9PSBudWxsICYmIHVybCAhPSBudWxsKSB7Ci0JCQlpbiA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCXRoaXMubGFzdE1vZGlmaWVkID0gY29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJfQotCQlyZXR1cm4gaW47Ci0JfQotCS8qKgotCSAqIEBzZWUgUmVzcG9uc2UjZ2V0SW5wdXRTdHJlYW0oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW0oKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgewotCQlyZXR1cm4gY29ubmVjdGlvbi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgewotCQlyZXR1cm4gSVN0YXR1c0NvZGVzLkhUVFBfT0s7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGF0dXNNZXNzYWdlKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCWlmIChsYXN0TW9kaWZpZWQgPT0gMCkgewotCQkJbGFzdE1vZGlmaWVkID0gY29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJfQotCQlyZXR1cm4gbGFzdE1vZGlmaWVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGF0Y2hlZEZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGF0Y2hlZEZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkNmVkYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1BhdGNoZWRGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotLyoqCi0gKiBGZWF0dXJlIGFuZCBjb3JyZXNwb25kaW5nIHBhdGNoIGZlYXR1cmVzCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRjaGVkRmVhdHVyZSB7Ci0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBwYXRjaGVzID0gbmV3IEhhc2hTZXQoKTsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFBhdGNoZWRGZWF0dXJlKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkUGF0Y2goSUZlYXR1cmVSZWZlcmVuY2UgcGF0Y2gpIHsKLQkJcGF0Y2hlcy5hZGQocGF0Y2gpOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZlYXR1cmUuCi0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGNoZXMuCi0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0UGF0Y2hlcygpIHsKLQkJcmV0dXJuIChJRmVhdHVyZVJlZmVyZW5jZVtdKSBwYXRjaGVzLnRvQXJyYXkobmV3IElGZWF0dXJlUmVmZXJlbmNlW3BhdGNoZXMuc2l6ZSgpXSk7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmVhdHVyZSBhbmQgdGhlIHBhdGNoZXMuCi0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0RmVhdHVyZUFuZFBhdGNoZXMoKSB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbcGF0Y2hlcy5zaXplKCkgKyAxXTsKLQkJZmVhdHVyZXNbMF0gPSBmZWF0dXJlOwotCQlTeXN0ZW0uYXJyYXljb3B5KGdldFBhdGNoZXMoKSwgMCwgZmVhdHVyZXMsIDEsIHBhdGNoZXMuc2l6ZSgpKTsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQkvKioKLQkgKiBPYnRhaW5zIGFsbCBwbHVnaW5zIGZyb20gdGhlIGZlYXR1cmUgYW5kIGl0cyBwYXRjaGVzLiBFYWNoIHBsdWdpbiB3aWxsCi0JICogaGF2ZSB1bmlxdWUgSUQuCi0JICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZlcnNpb24gb2YgcGx1Z2luIHdpdGggc2FtZSBJRCBhbW9uZyB0aGUgZmVhdHVyZQotCSAqIGFuZCBpdHMgcGF0Y2hlcywgaGlnaGVzdCB2ZXJzaW9uIHBsdWdpbnMgYXJlIGNob3Nlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEZlYXR1cmVQbHVnaW5bXQotCSAqLwotCXB1YmxpYyBGZWF0dXJlUGx1Z2luW10gZ2V0UGx1Z2lucygpIHsKLQkJLy8gVXNlIGEgbWFwIG9mIFBhdGNoZWRQbHVpZ25zIGJ5IHBsdWdpbiBJRAotCQkvLyB0byBjb2xsZWN0IG9uZSB2ZXJzaW9uIG9mIGVhY2ggcGx1Z2luCi0JCU1hcCBwbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmcyA9IGdldEZlYXR1cmVBbmRQYXRjaGVzKCk7Ci0JCS8vIGZvciBlYWNoIChmZWF0dXJlIG9yIGFueSBwYXRjaCkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZVJlZnNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJCVVwZGF0ZUNvcmUud2FybigiTnVsbCBGZWF0dXJlIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy8gZ2V0IHBsdWdpbiBlbnRyaWVzCi0JCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJCWZvciAoaW50IGVudHIgPSAwOyBlbnRyIDwgZW50cmllcy5sZW5ndGg7IGVudHIrKykgewotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBlbnRyaWVzW2VudHJdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHBsdWdpblZlcnNpb24gPSBlbnRyaWVzW2VudHJdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7Ci0JCQkJCS8vIGNoZWNrIGlmIG1hcCBjb250YWlucyA+PSB2ZXJzaW9uIG9mIHNhbWUgcGx1Z2luCi0JCQkJCUZlYXR1cmVQbHVnaW4gZXhpc3RpbmdQbHVnaW4gPSAoRmVhdHVyZVBsdWdpbikgcGx1Z2lucy5nZXQocGx1Z2luSWQpOwotCQkJCQlpZiAoZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCAmJiBleGlzdGluZ1BsdWdpbi5nZXRFbnRyeSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkuaXNHcmVhdGVyT3JFcXVhbFRvKHBsdWdpblZlcnNpb24pKSB7Ci0JCQkJCQkvLyBzYW1lIG9yIG5ld2VyIHBsdWdpbiBhbHJlYWR5IGNvbGxlY3RlZAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwbHVnaW5zLnB1dChwbHVnaW5JZCwgbmV3IEZlYXR1cmVQbHVnaW4oZW50cmllc1tlbnRyXSwgZmVhdHVyZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoRmVhdHVyZVBsdWdpbltdKSBwbHVnaW5zLnZhbHVlcygpLnRvQXJyYXkobmV3IEZlYXR1cmVQbHVnaW5bcGx1Z2lucy5zaXplKCldKTsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoZmVhdHVyZS50b1N0cmluZygpKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBwYXRjaGVzID0gZ2V0RmVhdHVyZUFuZFBhdGNoZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRjaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzdHIuYXBwZW5kKCIgK3BhdGNoPSIgKyBwYXRjaGVzW2ldLnRvU3RyaW5nKCkgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gc3RyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTljMjY1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBDb250ZW50Q29uc3VtZXIgZm9yIGEgcGx1Z2luIGVudHJ5IG9mIGEgZmVhdHVyZQ0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBQbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lciBleHRlbmRzIENvbnRlbnRDb25zdW1lciB7DQotDQotCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsNCi0NCi0JcHJpdmF0ZSBJQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcjsNCi0JCQ0KLQkvKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIFBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyKElDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyKXsNCi0JCXRoaXMuY29udGVudENvbnN1bWVyID0gY29udGVudENvbnN1bWVyOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKCFjbG9zZWQpew0KLQkJCWNvbnRlbnRDb25zdW1lci5zdG9yZShjb250ZW50UmVmZXJlbmNlLG1vbml0b3IpOw0KLQkJfSBlbHNlIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gc3RvcmUgaW4gYSBjbG9zZWQgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIiLG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIENvbnRlbnRDb25zdW1lciNjbG9zZSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmICghY2xvc2VkKXsNCi0JCQljbG9zZWQgPSB0cnVlOw0KLQkJCWNvbnRlbnRDb25zdW1lci5jbG9zZSgpOw0KLQkJfSBlbHNlIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIiLG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1BvbGljeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Qb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzZTMxNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1BvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotcHVibGljIGNsYXNzIFBvbGljeSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIE5MUyBjYXRhbG9nIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2NhbGl6ZShTdHJpbmcgYnVuZGxlTmFtZSkgewotCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIExvb2t1cCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGlzIGNhdGFsb2cgYW5kIGJpbmQgaXRzCi0JICogc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQsIFN0cmluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiBiaW5kKGlkLCBuZXcgU3RyaW5nW10geyBiaW5kaW5nIH0pOwotCX0KLQkKLQkvKioKLQkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cwotCSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBpZCwgU3RyaW5nIGJpbmRpbmcxLCBTdHJpbmcgYmluZGluZzIpIHsKLQkJcmV0dXJuIGJpbmQoaWQsIG5ldyBTdHJpbmdbXSB7IGJpbmRpbmcxLCBiaW5kaW5nMiB9KTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggYmVjYXVzZSBvZiBhIG1pc3NpbmcgU3RyaW5nLgotCSAqIFJldHVybnMgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0IHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gSWYgdGhlIGtleSBpcyAKLQkgKiBub3QgZm91bmQsIHJldHVybiB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCQl0cnkgewotCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGJpbmQoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcm9ncmVzcyBtb25pdG9yIGhlbHBlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcykgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9SZXNwb25zZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9SZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzlmNGUwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotcHVibGljIGludGVyZmFjZSBSZXNwb25zZSB7Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0SW5wdXRTdHJlYW0uCi0JICogCi0JICogQHJldHVybiBJbnB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEEgc3BlY2lhbCB2ZXJzaW9uIG9mICdnZXRJbnB1dFN0cmVhbScgdGhhdCBjYW4gYmUgY2FuY2VsZWQuCi0JICogQSBtb25pdG9yIHRocmVhZCBjaGVja3MgdGhlIHN0YXRlIG9mIHRoZSBtb25pdG9yCi0JICogYW5kIGRpc2Nvbm5lY3RzIHRoZSBjb25uZWN0aW9uIGlmICdpc0NhbmNlbGVkKCknIGlzIGRldGVjdGVkLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gSW5wdXRTdHJlYW0gYW4gb3BlbmVkIHN0cmVhbSBvciBudWxsIGlmIGZhaWxlZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlcmUgYXJlIHByb2JsZW1zCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgbm8gbW9yZSBjb25uZWN0aW9uIHRocmVhZHMgYXJlIGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE1ldGhvZCBnZXRDb250ZW50TGVuZ3RoLgotCSAqIAotCSAqIEByZXR1cm4gbG9uZwotCSAqLwotCXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKTsKLQotCS8qKgotCSAqIE1ldGhvZCBnZXRTdGF0dXNDb2RlLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0U3RhdHVzTWVzc2FnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzTWVzc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGltZXN0YW1wIG9mIGxhc3QgbW9kaWZpY2F0aW9uIHRvIHRoZSByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGU2OTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIKLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2l0ZUNvbnRlbnRDb25zdW1lciBpbXBsZW1lbnRzIElTaXRlQ29udGVudENvbnN1bWVyIHsKLQkKLQlwcml2YXRlIElTaXRlIHNpdGU7Ci0JCi0JLyoKLQkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI3NldFNpdGUoSVNpdGUpCi0JICovCi0JLyoqCi0JICogU2V0cyB0aGUgc2l0ZS4KLQkgKiBAcGFyYW0gc2l0ZSBUaGUgc2l0ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElTaXRlIHNpdGUpIHsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaXRlLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIElTaXRlCi0JICovCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7Ci0JCXJldHVybiBzaXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjFmY2Q5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotLyoqDQotICogQGF1dGhvciBiaXJzYW4NCi0gKg0KLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvDQotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMNCi0gKi8NCi0vKioNCi0gKiBTaXRlIG9uIHRoZSBGaWxlIFN5c3RlbQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTaXRlRmlsZSBleHRlbmRzIFNpdGUgew0KLQ0KLQkvKioNCi0JICogcGx1Z2luIGVudHJpZXMgDQotCSAqLw0KLQlwcml2YXRlIExpc3QgcGx1Z2luRW50cmllcyA9IG5ldyBBcnJheUxpc3QoMCk7DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBJU2l0ZUNvbnRlbnRDb25zdW1lciBjcmVhdGVTaXRlQ29udGVudENvbnN1bWVyKElGZWF0dXJlIHRhcmdldEZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCVNpdGVGaWxlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyID0gbmV3IFNpdGVGaWxlQ29udGVudENvbnN1bWVyKHRhcmdldEZlYXR1cmUpOw0KLQkJY29uc3VtZXIuc2V0U2l0ZSh0aGlzKTsNCi0JCXJldHVybiBjb25zdW1lcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhY2thZ2VkRmVhdHVyZVR5cGUoKSB7DQotCQlyZXR1cm4gREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9UWVBFOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSVZlcmlmaWVyLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gaW5zdGFsbChzb3VyY2VGZWF0dXJlLG51bGwsdmVyaWZpY2F0aW9uTGlzdGVuZXIscHJvZ3Jlc3MpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSVZlcmlmaWVyLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChzb3VyY2VGZWF0dXJlID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBJbnN0YWxsTW9uaXRvcgkJDQotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yOw0KLQkJaWYgKHByb2dyZXNzID09IG51bGwpDQotCQkJbW9uaXRvciA9IG51bGw7DQotCQllbHNlIGlmIChwcm9ncmVzcyBpbnN0YW5jZW9mIEluc3RhbGxNb25pdG9yKQ0KLQkJCW1vbml0b3IgPSAoSW5zdGFsbE1vbml0b3IpIHByb2dyZXNzOw0KLQkJZWxzZQ0KLQkJCW1vbml0b3IgPSBuZXcgSW5zdGFsbE1vbml0b3IocHJvZ3Jlc3MpOw0KLQ0KLQkJLy8gY3JlYXRlIG5ldyBleGVjdXRhYmxlIGZlYXR1cmUgYW5kIGluc3RhbGwgc291cmNlIGNvbnRlbnQgaW50byBpdA0KLQkJSUZlYXR1cmUgbG9jYWxGZWF0dXJlID0gY3JlYXRlRXhlY3V0YWJsZUZlYXR1cmUoc291cmNlRmVhdHVyZSk7DQotDQotCQlJRmVhdHVyZVJlZmVyZW5jZSBsb2NhbEZlYXR1cmVSZWZlcmVuY2UgPSBudWxsOw0KLQkJbG9jYWxGZWF0dXJlUmVmZXJlbmNlID0gc291cmNlRmVhdHVyZS5pbnN0YWxsKGxvY2FsRmVhdHVyZSwgb3B0aW9uYWxmZWF0dXJlcywgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIG1vbml0b3IpOw0KLQ0KLQkJcmV0dXJuIGxvY2FsRmVhdHVyZVJlZmVyZW5jZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsSUZlYXR1cmVDb250ZW50Q29uc3VtZXIsIElWZXJpZmllcixJVmVyaWZpY2F0aW9uTElzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBzb3VyY2VGZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsIElGZWF0dXJlQ29udGVudENvbnN1bWVyIHBhcmVudENvbnRlbnRDb25zdW1lciwgSVZlcmlmaWVyIHBhcmVudFZlcmlmaWVyLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpDQotCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKHNvdXJjZUZlYXR1cmUgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0NCi0JCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIEluc3RhbGxNb25pdG9yCQkNCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3I7DQotCQlpZiAocHJvZ3Jlc3MgPT0gbnVsbCkNCi0JCQltb25pdG9yID0gbnVsbDsNCi0JCWVsc2UgaWYgKHByb2dyZXNzIGluc3RhbmNlb2YgSW5zdGFsbE1vbml0b3IpDQotCQkJbW9uaXRvciA9IChJbnN0YWxsTW9uaXRvcikgcHJvZ3Jlc3M7DQotCQllbHNlDQotCQkJbW9uaXRvciA9IG5ldyBJbnN0YWxsTW9uaXRvcihwcm9ncmVzcyk7DQotDQotCQkvLyBjcmVhdGUgbmV3IGV4ZWN1dGFibGUgZmVhdHVyZSBhbmQgaW5zdGFsbCBzb3VyY2UgY29udGVudCBpbnRvIGl0DQotCQlJRmVhdHVyZSBsb2NhbEZlYXR1cmUgPSBjcmVhdGVFeGVjdXRhYmxlRmVhdHVyZShzb3VyY2VGZWF0dXJlKTsNCi0JCXBhcmVudENvbnRlbnRDb25zdW1lci5hZGRDaGlsZChsb2NhbEZlYXR1cmUpOw0KLQ0KLQkJLy8gc2V0IHRoZSB2ZXJpZmllcg0KLQkJSVZlcmlmaWVyIHZyID0gc291cmNlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0VmVyaWZpZXIoKTsNCi0JCWlmICh2ciAhPSBudWxsKQ0KLQkJCXZyLnNldFBhcmVudChwYXJlbnRWZXJpZmllcik7DQotDQotCQlJRmVhdHVyZVJlZmVyZW5jZSBsb2NhbEZlYXR1cmVSZWZlcmVuY2UgPSBudWxsOw0KLQkJbG9jYWxGZWF0dXJlUmVmZXJlbmNlID0gc291cmNlRmVhdHVyZS5pbnN0YWxsKGxvY2FsRmVhdHVyZSwgb3B0aW9uYWxmZWF0dXJlcywgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIG1vbml0b3IpOw0KLQ0KLQkJcmV0dXJuIGxvY2FsRmVhdHVyZVJlZmVyZW5jZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI3JlbW92ZShJRmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlIHRvIHJlbW92ZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCUVycm9yUmVjb3ZlcnlMb2cgcmVjb3ZlcnlMb2cgPSBFcnJvclJlY292ZXJ5TG9nLmdldExvZygpOw0KLQ0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gSW5zdGFsbE1vbml0b3IJCQ0KLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcjsNCi0JCWlmIChwcm9ncmVzcyA9PSBudWxsKQ0KLQkJCW1vbml0b3IgPSBudWxsOw0KLQkJZWxzZSBpZiAocHJvZ3Jlc3MgaW5zdGFuY2VvZiBJbnN0YWxsTW9uaXRvcikNCi0JCQltb25pdG9yID0gKEluc3RhbGxNb25pdG9yKSBwcm9ncmVzczsNCi0JCWVsc2UNCi0JCQltb25pdG9yID0gbmV3IEluc3RhbGxNb25pdG9yKHByb2dyZXNzKTsNCi0NCi0JCS8vIFNldHVwIG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcg0KLQkJSW5zdGFsbEhhbmRsZXJQcm94eSBoYW5kbGVyID0gbmV3IEluc3RhbGxIYW5kbGVyUHJveHkoSUluc3RhbGxIYW5kbGVyLkhBTkRMRVJfQUNUSU9OX1VOSU5TVEFMTCwgZmVhdHVyZSwgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCksIG1vbml0b3IpOw0KLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7DQotCQlUaHJvd2FibGUgb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0NCi0JCQkvLyBzdGFydCBsb2cNCi0JCQlyZWNvdmVyeUxvZy5vcGVuKEVycm9yUmVjb3ZlcnlMb2cuU1RBUlRfUkVNT1ZFX0xPRyk7DQotDQotCQkJYWJvdXRUb1JlbW92ZShmZWF0dXJlKTsNCi0NCi0JCQkvLyBsb2cgZmlsZXMgaGF2ZSBiZWVuIGRvd25sb2FkZWQNCi0JCQlyZWNvdmVyeUxvZy5hcHBlbmQoRXJyb3JSZWNvdmVyeUxvZy5FTkRfQUJPVVRfUkVNT1ZFKTsNCi0NCi0JCQloYW5kbGVyLnVuaW5zdGFsbEluaXRpYXRlZCgpOw0KLQ0KLQkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZSBhbmQgdGhlIHBsdWdpbnMgaWYgdGhleSBhcmUgbm90IHVzZWQgYW5kIG5vdCBhY3RpdmF0ZWQNCi0JCQkvLyBnZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgZmVhdHVyZQ0KLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbnNUb1JlbW92ZSA9IGdldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KGZlYXR1cmUpOw0KLQ0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJbW9uaXRvci5iZWdpblRhc2soUG9saWN5LmJpbmQoIlNpdGVGaWxlLlJlbW92aW5nIikgKyBmZWF0dXJlLmdldExhYmVsKCksIHBsdWdpbnNUb1JlbW92ZS5sZW5ndGggKyAxKTsJLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0NCi0JCQkvLyByZW1vdmUgZmVhdHVyZSByZWZlcmVuY2UgZnJvbSB0aGUgc2l0ZQ0KLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWZlcmVuY2VzID0gZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlpZiAoZmVhdHVyZVJlZmVyZW5jZXMgIT0gbnVsbCkgew0KLQkJCQlmb3IgKGludCBpbmRleFJlZiA9IDA7IGluZGV4UmVmIDwgZmVhdHVyZVJlZmVyZW5jZXMubGVuZ3RoOyBpbmRleFJlZisrKSB7DQotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBlbGVtZW50ID0gZmVhdHVyZVJlZmVyZW5jZXNbaW5kZXhSZWZdOw0KLQkJCQkJaWYgKGVsZW1lbnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsNCi0JCQkJCQlyZW1vdmVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgZWxlbWVudCk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotDQotCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiZmVhdHVyZV8iK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJVXBkYXRlQ29yZS5sb2coUG9saWN5LmJpbmQoIlNpdGVGaWxlLmZlYXR1cmVOb3RSZW1vdmVkIiwgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSksIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9IGVsc2Ugew0KLQkJCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUgY29udGVudA0KLQkJCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsNCi0JCQkJCXRyeSB7DQotCQkJCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHJlZmVyZW5jZXNbaV0uYXNGaWxlKCkpOw0KLQkJCQkJCWlmIChtb25pdG9yICE9IG51bGwpDQotCQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlRmlsZS5DYW5ub3RSZW1vdmVGZWF0dXJlIiwgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLCBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSwgZSk7CS8vJE5PTi1OTFMtMSQNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlckZlYXR1cmUoZmVhdHVyZSk7DQotCQkJfQ0KLQ0KLQkJCS8vZmluZHMgdGhlIGNvbnRlbnRSZWZlcmVuY2VzIGZvciBhbiBJUGx1Z2luRW50cnkNCi0JCQkvLyBhbmQgcmVtb3ZlIGl0DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCi0JCQkJcmVtb3ZlKGZlYXR1cmUsIHBsdWdpbnNUb1JlbW92ZVtpXSwgbW9uaXRvcik7DQotCQkJfQ0KLQ0KLQkJCS8vIHJlbW92ZSBhbnkgY2hpbGRyZW4gZmVhdHVyZQ0KLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW5SZWYgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuUmVmLmxlbmd0aDsgaSsrKSB7DQotCQkJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IG51bGw7DQotCQkJCXRyeSB7DQotCQkJCQljaGlsZEZlYXR1cmUgPSBjaGlsZHJlblJlZltpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIGZlYXR1cmUgdG8gcmVtb3ZlIGZvcjoiICsgY2hpbGRyZW5SZWZbaV0pOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJaWYgKGNoaWxkRmVhdHVyZSAhPSBudWxsKQ0KLQkJCQkJcmVtb3ZlKGNoaWxkcmVuUmVmW2ldLmdldEZlYXR1cmUobnVsbCksIG1vbml0b3IpOw0KLQkJCX0NCi0NCi0JCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUgZnJvbSB0aGUgc2l0ZSBjYWNoZQ0KLQkJCXJlbW92ZUZlYXR1cmVGcm9tQ2FjaGUoZmVhdHVyZS5nZXRVUkwoKSk7DQotCQkJDQotCQkJaGFuZGxlci5jb21wbGV0ZVVuaW5zdGFsbCgpOw0KLQ0KLQkJCXN1Y2Nlc3MgPSB0cnVlOw0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0JCQlvcmlnaW5hbEV4Y2VwdGlvbiA9IHQ7DQotCQl9IGZpbmFsbHkgew0KLQkJCVRocm93YWJsZSBuZXdFeGNlcHRpb24gPSBudWxsOw0KLQkJCXRyeSB7DQotCQkJCWlmIChzdWNjZXNzKSB7DQotCQkJCQkvLyBjbG9zZSB0aGUgbG9nDQotCQkJCQlyZWNvdmVyeUxvZy5jbG9zZShFcnJvclJlY292ZXJ5TG9nLkVORF9SRU1PVkVfTE9HKTsNCi0JCQkJCXJlY292ZXJ5TG9nLmRlbGV0ZSgpOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJcmVjb3ZlcnlMb2cuY2xvc2UoRXJyb3JSZWNvdmVyeUxvZy5FTkRfUkVNT1ZFX0xPRyk7DQotCQkJCX0NCi0JCQkJaGFuZGxlci51bmluc3RhbGxDb21wbGV0ZWQoc3VjY2Vzcyk7DQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0JCQkJbmV3RXhjZXB0aW9uID0gdDsNCi0JCQl9DQotCQkJaWYgKG9yaWdpbmFsRXhjZXB0aW9uICE9IG51bGwpIC8vIG9yaWdpbmFsIGV4Y2VwdGlvbiB3aW5zDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci5lcnJvciIsIGZlYXR1cmUuZ2V0TGFiZWwoKSksIG9yaWdpbmFsRXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWlmIChuZXdFeGNlcHRpb24gIT0gbnVsbCkNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLmVycm9yIiwgZmVhdHVyZS5nZXRMYWJlbCgpKSwgbmV3RXhjZXB0aW9uKTsvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIHJldHVybnMgdGhlIGRvd25sb2FkIHNpemUNCi0JICogb2YgdGhlIGZlYXR1cmUgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBzaXRlLg0KLQkgKiBJZiB0aGUgc2l0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiByZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUNCi0JICogDQotCSAqIElmIG9uZSBwbHVnLWluIGVudHJ5IGhhcyBhbiB1bmtub3duIHNpemUuDQotCSAqIHRoZW4gdGhlIGRvd25sb2FkIHNpemUgaXMgdW5rbm93bi4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemVGb3IoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJbG9uZyByZXN1bHQgPSAwOw0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllc1RvSW5zdGFsbCA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJSVBsdWdpbkVudHJ5W10gc2l0ZUVudHJpZXMgPSB0aGlzLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCWVudHJpZXNUb0luc3RhbGwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZihlbnRyaWVzVG9JbnN0YWxsLCBzaXRlRW50cmllcyk7DQotCQkvL1sxODM1NV0NCi0JCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkVudHJpZXNUb0luc3RhbGwgPSBmZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0NCi0JCXRyeSB7DQotCQkJcmVzdWx0ID0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0RG93bmxvYWRTaXplRm9yKGVudHJpZXNUb0luc3RhbGwsIG5vblBsdWdpbkVudHJpZXNUb0luc3RhbGwpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOw0KLQkJCXJlc3VsdCA9IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIHJldHVybnMgdGhlIGRvd25sb2FkIHNpemUNCi0JICogb2YgdGhlIGZlYXR1cmUgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBzaXRlLg0KLQkgKiBJZiB0aGUgc2l0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiByZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUNCi0JICogDQotCSAqIElmIG9uZSBwbHVnLWluIGVudHJ5IGhhcyBhbiB1bmtub3duIHNpemUuDQotCSAqIHRoZW4gdGhlIGRvd25sb2FkIHNpemUgaXMgdW5rbm93bi4NCi0JICogDQotCSAqIEBzZWUgSVNpdGUjZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlKQ0KLQkgKiANCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCWxvbmcgcmVzdWx0ID0gMDsNCi0NCi0JCXRyeSB7DQotCQkJTGlzdCBwbHVnaW5zVG9JbnN0YWxsID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLQkJCS8vIGdldCBhbGwgdGhlIHBsdWdpbnMgWzE3MzA0XQ0KLQkJCXBsdWdpbnNUb0luc3RhbGwuYWRkQWxsKEFycmF5cy5hc0xpc3QoZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCkpKTsNCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJSUZlYXR1cmUgY3VycmVudEZlYXR1cmUgPSBudWxsOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCi0JCQkJY3VycmVudEZlYXR1cmUgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQlpZiAoY3VycmVudEZlYXR1cmUgIT0gbnVsbCkgew0KLQkJCQkJcGx1Z2luc1RvSW5zdGFsbC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjdXJyZW50RmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCkpKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzVG9JbnN0YWxsID0gbmV3IElQbHVnaW5FbnRyeVswXTsNCi0JCQlpZiAocGx1Z2luc1RvSW5zdGFsbC5zaXplKCkgPiAwKSB7DQotCQkJCWVudHJpZXNUb0luc3RhbGwgPSBuZXcgSVBsdWdpbkVudHJ5W3BsdWdpbnNUb0luc3RhbGwuc2l6ZSgpXTsNCi0JCQkJcGx1Z2luc1RvSW5zdGFsbC50b0FycmF5KGVudHJpZXNUb0luc3RhbGwpOw0KLQkJCX0NCi0NCi0JCQlJUGx1Z2luRW50cnlbXSBzaXRlRW50cmllcyA9IHRoaXMuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJCWVudHJpZXNUb0luc3RhbGwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZihlbnRyaWVzVG9JbnN0YWxsLCBzaXRlRW50cmllcyk7DQotDQotCQkJLy9bMTgzNTVdDQotCQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRW50cmllc1RvSW5zdGFsbCA9IGZlYXR1cmUuZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQ0KLQkJCXJlc3VsdCA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldEluc3RhbGxTaXplRm9yKGVudHJpZXNUb0luc3RhbGwsIG5vblBsdWdpbkVudHJpZXNUb0luc3RhbGwpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOw0KLQkJCXJlc3VsdCA9IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsNCi0JCX0NCi0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZHMgYSBwbHVnaW4gZW50cnkgDQotCSAqIEVpdGhlciBmcm9tIHBhcnNpbmcgdGhlIGZpbGUgc3lzdGVtIG9yIA0KLQkgKiBpbnN0YWxsaW5nIGEgZmVhdHVyZQ0KLQkgKiANCi0JICogV2UgY2Fubm90IGZpZ3VyZSBvdXQgdGhlIGxpc3Qgb2YgcGx1Z2lucyBieSByZWFkaW5nIHRoZSBTaXRlLnhtbCBhcw0KLQkgKiB0aGUgYXJjaGl2ZXMgdGFnIGFyZSBvcHRpb25hbHMNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgew0KLQkJcGx1Z2luRW50cmllcy5hZGQocGx1Z2luRW50cnkpOw0KLQl9DQotDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRQbHVnaW5FbnRyaWVzKCkgew0KLQkJSVBsdWdpbkVudHJ5W10gcmVzdWx0ID0gbmV3IElQbHVnaW5FbnRyeVswXTsNCi0JCWlmICghKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmlzRW1wdHkoKSkpIHsNCi0JCQlyZXN1bHQgPSBuZXcgSVBsdWdpbkVudHJ5W3BsdWdpbkVudHJpZXMuc2l6ZSgpXTsNCi0JCQlwbHVnaW5FbnRyaWVzLnRvQXJyYXkocmVzdWx0KTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0NCi0JcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCkgew0KLQkJcmV0dXJuIGdldFBsdWdpbkVudHJpZXMoKS5sZW5ndGg7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSBJRmVhdHVyZSBjcmVhdGVFeGVjdXRhYmxlRmVhdHVyZShJRmVhdHVyZSBzb3VyY2VGZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJRmVhdHVyZSByZXN1bHQgPSBudWxsOw0KLQkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3J5KERFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfVFlQRSk7DQotCQlyZXN1bHQgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoLypVUkwqL251bGwsIHRoaXMsIG51bGwpOw0KLQ0KLQkJLy8gYXQgbGVhc3Qgc2V0IHRoZSB2ZXJzaW9uIGlkZW50aWZpZXIgdG8gYmUgdGhlIHNhbWUNCi0JCSAoKEZlYXR1cmVNb2RlbCkgcmVzdWx0KS5zZXRGZWF0dXJlSWRlbnRpZmllcihzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOw0KLQkJKChGZWF0dXJlTW9kZWwpIHJlc3VsdCkuc2V0RmVhdHVyZVZlcnNpb24oc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOw0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKHBsdWdpbkVudHJ5ID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJCQ0KLQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgicGx1Z2luXyIrcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlVcGRhdGVDb3JlLmxvZyhQb2xpY3kuYmluZCgiU2l0ZUZpbGUucGx1Z2luTm90UmVtb3ZlZCIsIHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCXJldHVybjsgDQotCQl9DQotDQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMocGx1Z2luRW50cnksIG1vbml0b3IpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7DQotCQkJdHJ5IHsNCi0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHJlZmVyZW5jZXNbaV0uYXNGaWxlKCkpOw0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKQ0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGUuQ2Fubm90UmVtb3ZlUGx1Z2luIiwgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCksIGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpLCBlKTsvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQkJcGx1Z2luRW50cmllcy5yZW1vdmUocGx1Z2luRW50cnkpOw0KLQkJSW5zdGFsbFJlZ2lzdHJ5LnVucmVnaXN0ZXJQbHVnaW4ocGx1Z2luRW50cnkpOw0KLQl9DQotDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGFib3V0VG9SZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJRXJyb3JSZWNvdmVyeUxvZyByZWNvdmVyeUxvZyA9IEVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCk7DQotCQkvLyBpZiB0aGUgcmVjb3ZlcnkgaXMgbm90IHR1cm5lZCBvbg0KLQkJaWYgKCFFcnJvclJlY292ZXJ5TG9nLlJFQ09WRVJZX09OKQ0KLQkJCXJldHVybjsNCi0NCi0JCS8vbG9nRmVhdHVyZQ0KLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgew0KLQkJCQkJDQotCQkJLy8gbG9nIGZlYXR1cmUgVVJMDQotCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhudWxsKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXJlY292ZXJ5TG9nLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5GRUFUVVJFX0VOVFJZLCByZWZlcmVuY2VzW2ldLmFzRmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJU3RyaW5nIGlkID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsNCi0JCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlRmlsZS5DYW5ub3RSZW1vdmVGZWF0dXJlIiwgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLCBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCX0NCi0JCQkvLyBsb2cgcGx1Z2luRW50cnkgVVJMDQotCQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luc1RvUmVtb3ZlID0gZ2V0UGx1Z2luRW50cmllc09ubHlSZWZlcmVuY2VkQnkoZmVhdHVyZSk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsNCi0JCQkJcmVmZXJlbmNlcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMocGx1Z2luc1RvUmVtb3ZlW2ldLCBudWxsKTsNCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZlcmVuY2VzLmxlbmd0aDsgaisrKSB7DQotCQkJCQl0cnkgew0KLQkJCQkJCXJlY292ZXJ5TG9nLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5CVU5ETEVfSkFSX0VOVFJZLCByZWZlcmVuY2VzW2pdLmFzRmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsNCi0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGUuQ2Fubm90UmVtb3ZlUGx1Z2luIiwgcGx1Z2luc1RvUmVtb3ZlW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLCBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGNhbGwgcmVjdXJzaXZlbHkgZm9yIGVhY2ggY2hpbGRyZW4JIA0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlblJlZiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gbnVsbDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5SZWYubGVuZ3RoOyBpKyspIHsNCi0JCQl0cnkgew0KLQkJCQljaGlsZEZlYXR1cmUgPSBjaGlsZHJlblJlZltpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBmZWF0dXJlIHRvIHJlbW92ZSBmb3I6IiArIGNoaWxkcmVuUmVmW2ldKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQlhYm91dFRvUmVtb3ZlKGNoaWxkRmVhdHVyZSk7DQotCQl9DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmRiZTE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotLyoqDQotICogQ29udGVudENvbnN1bW1lciBmb3IgYSBTaXRlRmlsZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTaXRlRmlsZUNvbnRlbnRDb25zdW1lciBleHRlbmRzIFNpdGVDb250ZW50Q29uc3VtZXIgew0KLQ0KLQlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7DQotCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsNCi0NCi0JLy8gcmVjb3ZlcnkNCi0JcHJpdmF0ZSBTdHJpbmcgb2xkUGF0aDsNCi0JcHJpdmF0ZSBTdHJpbmcgbmV3UGF0aDsNCi0NCi0JLy8gIGZvciBhYm9ydA0KLQlwcml2YXRlIExpc3QgLyogb2YgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIgKi8NCi0JY29udGVudENvbnN1bWVyczsNCi0JcHJpdmF0ZSBMaXN0IC8qb2YgcGF0aCBhcyBTdHJpbmcgKi8NCi0JaW5zdGFsbGVkRmlsZXM7DQotCQ0KLQkvLyBQRVJGOiBuZXcgaW5zdGFuY2UgdmFyaWFibGUNCi0JcHJpdmF0ZSBTaXRlRmlsZUZhY3RvcnkgYXJjaGl2ZUZhY3RvcnkgPSBuZXcgU2l0ZUZpbGVGYWN0b3J5KCk7DQotDQotCS8qDQotCSAqIENvbnN0cnVjdG9yIA0KLQkgKi8NCi0JcHVibGljIFNpdGVGaWxlQ29udGVudENvbnN1bWVyKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7DQotCQlpbnN0YWxsZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBSZXR1cm5zIHRoZSBwYXRoIGluIHdoaWNoIHRoZSBGZWF0dXJlIHdpbGwgYmUgaW5zdGFsbGVkDQotCSAqLw0KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlUGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBmZWF0dXJlUGF0aCA9IG51bGw7DQotCQl0cnkgew0KLQkJCVZlcnNpb25lZElkZW50aWZpZXIgZmVhdHVyZUlkZW50aWZpZXIgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0JCQlTdHJpbmcgcGF0aCA9IFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgZmVhdHVyZUlkZW50aWZpZXIudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yOw0KLQkJCVVSTCBuZXdVUkwgPSBuZXcgVVJMKGdldFNpdGUoKS5nZXRVUkwoKSwgcGF0aCk7DQotCQkJZmVhdHVyZVBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIuVW5hYmxlVG9DcmVhdGVVUkwiKSArIGUuZ2V0TWVzc2FnZSgpLCBlKTsJLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmV0dXJuIGZlYXR1cmVQYXRoOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjb3BlbihJTm9uUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgSUNvbnRlbnRDb25zdW1lciBvcGVuKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG5ldyBTaXRlRmlsZU5vblBsdWdpbkNvbnRlbnRDb25zdW1lcihnZXRGZWF0dXJlUGF0aCgpKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI29wZW4oSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUNvbnRlbnRDb25zdW1lciBjb25zOw0KLQkJaWYocGx1Z2luRW50cnkgaW5zdGFuY2VvZiBQbHVnaW5FbnRyeU1vZGVsICYmICEoKFBsdWdpbkVudHJ5TW9kZWwpcGx1Z2luRW50cnkpLmlzVW5wYWNrKCkpew0KLQkJCS8vIHBsdWdpbiBjYW4gcnVuIGZyb20gYSBqYXINCi0JCQkgY29ucyA9IG5ldyBTaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lcihwbHVnaW5FbnRyeSwgZ2V0U2l0ZSgpKTsNCi0JCX0gZWxzZXsNCi0JCQkvLyBwbHVnaW4gbXVzdCBiZSB1bnBhY2tlZA0KLQkJCWNvbnMgPSBuZXcgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIocGx1Z2luRW50cnksIGdldFNpdGUoKSk7DQotCQl9DQotCQlhZGRDb250ZW50Q29uc3VtZXJzKGNvbnMpOw0KLQkJcmV0dXJuIGNvbnM7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChjbG9zZWQpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gc3RvcmUgaW4gYSBjbG9zZWQgU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOw0KLQkJU3RyaW5nIGZlYXR1cmVQYXRoID0gZ2V0RmVhdHVyZVBhdGgoKTsNCi0JCVN0cmluZyBjb250ZW50S2V5ID0gY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCk7DQotCQlmZWF0dXJlUGF0aCArPSBjb250ZW50S2V5Ow0KLQ0KLQkJLy8gZXJyb3IgcmVjb3ZlcnkNCi0JCWlmIChmZWF0dXJlUGF0aC5lbmRzV2l0aCgiXFwiK0ZlYXR1cmUuRkVBVFVSRV9YTUwpIHx8IGZlYXR1cmVQYXRoLmVuZHNXaXRoKCIvIitGZWF0dXJlLkZFQVRVUkVfWE1MKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQlvbGRQYXRoID0gZmVhdHVyZVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7DQotCQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShvbGRQYXRoKTsNCi0JCQlpZiAobG9jYWxGaWxlLmV4aXN0cygpKSB7DQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJVcGRhdGVNYW5hZ2VyVXRpbHMuRmlsZUFscmVhZHlFeGlzdHMiLCBuZXcgT2JqZWN0W10geyBsb2NhbEZpbGUgfSksIG51bGwpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCWZlYXR1cmVQYXRoID0gRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIoZmVhdHVyZVBhdGgpOw0KLQkJCW5ld1BhdGggPSBmZWF0dXJlUGF0aDsNCi0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5GRUFUVVJFX0VOVFJZLCBmZWF0dXJlUGF0aCk7DQotCQl9DQotDQotCQl0cnkgew0KLQkJCWluU3RyZWFtID0gY29udGVudFJlZmVyZW5jZS5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5VG9Mb2NhbChpblN0cmVhbSwgZmVhdHVyZVBhdGgsIG51bGwpOw0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja1Blcm1pc3Npb25zKGNvbnRlbnRSZWZlcmVuY2UsIGZlYXR1cmVQYXRoKTsgLy8gMjAzMDUNCi0JCQlpbnN0YWxsZWRGaWxlcy5hZGQoZmVhdHVyZVBhdGgpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJHbG9iYWxDb25zdW1lci5FcnJvckNyZWF0aW5nRmlsZSIsIGZlYXR1cmVQYXRoKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCS8vIGNsb3NlIHN0cmVhbQ0KLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjY2xvc2UoKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKGNsb3NlZCkNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotDQotCQkvLyBjcmVhdGUgYSBuZXcgRmVhdHVyZSByZWZlcmVuY2UgdG8gYmUgYWRkZWQgdG8gdGhlIHNpdGUNCi0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOw0KLQkJcmVmLnNldFNpdGUoZ2V0U2l0ZSgpKTsNCi0JCUZpbGUgZmlsZSA9IG51bGw7DQotDQotCQl0cnkgew0KLQkJCWZpbGUgPSBuZXcgRmlsZShnZXRGZWF0dXJlUGF0aCgpKTsNCi0JCQlyZWYuc2V0VVJMKGZpbGUudG9VUkwoKSk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlRmlsZUNvbnRlbnRDb25zdW1lci5VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGUiLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCS8vcmVuYW1lIGZpbGUgYmFjayANCi0JCWlmIChuZXdQYXRoICE9IG51bGwpIHsNCi0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5SRU5BTUVfRU5UUlksIG5ld1BhdGgpOw0KLQkJCWJvb2xlYW4gc3VjZXNzID0gZmFsc2U7DQotCQkJRmlsZSBmaWxlVG9SZW5hbWUgPSBuZXcgRmlsZShuZXdQYXRoKTsNCi0JCQlpZiAoZmlsZVRvUmVuYW1lLmV4aXN0cygpKSB7DQotCQkJCUZpbGUgcmVuYW1lZEZpbGUgPSBuZXcgRmlsZShvbGRQYXRoKTsNCi0JCQkJaWYgKHJlbmFtZWRGaWxlLmV4aXN0cygpKSB7DQotCQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocmVuYW1lZEZpbGUpOw0KLQkJCQkJVXBkYXRlQ29yZS53YXJuKCJSZW1vdmluZyBhbHJlYWR5IGV4aXN0aW5nIGZpbGU6IiArIG9sZFBhdGgpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJc3VjZXNzID0gZmlsZVRvUmVuYW1lLnJlbmFtZVRvKHJlbmFtZWRGaWxlKTsNCi0JCQl9DQotCQkJaWYgKCFzdWNlc3MpIHsNCi0JCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJDb250ZW50Q29uc3VtZXIuVW5hYmxlVG9SZW5hbWUiLCBuZXdQYXRoLCBvbGRQYXRoKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihtc2csIG5ldyBFeGNlcHRpb24obXNnKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gY2xvc2UgcGx1Z2luIGFuZCBub24gcGx1Z2luIGNvbnRlbnQgY29uc3VtZXINCi0JCWlmIChjb250ZW50Q29uc3VtZXJzICE9IG51bGwpIHsNCi0JCQlJdGVyYXRvciBpdGVyID0gY29udGVudENvbnN1bWVycy5pdGVyYXRvcigpOw0KLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KLQkJCQlDb250ZW50Q29uc3VtZXIgZWxlbWVudCA9IChDb250ZW50Q29uc3VtZXIpIGl0ZXIubmV4dCgpOw0KLQkJCQllbGVtZW50LmNsb3NlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJY29udGVudENvbnN1bWVycyA9IG51bGw7DQotDQotCQlpZiAocmVmICE9IG51bGwpIHsNCi0JCQkvLyB0aGUgZmVhdHVyZSBNVVNUIGhhdmUgcmVuYW1lZCB0aGUgcGx1Z2lucyBhdCB0aGF0IHBvaW50DQotCQkJLy8gKGJ5IGNsb3NpbmcgdGhlIFBsdWdpbkNvbnRlbnRDb25zdW1lcikNCi0JCQljb21taXRQbHVnaW5zKHJlZik7DQotCQkJcmVmLm1hcmtSZWFkT25seSgpOw0KLQkJfQ0KLQ0KLQkJY2xvc2VkID0gdHJ1ZTsNCi0JCXJldHVybiByZWY7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNhYm9ydCgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhYm9ydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChjbG9zZWQpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gYWJvcnQgYSBjbG9zZWQgU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJLy9hYm9ydCBhbGwgcGx1Z2lucyBjb250ZW50IGNvbnN1bWVyIG9wZW5lZA0KLQkJaWYgKGNvbnRlbnRDb25zdW1lcnMgIT0gbnVsbCkgew0KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBjb250ZW50Q29uc3VtZXJzLml0ZXJhdG9yKCk7DQotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQotCQkJCVNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIGVsZW1lbnQgPSAoU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIpIGl0ZXIubmV4dCgpOw0KLQkJCQllbGVtZW50LmFib3J0KCk7DQotCQkJfQ0KLQkJfQ0KLQkJY29udGVudENvbnN1bWVycyA9IG51bGw7DQotCQlib29sZWFuIHN1Y2VzcyA9IHRydWU7DQotDQotCQkvL1JlbW92ZSBmZWF0dXJlLnhtbCBmaXJzdCBpZiBpdCBleGlzdHMNCi0JCWlmIChvbGRQYXRoICE9IG51bGwpIHsNCi0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5ERUxFVEVfRU5UUlksIG9sZFBhdGgpOw0KLQkJCUZpbGUgZmlsZVRvRGVsZXRlID0gbmV3IEZpbGUob2xkUGF0aCk7DQotCQkJaWYgKGZpbGVUb0RlbGV0ZS5leGlzdHMoKSkgew0KLQkJCQlzdWNlc3MgPSBmaWxlVG9EZWxldGUuZGVsZXRlKCk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKCFzdWNlc3MpIHsNCi0JCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlVuYWJsZSB0byBkZWxldGUiLCBvbGRQYXRoKTsgLy8kTk9OLU5MUy0xJA0KLQkJCVVwZGF0ZUNvcmUubG9nKG1zZywgbnVsbCk7DQotCQl9IGVsc2Ugew0KLQkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZSBmaWxlczsNCi0JCQlJdGVyYXRvciBpdGVyID0gaW5zdGFsbGVkRmlsZXMuaXRlcmF0b3IoKTsNCi0JCQlGaWxlIGZlYXR1cmVGaWxlID0gbnVsbDsNCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCi0JCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsNCi0JCQkJZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShwYXRoKTsNCi0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZlYXR1cmVGaWxlKTsNCi0JCQl9DQotDQotCQkJLy8gcmVtb3ZlIHRoZSBmZWF0dXJlIGRpcmVjdG9yeSBpZiBlbXB0eQ0KLQkJCVN0cmluZyBmZWF0dXJlUGF0aCA9IGdldEZlYXR1cmVQYXRoKCk7DQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUVtcHR5RGlyZWN0b3JpZXNGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmZWF0dXJlUGF0aCkpOw0KLQkJfQ0KLQkJY2xvc2VkID0gdHJ1ZTsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBjb21taXQgdGhlIHBsdWdpbnMgaW5zdGFsbGVkIGFzIGFyY2hpdmUgb24gdGhlIHNpdGUNCi0JICogKGNyZWF0ZXMgdGhlIG1hcCBiZXR3ZWVuIHRoZSBwbHVnaW4gaWQgYW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luKQ0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGNvbW1pdFBsdWdpbnMoSUZlYXR1cmVSZWZlcmVuY2UgbG9jYWxGZWF0dXJlUmVmZXJlbmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQ0KLQkJLy8gZ2V0IHRoZSBmZWF0dXJlDQotCQkgKChTaXRlRmlsZSkgZ2V0U2l0ZSgpKS5hZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGxvY2FsRmVhdHVyZVJlZmVyZW5jZSk7DQotCQlJRmVhdHVyZSBsb2NhbEZlYXR1cmUgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlsb2NhbEZlYXR1cmUgPSBsb2NhbEZlYXR1cmVSZWZlcmVuY2UuZ2V0RmVhdHVyZShudWxsKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQ0KLQkJaWYgKGxvY2FsRmVhdHVyZSA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JDQotCQkvLyBhZGQgdGhlIGluc3RhbGxlZCBwbHVnaW5zIGRpcmVjdG9yaWVzIGFzIGFyY2hpdmVzIGVudHJ5DQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWwgYXJjaGl2ZSA9IG51bGw7DQotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5FbnRyaWVzID0gbG9jYWxGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgew0KLQkJCVN0cmluZyB2ZXJzaW9uSWQgPSBwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJCVN0cmluZyBwbHVnaW5JRCA9IFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHZlcnNpb25JZCArIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5KQVJfRVhURU5TSU9OOw0KLQkJCWFyY2hpdmUgPSBhcmNoaXZlRmFjdG9yeS5jcmVhdGVBcmNoaXZlUmVmZXJlbmNlTW9kZWwoKTsNCi0JCQlhcmNoaXZlLnNldFBhdGgocGx1Z2luSUQpOw0KLQkJCXRyeSB7DQotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKGdldFNpdGUoKS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgdmVyc2lvbklkICsgRmlsZS5zZXBhcmF0b3IpOw0KLQkJCQlhcmNoaXZlLnNldFVSTFN0cmluZyh1cmwudG9FeHRlcm5hbEZvcm0oKSk7DQotCQkJCWFyY2hpdmUucmVzb2x2ZSh1cmwsIG51bGwpOw0KLQkJCQkoKFNpdGVGaWxlKSBnZXRTaXRlKCkpLmFkZEFyY2hpdmVSZWZlcmVuY2VNb2RlbChhcmNoaXZlKTsNCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkNCi0JCQkJU3RyaW5nIHVybFN0cmluZyA9IChnZXRTaXRlKCkuZ2V0VVJMKCkgIT0gbnVsbCkgPyBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSA6ICIiOwkvLyROT04tTkxTLTEkDQotCQkJCXVybFN0cmluZyArPSBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5FbnRyaWVzW2ldLnRvU3RyaW5nKCk7DQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlRmlsZS5VbmFibGVUb0NyZWF0ZVVSTCIsIHVybFN0cmluZyksIGUpOwkvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuOw0KLQl9DQotDQotCS8qDQotCSAqIEFkZHMgYSBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciB0byB0aGUgbGlzdA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGFkZENvbnRlbnRDb25zdW1lcnMoQ29udGVudENvbnN1bWVyIGNvbnMpIHsNCi0JCWlmIChjb250ZW50Q29uc3VtZXJzID09IG51bGwpDQotCQkJY29udGVudENvbnN1bWVycyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWNvbnRlbnRDb25zdW1lcnMuYWRkKGNvbnMpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0ZWUyMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogU2l0ZSBvbiB0aGUgRmlsZSBTeXN0ZW0NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBTaXRlQ29udGVudFByb3ZpZGVyIHsNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfVFlQRSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIjsJIC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBGaWxlU2l0ZQ0KLQkgKi8NCi0JcHVibGljIFNpdGVGaWxlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCi0JCXN1cGVyKHVybCk7DQotCX0NCi0NCi0JCQkNCi0JLyoNCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRQcm92aWRlciNnZXRBcmNoaXZlUmVmZXJlbmNlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcgYXJjaGl2ZUlkKSAgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJVVJMIGNvbnRlbnRVUkwgPSBudWxsOw0KLQkJDQotCQljb250ZW50VVJMID0gZ2V0QXJjaGl2ZVVSTGZvcihhcmNoaXZlSWQpOw0KLQkJLy8gaWYgdGhlcmUgaXMgbm8gbWFwcGluZyBpbiB0aGUgc2l0ZS54bWwNCi0JCS8vIGZvciB0aGlzIGFyY2hpdmVJZCwgdXNlIHRoZSBkZWZhdWx0IG9uZQ0KLQkJaWYgKGNvbnRlbnRVUkw9PW51bGwpIHsNCi0JCQlyZXR1cm4gc3VwZXIuZ2V0QXJjaGl2ZVJlZmVyZW5jZShhcmNoaXZlSWQpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY29udGVudFVSTDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogcmV0dXJuIHRoZSBVUkwgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZCBvZiB0aGUgYXJjaGl2ZSBmb3IgdGhpcyBzaXRlDQotCSAqIHJldHVybiBudWxsIGlmIHRoZSBhcmNoaXZlSWQgaXMgbnVsbCwgZW1wdHkgb3IgDQotCSAqIGlmIHRlaCBsaXN0IG9mIGFyY2hpdmVzIG9uIHRoZSBzaXRlIGlzIG51bGwgb3IgZW1wdHkNCi0JICogb2YgaWYgdGhlcmUgaXMgbm8gVVJMIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJjaGl2ZUlEIGZvciB0aGlzIHNpdGUNCi0JICovDQotCXByaXZhdGUgVVJMIGdldEFyY2hpdmVVUkxmb3IoU3RyaW5nIGFyY2hpdmVJZCkgew0KLQkJVVJMIHJlc3VsdCA9IG51bGw7DQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQotDQotCQlJQXJjaGl2ZVJlZmVyZW5jZVtdIHNpdGVBcmNoaXZlcyA9IGdldFNpdGUoKS5nZXRBcmNoaXZlcygpOw0KLQkJaWYgKHNpdGVBcmNoaXZlcy5sZW5ndGggPiAwKSB7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlQXJjaGl2ZXMubGVuZ3RoICYmICFmb3VuZDsgaSsrKSB7DQotCQkJCWlmIChhcmNoaXZlSWQudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2Uoc2l0ZUFyY2hpdmVzW2ldLmdldFBhdGgoKSkpIHsNCi0JCQkJCXJlc3VsdCA9IHNpdGVBcmNoaXZlc1tpXS5nZXRVUkwoKTsNCi0JCQkJCWZvdW5kID0gdHJ1ZTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLX0NCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlMWI5Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuKjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguKjsNCi0NCi1wdWJsaWMgY2xhc3MgU2l0ZUZpbGVGYWN0b3J5IGV4dGVuZHMgQmFzZVNpdGVGYWN0b3J5IHsNCi0NCi0JLy8gcHJpdmF0ZSB3aGVuIHBhcnNpbmcgZmlsZSBzeXN0ZW0NCi0JcHJpdmF0ZSBTaXRlRmlsZSBzaXRlOw0KLQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCxib29sZWFuKQ0KLQkgKi8NCi0JcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotCQ0KLQkJU2l0ZSBzaXRlID0gbnVsbDsNCi0JCUlucHV0U3RyZWFtIHNpdGVTdHJlYW0gPSBudWxsOw0KLQkJU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gdGhpczsNCi0JDQotCQl0cnkgew0KLQkJCS8vIGlmIHVybCBwb2ludHMgdG8gYSBkaXJlY3RvcnkNCi0JCQkvLyBhdHRlbXB0IHRvIHBhcnNlIHNpdGUueG1sDQotCQkJU3RyaW5nIHBhdGggPSB1cmwuZ2V0RmlsZSgpOw0KLQkJCUZpbGUgc2l0ZUxvY2F0aW9uID0gbmV3IEZpbGUocGF0aCk7DQotCQkJaWYgKHNpdGVMb2NhdGlvbi5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCXVybCA9IHNpdGVMb2NhdGlvbi50b1VSTCgpOw0KLQkJCQlGaWxlIHNpdGVYTUxGaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2F0aW9uLCBTaXRlLlNJVEVfWE1MKTsNCi0JCQkJaWYgKHNpdGVYTUxGaWxlLmV4aXN0cygpKSB7DQotCQkJCQlzaXRlU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzaXRlWE1MRmlsZSk7DQotCQkJCQlzaXRlID0gKFNpdGUpIGZhY3RvcnkucGFyc2VTaXRlKHNpdGVTdHJlYW0pOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJLy8gcGFyc2Ugc2l0ZUxvY2F0aW9uDQotCQkJCQlzaXRlID0gcGFyc2VTaXRlKHNpdGVMb2NhdGlvbik7DQotCQkJCX0NCi0JCQl9IGVsc2Ugew0KLQkJCQkvLyB3ZSBhcmUgbm90IHBvaW50aW5nIHRvIGEgZGlyZWN0b3J5DQotCQkJCS8vIGF0dGVtcHQgdG8gcGFyc2UgdGhlIGZpbGUNCi0JCQkJdHJ5IHsNCi0JCQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7DQotCQkJCQlzaXRlU3RyZWFtID0gb3BlblN0cmVhbShyZXNvbHZlZFVSTCk7DQotCQkJCQlzaXRlID0gKFNpdGUpIGZhY3RvcnkucGFyc2VTaXRlKHNpdGVTdHJlYW0pOw0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQ0KLQkJCQkJLy8gYXR0ZW1wdCB0byBwYXJzZSBwYXJlbnQgZGlyZWN0b3J5DQotCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsNCi0JCQkJCUZpbGUgcGFyZW50RGlyZWN0b3J5ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7DQotCQ0KLQkJCQkJLy8gZG8gbm90IGNyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdAlbMTgzMThdDQotCQkJCQkvLyBpbnN0ZWFkIGhyb3cgZXJyb3IJCQkJCQ0KLQkJCQkJaWYgKHBhcmVudERpcmVjdG9yeSAhPSBudWxsICYmICFwYXJlbnREaXJlY3RvcnkuZXhpc3RzKCkpDQotCQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVGaWxlRmFjdG9yeS5EaXJlY3RvcnlEb2VzTm90RXhpc3QiLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCk7CS8vJE5PTi1OTFMtMSQNCi0JDQotCQkJCQlpZiAocGFyZW50RGlyZWN0b3J5ID09IG51bGwgfHwgIXBhcmVudERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKQ0KLQkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlRmlsZUZhY3RvcnkuVW5hYmxlVG9PYnRhaW5QYXJlbnREaXJlY3RvcnkiLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCk7CS8vJE5PTi1OTFMtMSQNCi0JDQotCQkJCQlzaXRlID0gcGFyc2VTaXRlKHBhcmVudERpcmVjdG9yeSk7DQotCQ0KLQkJCQl9DQotCQkJfQ0KLQkNCi0JCQlTaXRlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBTaXRlRmlsZUNvbnRlbnRQcm92aWRlcih1cmwpOw0KLQkJCXNpdGUuc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOw0KLQkJCWNvbnRlbnRQcm92aWRlci5zZXRTaXRlKHNpdGUpOw0KLQkJCXNpdGUucmVzb2x2ZSh1cmwsIHVybCk7DQotCQ0KLQkJCS8vIERvIG5vdCBzZXQgcmVhZCBvbmx5IGFzIG1heSBpbnN0YWxsIGluIGl0DQotCQkJLy9zaXRlLm1hcmtSZWFkT25seSgpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGVGYWN0b3J5LlVuYWJsZVRvQ3JlYXRlVVJMIiwgdXJsID09IG51bGwgPyAiIiA6IHVybC50b0V4dGVybmFsRm9ybSgpKSwgZSk7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlRmlsZUZhY3RvcnkuVW5hYmxlVG9BY2Nlc3NTaXRlIiksSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OLCBlKTsvLyROT04tTkxTLTEkDQotCQl9IGZpbmFsbHkgew0KLQkJCXRyeSB7DQotCQkJCWlmIChzaXRlU3RyZWFtICE9IG51bGwpDQotCQkJCQlzaXRlU3RyZWFtLmNsb3NlKCk7DQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotCS8qKg0KLQkgKiBNZXRob2QgcGFyc2VTaXRlLg0KLQkgKi8NCi0JcHJpdmF0ZSBTaXRlIHBhcnNlU2l0ZShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJdGhpcy5zaXRlID0gKFNpdGVGaWxlKSBjcmVhdGVTaXRlTWFwTW9kZWwoKTsNCi0NCi0JCWlmICghZGlyZWN0b3J5LmV4aXN0cygpKQ0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlRmlsZUZhY3RvcnkuRmlsZURvZXNOb3RFeGlzdCIsIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpOy8vJE5PTi1OTFMtMSQNCi0NCi0JCUZpbGUgcGx1Z2luUGF0aCA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIKTsNCi0NCi0JCS8vUEFDS0FHRUQNCi0JCXBhcnNlUGFja2FnZWRGZWF0dXJlKGRpcmVjdG9yeSk7IC8vIGluIGNhc2UgaXQgY29udGFpbnMgSkFSIGZpbGVzDQotDQotCQlwYXJzZVBhY2thZ2VkUGx1Z2lucyhwbHVnaW5QYXRoKTsNCi0NCi0JCS8vIElOU1RBTExFRAkNCi0JCXBhcnNlSW5zdGFsbGVkRmVhdHVyZShkaXJlY3RvcnkpOw0KLQ0KLQkJcGFyc2VJbnN0YWxsZWRQbHVnaW5zKHBsdWdpblBhdGgpOw0KLQ0KLQkJcmV0dXJuIHNpdGU7DQotDQotCX0NCi0NCi0JLyoqDQotCSAqIE1ldGhvZCBwYXJzZUZlYXR1cmUuDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5zdGFsbGVkRmVhdHVyZShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJRmlsZSBmZWF0dXJlRGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCk7DQotCQlpZiAoZmVhdHVyZURpci5leGlzdHMoKSkgew0KLQkJCVN0cmluZ1tdIGRpcjsNCi0JCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWY7DQotCQkJVVJMIGZlYXR1cmVVUkw7DQotCQkJRmlsZSBjdXJyZW50RmVhdHVyZURpcjsNCi0JCQlTdHJpbmcgbmV3RmlsZVBhdGggPSBudWxsOw0KLQ0KLQkJCXRyeSB7DQotCQkJCS8vIGhhbmRsZSB0aGUgaW5zdGFsbGVkIGZlYXR1cmVzQ29uZmlndXJlZCB1bmRlciBmZWF0dXJlc0NvbmZpZ3VyZWQgc3ViZGlyZWN0b3J5DQotCQkJCWRpciA9IGZlYXR1cmVEaXIubGlzdCgpOw0KLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZGlyLmxlbmd0aDsgaW5kZXgrKykgew0KLQ0KLQkJCQkJLy8gdGhlIFVSTCBtdXN0IGVuZHMgd2l0aCAnLycgZm9yIHRoZSBidW5kbGUgdG8gYmUgcmVzb2x2ZWQNCi0JCQkJCW5ld0ZpbGVQYXRoID0gZGlyW2luZGV4XSArIChkaXJbaW5kZXhdLmVuZHNXaXRoKCIvIikgPyAiLyIgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCQljdXJyZW50RmVhdHVyZURpciA9IG5ldyBGaWxlKGZlYXR1cmVEaXIsIG5ld0ZpbGVQYXRoKTsNCi0JCQkJCS8vIGNoZWNrIGlmIGZlYXR1cmUueG1sIGV4aXN0cw0KLQkJCQkJRmlsZSBmZWF0dXJlWE1MRmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRGZWF0dXJlRGlyLCBGZWF0dXJlLkZFQVRVUkVfWE1MKTsNCi0JCQkJCWlmICghZmVhdHVyZVhNTEZpbGUuZXhpc3RzKCkpIHsNCi0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBmaW5kIGZlYXR1cmUueG1sIGluIGRpcmVjdG9yeToiICsgY3VycmVudEZlYXR1cmVEaXIpOyAvLyROT04tTkxTLTEkDQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCS8vIFBFUkY6IHJlbW92ZSBjb2RlDQotCQkJCQkJLy9TaXRlRmlsZUZhY3RvcnkgYXJjaGl2ZUZhY3RvcnkgPSBuZXcgU2l0ZUZpbGVGYWN0b3J5KCk7DQotCQkJCQkJZmVhdHVyZVVSTCA9IGN1cnJlbnRGZWF0dXJlRGlyLnRvVVJMKCk7DQotCQkJCQkJZmVhdHVyZVJlZiA9IGNyZWF0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpOw0KLQkJCQkJCWZlYXR1cmVSZWYuc2V0U2l0ZU1vZGVsKHNpdGUpOw0KLQkJCQkJCWZlYXR1cmVSZWYuc2V0VVJMU3RyaW5nKGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7DQotCQkJCQkJZmVhdHVyZVJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfVFlQRSk7DQotCQkJCQkJKChTaXRlKSBzaXRlKS5hZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoZmVhdHVyZVJlZik7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGVGYWN0b3J5LlVuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZSIsIG5ld0ZpbGVQYXRoKSwgZSk7CS8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSogTWV0aG9kIHBhcnNlRmVhdHVyZS4NCi0JKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JKi8NCi0JcHJpdmF0ZSB2b2lkIHBhcnNlUGFja2FnZWRGZWF0dXJlKEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQkvLyBGRUFUVVJFUw0KLQkJRmlsZSBmZWF0dXJlRGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIKTsNCi0JCWlmIChmZWF0dXJlRGlyLmV4aXN0cygpKSB7DQotCQkJU3RyaW5nW10gZGlyOw0KLQkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZjsNCi0JCQlVUkwgZmVhdHVyZVVSTDsNCi0JCQlGaWxlIGN1cnJlbnRGZWF0dXJlRmlsZTsNCi0JCQlTdHJpbmcgbmV3RmlsZVBhdGggPSBudWxsOw0KLQ0KLQkJCXRyeSB7DQotCQkJCS8vIG9ubHkgbGlzdCBKQVIgZmlsZXMNCi0JCQkJZGlyID0gZmVhdHVyZURpci5saXN0KEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5maWx0ZXIpOw0KLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZGlyLmxlbmd0aDsgaW5kZXgrKykgew0KLQ0KLQkJCQkJLy8gY2hlY2sgaWYgdGhlIEpBUiBmaWxlIGNvbnRhaW5zIGEgZmVhdHVyZS54bWwNCi0JCQkJCWN1cnJlbnRGZWF0dXJlRmlsZSA9IG5ldyBGaWxlKGZlYXR1cmVEaXIsIGRpcltpbmRleF0pOw0KLQkJCQkJSmFyQ29udGVudFJlZmVyZW5jZSByZWYgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiIiwgY3VycmVudEZlYXR1cmVGaWxlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJQ29udGVudFJlZmVyZW5jZSByZXN1bHQgPSBudWxsOw0KLQkJCQkJdHJ5IHsNCi0JCQkJCQlyZXN1bHQgPSByZWYucGVlayhGZWF0dXJlLkZFQVRVUkVfWE1MLCBudWxsLCBudWxsKTsNCi0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIkV4Y2VwdGlvbiByZXRyaWV2aW5nIGZlYXR1cmUueG1sIGluIGZpbGU6IiArIGN1cnJlbnRGZWF0dXJlRmlsZSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0NCi0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgew0KLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGZpbmQgZmVhdHVyZS54bWwgaW4gZmlsZToiICsgY3VycmVudEZlYXR1cmVGaWxlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQlmZWF0dXJlVVJMID0gY3VycmVudEZlYXR1cmVGaWxlLnRvVVJMKCk7DQotCQkJCQkJLy8gUEVSRjogcmVtb3ZlIGNvZGUNCi0JCQkJCQkvL1NpdGVGaWxlRmFjdG9yeSBhcmNoaXZlRmFjdG9yeSA9IG5ldyBTaXRlRmlsZUZhY3RvcnkoKTsNCi0JCQkJCQlmZWF0dXJlUmVmID0gY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7DQotCQkJCQkJZmVhdHVyZVJlZi5zZXRTaXRlTW9kZWwoc2l0ZSk7DQotCQkJCQkJZmVhdHVyZVJlZi5zZXRVUkxTdHJpbmcoZmVhdHVyZVVSTC50b0V4dGVybmFsRm9ybSgpKTsNCi0JCQkJCQlmZWF0dXJlUmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOw0KLQkJCQkJCXNpdGUuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWYpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVGaWxlRmFjdG9yeS5VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGUiLCBuZXdGaWxlUGF0aCksIGUpOwkvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBNZXRob2QgcGFyc2VQbHVnaW5zLg0KLQkgKiANCi0JICogbG9vayBpbnRvIGVhY2ggcGx1Z2luL2ZyYWdtZW50IGRpcmVjdG9yeSwgY3JhY2sgdGhlIHBsdWdpbi54bWwgb3BlbiAob3INCi0JICogZnJhZ21lbnQueG1sID8/PykgZ2V0IGlkIGFuZCB2ZXJzaW9uLCBjYWxjdWxhdGUgVVJMLi4uDQotCSAqIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCBwYXJzZUluc3RhbGxlZFBsdWdpbnMoRmlsZSBwbHVnaW5zRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoIXBsdWdpbnNEaXIuZXhpc3RzKCkgfHwgIXBsdWdpbnNEaXIuaXNEaXJlY3RvcnkoKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCUZpbGVbXSBkaXJzID0gcGx1Z2luc0Rpci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgew0KLQkJCQlyZXR1cm4gZi5pc0RpcmVjdG9yeSgpOw0KLQkJCX0NCi0JCX0pOw0KLQkJRGVmYXVsdFBsdWdpblBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFBsdWdpblBhcnNlcigpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKSB7DQotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoZGlyc1tpXSwgIk1FVEEtSU5GL01BTklGRVNULk1GIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7DQotCQkJdHJ5IHsNCi0JCQkJQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QgPSBuZXcgQnVuZGxlTWFuaWZlc3QocGx1Z2luRmlsZSk7DQotCQkJCWlmIChidW5kbGVNYW5pZmVzdC5leGlzdHMoKSkgew0KLQkJCQkJUGx1Z2luRW50cnkgZW50cnkgPSBidW5kbGVNYW5pZmVzdC5nZXRQbHVnaW5FbnRyeSgpOw0KLQkJCQkJYWRkUGFyc2VkUGx1Z2luKGVudHJ5LCBkaXJzW2ldKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCWlmICghKHBsdWdpbkZpbGUgPSBuZXcgRmlsZShkaXJzW2ldLCAicGx1Z2luLnhtbCIpKSAvLyROT04tTkxTLTEkDQotCQkJCQkJCS5leGlzdHMoKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKGRpcnNbaV0sICJmcmFnbWVudC54bWwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJfQ0KLQkJCQkJaWYgKHBsdWdpbkZpbGUgIT0gbnVsbCAmJiBwbHVnaW5GaWxlLmV4aXN0cygpDQotCQkJCQkJCSYmICFwbHVnaW5GaWxlLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQkJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGx1Z2luRmlsZSk7DQotCQkJCQkJUGx1Z2luRW50cnkgZW50cnkgPSBwYXJzZXIucGFyc2UoaW4pOw0KLQkJCQkJCWFkZFBhcnNlZFBsdWdpbihlbnRyeSwgZGlyc1tpXSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCVN0cmluZyBwbHVnaW5GaWxlU3RyaW5nID0gKHBsdWdpbkZpbGUgPT0gbnVsbCkNCi0JCQkJCQk/IG51bGwNCi0JCQkJCQk6IHBsdWdpbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7DQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKA0KLQkJCQkJCSJTaXRlRmlsZUZhY3RvcnkuRXJyb3JBY2Nlc3NpbmciLCBwbHVnaW5GaWxlU3RyaW5nKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgew0KLQkJCQlTdHJpbmcgcGx1Z2luRmlsZVN0cmluZyA9IChwbHVnaW5GaWxlID09IG51bGwpDQotCQkJCQkJPyBudWxsDQotCQkJCQkJOiBwbHVnaW5GaWxlLmdldEFic29sdXRlUGF0aCgpOw0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgNCi0JCQkJCQkiU2l0ZUZpbGVGYWN0b3J5LkVycm9yUGFyc2luZ0ZpbGUiLCBwbHVnaW5GaWxlU3RyaW5nKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCWUpOw0KLQkJCX0gZmluYWxseSB7DQotCQkJCWlmIChpbiAhPSBudWxsKXsNCi0JCQkJCXRyeXsNCi0JCQkJCQlpbi5jbG9zZSgpOw0KLQkJCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogdHJhbmZvcm0gZWFjaCBQbHVnaW4gYW5kIEZyYWdtZW50IGludG8gYW4gQXJjaGl2ZVJlZmVyZW5jZU1vZGVsDQotCSAqIGFuZCBhIFBsdWdpbkVudHJ5IGZvciB0aGUgU2l0ZQkgDQotCSAqLw0KLQkvLyBQRVJGOiByZW1vdmVkIGludGVybWVkaWF0ZSBQbHVnaW4gb2JqZWN0DQotCXByaXZhdGUgdm9pZCBhZGRQYXJzZWRQbHVnaW4oUGx1Z2luRW50cnkgZW50cnksRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlpZiAoZW50cnkgIT0gbnVsbCkgew0KLQ0KLQkJCQkvLyBjcmVhdGUgdGhlIHBsdWdpbiBFbnRyeQ0KLQkJCQkoKFNpdGUpIHNpdGUpLmFkZFBsdWdpbkVudHJ5KGVudHJ5KTsNCi0NCi0JCQkJLy8gQ3JlYXRlIHRoZSBTaXRlIG1hcHBpbmcgQXJjaGl2ZVJlZi0+UGx1Z2luRW50cnkNCi0JCQkJLy8gdGhlIGlkIG9mIHRoZSBhcmNoaXZlUmVmIGlzIHBsdWdpbnNcPHBsdWdpbmlkPl88dmVyPi5qYXIgYXMgcGVyIHRoZSBzcGVjcw0KLQkJCQkvLyBQRVJGOiByZW1vdmUgY29kZQ0KLQkJCQkvL1NpdGVGaWxlRmFjdG9yeSBhcmNoaXZlRmFjdG9yeSA9IG5ldyBTaXRlRmlsZUZhY3RvcnkoKTsJCQkJDQotCQkJCUFyY2hpdmVSZWZlcmVuY2VNb2RlbCBhcmNoaXZlID0gY3JlYXRlQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKCk7DQotCQkJCVN0cmluZyBpZCA9IChlbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQkJCVN0cmluZyBwbHVnaW5JRCA9IFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIGlkICsgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLkpBUl9FWFRFTlNJT047DQotCQkJCWFyY2hpdmUuc2V0UGF0aChwbHVnaW5JRCk7DQotCQkJCWxvY2F0aW9uID0gZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkJCWFyY2hpdmUuc2V0VVJMU3RyaW5nKGxvY2F0aW9uKTsNCi0JCQkJKChTaXRlKSBzaXRlKS5hZGRBcmNoaXZlUmVmZXJlbmNlTW9kZWwoYXJjaGl2ZSk7DQotDQotCQkJCS8vIFRSQUNFCQkJCQ0KLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgew0KLQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQWRkZWQgYXJjaGl2ZSB0byBzaXRlOiIgKyBwbHVnaW5JRCArICIgcG9pbnRpbmcgdG86ICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCQl9DQotCQkJfQ0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGVGYWN0b3J5LlVuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZSIsIGxvY2F0aW9uKSwgZSk7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogIA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHBhcnNlUGFja2FnZWRQbHVnaW5zKEZpbGUgcGx1Z2luRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoIXBsdWdpbkRpci5leGlzdHMoKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCVN0cmluZ1tdIGRpciA9IHBsdWdpbkRpci5saXN0KEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5maWx0ZXIpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXIubGVuZ3RoOyBpKyspIHsNCi0JCQlDb250ZW50UmVmZXJlbmNlIHJlZiA9IG51bGw7DQotCQkJU3RyaW5nIHJlZlN0cmluZyA9IG51bGw7DQotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOw0KLQkJCXRyeSB7DQotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBsdWdpbkRpciwgZGlyW2ldKTsNCi0JCQkJSmFyQ29udGVudFJlZmVyZW5jZSBqYXJSZWZlcmVuY2UgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgNCi0JCQkJCQludWxsLCBmaWxlKTsNCi0JCQkJcmVmID0gamFyUmVmZXJlbmNlLnBlZWsoIk1FVEEtSU5GL01BTklGRVNULk1GIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJaWYgKHJlZiAhPSBudWxsKSB7DQotCQkJCQlpbiA9IHJlZi5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQnVuZGxlTWFuaWZlc3QoaW4pOw0KLQkJCQkJaWYgKG1hbmlmZXN0LmV4aXN0cygpKSB7DQotCQkJCQkJYWRkUGFyc2VkUGx1Z2luKG1hbmlmZXN0LmdldFBsdWdpbkVudHJ5KCksIGZpbGUpOw0KLQkJCQkJCWNvbnRpbnVlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXJlZiA9IGphclJlZmVyZW5jZS5wZWVrKCJwbHVnaW4ueG1sIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJaWYgKHJlZiA9PSBudWxsKSB7DQotCQkJCQlyZWYgPSBqYXJSZWZlcmVuY2UucGVlaygiZnJhZ21lbnQueG1sIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQlpZiAocmVmICE9IG51bGwpIHsNCi0JCQkJCWluID0gcmVmLmdldElucHV0U3RyZWFtKCk7DQotCQkJCQlQbHVnaW5FbnRyeSBlbnRyeSA9IG5ldyBEZWZhdWx0UGx1Z2luUGFyc2VyKCkucGFyc2UoaW4pOw0KLQkJCQkJYWRkUGFyc2VkUGx1Z2luKGVudHJ5LCBmaWxlKTsNCi0JCQkJfQ0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXJlZlN0cmluZyA9IChyZWYgPT0gbnVsbCkgPyBudWxsIDogcmVmLmFzVVJMKCkNCi0JCQkJCQkJLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgew0KLQkJCQl9DQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKA0KLQkJCQkJCSJTaXRlRmlsZUZhY3RvcnkuRXJyb3JBY2Nlc3NpbmciLCByZWZTdHJpbmcpLCBlKTsvLyROT04tTkxTLTEkDQotCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXJlZlN0cmluZyA9IChyZWYgPT0gbnVsbCkgPyBudWxsIDogcmVmLmFzVVJMKCkNCi0JCQkJCQkJLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgew0KLQkJCQl9DQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKA0KLQkJCQkJCSJTaXRlRmlsZUZhY3RvcnkuRXJyb3JQYXJzaW5nRmlsZSIsIHJlZlN0cmluZyksIGUpOyAvLyROT04tTkxTLTEkDQotCQkJfSBmaW5hbGx5IHsNCi0JCQkJaWYoaW4gIT0gbnVsbCl7DQotCQkJCQl0cnl7DQotCQkJCQkJaW4uY2xvc2UoKTsNCi0JCQkJCX1jYXRjaChJT0V4Y2VwdGlvbiBjZSl7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBTaXRlTW9kZWxGYWN0b3J5I2NyZWF0ZVNpdGVNYXBNb2RlbCgpDQotCSAqLw0KLQlwdWJsaWMgU2l0ZU1vZGVsIGNyZWF0ZVNpdGVNYXBNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgU2l0ZUZpbGUoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIFNpdGVNb2RlbEZhY3RvcnkjY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYXJzZVNpdGVUeXBlKFN0cmluZyB0eXBlKSB7DQotCQlyZXR1cm4gKHN1cGVyLmNhblBhcnNlU2l0ZVR5cGUodHlwZSkgfHwgU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIuU0lURV9UWVBFLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxNjVmZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBQbHVnaW4gQ29udGVudCBDb25zdW1lciBvbiBhIFNpdGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIgZXh0ZW5kcyBDb250ZW50Q29uc3VtZXIgew0KLQ0KLQlwcml2YXRlIFN0cmluZyBwYXRoOw0KLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7DQotDQotCS8qDQotCSAqIENvbnN0cnVjdG9yIA0KLQkgKi8NCi0JcHVibGljIFNpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyKFN0cmluZyBmZWF0dXJlUGF0aCkgew0KLQkJdGhpcy5wYXRoID0gZmVhdHVyZVBhdGg7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChjbG9zZWQpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gc3RvcmUgaW4gYSBjbG9zZWQgU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOw0KLQkJU3RyaW5nIGZlYXR1cmVQYXRoID0gcGF0aDsNCi0JCVN0cmluZyBjb250ZW50S2V5ID0gY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCk7DQotCQlmZWF0dXJlUGF0aCArPSBjb250ZW50S2V5Ow0KLQkJdHJ5IHsNCi0JCQlpblN0cmVhbSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIGZlYXR1cmVQYXRoLCBudWxsKTsNCi0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tQZXJtaXNzaW9ucyhjb250ZW50UmVmZXJlbmNlLCBmZWF0dXJlUGF0aCk7IC8vIDIwMzA1DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkdsb2JhbENvbnN1bWVyLkVycm9yQ3JlYXRpbmdGaWxlIiwgZmVhdHVyZVBhdGgpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgew0KLQkJCQl0cnkgew0KLQkJCQkJLy8gY2xvc2Ugc3RyZWFtDQotCQkJCQlpblN0cmVhbS5jbG9zZSgpOw0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNjbG9zZSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsNCi0JCWlmIChjbG9zZWQpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJY2xvc2VkID0gdHJ1ZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlUGFja2VkUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlUGFja2VkUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiM2RlM2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIFBsdWdpbiBDb250ZW50IENvbnN1bWVyIG9uIGEgU2l0ZQotICogZm9yIGEgcGx1Z2luIHRoYXQgd2lsbCBydW4gZnJvbSBhIGphcgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIgZXh0ZW5kcyBDb250ZW50Q29uc3VtZXIgewotCi0JcHJpdmF0ZSBJUGx1Z2luRW50cnkgcGx1Z2luRW50cnk7Ci0JcHJpdmF0ZSBJU2l0ZSBzaXRlOwotCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBqYXJQYXRoOwotCXByaXZhdGUgU3RyaW5nIHRlbXBQYXRoOwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBTaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lcihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIElTaXRlIHNpdGUpIHsKLQkJdGhpcy5wbHVnaW5FbnRyeSA9IHBsdWdpbkVudHJ5OwotCQl0aGlzLnNpdGUgPSBzaXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQotCQlpZiAoY2xvc2VkKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gc3RvcmUgaW4gYSBjbG9zZWQgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyAiLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQlpblN0cmVhbSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCWphclBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoamFyUGF0aCk7Ci0JCQlpZiAoamFyRmlsZS5leGlzdHMoKSkgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJVcGRhdGVNYW5hZ2VyVXRpbHMuRmlsZUFscmVhZHlFeGlzdHMiLCBuZXcgT2JqZWN0W10geyBqYXJGaWxlIH0pLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gZXJyb3IgcmVjb3ZlcnkKLQkJCXRlbXBQYXRoPSBFcnJvclJlY292ZXJ5TG9nLmdldExvY2FsUmFuZG9tSWRlbnRpZmllcihqYXJQYXRoKyIudG1wIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5CVU5ETEVfSkFSX0VOVFJZLCB0ZW1wUGF0aCk7Ci0JCQkvLwotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNvcHlUb0xvY2FsKGluU3RyZWFtLCB0ZW1wUGF0aCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJHbG9iYWxDb25zdW1lci5FcnJvckNyZWF0aW5nRmlsZSIsIHRlbXBQYXRoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gY2xvc2Ugc3RyZWFtCi0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNjbG9zZSgpIAotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChjbG9zZWQpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBjbG9zZSBhIGNsb3NlZCBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0ZW1wUGF0aCAhPSBudWxsKSB7Ci0JCQkvLyByZW5hbWUgZmlsZSAKLQkJCUVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCkuYXBwZW5kUGF0aChFcnJvclJlY292ZXJ5TG9nLlJFTkFNRV9FTlRSWSwgdGVtcFBhdGgpOwotCQkJRmlsZSBmaWxlVG9SZW5hbWUgPSBuZXcgRmlsZSh0ZW1wUGF0aCk7Ci0JCQlib29sZWFuIHN1Y2VzcyA9IGZhbHNlOwotCQkJaWYgKGZpbGVUb1JlbmFtZS5leGlzdHMoKSkgewotCQkJCUZpbGUgcmVuYW1lZEZpbGUgPSBuZXcgRmlsZShqYXJQYXRoKTsKLQkJCQlzdWNlc3MgPSBmaWxlVG9SZW5hbWUucmVuYW1lVG8ocmVuYW1lZEZpbGUpOwotCQkJfQotCQkJaWYgKCFzdWNlc3MpIHsKLQkJCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIkNvbnRlbnRDb25zdW1lci5VbmFibGVUb1JlbmFtZSIsIHRlbXBQYXRoLCBqYXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKG1zZywgbmV3IEV4Y2VwdGlvbihtc2cpKTsKLQkJCX0KLQkJfQotCi0JCWlmIChzaXRlIGluc3RhbmNlb2YgU2l0ZUZpbGUpCi0JCQkgKChTaXRlRmlsZSkgc2l0ZSkuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOwotCQljbG9zZWQgPSB0cnVlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWJvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGNsb3NlZCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGFib3J0IGEgY2xvc2VkIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBzdWNlc3MgPSB0cnVlOwotCi0JCS8vIGRlbGV0ZSBwbHVnaW4uamFyCi0JCWlmIChqYXJQYXRoICE9IG51bGwpIHsKLQkJCUVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCkuYXBwZW5kUGF0aChFcnJvclJlY292ZXJ5TG9nLkRFTEVURV9FTlRSWSwgamFyUGF0aCk7Ci0JCQlGaWxlIGZpbGVUb1JlbW92ZSA9IG5ldyBGaWxlKGphclBhdGgpOwotCi0JCQlpZiAoZmlsZVRvUmVtb3ZlLmV4aXN0cygpKSB7Ci0JCQkJc3VjZXNzID0gZmlsZVRvUmVtb3ZlLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFzdWNlc3MpIHsKLQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiVW5hYmxlIHRvIGRlbGV0ZSIsIGphclBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVDb3JlLmxvZyhtc2csIG51bGwpOwotCQl9Ci0JCWNsb3NlZCA9IHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MmY1M2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBQbHVnaW4gQ29udGVudCBDb25zdW1lciBvbiBhIFNpdGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIgZXh0ZW5kcyBDb250ZW50Q29uc3VtZXIgew0KLQ0KLQlwcml2YXRlIElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeTsNCi0JcHJpdmF0ZSBJU2l0ZSBzaXRlOw0KLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7DQotDQotCS8vIHJlY292ZXJ5DQotCS8vIHRlbXBvcmFyeSBuYW1lIHRvIG9yaWdpbmFsIG5hbWUgbWFwDQotCXByaXZhdGUgTWFwIHJlbmFtZXMgPSBuZXcgSGFzaE1hcCgyKTsNCi0NCi0JLy8gZm9yIGFib3J0DQotCXByaXZhdGUgTGlzdCAvKm9mIHBhdGggYXMgU3RyaW5nICovDQotCWluc3RhbGxlZEZpbGVzOw0KLQ0KLQkvKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSVNpdGUgc2l0ZSkgew0KLQkJdGhpcy5wbHVnaW5FbnRyeSA9IHBsdWdpbkVudHJ5Ow0KLQkJdGhpcy5zaXRlID0gc2l0ZTsNCi0JCWluc3RhbGxlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7DQotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IG51bGw7DQotDQotCQlpZiAoY2xvc2VkKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIHN0b3JlIGluIGEgY2xvc2VkIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCXRyeSB7DQotCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJCXBsdWdpblBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOyANCi0JCQlTdHJpbmcgY29udGVudEtleSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpOw0KLQkJCWluU3RyZWFtID0gY29udGVudFJlZmVyZW5jZS5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJCXBsdWdpblBhdGggKz0gcGx1Z2luUGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyBjb250ZW50S2V5IDogRmlsZS5zZXBhcmF0b3IgKyBjb250ZW50S2V5Ow0KLQ0KLQkJCS8vIGVycm9yIHJlY292ZXJ5DQotCQkJU3RyaW5nIGxvZ0VudHJ5PW51bGw7DQotCQkJaWYgKCJwbHVnaW4ueG1sIi5lcXVhbHMoY29udGVudEtleSkpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlsb2dFbnRyeT1FcnJvclJlY292ZXJ5TG9nLlBMVUdJTl9FTlRSWTsNCi0JCQl9IGVsc2UgaWYgKCJmcmFnbWVudC54bWwiLmVxdWFscyhjb250ZW50S2V5KSkgeyAvLyROT04tTkxTLTEkDQotCQkJCWxvZ0VudHJ5PUVycm9yUmVjb3ZlcnlMb2cuRlJBR01FTlRfRU5UUlk7DQotCQkJfSBlbHNlIGlmICgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiLmVxdWFscyhjb250ZW50S2V5KSkgeyAvLyROT04tTkxTLTEkDQotCQkJCWxvZ0VudHJ5PUVycm9yUmVjb3ZlcnlMb2cuQlVORExFX01BTklGRVNUX0VOVFJZOw0KLQkJCX0NCi0JCQlpZiAobG9nRW50cnkhPW51bGwpIHsNCi0JCQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IHBsdWdpblBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7DQotCQkJCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUob3JpZ2luYWxOYW1lKTsNCi0JCQkJaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkgew0KLQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlVwZGF0ZU1hbmFnZXJVdGlscy5GaWxlQWxyZWFkeUV4aXN0cyIsIG5ldyBPYmplY3RbXSB7IGxvY2FsRmlsZSB9KSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQlwbHVnaW5QYXRoID0gRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIocGx1Z2luUGF0aCk7DQotCQkJCXJlbmFtZXMucHV0KHBsdWdpblBhdGgsIG9yaWdpbmFsTmFtZSk7DQotCQkJCUVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCkuYXBwZW5kUGF0aChsb2dFbnRyeSwgcGx1Z2luUGF0aCk7DQotCQkJfQ0KLQkJCS8vDQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNvcHlUb0xvY2FsKGluU3RyZWFtLCBwbHVnaW5QYXRoLCBudWxsKTsNCi0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tQZXJtaXNzaW9ucyhjb250ZW50UmVmZXJlbmNlLCBwbHVnaW5QYXRoKTsgLy8gMjAzMDUNCi0JCQlpbnN0YWxsZWRGaWxlcy5hZGQocGx1Z2luUGF0aCk7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkdsb2JhbENvbnN1bWVyLkVycm9yQ3JlYXRpbmdGaWxlIiwgcGx1Z2luUGF0aCksIGUpOy8vJE5PTi1OTFMtMSQNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCS8vIGNsb3NlIHN0cmVhbQ0KLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjY2xvc2UoKSANCi0JICovDQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKGNsb3NlZCkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBjbG9zZSBhIGNsb3NlZCBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlmb3IoSXRlcmF0b3IgaXQgPSByZW5hbWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7DQotCQkJLy8gcmVuYW1lIGZpbGUgDQotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7DQotCQkJU3RyaW5nIHRlbXBvcmFyeSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOw0KLQkJCVN0cmluZyBvcmlnaW5hbCA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7DQotCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuUkVOQU1FX0VOVFJZLCB0ZW1wb3JhcnkpOw0KLQkJCUZpbGUgZmlsZVRvUmVuYW1lID0gbmV3IEZpbGUodGVtcG9yYXJ5KTsNCi0JCQlib29sZWFuIHN1Y2VzcyA9IGZhbHNlOw0KLQkJCWlmIChmaWxlVG9SZW5hbWUuZXhpc3RzKCkpIHsNCi0JCQkJRmlsZSByZW5hbWVkRmlsZSA9IG5ldyBGaWxlKG9yaWdpbmFsKTsNCi0JCQkJc3VjZXNzID0gZmlsZVRvUmVuYW1lLnJlbmFtZVRvKHJlbmFtZWRGaWxlKTsNCi0JCQl9DQotCQkJaWYgKCFzdWNlc3MpIHsNCi0JCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJDb250ZW50Q29uc3VtZXIuVW5hYmxlVG9SZW5hbWUiLCB0ZW1wb3JhcnksIG9yaWdpbmFsKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihtc2csIG5ldyBFeGNlcHRpb24obXNnKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKHNpdGUgaW5zdGFuY2VvZiBTaXRlRmlsZSkNCi0JCQkgKChTaXRlRmlsZSkgc2l0ZSkuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOw0KLQkJY2xvc2VkID0gdHJ1ZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIGFib3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKGNsb3NlZCkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBhYm9ydCBhIGNsb3NlZCBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOw0KLQkJLy8gZGVsZXRlIHBsdWdpbiBtYW5pZmVzdHMgZmlyc3QNCi0JCWZvcihJdGVyYXRvciBpdCA9IHJlbmFtZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7DQotCQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsNCi0NCi0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5ERUxFVEVfRU5UUlksIG9yaWdpbmFsTmFtZSk7DQotCQkJRmlsZSBmaWxlVG9SZW1vdmUgPSBuZXcgRmlsZShvcmlnaW5hbE5hbWUpOw0KLQkJCWlmIChmaWxlVG9SZW1vdmUuZXhpc3RzKCkpIHsNCi0JCQkJaWYoIWZpbGVUb1JlbW92ZS5kZWxldGUoKSl7DQotCQkJCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlVuYWJsZSB0byBkZWxldGUiLCBvcmlnaW5hbE5hbWUpOyAvLyROT04tTkxTLTEkDQotCQkJCQlVcGRhdGVDb3JlLmxvZyhtc2csIG51bGwpOwkNCi0JCQkJCXN1Y2Nlc3MgPSBmYWxzZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChzdWNjZXNzKSB7DQotCQkJLy8gcmVtb3ZlIHRoZSBwbHVnaW4gZmlsZXM7DQotCQkJSXRlcmF0b3IgaXRlciA9IGluc3RhbGxlZEZpbGVzLml0ZXJhdG9yKCk7DQotCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG51bGw7DQotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQotCQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7DQotCQkJCWZlYXR1cmVGaWxlID0gbmV3IEZpbGUocGF0aCk7DQotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7DQotCQkJfQ0KLQ0KLQkJCS8vIHJlbW92ZSB0aGUgcGx1Z2luIGRpcmVjdG9yeSBpZiBlbXB0eQ0KLQkJCXRyeSB7DQotCQkJCVVSTCBuZXdVUkwgPSBuZXcgVVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCQkJU3RyaW5nIHBsdWdpblBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOw0KLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRW1wdHlEaXJlY3Rvcmllc0Zyb21GaWxlU3lzdGVtKG5ldyBGaWxlKHBsdWdpblBhdGgpKTsNCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJfQ0KLQkJfQ0KLQkJY2xvc2VkID0gdHJ1ZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVMb2NhbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzNDU1NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVMb2NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuKjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGNvbmZpZ3VyYXRpb25zLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBTaXRlTG9jYWwgZXh0ZW5kcyBTaXRlTG9jYWxNb2RlbCBpbXBsZW1lbnRzIElMb2NhbFNpdGV7DQotDQotCXByaXZhdGUgTGlzdGVuZXJzTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJzTGlzdCgpOw0KLQlwcml2YXRlIFNpdGVTdGF0dXNBbmFseXplciBzaXRlU3RhdHVzQW5hbHl6ZXI7DQotCXByaXZhdGUgYm9vbGVhbiBpc1RyYW5zaWVudCA9IGZhbHNlOw0KLQ0KLQkvKg0KLQkgKiBIYXZlIG5ldyBmZWF0dXJlcyBiZWVuIGZvdW5kIGR1cmluZyByZWNvbmNpbGlhdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0ZlYXR1cmVzRm91bmQgPSBmYWxzZTsNCi0NCi0JLyoNCi0JICogaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgcGVyc2lzdGVudCBtb2RlbC4NCi0JICogU2V0IHRoZSByZWNvbmNpbGlhdGlvbiBhcyBub24gb3B0aW1pc3RpYw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJTG9jYWxTaXRlIGdldExvY2FsU2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBpbnRlcm5hbEdldExvY2FsU2l0ZSgpOw0KLQl9DQotDQotCS8qDQotCSAqSW50ZXJuYWwgY2FsbCBpcyByZWNvbmNpbGlhdGlvbiBuZWVkcyB0byBiZSBvcHRpbWlzdGljDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElMb2NhbFNpdGUgaW50ZXJuYWxHZXRMb2NhbFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQ0KLQkJU2l0ZUxvY2FsIGxvY2FsU2l0ZSA9IG5ldyBTaXRlTG9jYWwoKTsNCi0JDQotCQkvLyBvYnRhaW4gcGxhdGZvcm0gY29uZmlndXJhdGlvbg0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOw0KLQkJbG9jYWxTaXRlLmlzVHJhbnNpZW50KGN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uaXNUcmFuc2llbnQoKSk7DQotCQ0KLQkJdHJ5IHsNCi0JCQlVUkwgY29uZmlnWE1MID0gY3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsNCi0JCQlsb2NhbFNpdGUuc2V0TG9jYXRpb25VUkxTdHJpbmcoY29uZmlnWE1MLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJCWxvY2FsU2l0ZS5yZXNvbHZlKGNvbmZpZ1hNTCwgbnVsbCk7DQotCQ0KLQkJCS8vIEF0dGVtcHQgdG8gcmVhZCBwcmV2aW91cyBzdGF0ZQ0KLQkJCXBhcnNlTG9jYWxTaXRlRmlsZShjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uLCBsb2NhbFNpdGUpOw0KLQ0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuVW5hYmxlVG9DcmVhdGVVUkxGb3IiLCBsb2NhbFNpdGUuZ2V0TG9jYXRpb25VUkxTdHJpbmcoKSArICIgJiAiICsgQ09ORklHX0ZJTEUpLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0JDQotCQlyZXR1cm4gbG9jYWxTaXRlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgdGhlIGxvY2FsU2l0ZSBvYmplY3QNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGFyc2VMb2NhbFNpdGVGaWxlKElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcsIFNpdGVMb2NhbCBsb2NhbFNpdGUgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0NCi0JCS8vYXR0ZW1wdCB0byBwYXJzZSB0aGUgTG9jYWxTaXRlLnhtbAkNCi0vLwkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUoY29uZmlnWE1MKTsNCi0JCXRyeSB7DQotLy8JCQlJbnB1dFN0cmVhbSBpbiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0KHJlc29sdmVkVVJMKS5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJCW5ldyBTaXRlTG9jYWxQYXJzZXIocGxhdGZvcm1Db25maWcsIGxvY2FsU2l0ZSk7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgU2l0ZUxvY2FsKCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBhZGRzIGEgbmV3IGNvbmZpZ3VyYXRpb24gdG8gdGhlIExvY2FsU2l0ZQ0KLQkgKiAgdGhlIG5ld2x5IGFkZGVkIGNvbmZpZ3VyYXRpb24gaXMgdGVoIGN1cnJlbnQgb25lDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsNCi0JCWlmIChjb25maWcgIT0gbnVsbCkgew0KLQkJCWFkZENvbmZpZ3VyYXRpb25Nb2RlbCgoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCkgY29uZmlnKTsNCi0NCi0JCQl0cmltSGlzdG9yeVRvQ2FwYWNpdHkoKTsNCi0NCi0JCQkvLyBzZXQgY29uZmlndXJhdGlvbiBhcyBjdXJyZW50CQkNCi0JCQlpZiAoZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgpICE9IG51bGwpDQotCQkJCWdldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKS5zZXRDdXJyZW50KGZhbHNlKTsNCi0JCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgSW5zdGFsbENvbmZpZ3VyYXRpb24pDQotCQkJCSAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBjb25maWcpLnNldEN1cnJlbnQodHJ1ZSk7DQotDQotCQkJc2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCkgY29uZmlnKTsNCi0JCQkoKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwpIGNvbmZpZykubWFya1JlYWRPbmx5KCk7DQotDQotCQkJLy8gbm90aWZ5IGxpc3RlbmVycw0KLQkJCU9iamVjdFtdIHNpdGVMb2NhbExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVMb2NhbExpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KLQkJCQkoKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIpIHNpdGVMb2NhbExpc3RlbmVyc1tpXSkuY3VycmVudEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZChjb25maWcpOw0KLQkJCX0NCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCB0cmltSGlzdG9yeVRvQ2FwYWNpdHkoKSB7DQotCQkvLyBjaGVjayBpZiB3ZSBoYXZlIHRvIHJlbW92ZSBhIGNvbmZpZ3VyYXRpb24NCi0JCS8vIHRoZSBmaXJzdCBhZGRlZCBpcyAjMA0KLQkJd2hpbGUgKGdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoID4gZ2V0TWF4aW11bUhpc3RvcnlDb3VudCgpICYmDQotCQkJCWdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoID4gMSkgew0KLQkJCS8vIGRvIG5vdCByZW1vdmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gaGlzdG9yeSwgdGhpcyBpcyB0aGUgb3JpZ2luYWwgY29uZmlnDQotCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCByZW1vdmVkQ29uZmlnID0gZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpWzFdOw0KLQkJCWlmIChyZW1vdmVDb25maWd1cmF0aW9uTW9kZWwocmVtb3ZlZENvbmZpZykpIHsNCi0NCi0JCQkJLy8gREVCVUc6DQotCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKSB7DQotCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJSZW1vdmVkIGNvbmZpZ3VyYXRpb24gOiIgKyByZW1vdmVkQ29uZmlnLmdldExhYmVsKCkpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0NCi0JCQkJLy8gbm90aWZ5IGxpc3RlbmVycw0KLQkJCQlPYmplY3RbXSBzaXRlTG9jYWxMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUxvY2FsTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQkoKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIpIHNpdGVMb2NhbExpc3RlbmVyc1tpXSkuaW5zdGFsbENvbmZpZ3VyYXRpb25SZW1vdmVkKChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHJlbW92ZWRDb25maWcpOw0KLQkJCQl9DQotDQotCQkJCS8vcmVtb3ZlIGZpbGVzDQotCQkJCVVSTCB1cmwgPSByZW1vdmVkQ29uZmlnLmdldFVSTCgpOw0KLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUodXJsLmdldEZpbGUoKSkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkvKg0KLQkgKiBAc2VlIElMb2NhbFNpdGUjYWRkTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElMb2NhbFNpdGUjcmVtb3ZlTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogU2F2ZXMgdGhlIHNpdGUgaW50byB0aGUgY29uZmlnIGZpbGUuDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjaGFuZ2VzIHJlc3RhcnQgaXMgbmVlZGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBzYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gU2F2ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGFzDQotCQkvLyB0aGUgb3RoZXIgYXJlIGFscmVhZHkgc2F2ZWQNCi0JCS8vIGFuZCBzZXQgcnVudGltIGluZm8gZm9yIG5leHQgc3RhcnR1cA0KLQkJcmV0dXJuICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLnNhdmUoKTsNCi0JfQ0KLQkNCi0vLwkvKioNCi0vLwkgKiBNZXRob2QgY3JlYXRlTmV3SW5zdGFsbENvbmZpZ3VyYXRpb24uDQotLy8JICogQHJldHVybiBJSW5zdGFsbENvbmZpZ3VyYXRpb24NCi0vLwkgKi8NCi0vLwlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjcmVhdGVOZXdJbnN0YWxsQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0vLwkJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3SW5zdGFsbENvbmZpZyA9IGNyZWF0ZUNvbmZpZ3VyYXRpb25TaXRlKG51bGwpOw0KLS8vCQluZXdJbnN0YWxsQ29uZmlnLnNldFRpbWVsaW5lKG5ld0luc3RhbGxDb25maWcuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpKTsNCi0vLwkJcmV0dXJuIG5ld0luc3RhbGxDb25maWc7DQotLy8JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQHNpbmNlIDIuMA0KLQkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuIFRoZSBjdXJyZW50IGluc3RhbGwgY29uZmlndXJhdGlvbiBpcyB0byBiZSB1c2VkLg0KLQkgKi8NCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gbmV3IEluc3RhbGxDb25maWd1cmF0aW9uKGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLmNsb25lQ29uZmlnIiksIGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHJldmVydFRvKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9ibGVtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQkvLyBjcmVhdGUgdGhlIGFjdGl2aXR5IA0KLQkJLy9TdGFydCBVT1cgPw0KLQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX1JFVkVSVCk7DQotCQlhY3Rpdml0eS5zZXRMYWJlbChjb25maWd1cmF0aW9uLmdldExhYmVsKCkpOw0KLQkJYWN0aXZpdHkuc2V0RGF0ZShuZXcgRGF0ZSgpKTsNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWd1cmF0aW9uID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotCQkJLy8gY3JlYXRlIGEgY29uZmlndXJhdGlvbg0KLQkJCW5ld0NvbmZpZ3VyYXRpb24gPSBjbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7DQotCQkJbmV3Q29uZmlndXJhdGlvbi5zZXRMYWJlbChjb25maWd1cmF0aW9uLmdldExhYmVsKCkpOw0KLQ0KLQkJCS8vIGFkZCB0byB0aGUgc3RhY2sgd2hpY2ggd2lsbCBzZXQgdXAgYXMgY3VycmVudA0KLQkJCWFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlndXJhdGlvbik7DQotDQotCQkJLy8gcHJvY2VzcyBkZWx0YQ0KLQkJCS8vIHRoZSBDb25maWd1cmVkIGZlYXR1cmVzQ29uZmlndXJlZCBhcmUgdGhlIHNhbWUgYXMgdGhlIG9sZCBjb25maWd1cmF0aW9uDQotCQkJLy8gdGhlIHVuY29uZmlndXJlZCBmZWF0dXJlc0NvbmZpZ3VyZWQgYXJlIHRoZSByZXN0Li4uDQotCQkJICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIG5ld0NvbmZpZ3VyYXRpb24pLnJldmVydFRvKGNvbmZpZ3VyYXRpb24sIG1vbml0b3IsIGhhbmRsZXIpOw0KLQ0KLQkJCS8vIGV2ZXJ5dGhpbmcgZG9uZSBvaw0KLQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCS8vIGVycm9yDQotCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfTk9LKTsNCi0JCQl0aHJvdyBlOw0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJCS8vdXNlciBkZWNpZGVkIG5vdCB0byByZXZlcnQsIGRvIG5vdGhpbmcNCi0JCQkvLyBiZWNhdXNlIHdlIGRpZG4ndCBhZGQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGhpc3RvcnkNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKG5ld0NvbmZpZ3VyYXRpb24gIT0gbnVsbCkNCi0JCQkJICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIG5ld0NvbmZpZ3VyYXRpb24pLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNpbmNlIDIuMA0KLQkgKiBAZGVwcmVjYXRlZA0KLQkgKi8NCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBhZGRUb1ByZXNlcnZlZENvbmZpZ3VyYXRpb25zKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElMb2NhbFNpdGUjZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbkZvcihJSW5zdGFsbENvbmZpZ3VyYXRpb24pDQotCSAqLw0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGZpbmRQcmVzZXJ2ZWRDb25maWd1cmF0aW9uRm9yKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7DQotDQotCQkvLyBiYXNlZCBvbiB0aW1lIHN0YW1wIGZvciBub3cNCi0JCUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgcHJlc2VydmVkQ29uZmlnID0gbnVsbDsNCi0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsNCi0JCQlJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsW10gcHJlc2VydmVkQ29uZmlndXJhdGlvbnMgPSBnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9uc01vZGVsKCk7DQotCQkJaWYgKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zICE9IG51bGwpIHsNCi0JCQkJZm9yIChpbnQgaW5kZXhQcmVzZXJ2ZWQgPSAwOyBpbmRleFByZXNlcnZlZCA8IHByZXNlcnZlZENvbmZpZ3VyYXRpb25zLmxlbmd0aDsgaW5kZXhQcmVzZXJ2ZWQrKykgew0KLQkJCQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0Q3JlYXRpb25EYXRlKCkuZXF1YWxzKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zW2luZGV4UHJlc2VydmVkXS5nZXRDcmVhdGlvbkRhdGUoKSkpIHsNCi0JCQkJCQlwcmVzZXJ2ZWRDb25maWcgPSBwcmVzZXJ2ZWRDb25maWd1cmF0aW9uc1tpbmRleFByZXNlcnZlZF07DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gKElJbnN0YWxsQ29uZmlndXJhdGlvbikgcHJlc2VydmVkQ29uZmlnOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUxvY2FsU2l0ZSNnZXRDdXJyZW50Q29uZmlndXJhdGlvbigpDQotCSAqIExvY2FsU2l0ZU1vZGVsI2dldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKSBtYXkgcmV0dXJuIG51bGwgaWYNCi0JICogd2UganVzdCBwYXJzZWQgTG9jYWxTaXRlLnhtbA0KLQkgKi8NCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRDdXJyZW50Q29uZmlndXJhdGlvbigpIHsNCi0JCWlmIChnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKCkgPT0gbnVsbCkgew0KLQkJCWludCBpbmRleCA9IDA7DQotCQkJaWYgKChpbmRleCA9IGdldENvbmZpZ3VyYXRpb25IaXN0b3J5TW9kZWwoKS5sZW5ndGgpID09IDApIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfSBlbHNlIHsNCi0JCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uSGlzdG9yeU1vZGVsKClbaW5kZXggLSAxXTsNCi0JCQkJY29uZmlnLnNldEN1cnJlbnQodHJ1ZSk7DQotCQkJCXNldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoY29uZmlnKTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gKElJbnN0YWxsQ29uZmlndXJhdGlvbikgZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUxvY2FsU2l0ZSNnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9ucygpDQotCSAqLw0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uW10gZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKSB7DQotCQlpZiAoZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnNNb2RlbCgpLmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSUluc3RhbGxDb25maWd1cmF0aW9uWzBdOw0KLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSkgZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnNNb2RlbCgpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUxvY2FsU2l0ZSNyZW1vdmVGcm9tUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoSUluc3RhbGxDb25maWd1cmF0aW9uKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVByZXNlcnZlZENvbmZpZ3VyYXRpb25zKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7DQotCQlpZiAocmVtb3ZlUHJlc2VydmVkQ29uZmlndXJhdGlvbk1vZGVsKChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKSBjb25maWd1cmF0aW9uKSkNCi0JCQkgKChJbnN0YWxsQ29uZmlndXJhdGlvbikgY29uZmlndXJhdGlvbikucmVtb3ZlKCk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJTG9jYWxTaXRlI2dldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkNCi0JICovDQotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBnZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpIHsNCi0JCWlmIChnZXRDb25maWd1cmF0aW9uSGlzdG9yeU1vZGVsKCkubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJSW5zdGFsbENvbmZpZ3VyYXRpb25bMF07DQotCQlyZXR1cm4gKElJbnN0YWxsQ29uZmlndXJhdGlvbltdKSBnZXRDb25maWd1cmF0aW9uSGlzdG9yeU1vZGVsKCk7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIEdldHMgdGhlIGlzVHJhbnNpZW50Lg0KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsNCi0JCXJldHVybiBpc1RyYW5zaWVudDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgaXNUcmFuc2llbnQuDQotCSAqIEBwYXJhbSBpc1RyYW5zaWVudCBUaGUgaXNUcmFuc2llbnQgdG8gc2V0DQotCSAqLw0KLQlwcml2YXRlIHZvaWQgaXNUcmFuc2llbnQoYm9vbGVhbiBpc1RyYW5zaWVudCkgew0KLQkJdGhpcy5pc1RyYW5zaWVudCA9IGlzVHJhbnNpZW50Ow0KLQl9DQotDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSBTaXRlU3RhdHVzQW5hbHl6ZXIgZ2V0U2l0ZVN0YXR1c0FuYWx5emVyKCkgew0KLQkJaWYgKHNpdGVTdGF0dXNBbmFseXplciA9PSBudWxsKQ0KLQkJCXNpdGVTdGF0dXNBbmFseXplciA9IG5ldyBTaXRlU3RhdHVzQW5hbHl6ZXIodGhpcyk7DQotCQlyZXR1cm4gc2l0ZVN0YXR1c0FuYWx5emVyOw0KLQl9DQotDQotCS8qDQotCSAqICBjaGVjayBpZiB0aGUgUGx1Z2lucyBvZiB0aGUgZmVhdHVyZSBhcmUgb24gdGhlIHBsdWdpbiBwYXRoDQotCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBubyBvdGhlciB2ZXJzaW9uIC0+IEhBUFBZDQotCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBvdGhlciB2ZXJzaW9uIC0+IEFNQklHVU9VUw0KLQkgKiAgSWYgc29tZSBvZiB0aGUgcGx1Z2lucyBhcmUgb24gdGhlIHBsdWdpbiBwYXRoLCBidXQgbm90IGFsbCAtPiBVTkhBUFBZDQotCSAqIAlDaGVjayBvbiBhbGwgQ29uZmlndXJlZFNpdGVzDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBnZXRGZWF0dXJlU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBnZXRTaXRlU3RhdHVzQW5hbHl6ZXIoKS5nZXRGZWF0dXJlU3RhdHVzKGZlYXR1cmUpOw0KLQl9DQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5TaXRlTG9jYWxNb2RlbCNzZXRNYXhpbXVtSGlzdG9yeUNvdW50KGludCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE1heGltdW1IaXN0b3J5Q291bnQoaW50IGhpc3RvcnkpIHsNCi0JCXN1cGVyLnNldE1heGltdW1IaXN0b3J5Q291bnQoaGlzdG9yeSk7DQotCQl0cmltSGlzdG9yeVRvQ2FwYWNpdHkoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVSZWNvbmNpbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZWRlYjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSByZWNvbmNpbGlhdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgU2l0ZVJlY29uY2lsZXIgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2l0ZVJlY29uY2lsZXIoU2l0ZUxvY2FsIHNpdGVMb2NhbCkgewotLy8JCXRoaXMuc2l0ZUxvY2FsID0gc2l0ZUxvY2FsOwotCX0KLQotCi0JLyoqCi0JKiAKLQkqLwotCS8qcGFja2FnZSAqLwotCVVSTCByZXNvbHZlU2l0ZUVudHJ5KElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBuZXdTaXRlRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVVJMIHJlc29sdmVkVVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc29sdmVkVVJMID0gUGxhdGZvcm0ucmVzb2x2ZShuZXdTaXRlRW50cnkuZ2V0VVJMKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLlVuYWJsZVRvUmVzb2x2ZSIsIG5ld1NpdGVFbnRyeS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSwgZSk7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWRVUkw7Ci0JfQotCi0KLQkvKioKLQkgKiBWYWxpZGF0ZSB3ZSBoYXZlIG9ubHkgb25lIGNvbmZpZ3VyZWQgZmVhdHVyZSBvZiBhIHNwZWNpZmljIGlkCi0JICogcGVyIGNvbmZpZ3VyZWQgc2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0NvbmZpZ3VyZWRGZWF0dXJlc09sZChJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBOT1QgVVNFRAotCi0JCUNvbmZpZ3VyZWRTaXRlIGNTaXRlID0gKENvbmZpZ3VyZWRTaXRlKSBjb25maWd1cmVkU2l0ZTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkRmVhdHVyZXMgPSBjU2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJQ29uZmlndXJhdGlvblBvbGljeSBjUG9saWN5ID0gY1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOwotCi0JCS8vIFRSQUNFCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7Ci0JCQlVcGRhdGVDb3JlLmRlYnVnKCJDb21wYXJlIGZlYXR1cmVzIHdpdGhpbiA6IiArIGNvbmZpZ3VyZWRTaXRlLmdldFNpdGUoKS5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZvciAoaW50IGluZGV4Q29uZmlndXJlZEZlYXR1cmVzID0gMDsgaW5kZXhDb25maWd1cmVkRmVhdHVyZXMgPCBjb25maWd1cmVkRmVhdHVyZXMubGVuZ3RoIC0gMTsgaW5kZXhDb25maWd1cmVkRmVhdHVyZXMrKykgewotCi0JCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlVG9Db21wYXJlID0gY29uZmlndXJlZEZlYXR1cmVzW2luZGV4Q29uZmlndXJlZEZlYXR1cmVzXTsKLQotCQkJLy8gd2l0aGluIHRoZSBjb25maWd1cmVkIHNpdGUKLQkJCS8vIGNvbXBhcmUgd2l0aCB0aGUgb3RoZXIgY29uZmlndXJlZCBmZWF0dXJlcyBvZiB0aGlzIHNpdGUKLQkJCWZvciAoaW50IHJlc3RPZkNvbmZpZ3VyZWRGZWF0dXJlcyA9IGluZGV4Q29uZmlndXJlZEZlYXR1cmVzICsgMTsgcmVzdE9mQ29uZmlndXJlZEZlYXR1cmVzIDwgY29uZmlndXJlZEZlYXR1cmVzLmxlbmd0aDsgcmVzdE9mQ29uZmlndXJlZEZlYXR1cmVzKyspIHsKLQkJCQlpbnQgcmVzdWx0ID0gY29tcGFyZShmZWF0dXJlVG9Db21wYXJlLCBjb25maWd1cmVkRmVhdHVyZXNbcmVzdE9mQ29uZmlndXJlZEZlYXR1cmVzXSk7Ci0JCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCWlmIChyZXN1bHQgPT0gMSkgewotCQkJCQkJY1BvbGljeS51bmNvbmZpZ3VyZShjb25maWd1cmVkRmVhdHVyZXNbcmVzdE9mQ29uZmlndXJlZEZlYXR1cmVzXSwgdHJ1ZSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJCWlmIChyZXN1bHQgPT0gMikgewotCQkJCQkJY1BvbGljeS51bmNvbmZpZ3VyZShmZWF0dXJlVG9Db21wYXJlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjb21wYXJlIHR3byBmZWF0dXJlIHJlZmVyZW5jZXMKLQkgKiByZXR1cm5zIDAgaWYgdGhlIGZlYXR1cmUgYXJlIGRpZmZlcmVudAotCSAqIHJldHVybnMgMSBpZiB0aGUgdmVyc2lvbiBvZiBmZWF0dXJlIDEgaXMgZ3JlYXRlciB0aGFuIHRoZSB2ZXJzaW9uIG9mIGZlYXR1cmUgMgotCSAqIHJldHVybnMgMiBpZiBvcHBvc2l0ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBjb21wYXJlKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYxLCBJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmMikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIFRSQUNFCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7Ci0JCQlVcGRhdGVDb3JlLmRlYnVnKCJDb21wYXJlOiAiICsgZmVhdHVyZVJlZjEgKyAiICYmICIgKyBmZWF0dXJlUmVmMik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKGZlYXR1cmVSZWYxID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlJRmVhdHVyZSBmZWF0dXJlMSA9IG51bGw7Ci0JCUlGZWF0dXJlIGZlYXR1cmUyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZlYXR1cmUxID0gZmVhdHVyZVJlZjEuZ2V0RmVhdHVyZShudWxsKTsKLQkJCWZlYXR1cmUyID0gZmVhdHVyZVJlZjIuZ2V0RmVhdHVyZShudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWlmIChmZWF0dXJlMSA9PSBudWxsIHx8IGZlYXR1cmUyID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZDEgPSBmZWF0dXJlMS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgaWQyID0gZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCi0JCWlmIChpZDEgPT0gbnVsbCB8fCBpZDIgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAoaWQxLmdldElkZW50aWZpZXIoKSAhPSBudWxsICYmIGlkMS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGlkMi5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2ZXJzaW9uMSA9IGlkMS5nZXRWZXJzaW9uKCk7Ci0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2ZXJzaW9uMiA9IGlkMi5nZXRWZXJzaW9uKCk7Ci0JCQlpZiAodmVyc2lvbjEgIT0gbnVsbCkgewotCQkJCWlmICh2ZXJzaW9uMS5pc0dyZWF0ZXJUaGFuKHZlcnNpb24yKSkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gMjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAyOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBsaXN0IG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMgZWxpbWluYXRpbmcgZXh0cmEKLQkgKiBlbnRyaWVzIChpZiBwb3NzaWJsZSkuIE1ha2Ugc3VyZSB3ZSBkbyBub3QgbGVhdmUgY29uZmlndXJlZAotCSAqIG5lc3RlZCBmZWF0dXJlcyB3aXRoICJob2xlcyIgKGllLiB1bmNvbmZpZ3VyZWQgY2hpbGRyZW4pCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQ29uZmlndXJlZEZlYXR1cmVzKElDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSkgewotCi0JCS8vIE5vdGU6IGlmIHdlIGhpdCBlcnJvcnMgaW4gdGhlIHZhcmlvdXMgY29tcHV0YXRpb24KLQkJLy8gbWV0aG9kcyBhbmQgdGhyb3cgYSBDb3JlRXhjZXB0aW9uLCB3ZSB3aWxsIG5vdCBjYXRjaCBpdAotCQkvLyBpbiB0aGlzIG1ldGhvZC4gQ29uc2VxdWVudGx5IHdlIHdpbGwgbm90IGF0dGVtcHQgdG8KLQkJLy8gdW5jb25maWd1cmUgYW55ICJleHRyYSIgZmVhdHVyZXMgYmVjYXVzZSB3ZSB3b3VsZCAKLQkJLy8gbGlrZWx5IGdldCBpdCB3cm9uZy4gVGhlIHBsYXRmb3JtIHdpbGwgcnVuIHdpdGggZXh0cmEgZmVhdHVyZXMKLQkJLy8gY29uZmlndXJlZC4gVGhlIHJ1bnRpbWUgd2lsbCBlbGltaW5hdGUgZXh0cmEgcGx1Z2lucyBiYXNlZAotCQkvLyBvbiBydW50aW1lIGJpbmRpbmcgcnVsZXMuCi0KLQkJLy8gZGV0ZXJtaW5lICJwcm9wb3NlZCIgbGlzdCBvZiBjb25maWd1cmVkIGZlYXR1cmVzCi0JCUNvbmZpZ3VyZWRTaXRlIGNTaXRlID0gKENvbmZpZ3VyZWRTaXRlKSBjb25maWd1cmVkU2l0ZTsKLQkJLy8gZGVidWcKLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsKLQkJCVVwZGF0ZUNvcmUuZGVidWcoIlZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gb2Ygc2l0ZSAiICsgY1NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZFJlZnMgPSBjU2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJQXJyYXlMaXN0IGFsbFBvc3NpYmxlQ29uZmlndXJlZEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyZWRSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBjb25maWd1cmVkUmVmc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWFsbFBvc3NpYmxlQ29uZmlndXJlZEZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQkvLyBkZWJ1ZwotCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7Ci0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoIiAgIGNvbmZpZ3VyZWQgZmVhdHVyZSAiICsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBmaW5kIHRvcCBsZXZlbCBmZWF0dXJlcwotCQlBcnJheUxpc3QgdG9wRmVhdHVyZXMgPSBjb21wdXRlVG9wRmVhdHVyZXMoYWxsUG9zc2libGVDb25maWd1cmVkRmVhdHVyZXMpOwotCi0JCS8vIGZpbmQgbm9uIGVmaXggdG9wIGxldmVsIGZlYXR1cmVzCi0JCUFycmF5TGlzdCB0b3BOb25FZml4RmVhdHVyZXMgPSBnZXROb25FZml4RmVhdHVyZXModG9wRmVhdHVyZXMpOwotCi0JCS8vIGV4cGFuZCBub24gZWZpeCB0b3AgbGV2ZWwgZmVhdHVyZXMgKGNvbXB1dGUgZnVsbCBuZXN0aW5nIHN0cnVjdHVyZXMpLgotCQlBcnJheUxpc3QgY29uZmlndXJlZEZlYXR1cmVzID0gZXhwYW5kRmVhdHVyZXModG9wTm9uRWZpeEZlYXR1cmVzLCBjb25maWd1cmVkU2l0ZSk7Ci0KLQkJLy8gcmV0cmlldmUgZWZpeGVzIHRoYXQgcGF0Y2ggZW5hYmxlIGZlYXR1cmUKLQkJLy8gdGhleSBtdXN0IGJlIGtlcHQgZW5hYmxlZAotCQlpZiAodG9wRmVhdHVyZXMuc2l6ZSgpICE9IHRvcE5vbkVmaXhGZWF0dXJlcy5zaXplKCkpIHsKLQkJCU1hcCBwYXRjaGVzID0gZ2V0UGF0Y2hlc0FzRmVhdHVyZShhbGxQb3NzaWJsZUNvbmZpZ3VyZWRGZWF0dXJlcyk7Ci0JCQlpZiAoIXBhdGNoZXMuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gY2FsY3VsYXRlIGVmaXhlcyB0byBlbmFibGUKLQkJCQlMaXN0IGVmaXhlc1RvRW5hYmxlID0gZ2V0UGF0Y2hlc1RvRW5hYmxlKHBhdGNoZXMsIGNvbmZpZ3VyZWRGZWF0dXJlcyk7Ci0JCQkJLy8gYWRkIGVmaWVzIHRvIGtlZXAgZW5hYmxlCi0JCQkJLy9hZGQgdGhlbSB0byB0aGUgZW5hYmxlIGxpc3QKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZml4ZXNUb0VuYWJsZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSUZlYXR1cmUgZWxlbWVudCA9IChJRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQkJCUFycmF5TGlzdCBleHBhbmRlZEVmaXggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWV4cGFuZEVmaXhGZWF0dXJlKGVsZW1lbnQsIGV4cGFuZGVkRWZpeCwgY29uZmlndXJlZFNpdGUpOwotCQkJCQljb25maWd1cmVkRmVhdHVyZXMuYWRkQWxsKGV4cGFuZGVkRWZpeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY29tcHV0ZSBleHRyYSBmZWF0dXJlcwotCQlBcnJheUxpc3QgZXh0cmFzID0gZGlmZihhbGxQb3NzaWJsZUNvbmZpZ3VyZWRGZWF0dXJlcywgY29uZmlndXJlZEZlYXR1cmVzKTsKLQotCQkvLyB1bmNvbmZpZ3VyZSBleHRyYSBmZWF0dXJlcwotCQlDb25maWd1cmF0aW9uUG9saWN5IGNQb2xpY3kgPSBjU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0cmFzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBleHRyYXMuZ2V0KGkpOwotCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gY1NpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2UoZmVhdHVyZSk7Ci0JCQl0cnkgewotCQkJCWNQb2xpY3kudW5jb25maWd1cmUocmVmLCB0cnVlLCBmYWxzZSk7Ci0JCQkJLy8gZGVidWcKLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJVbmNvbmZpZ3VyaW5nIFwiZXh0cmFcIiBmZWF0dXJlICIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogIAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlVG9wRmVhdHVyZXMoQXJyYXlMaXN0IGZlYXR1cmVzKSB7Ci0JCS8qIG1hcCBvZiBGZWF0dXJlIGJ5IFZlcnNpb25lZElkZW50aWZpZXIgKi8KLQkJTWFwIHRvcEZlYXR1cmVzID0gbmV3IEhhc2hNYXAoZmVhdHVyZXMuc2l6ZSgpKTsKLQkJLy8gc3RhcnQgd2l0aCB0aGUgZmVhdHVyZXMgcGFzc2VkIGluCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJRmVhdHVyZSBmID0gKChJRmVhdHVyZSkgaXQubmV4dCgpKTsKLQkJCXRvcEZlYXR1cmVzLnB1dChmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSwgZik7Ci0JCX0KLQkJLy8gcmVtb3ZlIGFsbCBmZWF0dXJlcyB0aGF0IG5lc3QgaW4gc29tZSBvdGhlciBmZWF0dXJlCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9ICgoSUZlYXR1cmUpIGl0Lm5leHQoKSkuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRvcEZlYXR1cmVzLnJlbW92ZShjaGlsZHJlbltqXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfV0FSTklOR1MpCi0JCQkJCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGRBbGwodG9wRmVhdHVyZXMudmFsdWVzKCkpOwotCQkvLyBkZWJ1ZwotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQ29tcHV0ZWQgdG9wLWxldmVsIGZlYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9wRmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCIgICAiICsgKChJRmVhdHVyZSkgbGlzdC5nZXQoaSkpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGV4cGFuZEZlYXR1cmVzKEFycmF5TGlzdCBmZWF0dXJlcywgSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gZXhwYW5kIGFsbCB0b3AgbGV2ZWwgZmVhdHVyZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJZXhwYW5kRmVhdHVyZSgoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKSwgcmVzdWx0LCBjb25maWd1cmVkU2l0ZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHBhbmRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUsIEFycmF5TGlzdCBmZWF0dXJlcywgSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlKSB7Ci0KLQkJLy8gYWRkIGZlYXR1cmUKLQkJaWYgKCFmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJLy8gZGVidWcKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7Ci0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiUmV0YWluaW5nIGNvbmZpZ3VyZWQgZmVhdHVyZSAiICsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBuZXN0ZWQgY2hpbGRyZW4gdG8gdGhlIGxpc3QKLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNoaWxkcmVuID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJSUZlYXR1cmUgY2hpbGQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljaGlsZCA9IGNoaWxkcmVuW2pdLmdldEZlYXR1cmUobnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKGNoaWxkcmVuW2pdKSkKLQkJCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIDI1MjAyIGRvIG5vdCByZXR1cm4gcmlnaHQgbm93LCB0aGUgcGVlciBjaGlsZHJlbiBtYXkgYmUgb2sKLQkJCX0KLQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCWV4cGFuZEZlYXR1cmUoY2hpbGQsIGZlYXR1cmVzLCBjb25maWd1cmVkU2l0ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBkaWZmKEFycmF5TGlzdCBsZWZ0LCBBcnJheUxpc3QgcmlnaHQpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBkZXRlcm1pbmUgZGlmZmVyZW5jZSAobGVmdCAibWludXMiIHJpZ2h0KQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlZnQuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGxlZnQuZ2V0KGkpOwotCQkJaWYgKCFyaWdodC5jb250YWlucyhmZWF0dXJlKSkKLQkJCQlyZXN1bHQuYWRkKGZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBnZXQgdGhlIGxpc3Qgb2YgZW5hYmxlZCBwYXRjaGVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGdldFBhdGNoZXNBc0ZlYXR1cmUoQXJyYXlMaXN0IGFsbENvbmZpZ3VyZWRGZWF0dXJlcykgewotCQkvLyBnZXQgYWxsIGVmaXhlcyBhbmQgdGhlIGFzc29jaWF0ZWQgcGF0Y2hlZCBmZWF0dXJlcwotCQlNYXAgcGF0Y2hlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChhbGxDb25maWd1cmVkRmVhdHVyZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlciA9IGFsbENvbmZpZ3VyZWRGZWF0dXJlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJTGlzdCBwYXRjaGVkRmVhdHVyZXNJRCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJRmVhdHVyZSBlbGVtZW50ID0gKElGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCQkvLyBhZGQgdGhlIHBhdGNoZWQgZmVhdHVyZSBpZGVudGlmaWVycwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudC5nZXRJbXBvcnRzKCkubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGVsZW1lbnQuZ2V0SW1wb3J0cygpW2ldLmlzUGF0Y2goKSkgewotCQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZCA9IGVsZW1lbnQuZ2V0SW1wb3J0cygpW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKQotCQkJCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkZvdW5kIHBhdGNoICIgKyBlbGVtZW50ICsgIiBmb3IgZmVhdHVyZSBpZGVudGlmaWVyICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJcGF0Y2hlZEZlYXR1cmVzSUQuYWRkKGlkKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICghcGF0Y2hlZEZlYXR1cmVzSUQuaXNFbXB0eSgpKSB7Ci0JCQkJCXBhdGNoZXMucHV0KGVsZW1lbnQsIHBhdGNoZWRGZWF0dXJlc0lEKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGF0Y2hlczsKLQl9Ci0KLQkvKgotCSAqIHJldHJ1bnMgdGhlIGxpc3Qgb2YgcGF0aGVzLWZlYXR1cmUgd2hvIHBhdGNoIGVuYWJsZWQgZmVhdHVyZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldFBhdGNoZXNUb0VuYWJsZShNYXAgZWZpeGVzLCBBcnJheUxpc3QgY29uZmlndXJlZEZlYXR1cmVzKSB7Ci0KLQkJQXJyYXlMaXN0IGVuYWJsZWRWZXJzaW9uZWRJZGVudGlmaWVyID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gY29uZmlndXJlZEZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUZlYXR1cmUgZWxlbWVudCA9IChJRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQllbmFibGVkVmVyc2lvbmVkSWRlbnRpZmllci5hZGQoZWxlbWVudC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQl9Ci0KLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBwYXRjaGVzCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpdGVyID0gZWZpeGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJYm9vbGVhbiB0b0VuYWJsZSA9IGZhbHNlOwotCQkJSUZlYXR1cmUgZWZpeEZlYXR1cmUgPSAoSUZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBwYXRjaGVkRmVhdHVyZXMgPSAoTGlzdCkgZWZpeGVzLmdldChlZml4RmVhdHVyZSk7Ci0JCQkvLyBsb29wIHRocm91Z2ggdGhlICdwYXRjaGVkIGZlYXR1cmVzIGlkZW50aWZpZXInIHRoZSBmb3IgdGhpcyBwYXRjaAotCQkJLy8gc2VlIGlmIGl0IHRoZSBwYXRjaCBwYXRjaGVzIGF0IGxlYXN0IG9uZSBlbmFibGUgZmVhdHVyZQotCQkJSXRlcmF0b3IgcGF0Y2hlZEZlYXR1cmVzSXRlciA9IHBhdGNoZWRGZWF0dXJlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHBhdGNoZWRGZWF0dXJlc0l0ZXIuaGFzTmV4dCgpICYmICF0b0VuYWJsZSkgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgcGF0Y2hlZEZlYXR1cmVJRCA9IChWZXJzaW9uZWRJZGVudGlmaWVyKSBwYXRjaGVkRmVhdHVyZXNJdGVyLm5leHQoKTsKLQkJCQlpZiAoZW5hYmxlZFZlcnNpb25lZElkZW50aWZpZXIuY29udGFpbnMocGF0Y2hlZEZlYXR1cmVJRCkpIHsKLQkJCQkJdG9FbmFibGUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCF0b0VuYWJsZSkgewotCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKQotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlRoZSBQYXRjaCAiICsgZWZpeEZlYXR1cmUgKyAiIGRvZXMgbm90IHBhdGNoIGFueSBlbmFibGVkIGZlYXR1cmVzOiBpdCB3aWxsIGJlIGRpc2FibGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBlbHNlIHsKLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikKLQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVGhlIHBhdGNoICIgKyBlZml4RmVhdHVyZSArICIgd2lsbCBiZSBlbmFibGVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXN1bHQuYWRkKGVmaXhGZWF0dXJlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogcmV0dXJucyB0aGUgZmVhdHVyZSB0aGF0IGFyZSBub3QgcGF0Y2hlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBnZXROb25FZml4RmVhdHVyZXMoQXJyYXlMaXN0IHRvcEZlYXR1cmVzKSB7Ci0JCU1hcCBlZml4RmVhdHVyZXMgPSBnZXRQYXRjaGVzQXNGZWF0dXJlKHRvcEZlYXR1cmVzKTsKLQkJU2V0IGtleVNldCA9IGVmaXhGZWF0dXJlcy5rZXlTZXQoKTsKLQkJaWYgKGtleVNldCA9PSBudWxsIHx8IGtleVNldC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gdG9wRmVhdHVyZXM7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHRvcEZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUZlYXR1cmUgZWxlbWVudCA9IChJRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWtleVNldC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCi0KLQkvKgotCSAqIG9ubHkgZW5hYmxlIG5vbi1lZml4IGNoaWxkcmVuIHJlY3Vyc2l2ZWx5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHBhbmRFZml4RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3QgZmVhdHVyZXMsIElDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSkgewotCi0JCS8vIGFkZCBmZWF0dXJlCi0JCWlmICghZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCS8vIGRlYnVnCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlJldGFpbmluZyBjb25maWd1cmVkIGZlYXR1cmUgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmVzdGVkIGNoaWxkcmVuIHRvIHRoZSBsaXN0Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljaGlsZHJlbiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCUlGZWF0dXJlIGNoaWxkID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY2hpbGQgPSBjaGlsZHJlbltqXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKCFjaGlsZHJlbltqXS5pc09wdGlvbmFsKCkpCi0JCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAyNTIwMiBkbyBub3QgcmV0dXJuIHJpZ2h0IG5vdywgdGhlIHBlZXIgY2hpbGRyZW4gbWF5IGJlIG9rCi0JCQl9Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCl7Ci0JCQkJaWYgKCFVcGRhdGVDb3JlLmlzUGF0Y2goY2hpbGQpKQotCQkJCQlleHBhbmRFZml4RmVhdHVyZShjaGlsZCwgZmVhdHVyZXMsIGNvbmZpZ3VyZWRTaXRlKTsKLQkJCX0KLQkJfQotCX0JCi0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVTdGF0dXNBbmFseXplci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlU3RhdHVzQW5hbHl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5MTAwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVTdGF0dXNBbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGNvbmZpZ3VyYXRpb25zLgotICovCi0KLXB1YmxpYyBjbGFzcyBTaXRlU3RhdHVzQW5hbHl6ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBhbGxDb25maWd1cmVkRmVhdHVyZXM7IC8qVmVyc2lvbmVkSWRlbnRpZmllciAqLwotCXByaXZhdGUgU2l0ZUxvY2FsIHNpdGVMb2NhbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTaXRlU3RhdHVzQW5hbHl6ZXIoU2l0ZUxvY2FsIHNpdGVMb2NhbCkgewotCQl0aGlzLnNpdGVMb2NhbCA9IHNpdGVMb2NhbDsKLQl9Ci0KLQkvKioKLQkgKiBtYW5hZ2VzIHRoZSB2ZXJzaW9uZWRJZGVudGlmaWVyIGFuZCBsb2NhdGlvbiBvZiBwYXJzZWQgcGx1Z2lucwotCSAqLwotCXB1YmxpYyBjbGFzcyBQbHVnaW5JZGVudGlmaWVyIHsKLQkJcHJpdmF0ZSBWZXJzaW9uZWRJZGVudGlmaWVyIGlkOwotCQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQkJcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQotCQlwdWJsaWMgUGx1Z2luSWRlbnRpZmllcihWZXJzaW9uZWRJZGVudGlmaWVyIGlkLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gZnJhZ21lbnQpIHsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJCXRoaXMuaXNGcmFnbWVudCA9IGZyYWdtZW50OwotCQl9Ci0KLQkJcHVibGljIFZlcnNpb25lZElkZW50aWZpZXIgZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpIHsKLQkJCXJldHVybiBpZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7Ci0JCQlyZXR1cm4gaXNGcmFnbWVudDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQl9Ci0JLyoKLQkgKiAgY2hlY2sgaWYgdGhlIFBsdWdpbnMgb2YgdGhlIGZlYXR1cmUgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aAotCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBubyBvdGhlciB2ZXJzaW9uIC0+IEhBUFBZCi0JICogIElmIGFsbCB0aGUgcGx1Z2lucyBhcmUgb24gdGhlIHBsdWdpbiBwYXRoLCBhbmQgdGhlIHZlcnNpb24gbWF0Y2ggYW5kIHRoZXJlIGlzIG90aGVyIHZlcnNpb24gLT4gQU1CSUdVT1VTCi0JICogIElmIHNvbWUgb2YgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYnV0IG5vdCBhbGwgLT4gVU5IQVBQWQotCSAqIAlDaGVjayBvbiBhbGwgQ29uZmlndXJlZFNpdGVzCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGdldFN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0KLQkJLy8gdmFsaWRhdGUgc2l0ZQotCQlJU2l0ZSBmZWF0dXJlU2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpOwotCQlpZiAoZmVhdHVyZVNpdGUgPT0gbnVsbCkgewotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCi0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQ2Fubm90IGRldGVybWluZSBzdGF0dXMgb2YgZmVhdHVyZToiICsgZmVhdHVyZS5nZXRMYWJlbCgpICsgIi4gU2l0ZSBpcyBOVUxMLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLlVuYWJsZVRvRGV0ZXJtaW5lRmVhdHVyZVN0YXR1c1NpdGVOdWxsIiwgbmV3IE9iamVjdFtdIHsgZmVhdHVyZS5nZXRVUkwoKX0pOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElGZWF0dXJlLlNUQVRVU19BTUJJR1VPVVMsIG1zZywgbnVsbCk7Ci0JCX0KLQotCQkvLyB2YWxpZGF0ZSBjb25maWd1cmVkIHNpdGUJCQotCQlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9IChDb25maWd1cmVkU2l0ZSkgZmVhdHVyZVNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCWlmIChjU2l0ZSA9PSBudWxsKSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikKLQkJCQlVcGRhdGVDb3JlLndhcm4oIkNhbm5vdCBkZXRlcm1pbmUgc3RhdHVzIG9mIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldExhYmVsKCkgKyAiLiBDb25maWd1cmVkIFNpdGUgaXMgTlVMTC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5VbmFibGVUb0RldGVybWluZUZlYXR1cmVTdGF0dXNDb25maWd1cmVkU2l0ZU51bGwiLCBuZXcgT2JqZWN0W10geyBmZWF0dXJlLmdldFVSTCgpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSUZlYXR1cmUuU1RBVFVTX0FNQklHVU9VUywgbXNnLCBudWxsKTsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIGRpc2FibGUsIGlmIHNvIHJldHVybgotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBjU2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQlpZiAoIWNTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5pc0NvbmZpZ3VyZWQocmVmKSkKLQkJCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikKLQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBmaW5kIHJlZmVyZW5jZSBmb3IgZmVhdHVyZSAiICsgZmVhdHVyZSArICIgaW4gc2l0ZSAiICsgY1NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQkvLyBjaGVjayBpZiBicm9rZW4KLQkJSVN0YXR1cyBzdGF0dXMgPSBjU2l0ZS5nZXRCcm9rZW5TdGF0dXMoZmVhdHVyZSk7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJGZWF0dXJlIGJyb2tlbjoiICsgZmVhdHVyZS5nZXRMYWJlbCgpICsgIi5TaXRlOiIgKyBjU2l0ZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJLy8gY2hlY2sgYW1iaWd1b3VzIGFnYWluc3QgcmVnaXN0cnkgWzE3MDE1XQotCQlJUGx1Z2luRW50cnlbXSBmZWF0dXJlc0VudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJcmV0dXJuIHN0YXR1cyhmZWF0dXJlc0VudHJpZXMpOwotCX0KLQotCS8qCi0JICogIGNoZWNrIGlmIHRoZSBQbHVnaW5zIG9mIHRoZSBmZWF0dXJlIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgKLQkgKiAgSWYgYWxsIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGFuZCB0aGUgdmVyc2lvbiBtYXRjaCBhbmQgdGhlcmUgaXMgbm8gb3RoZXIgdmVyc2lvbiAtPiBIQVBQWQotCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBvdGhlciB2ZXJzaW9uIC0+IEFNQklHVU9VUwotCSAqICBJZiBzb21lIG9mIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGJ1dCBub3QgYWxsIC0+IFVOSEFQUFkKLQkgKiAJQ2hlY2sgb24gYWxsIENvbmZpZ3VyZWRTaXRlcwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldEZlYXR1cmVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IG51bGw7Ci0JCUlTdGF0dXMgY2hpbGRTdGF0dXM7Ci0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCi0JCS8vIGNvbnNpZGVyIGRpc2FibGUKLQkJLy8gY2hlY2sgdGhlIGN1cnJlbnQgZmVhdHVyZQotCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5GZWF0dXJlRGlzYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb2RlID0gSUZlYXR1cmUuU1RBVFVTX0RJU0FCTEVEOwotCQlJU3RhdHVzIGZlYXR1cmVTdGF0dXMgPSBnZXRTdGF0dXMoZmVhdHVyZSk7Ci0JCU11bHRpU3RhdHVzIG11bHRpVGVtcCA9IG5ldyBNdWx0aVN0YXR1cyhmZWF0dXJlU3RhdHVzLmdldFBsdWdpbigpLCBjb2RlLCBtc2csIG51bGwpOwotCQlpZiAoZmVhdHVyZVN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCWlmIChmZWF0dXJlU3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJCW11bHRpVGVtcC5hZGRBbGwoZmVhdHVyZVN0YXR1cyk7Ci0JCQl9IGVsc2UgewotCQkJCW11bHRpVGVtcC5hZGQoZmVhdHVyZVN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQkJLy8gcHJlc2VydmUgdGhlIHdvcnNlIGNvZGUgdGhyb3VnaCB0aGUgbWV0aG9kIChzZWxmIGFzc2VzbWVudCArIGNoaWxkcmVuIGFzc2Vzc21lbnQpCi0JCWlmIChmZWF0dXJlU3RhdHVzLmdldENvZGUoKSA+IGNvZGUpCi0JCQljb2RlID0gZmVhdHVyZVN0YXR1cy5nZXRDb2RlKCk7Ci0KLQkJLy8gZG8gbm90IGNoZWNrIGNoaWxkcmVuIGlmIGZlYXR1cmUgaXMgZGlzYWJsZQotCQlpZiAoIShjb2RlID09IElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKGNoaWxkcmVuW2ldKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2hpbGRGZWF0dXJlID0gY2hpbGRyZW5baV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKGNoaWxkcmVuW2ldKSkKLQkJCQkJCQlVcGRhdGVDb3JlLndhcm4oIkVycm9yIHJldHJpZXZpbmcgZmVhdHVyZToiICsgY2hpbGRyZW5baV0pOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQlpZiAoY2hpbGRGZWF0dXJlID09IG51bGwpIHsKLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiZ2V0RmVhdHVyZVN0YXR1czogRmVhdHVyZSBpcyBudWxsIGZvcjoiICsgY2hpbGRyZW5baV0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBVbmFibGUgdG8gZmluZCBjaGlsZHJlbiBmZWF0dXJlLCBicm9rZW4KLQkJCQkJCU9iamVjdCBmZWF0dXJlQXNQcmludGFibGVPYmplY3QgPSBjaGlsZHJlbltpXS5nZXRVUkwoKTsKLQkJCQkJCWZlYXR1cmVBc1ByaW50YWJsZU9iamVjdCA9IGNoaWxkcmVuW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkJCVN0cmluZyBtc2cxID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5OZXN0ZWRGZWF0dXJlVW5hdmFpbGFibGUiLCBuZXcgT2JqZWN0W10geyBmZWF0dXJlQXNQcmludGFibGVPYmplY3QgfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW11bHRpVGVtcC5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZLCBtc2cxLCBudWxsKSk7Ci0JCQkJCQlpZiAoSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkgPiBjb2RlKQotCQkJCQkJCWNvZGUgPSBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNoaWxkU3RhdHVzID0gZ2V0RmVhdHVyZVN0YXR1cyhjaGlsZEZlYXR1cmUpOwotCQkJCQkJLy8gZG8gbm90IGFkZCB0aGUgc3RhdHVzLCBhZGQgdGhlIGNoaWxkcmVuIHN0YXR1cyBhcyBnZXRGZWF0dXJlU3RhdHVzCi0JCQkJCQkvLyByZXR1cm5zIGEgbXVsdGlTdGF0dXMgCi0JCQkJCQlpZiAoY2hpbGRTdGF0dXMuZ2V0Q29kZSgpID09IElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRCkgewotCQkJCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmVyc2lvbklEID0gY2hpbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkJCQlTdHJpbmcgZmVhdHVyZVZlciA9ICh2ZXJzaW9uSUQgPT0gbnVsbCkgPyAiIiA6IHZlcnNpb25JRC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBtc2cxID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5OZXN0ZWRGZWF0dXJlRGlzYWJsZSIsIGNoaWxkRmVhdHVyZS5nZXRMYWJlbCgpLCBmZWF0dXJlVmVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW11bHRpVGVtcC5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGNoaWxkU3RhdHVzLmdldENvZGUoKSwgbXNnMSwgbnVsbCkpOwotCQkJCQkJCWlmIChJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSA+IGNvZGUpCi0JCQkJCQkJCWNvZGUgPSBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWTsKLQkJCQkJCX0KLQkJCQkJCWlmIChjaGlsZFN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spIHsKLQkJCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZlcnNpb25JRCA9IGNoaWxkRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCQkJU3RyaW5nIGZlYXR1cmVWZXIgPSAodmVyc2lvbklEID09IG51bGwpID8gIiIgOiB2ZXJzaW9uSUQuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgbXNnMSA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuTmVzdGVkRmVhdHVyZVVuSGFwcHkiLCBjaGlsZEZlYXR1cmUuZ2V0TGFiZWwoKSwgZmVhdHVyZVZlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQltdWx0aVRlbXAuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBjaGlsZFN0YXR1cy5nZXRDb2RlKCksIG1zZzEsIG51bGwpKTsKLQkJCQkJCQlpZiAoY2hpbGRTdGF0dXMuZ2V0Q29kZSgpID4gY29kZSkKLQkJCQkJCQkJY29kZSA9IGNoaWxkU3RhdHVzLmdldENvZGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNldCBtZXNzYWdlCi0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBJRmVhdHVyZS5TVEFUVVNfSEFQUFkgOgotCQkJCW1zZyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuRmVhdHVyZUhhcHB5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkgOgotCQkJCW1zZyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuRmVhdHVyZVVuSGFwcHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTIDoKLQkJCQltc2cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLkZlYXR1cmVBbWJpZ3VvdXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQgOgotCQkJCW1zZyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuRmVhdHVyZURpc2FibGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJbXNnID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5GZWF0dXJlU3RhdHVzVW5rbm93biIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoZmVhdHVyZVN0YXR1cy5nZXRQbHVnaW4oKSwgY29kZSwgbXNnLCBudWxsKTsKLQkJbXVsdGkuYWRkQWxsKG11bHRpVGVtcCk7Ci0JCXJldHVybiBtdWx0aTsKLQl9Ci0KLQkvKgotCSAqIGNvbXB1dGUgdGhlIHN0YXR1cyBiYXNlZCBvbiBnZXRTdGF0dXMoKSBydWxlcyAKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzKElQbHVnaW5FbnRyeVtdIGZlYXR1cmVQbHVnaW5zKSB7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgZmVhdHVyZVBsdWdpbklEOwotCi0JCVN0cmluZyBoYXBweU1TRyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuRmVhdHVyZUhhcHB5Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGFtYmlndW91c01TRyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuRmVhdHVyZUFtYmlndW91cyIpOyAvLyROT04tTkxTLTEkCi0JCUlTdGF0dXMgZmVhdHVyZVN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCBJRmVhdHVyZS5TVEFUVVNfSEFQUFksICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhmZWF0dXJlU3RhdHVzLmdldFBsdWdpbigpLCBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTLCBhbWJpZ3VvdXNNU0csIG51bGwpOwotCQlQYWNrYWdlQWRtaW4gcGtnQWRtaW4gPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBhY2thZ2VBZG1pbigpOwotCQkKLQkJLy8gaXMgQW1iaWdvdXMgaWYgd2UgZmluZCBhIHBsdWdpbiBmcm9tIHRoZSBmZWF0dXJlCi0JCS8vIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiBhbmQgbm90IHRoZSBvbmUgd2UgYXJlIGxvb2tpbmcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUGx1Z2lucy5sZW5ndGg7IGkrKykgewotCQkJTXVsdGlTdGF0dXMgdGVtcG11bHRpID0gbmV3IE11bHRpU3RhdHVzKGZlYXR1cmVTdGF0dXMuZ2V0UGx1Z2luKCksIElGZWF0dXJlLlNUQVRVU19BTUJJR1VPVVMsIGFtYmlndW91c01TRywgbnVsbCk7Ci0JCQlmZWF0dXJlUGx1Z2luSUQgPSBmZWF0dXJlUGx1Z2luc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkKLQkJCVN0cmluZyBzaW5nbGVWZXJzaW9uUmFuZ2UgPSAnWycgKyBmZWF0dXJlUGx1Z2luSUQuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAnLCcgKyBmZWF0dXJlUGx1Z2luSUQuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAnXSc7Ci0JCQlCdW5kbGVbXSBidW5kbGVzID0gcGtnQWRtaW4uZ2V0QnVuZGxlcyhmZWF0dXJlUGx1Z2luSUQuZ2V0SWRlbnRpZmllcigpLCBzaW5nbGVWZXJzaW9uUmFuZ2UpOwotCQkJaWYgKGJ1bmRsZXMgIT0gbnVsbCAmJiBidW5kbGVzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQkvLyBDaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIGZlYXR1cmUgd2l0aCB0aGlzIHBsdWdpbiAoYnV0IGRpZmZlcmVudCB2ZXJzaW9uKQotCQkJLy8gbG9nIGl0Ci0JCQlidW5kbGVzID0gcGtnQWRtaW4uZ2V0QnVuZGxlcyhmZWF0dXJlUGx1Z2luSUQuZ2V0SWRlbnRpZmllcigpLCBudWxsKTsKLQkJCWZvciAoaW50IGo9MDsgYnVuZGxlcyAhPSBudWxsICYmIGo8YnVuZGxlcy5sZW5ndGg7IGorKyApIHsKLQkJCQlTdHJpbmcgYnVuZGxlVmVyc2lvbiA9IChTdHJpbmcpYnVuZGxlc1tqXS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVGb3JJZChuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihidW5kbGVzW2pdLmdldFN5bWJvbGljTmFtZSgpLCBidW5kbGVWZXJzaW9uICkpOwotCQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQkJT2JqZWN0W10gdmFsdWVzID0gbmV3IE9iamVjdFtdIHtidW5kbGVzW2pdLmdldFN5bWJvbGljTmFtZSgpLCBmZWF0dXJlUGx1Z2luSUQuZ2V0VmVyc2lvbigpLCBidW5kbGVWZXJzaW9ufTsKLQkJCQkJbXNnID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5Ud29WZXJzaW9uU2FtZVBsdWdpbjEiLCB2YWx1ZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIGxhYmVsID0gZmVhdHVyZS5nZXRMYWJlbCgpOwotCQkJCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24gPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJT2JqZWN0W10gdmFsdWVzID0gbmV3IE9iamVjdFtdIHsgYnVuZGxlc1tqXS5nZXRTeW1ib2xpY05hbWUoKSwgZmVhdHVyZVBsdWdpbklELmdldFZlcnNpb24oKSwgYnVuZGxlVmVyc2lvbiwgbGFiZWwsIGZlYXR1cmVWZXJzaW9uIH07Ci0JCQkJCW1zZyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuVHdvVmVyc2lvblNhbWVQbHVnaW4yIiwgdmFsdWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCVVwZGF0ZUNvcmUud2FybigiRm91bmQgYW5vdGhlciB2ZXJzaW9uIG9mIHRoZSBzYW1lIHBsdWdpbiBvbiB0aGUgcGF0aDoiICsgYnVuZGxlc1tqXS5nZXRTeW1ib2xpY05hbWUoKSArICIgIiArIGJ1bmRsZVZlcnNpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0ZW1wbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTLCBtc2csIG51bGwpKTsKLQkJCX0KLQkKLQotCQkJLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCB0aGUgZXhhY3QgcGx1Z2luLCBhZGQgdGhlIGNoaWxkcmVuCi0JCQkvLyBvZiB0ZW1wTXVsdGkgKGksZSB0aGUgb3RoZXIgd2UgZm91bmQpIAotCQkJLy8gaWYgd2UgaGF2ZSBubyBjaGlsZHJlbiwgd2UgaGF2ZSBhIHByb2JsZW0gYXMgYSByZXF1aXJlZCBwbHVnaW4gaXMgbm90IHRoZXJlIGF0IGFsbAotCQkJaWYgKCFmb3VuZCkgewotCQkJCWlmICh0ZW1wbXVsdGkuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0JCQkJCW11bHRpLmFkZEFsbCh0ZW1wbXVsdGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChtdWx0aS5nZXRDb2RlKCkgIT0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkpIHsKLQkJCQkJCVN0cmluZyB1bmhhcHB5TVNHID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5GZWF0dXJlVW5IYXBweSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlNdWx0aVN0YXR1cyBuZXdNdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhmZWF0dXJlU3RhdHVzLmdldFBsdWdpbigpLCBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSwgdW5oYXBweU1TRywgbnVsbCk7Ci0JCQkJCQluZXdNdWx0aS5hZGRBbGwobXVsdGkpOwotCQkJCQkJbXVsdGkgPSBuZXdNdWx0aTsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5Ob1BsdWdpblZlcnNpb24iLCBmZWF0dXJlUGx1Z2luSUQuZ2V0SWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZLCBtc2csIG51bGwpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIW11bHRpLmlzT0soKSkKLQkJCXJldHVybiBtdWx0aTsKLQotCQkvLyB3ZSByZXR1cm4gaGFwcHkgYXMgd2UgY29uc2lkZXIgdGhlIGlzQnJva2VuIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBkb25lCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgSUZlYXR1cmUuU1RBVFVTX0hBUFBZLCBoYXBweU1TRywgbnVsbCk7Ci0JfQotCS8qCi0JICogY3JlYXRlcyBhIFN0YXR1cwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHN0YXR1c1NldmVyaXR5LCBpbnQgc3RhdHVzQ29kZSwgU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpIHsKLQkJU3RyaW5nIGlkID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCQlTdHJpbmdCdWZmZXIgY29tcGxldGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobXNnICE9IG51bGwpCi0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQobXNnKTsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKCJcclxuWyIpOyAvLyROT04tTkxTLTEkCi0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoZS50b1N0cmluZygpKTsKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXVxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuZXcgU3RhdHVzKHN0YXR1c1NldmVyaXR5LCBpZCwgc3RhdHVzQ29kZSwgY29tcGxldGVTdHJpbmcudG9TdHJpbmcoKSwgZSk7Ci0JfQotCi0KLQkvKgotCSAqIHJldHVybnMgYWxsIHRoZSBjb25maWd1cmVkIGZldGF1cmVzCi0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZVtdIGdldEFsbENvbmZpZ3VyZWRGZWF0dXJlcygpIHsKLQkJaWYgKGFsbENvbmZpZ3VyZWRGZWF0dXJlcyA9PSBudWxsKSB7Ci0KLQkJCWFsbENvbmZpZ3VyZWRGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGFsbENvbmZpZ3VyZWRTaXRlcyA9IHNpdGVMb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENvbmZpZ3VyZWRTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGFsbENvbmZpZ3VyZWRTaXRlc1tpXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJZmVhdHVyZSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmZWF0dXJlID0gcmVmc1tqXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCQlhbGxDb25maWd1cmVkRmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IG5ldyBJRmVhdHVyZVthbGxDb25maWd1cmVkRmVhdHVyZXMuc2l6ZSgpXTsKLQkJaWYgKGFsbENvbmZpZ3VyZWRGZWF0dXJlcy5zaXplKCkgPiAwKSB7Ci0JCQlhbGxDb25maWd1cmVkRmVhdHVyZXMudG9BcnJheShmZWF0dXJlcyk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogcmV0dXJucyB0aGUgRmVhdHVyZSB0aGF0IGRlY2xhcmVzIHRoaXMgdmVyc2lvbmVkSWRlbnRpZmllciBvciBudWxsIGlmIG5vbmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGdldEZlYXR1cmVGb3JJZChWZXJzaW9uZWRJZGVudGlmaWVyIGlkKSB7Ci0KLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJRmVhdHVyZVtdIGFsbEZlYXR1cmVzID0gZ2V0QWxsQ29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCUlGZWF0dXJlIGN1cnJlbnRGZWF0dXJlID0gbnVsbDsKLQkJSVBsdWdpbkVudHJ5W10gYWxsUGx1Z2lucyA9IG51bGw7Ci0JCUlQbHVnaW5FbnRyeSBjdXJyZW50UGx1Z2luID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJY3VycmVudEZlYXR1cmUgPSBhbGxGZWF0dXJlc1tpXTsKLQkJCWFsbFBsdWdpbnMgPSBjdXJyZW50RmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGFsbFBsdWdpbnMubGVuZ3RoOyBqKyspIHsKLQkJCQljdXJyZW50UGx1Z2luID0gYWxsUGx1Z2luc1tqXTsKLQkJCQlpZiAoaWQuZXF1YWxzKGN1cnJlbnRQbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkKLQkJCQkJcmV0dXJuIGN1cnJlbnRGZWF0dXJlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVR5cGVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVUeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDA2MTI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVR5cGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaXRlVHlwZUZhY3Rvcnkgew0KLQkNCi0NCi0JLyoqDQotCSAqIGV4dGVuc2lvbiBwb2ludCBJRA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNUExFX0VYVEVOU0lPTl9JRCA9ICJzaXRlVHlwZXMiOwkgLy8kTk9OLU5MUy0xJA0KLQkNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgU2l0ZVR5cGVGYWN0b3J5IGluc3Q7DQotCQ0KLQlwcml2YXRlIE1hcCBmYWN0b3JpZXM7DQotDQotCS8qKg0KLQkgKiBoaWRlIGN0ciANCi0JICovDQotCXByaXZhdGUgU2l0ZVR5cGVGYWN0b3J5KCkgew0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgU2l0ZVR5cGVGYWN0b3J5IGdldEluc3RhbmNlKCkgew0KLQkJaWYgKGluc3QgPT0gbnVsbCkNCi0JCQlpbnN0ID0gbmV3IFNpdGVUeXBlRmFjdG9yeSgpOw0KLQkJcmV0dXJuIGluc3Q7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIHJldHVybiB0aGUgZmFjdG9yeSBmb3IgdGhlIHR5cGUNCi0JICovDQotCXB1YmxpYyBJU2l0ZUZhY3RvcnkgZ2V0RmFjdG9yeShTdHJpbmcgdHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJCS8vDQotCQkJT2JqZWN0IGluc3RhbmNlID0gZ2V0RmFjdG9yaWVzKCkuZ2V0KHR5cGUpOw0KLQkJCWlmIChpbnN0YW5jZT09bnVsbCkgew0KLQkJCQlpbnN0YW5jZSA9IGNyZWF0ZUZhY3RvcnlGb3IodHlwZSk7DQotCQkJCWdldEZhY3RvcmllcygpLnB1dCh0eXBlLGluc3RhbmNlKTsNCi0JCQl9DQotCQkJcmV0dXJuIChJU2l0ZUZhY3RvcnkpIGluc3RhbmNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgSVNpdGVGYWN0b3J5IGNyZWF0ZUZhY3RvcnlGb3IoU3RyaW5nIHR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUlTaXRlRmFjdG9yeSByZXN1bHQgPSBudWxsOw0KLQkJDQotCQlTdHJpbmcgcGx1Z2luSUQgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOw0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsNCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKHBsdWdpbklELFNJTVBMRV9FWFRFTlNJT05fSUQsdHlwZSk7DQotCQlpZiAoZWxlbWVudHM9PW51bGwgfHwgZWxlbWVudHMubGVuZ3RoPT0wKXsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZVR5cGVGYWN0b3J5LlVuYWJsZVRvRmluZFNpdGVGYWN0b3J5Iix0eXBlKSxudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSBlbHNlIHsNCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzWzBdOw0KLQkJCXJlc3VsdCA9IChJU2l0ZUZhY3RvcnkpZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBhY3Rvcmllcy4NCi0JICogQHJldHVybiBSZXR1cm5zIGEgTWFwDQotCSAqLw0KLQlwcml2YXRlIE1hcCBnZXRGYWN0b3JpZXMoKSB7DQotCQlpZiAoZmFjdG9yaWVzPT1udWxsKSBmYWN0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOw0KLQkJCXJldHVybiBmYWN0b3JpZXM7DQotCX0NCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVVJMQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVVUkxDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4NWVlNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVVUkxDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2l0ZVVSTENvbnRlbnRQcm92aWRlciBleHRlbmRzIFNpdGVDb250ZW50UHJvdmlkZXIgew0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9UWVBFID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmh0dHAiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgSFRUUFNpdGUNCi0JICovDQotCXB1YmxpYyBTaXRlVVJMQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCi0JCXN1cGVyKHVybCk7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nIGFyY2hpdmVJZCkgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCVVSTCBjb250ZW50VVJMID0gbnVsbDsNCi0JCQ0KLQkJY29udGVudFVSTCA9IGdldEFyY2hpdmVVUkxmb3IoYXJjaGl2ZUlkKTsNCi0JCS8vIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcgaW4gdGhlIHNpdGUueG1sDQotCQkvLyBmb3IgdGhpcyBhcmNoaXZlSWQsIHVzZSB0aGUgZGVmYXVsdCBvbmUNCi0JCWlmIChjb250ZW50VVJMPT1udWxsKSB7DQotCQkJcmV0dXJuIHN1cGVyLmdldEFyY2hpdmVSZWZlcmVuY2UoYXJjaGl2ZUlkKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNvbnRlbnRVUkw7DQotCX0NCi0NCi0JLyoqDQotCSAqIHJldHVybiB0aGUgVVJMIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWQgb2YgdGVoIGFyY2hpdmUgZm9yIHRoaXMgc2l0ZQ0KLQkgKiByZXR1cm4gbnVsbCBpZiB0aGUgYXJjaGl2ZUlkIGlzIG51bGwsIGVtcHR5IG9yIA0KLQkgKiBpZiB0ZWggbGlzdCBvZiBhcmNoaXZlcyBvbiB0aGUgc2l0ZSBpcyBudWxsIG9yIGVtcHR5DQotCSAqIG9mIGlmIHRoZXJlIGlzIG5vIFVSTCBhc3NvY2lhdGVkIHdpdGggdGhlIGFyY2hpdmVJRCBmb3IgdGhpcyBzaXRlDQotCSAqLw0KLQlwcml2YXRlIFVSTCBnZXRBcmNoaXZlVVJMZm9yKFN0cmluZyBhcmNoaXZlSWQpIHsNCi0JCVVSTCByZXN1bHQgPSBudWxsOw0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQ0KLQkJSUFyY2hpdmVSZWZlcmVuY2VbXSBzaXRlQXJjaGl2ZXMgPSBnZXRTaXRlKCkuZ2V0QXJjaGl2ZXMoKTsNCi0JCWlmIChzaXRlQXJjaGl2ZXMubGVuZ3RoID4gMCkgew0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUFyY2hpdmVzLmxlbmd0aCAmJiAhZm91bmQ7IGkrKykgew0KLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkNCi0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkdldEFyY2hpdmVVUkwgZm9yOiIrYXJjaGl2ZUlkKyIgY29tcGFyZSB0byAiK3NpdGVBcmNoaXZlc1tpXS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQkJaWYgKGFyY2hpdmVJZC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShzaXRlQXJjaGl2ZXNbaV0uZ2V0UGF0aCgpKSkgew0KLQkJCQkJcmVzdWx0ID0gc2l0ZUFyY2hpdmVzW2ldLmdldFVSTCgpOw0KLQkJCQkJZm91bmQgPSB0cnVlOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotDQotDQotCX0NCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVVUkxGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVVUkxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWNiZmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVVJMRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotcHVibGljIGNsYXNzIFNpdGVVUkxGYWN0b3J5IGV4dGVuZHMgQmFzZVNpdGVGYWN0b3J5IGltcGxlbWVudHMgSVNpdGVGYWN0b3J5RXh0ZW5zaW9uIHsNCi0JDQotCS8qDQotCSAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Lg0KLQkgKi8NCi0JcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gY3JlYXRlU2l0ZSh1cmwsIG51bGwpOw0KLQl9DQotCS8qDQotCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMLCBib29sZWFuKQ0KLQkgKiANCi0JICogdGhlIFVSTCBjYW4gYmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtDQotCSAqIDEgcHJvdG9jb2w6Ly8uLi4uLi8NCi0JICogMiBwcm90b2NvbDovLy4uLi4uDQotCSAqIDMgcHJvdG9jb2w6Ly8uLi4uL3NpdGUueG1sDQotCSAqIA0KLQkgKiAxIElmIHRoZSBmaWxlIG9mIHRoZSBmaWxlIG9mIHRlaCB1cmwgZW5kcyB3aXRoICcvJywgYXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0uDQotCSAqIGlmIGl0IGZhaWxzLCBhZGQgc2l0ZS54bWwgYW5kIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtDQotCSAqIA0KLQkgKiAyIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtDQotCSAqIAlmYWlsDQotCSAqIAkJYWRkICcvc2l0ZS54bWwnIGFuZCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQ0KLQkgKiAJc3VjZXNzDQotCSAqIAkJYXR0ZW1wdCB0byBwYXJzZSwgaWYgaXQgZmFpbHMsIGFkZCAnL3NpdGUueG1sJyBhbmQgYXR0ZW1wdCB0byBvcGVuIHRlaCBzdHJlYW0NCi0JICogDQotCSAqIDMgb3BlbiB0aGUgc3RyZWFtCSANCi0JICovDQotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotCQlTaXRlIHNpdGUgPSBudWxsOw0KLQkJSW5wdXRTdHJlYW0gc2l0ZVN0cmVhbSA9IG51bGw7DQotCQ0KLQkJdHJ5IHsNCi0JCQlTaXRlVVJMQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBTaXRlVVJMQ29udGVudFByb3ZpZGVyKHVybCk7DQotCQ0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7DQotCQkJUmVzcG9uc2UgcmVzcG9uc2UgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChyZXNvbHZlZFVSTCk7DQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNoZWNrQ29ubmVjdGlvblJlc3VsdChyZXNwb25zZSwgcmVzb2x2ZWRVUkwpOw0KLQkJCXNpdGVTdHJlYW0gPSByZXNwb25zZS5nZXRJbnB1dFN0cmVhbShtb25pdG9yKTsNCi0JCQkvLyB0aGUgc3RyZWFtIGNhbiBiZSBudWxsIGlmIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGNvbm5lY3Rpb24NCi0JCQlpZiAoc2l0ZVN0cmVhbT09bnVsbCkgcmV0dXJuIG51bGw7DQotDQotCQkJU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gdGhpczsNCi0JCQlzaXRlID0gKFNpdGUpIGZhY3RvcnkucGFyc2VTaXRlKHNpdGVTdHJlYW0pOw0KLQkNCi0JCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCi0JCQljb250ZW50UHJvdmlkZXIuc2V0U2l0ZShzaXRlKTsNCi0JCQlzaXRlLnJlc29sdmUodXJsLCB1cmwpOw0KLQkJCXNpdGUubWFya1JlYWRPbmx5KCk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlVVJMRmFjdG9yeS5VbmFibGVUb0NyZWF0ZVVSTCIsIHVybCA9PSBudWxsID8gIiIgOiB1cmwudG9FeHRlcm5hbEZvcm0oKSksIGUpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZVVSTEZhY3RvcnkuVW5hYmxlVG9BY2Nlc3NTaXRlU3RyZWFtIiwgdXJsID09IG51bGwgPyAiIiA6IHVybC50b0V4dGVybmFsRm9ybSgpKSwgSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OLCBlKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChzaXRlU3RyZWFtICE9IG51bGwpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXNpdGVTdHJlYW0uY2xvc2UoKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBTaXRlTW9kZWxGYWN0b3J5I2NhblBhcnNlU2l0ZVR5cGUoU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcgdHlwZSkgew0KLQkJcmV0dXJuIChzdXBlci5jYW5QYXJzZVNpdGVUeXBlKHR5cGUpIHx8IFNpdGVVUkxDb250ZW50UHJvdmlkZXIuU0lURV9UWVBFLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVGFyZ2V0RmVhdHVyZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9UYXJnZXRGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OTcyNTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9UYXJnZXRGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXRGZWF0dXJlIGV4dGVuZHMgRmVhdHVyZSB7Ci0KLQotCS8qKgotCSAqIFRoZSBjb250ZW50IGNvbnN1bWVyIG9mIHRoZSBEZWZhdWx0RmVhdHVyZQotCSAqLwotCXByaXZhdGUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyOwotCQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRhcmdldEZlYXR1cmUuCi0JICovCi0JcHVibGljIFRhcmdldEZlYXR1cmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudCBDb25zdW1lcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRDb25zdW1lcihJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb250ZW50Q29uc3VtZXIpIHsKLQkJdGhpcy5jb250ZW50Q29uc3VtZXIgPSBjb250ZW50Q29uc3VtZXI7Ci0JCWNvbnRlbnRDb25zdW1lci5zZXRGZWF0dXJlKHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNnZXRGZWF0dXJlQ29udGVudENvbnN1bWVyKCkKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuY29udGVudENvbnN1bWVyID09IG51bGwpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCBQb2xpY3kuYmluZCgiRmVhdHVyZS5Ob0ZlYXR1cmVDb250ZW50Q29uc3VtZXIiLCBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY29udGVudENvbnN1bWVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxFbmNvZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VSTEVuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhZTY3Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VSTEVuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0NCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi0vKioNCi0gKiBFbmNvZGVzIGEgPGNvZGU+VVJMPC9jb2RlPiBpbnRvIGFuIDxjb2RlPkFTQ0lJPC9jb2RlPiByZWFkYWJsZQ0KLSAqIDxjb2RlPlVSTDwvY29kZT4gdGhhdCBpcyBzYWZlIGZvciB0cmFuc3BvcnQuIEVuY29kZWQNCi0gKiA8Y29kZT5VUkw8L2NvZGU+cyBjYW4gYmUgZGVjb2RlZCB1c2luZyB0aGUgPGNvZGU+VVJMRGVjb2RlcjwvY29kZT4uDQotICoNCi0gKiBAc2VlIFVSTERlY29kZXINCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgVVJMRW5jb2RlciB7DQotCS8qKg0KLQkgKiBQcmV2ZW50cyBpbnN0YW5jZXMgZnJvbSBiZWluZyBjcmVhdGVkLg0KLQkgKi8NCi0JcHJpdmF0ZSBVUkxFbmNvZGVyKCkgew0KLQl9DQotCS8qKg0KLQkgKiBFbmNvZGVzIHRoZSBnaXZlbiBmaWxlIGFuZCByZWZlcmVuY2UgcGFydHMgb2YgYSA8Y29kZT5VUkw8L2NvZGU+IGludG8NCi0JICogYW4gPGNvZGU+QVNDSUk8L2NvZGU+IHJlYWRhYmxlIDxjb2RlPlN0cmluZzwvY29kZT4gdGhhdCBpcyBzYWZlIGZvcg0KLQkgKiB0cmFuc3BvcnQuIFJldHVybnMgdGhlIHJlc3VsdC4NCi0JICoNCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGVuY29kaW5nIHRoZSBnaXZlbiBmaWxlIGFuZCByZWZlcmVuY2UgcGFydHMgb2YNCi0JICogICAgICAgICBhIDxjb2RlPlVSTDwvY29kZT4gaW50byBhbiA8Y29kZT5BU0NJSTwvY29kZT4gcmVhZGFibGUNCi0JICogICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgaXMgc2FmZSBmb3IgdHJhbnNwb3J0DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIGZpbGUsIFN0cmluZyBxdWVyeSwgU3RyaW5nIHJlZikgew0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpbGUsICIvIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7DQotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOw0KLQkJCWlmICh0b2tlbi5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCWJ1Zi5hcHBlbmQodG9rZW4pOw0KLQkJCX0gZWxzZSB7DQotCQkJCWJ1Zi5hcHBlbmQoZW5jb2RlU2VnbWVudCh0b2tlbikpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChxdWVyeSAhPSBudWxsKXsNCi0JCQlidWYuYXBwZW5kKCc/Jyk7DQotCQkJYnVmLmFwcGVuZChxdWVyeSk7DQotCQl9DQotDQotCQlpZiAocmVmICE9IG51bGwpIHsNCi0JCQlidWYuYXBwZW5kKCcjJyk7DQotCQkJYnVmLmFwcGVuZChlbmNvZGVTZWdtZW50KHJlZikpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KLQl9DQotCS8qKg0KLQkgKiBFbmNvZGVzIHRoZSBnaXZlbiA8Y29kZT5VUkw8L2NvZGU+IGludG8gYW4gPGNvZGU+QVNDSUk8L2NvZGU+DQotCSAqIHJlYWRhYmxlIDxjb2RlPlVSTDwvY29kZT4gdGhhdCBpcyBzYWZlIGZvciB0cmFuc3BvcnQuIFJldHVybnMgdGhlDQotCSAqIHJlc3VsdC4NCi0JICoNCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGVuY29kaW5nIHRoZSBnaXZlbiA8Y29kZT5VUkw8L2NvZGU+IGludG8gYW4NCi0JICogICAgICAgICA8Y29kZT5BU0NJSTwvY29kZT4gcmVhZGFibGUgPGNvZGU+VVJMPC9jb2RlPiB0aGF0IGlzIHNhZmUgZm9yDQotCSAqICAgICAgICAgdHJhbnNwb3J0DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFVSTCBlbmNvZGUoVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQkvLyBlbmNvZGUgdGhlIHBhdGggbm90IHRoZSBmaWxlIGFzIHRoZSBVUkwgbWF5IGNvbnRhaW4gYSBxdWVyeQ0KLQkJU3RyaW5nIGZpbGUgPSB1cmwuZ2V0UGF0aCgpOw0KLQkJU3RyaW5nIHF1ZXJ5ID0gdXJsLmdldFF1ZXJ5KCk7DQotCQlTdHJpbmcgcmVmID0gdXJsLmdldFJlZigpOw0KLQ0KLQkJVVJMIHJlc3VsdCA9ICBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCBlbmNvZGUoZmlsZSwgcXVlcnksIHJlZikpOw0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlU2VnbWVudChTdHJpbmcgc2VnbWVudCkgew0KLQkJDQotCQkvLyBpZiB3ZSBmaW5kIGEgJyUnIGluIHRoZSBzdHJpbmcsIGNvbnNpZGVyIHRoZSBVUkwgdG8gYmUgYWxyZWFkeSBlbmNvZGVkDQotCQlpZiAoc2VnbWVudC5pbmRleE9mKCclJykhPS0xKSByZXR1cm4gc2VnbWVudDsNCi0JCQ0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc2VnbWVudC5sZW5ndGgoKSk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnQubGVuZ3RoKCk7ICsraSkgew0KLQkJCWNoYXIgYyA9IHNlZ21lbnQuY2hhckF0KGkpOw0KLQkJCWlmIChtdXN0RW5jb2RlKGMpKSB7DQotCQkJCWJ5dGVbXSBieXRlcyA9IG51bGw7DQotCQkJCXRyeSB7DQotCQkJCQlieXRlcyA9IG5ldyBDaGFyYWN0ZXIoYykudG9TdHJpbmcoKS5nZXRCeXRlcygiVVRGOCIpOyAvLyROT04tTkxTLTEkDQotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgew0KLQkJCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgZS5nZXRNZXNzYWdlKCkpOw0KLQkJCQl9DQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYnl0ZXMubGVuZ3RoOyArK2opIHsNCi0JCQkJCXJlc3VsdC5hcHBlbmQoJyUnKTsNCi0JCQkJCXJlc3VsdC5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZygoYnl0ZXNbal0gPj4gNCkgJiAweDBGKSk7DQotCQkJCQlyZXN1bHQuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYnl0ZXNbal0gJiAweDBGKSk7DQotCQkJCX0NCi0JCQl9IGVsc2Ugew0KLQkJCQlyZXN1bHQuYXBwZW5kKGMpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG11c3RFbmNvZGUoY2hhciBjKSB7DQotCQlpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAoYyA+PSAnXCcnICYmIGMgPD0gJy4nKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKGMgPT0gJyEnIHx8IGMgPT0gJyQnIHx8IGMgPT0gJ18nKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJLy8gbmVlZGVkIG90aGVyd2lzZSBmaWxlOi8vL2M6L2ZpbGUvIGJlY29tZXMgZmlsZTovLy9DJTNhL2ZpbGUvDQotCQlpZiAoYyA9PSc6Jyl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxLZXkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVVJMS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMWQ5YjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0gCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotCi0KLS8qKgotICogCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVSTEtleSB7Ci0KLQlwcml2YXRlIFVSTCB1cmw7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFVSTEtleS4KLQkgKi8KLQlwdWJsaWMgVVJMS2V5KFVSTCB1cmwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKHRoaXMgPT0gb2JqKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBVUkxLZXkpIHsKLQkJCQlyZXR1cm4gZXF1YWxzKCgoVVJMS2V5KSBvYmopLmdldFVSTCgpKTsKLQkJCX0KLQotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVVJMKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJVVJMIHVybDIgPSAoVVJMKW9iajsKLQkJCWlmICh1cmwgPT0gdXJsMikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlyZXR1cm4gVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwodXJsLHVybDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHVybC5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVybC4KLQkgKiBAcmV0dXJuIFVSTAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVDb3JlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZUNvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxYzU4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZUNvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlQ29yZSBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBkZWJ1ZyBvcHRpb25zCi0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX0lOU1RBTEw7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfUEFSU0lORzsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19XQVJOSU5HUzsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19DT05GSUdVUkFUSU9OOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfV0VCOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX0lIQU5ETEVSOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX1JFQ09OQ0lMRVI7Ci0KLQkvLyBwcmVmZXJlbmNlIGtleXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSElTVE9SWV9TSVpFID0gUFJFRklYICsgIi5oaXN0b3J5U2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0NIRUNLX1NJR05BVFVSRSA9IFBSRUZJWCArICIuY2hlY2tTaWduYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9VUERBVEVfVkVSU0lPTlMgPSBQUkVGSVggKyAiLnVwZGF0ZVZlcnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUlWQUxFTlRfVkFMVUUgPSAiZXF1aXZhbGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVRJQkxFX1ZBTFVFID0gImNvbXBhdGlibGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBpbnQgREVGQVVMVF9ISVNUT1JZID0gMTAwOy8vSW50ZWdlci5NQVhfVkFMVUU7Ci0JCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFVwZGF0ZUNvcmUgcGx1Z2luOwotCi0JLy9sb2cKLQlwcml2YXRlIHN0YXRpYyBVcGRhdGVNYW5hZ2VyTG9nV3JpdGVyIGxvZzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEU9Imluc3RhbGwubG9nIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vQ29ubmVjdGlvbiBtYW5hZ2VyCi0JcHJpdmF0ZSBDb25uZWN0aW9uVGhyZWFkTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUVFBfUFJPWFlfSE9TVCA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wcm94eS5ob3N0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUVFBfUFJPWFlfUE9SVCA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wcm94eS5wb3J0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUVFBfUFJPWFlfRU5BQkxFID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnByb3h5LmVuYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGJ1bmRsZSBkYXRhCi0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBwa2dBZG1pblRyYWNrZXI7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVcGRhdGVDb3JlKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQkKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVwZGF0ZUNvcmUgZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYW5hZ2VyIHRoYXQgbWFuYWdlcyBVUkwgY29ubmVjdGlvbiB0aHJlYWRzLgotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlciBnZXRDb25uZWN0aW9uTWFuYWdlcigpIHsKLQkJaWYgKGNvbm5lY3Rpb25NYW5hZ2VyPT1udWxsKQotCQkJY29ubmVjdGlvbk1hbmFnZXIgPSBuZXcgQ29ubmVjdGlvblRocmVhZE1hbmFnZXIoKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb25NYW5hZ2VyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuRGVidWdPcHRpb24oU3RyaW5nIGZsYWcsIGJvb2xlYW4gZGZsdCkgewotCQlTdHJpbmcgcmVzdWx0ID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oZmxhZyk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJldHVybiBkZmx0OwotCQllbHNlCi0JCQlyZXR1cm4gcmVzdWx0LnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBkdW1wcyBhIFN0cmluZyBpbiB0aGUgdHJhY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIHMpIHsKLQkJU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJbXNnLmFwcGVuZChnZXRQbHVnaW4oKS50b1N0cmluZygpKTsKLQkJbXNnLmFwcGVuZCgiXiIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmhhc2hDb2RlKCkpKTsKLQkJbXNnLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCW1zZy5hcHBlbmQocyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihtc2cudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIER1bXBzIGEgU3RyaW5nIGluIHRoZSBsb2cgaWYgV0FSTklORyBpcyBzZXQgdG8gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuKFN0cmluZyBzKSB7Ci0JCWlmIChERUJVRyAmJiBERUJVR19TSE9XX1dBUk5JTkdTKSB7Ci0JCQlpZiAocyE9bnVsbCl7Ci0JCQkJcz0iV0FSTklORzogIitzOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlsb2cocywgbnVsbCk7IAotCQl9Ci0JfQotCi0JLyoqCi0JICogRHVtcHMgYW4gZXhjZXB0aW9uIGluIHRoZSBsb2cgaWYgV0FSTklORyBpcyBzZXQgdG8gdHJ1ZQotCSAqIAotCSAqIEBwYXJhbSBzIGxvZyBzdHJpbmcKLQkgKiBAcGFyYW0gZSBleGNlcHRpb24gdG8gYmUgbG9nZ2VkCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuKFN0cmluZyBzLCBUaHJvd2FibGUgZSkgewotCQlpZiAoREVCVUcgJiYgREVCVUdfU0hPV19XQVJOSU5HUyl7Ci0JCQlpZiAocyE9bnVsbCl7Ci0JCQkJcz0iVVBEQVRFIE1BTkFHRVIgSU5GTzogIitzOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlsb2cocyxlKTsKLQkJfQotCX0KLQkJCQotCS8qKgotCSAqIExvZ3MgYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKXsKLQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsJCQotCX0KLQkKLQkvKioKLQkgKiBMb2dzIGFuIGVycm9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSl7CQkKLQkJbG9nKCIiLGUpOyAvLyROT04tTkxTLTEkCi0JfQkKLQkKLQkvKioKLQkgKiBMb2dzIGEgc3RyaW5nIGFuZCBhbiAgZXJyb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2csIFRocm93YWJsZSBlKXsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIAotCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKWUpLmdldFN0YXR1cygpOwotCQllbHNlIAotCQkJc3RhdHVzID0gVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLGUpLmdldFN0YXR1cygpOwkJCi0JCWlmIChzdGF0dXMhPW51bGwpCi0JCQlsb2coc3RhdHVzKTsKLQl9CQkKLQkvKgotCSAqIE1ldGhvZCBsb2cuCi0JICogQHBhcmFtIG5ld0NvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWd1cmF0aW9uKSB7Ci0JCWlmIChsb2chPW51bGwpCi0JCQlsb2cubG9nKG5ld0NvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qCi0JICogR2V0IHVwZGF0ZSBsb2cgbG9jYXRpb24gcmVsYXRpdmUgdG8gcGxhdGZvcm0gY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0SW5zdGFsbExvZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjb25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CQkKLQkJVVJMIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbj09bnVsbCl7Ci0JCQl3YXJuKCJVbmFibGUgdG8gcmV0cmlldmUgbG9jYXRpb24gZm9yIHVwZGF0ZSBtYW5hZ2VyIGxvZyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0vLwkJVVJMIGNvbmZpZ0xvY2F0aW9uID0gUGxhdGZvcm0ucmVzb2x2ZShjb25maWd1cmF0aW9uTG9jYXRpb24pOwotCQlGaWxlIHVwZGF0ZVN0YXRlTG9jYXRpb24gPSBudWxsOwotCi0JCWlmICgiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShjb25maWd1cmF0aW9uTG9jYXRpb24uZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoY29uZmlndXJhdGlvbkxvY2F0aW9uLmdldEZpbGUoKSk7Ci0JCQl1cGRhdGVTdGF0ZUxvY2F0aW9uID0gbmV3IEZpbGUocGF0aC5nZXRQYXJlbnRGaWxlKCksIExPR19GSUxFKTsKLQkJfQotCQlyZXR1cm4gdXBkYXRlU3RhdGVMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZW5kcyB0aGUgR0VUIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBhbmQgcmV0dXJucyB0aGUgc2VydmVyJ3MKLQkgKiByZXNwb25zZS4KLQkgKgotCSAqIEBwYXJhbSB1cmwgdGhlIFVSTCB0byBvcGVuIG9uIHRoZSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIncyByZXNwb25zZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4gUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIGNsaWVudCBpcyBjbG9zZWQuCi0JICogPGxpPlRoZSBjbGllbnQgY291bGQgbm90IGNvbm5lY3QgdG8gdGhlIHNlcnZlcgotCSAqIDxsaT5BbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgc2VydmVyCi0JICogPHVsPgotCSAqLwotCXB1YmxpYyBSZXNwb25zZSBnZXQoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy9SZXF1ZXN0IHJlcXVlc3QgPSBudWxsOwotCQlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7Ci0JCQotCQlpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzcG9uc2UgPSBuZXcgRmlsZVJlc3BvbnNlKHVybCk7Ci0JCX0gZWxzZSBpZiAodXJsICE9IG51bGwgJiYgdXJsLmdldFByb3RvY29sKCkuc3RhcnRzV2l0aCgiaHR0cCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3BvbnNlID0gbmV3IEh0dHBSZXNwb25zZSh1cmwpOwotCQl9IGVsc2UgewotCQkJcmVzcG9uc2UgPSBuZXcgT3RoZXJSZXNwb25zZSh1cmwpOwotCQl9Ci0JCQotCQkvKmVsc2UgewotCQkJdHJ5IHsKLQkJCQlyZXF1ZXN0ID0gbmV3IFJlcXVlc3QoIkdFVCIsIHVybCwgbnVsbCk7Ci0JCQkJcmVzcG9uc2UgPSBjbGllbnQuaW52b2tlKHJlcXVlc3QpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXF1ZXN0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0qLwotCQlyZXR1cm4gcmVzcG9uc2U7Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIGEgcGF0Y2gKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYXRjaChJRmVhdHVyZSBjYW5kaWRhdGUpIHsKLQkJSUltcG9ydFtdIGltcG9ydHMgPSBjYW5kaWRhdGUuZ2V0SW1wb3J0cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJSUltcG9ydCBpaW1wb3J0ID0gaW1wb3J0c1tpXTsKLQkJCWlmIChpaW1wb3J0LmlzUGF0Y2goKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0KLQkJUG9saWN5LmxvY2FsaXplKCJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5tZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1ZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChERUJVRykgewotCQkJREVCVUdfU0hPV19XQVJOSU5HUyA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2FybmluZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJREVCVUdfU0hPV19QQVJTSU5HID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9wYXJzaW5nIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlERUJVR19TSE9XX0lOU1RBTEwgPSBnZXRCb29sZWFuRGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2luc3RhbGwiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCURFQlVHX1NIT1dfQ09ORklHVVJBVElPTiA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvY29uZmlndXJhdGlvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJREVCVUdfU0hPV19UWVBFID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy90eXBlIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlERUJVR19TSE9XX1dFQiA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2ViIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlERUJVR19TSE9XX0lIQU5ETEVSID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsaGFuZGxlciIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJREVCVUdfU0hPV19SRUNPTkNJTEVSID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9yZWNvbmNpbGVyIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vCi0JCXRyeSB7Ci0JCQlGaWxlIGxvZ0ZpbGUgPSBnZXRJbnN0YWxsTG9nRmlsZSgpOwotCQkJaWYgKGxvZ0ZpbGUhPW51bGwpCi0JCQkJbG9nID0gbmV3IFVwZGF0ZU1hbmFnZXJMb2dXcml0ZXIobG9nRmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotCQkJd2FybigiIixlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlTaXRlTWFuYWdlci5zZXRIdHRwUHJveHlJbmZvKAotCQkJZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUVFBfUFJPWFlfRU5BQkxFKSwKLQkJCWdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEhUVFBfUFJPWFlfSE9TVCksCi0JCQlnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhIVFRQX1BST1hZX1BPUlQpKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJCi0JCUphckNvbnRlbnRSZWZlcmVuY2Uuc2h1dGRvd24oKTsgLy8gbWFrZSBzdXJlIHdlIGFyZSBub3QgbGVhdmluZyBqYXJzIG9wZW4KLQkJVXRpbGl0aWVzLnNodXRkb3duKCk7IC8vIGNsZWFudXAgdGVtcCBhcmVhCi0JCWlmIChsb2chPW51bGwpCi0JCQlsb2cuc2h1dGRvd24oKTsKLQkJaWYgKGNvbm5lY3Rpb25NYW5hZ2VyIT1udWxsKQotCQkJY29ubmVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKLQkJCi0JCXRoaXMuY29udGV4dCA9IG51bGw7Ci0JCWlmIChwa2dBZG1pblRyYWNrZXIgIT0gbnVsbCkgewotCQkJcGtnQWRtaW5UcmFja2VyLmNsb3NlKCk7Ci0JCQlwa2dBZG1pblRyYWNrZXIgPSBudWxsOwotCQl9Ci0JfQotCQotCUJ1bmRsZUNvbnRleHQgZ2V0QnVuZGxlQ29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCQotCVBhY2thZ2VBZG1pbiBnZXRQYWNrYWdlQWRtaW4oKSB7Ci0JCWlmIChwa2dBZG1pblRyYWNrZXIgPT0gbnVsbCkgewotCQkJcGtnQWRtaW5UcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQkJcGtnQWRtaW5UcmFja2VyLm9wZW4oKTsKLQkJfQotCQlyZXR1cm4gKFBhY2thZ2VBZG1pbilwa2dBZG1pblRyYWNrZXIuZ2V0U2VydmljZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlckxvZ1dyaXRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyTG9nV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNGI2NjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyTG9nV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotCi0KLS8qKgotICogQSBsb2cgd3JpdGVyIHRoYXQgd3JpdGVzIHVwZGF0ZSBtYW5hZ2VyIGxvZyBlbnRyaWVzLiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5hZ2VyTG9nV3JpdGVyIHsKLQlwcml2YXRlIEZpbGUgbG9nRmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBXcml0ZXIgbG9nID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OID0gIiFDT05GSUdVUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWSA9ICIhQUNUSVZJVFkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VDQ0VTUyA9ICJzdWNjZXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFID0gImZhaWx1cmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9JTlNUQUxMID0gImZlYXR1cmUtaW5zdGFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9SRU1PVkUgPSAiZmVhdHVyZS1yZW1vdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfSU5TVEFMTCA9ICJzaXRlLWluc3RhbGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfUkVNT1ZFID0gInNpdGUtcmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNPTkZJR1VSRSA9ICJmZWF0dXJlLWRpc2FibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSRSA9ICJmZWF0dXJlLWVuYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWRVJUID0gInJldmVydCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT05DSUxJQVRJT04gPSAicmVjb25jaWxpYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFUlZFRCA9ICJwcmVzZXJ2ZS1jb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTiA9ICJ1bmtub3duIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUjsKLQotCXN0YXRpYyB7Ci0JCVN0cmluZyBzID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCUxJTkVfU0VQQVJBVE9SID0gcyA9PSBudWxsID8gIlxuIiA6IHM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBVcGRhdGVNYW5hZ2VyTG9nV3JpdGVyKEZpbGUgZmlsZSkgewotCQl0aGlzLmxvZ0ZpbGUgPSBmaWxlOwotCQlVcGRhdGVDb3JlLndhcm4oIlVQREFURSBNQU5BR0VSIExPRyBMb2NhdGlvbjogIitmaWxlLmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBwcmltZSBpdCB3aXRoIHRoZSBzaXRlcyBpbiB0aGUgZXhpc2l0aW5nIGNvbmZpZwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlpbml0TG9nKCk7Ci0JfQotCQotCS8qCi0JICogSW5pdGlhbGl6ZXMgdGhlIGxvZyB3aXRoIHRoZSBvcmlnaW5hbCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRMb2coKSB7Ci0JCXRyeSB7Ci0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnlbXSBzaXRlcyA9IHJ1bnRpbWVDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQlDb25maWd1cmF0aW9uQWN0aXZpdHlbXSBhY3Rpdml0aWVzID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eVtzaXRlcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaT0wOyBpPHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWN0aXZpdGllc1tpXSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9TSVRFX0lOU1RBTEwpOwotCQkJCWFjdGl2aXRpZXNbaV0uc2V0TGFiZWwoUGxhdGZvcm0uYXNMb2NhbFVSTChzaXRlc1tpXS5nZXRVUkwoKSkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQkJYWN0aXZpdGllc1tpXS5zZXREYXRlKG5ldyBEYXRlKCkpOwotCQkJCWFjdGl2aXRpZXNbaV0uc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOwotCQkJfQotCQkJRGF0ZSBkYXRlID0gbmV3IERhdGUocnVudGltZUNvbmZpZy5nZXRDaGFuZ2VTdGFtcCgpKTsKLQkJCXNhZmVXcml0ZUNvbmZpZ3VyYXRpb24oZGF0ZSwgYWN0aXZpdGllcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaWxlbnRseSBpZ25vcmUgZXJyb3JzCi0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZUxvZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGxvZyAhPSBudWxsKSB7Ci0JCQkJbG9nLmZsdXNoKCk7Ci0JCQkJbG9nLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlsb2cgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbG9nKElJbnN0YWxsQ29uZmlndXJhdGlvbiBpbnN0YWxsQ29uZmlnKSB7Ci0JCXNhZmVXcml0ZUNvbmZpZ3VyYXRpb24oaW5zdGFsbENvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKSwgaW5zdGFsbENvbmZpZy5nZXRBY3Rpdml0aWVzKCkpOwotCX0KLQkKLQkKLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuTG9nRmlsZSgpIHsKLQkJdHJ5IHsKLQkJCWxvZyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRydWUpLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gdGhlcmUgd2FzIGEgcHJvYmxlbSBvcGVuaW5nIHRoZSBsb2cgZmlsZSBzbyBsb2cgdG8gdGhlIGNvbnNvbGUKLQkJCWxvZyA9IGxvZ0ZvclN0cmVhbShTeXN0ZW0uZXJyKTsKLQkJfQotCX0KLQkKLSAgICAvKgotICAgICAqIAotICAgICAqLwotCXByaXZhdGUgU3RyaW5nIGdldEZvcm1hdHRlZERhdGUoRGF0ZSBkYXRlKSB7Ci0JCXRyeSB7Ci0JCQlEYXRlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJNTU0gZGQsIHl5eXkga2s6bW06c3MuU1MiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQoZGF0ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZiB0aGVyZSB3ZXJlIHByb2JsZW1zIHdyaXRpbmcgb3V0IHRoZSBkYXRlLCBpZ25vcmUgYW5kCi0JCQkvLyBjb250aW51ZSBzaW5jZSB0aGF0IHNob3VsZG4ndCBzdG9wIHVzIGZyb20gbG9zaW5nIHRoZSByZXN0Ci0JCQkvLyBvZiB0aGUgaW5mb3JtYXRpb24KLQkJfQotCQlyZXR1cm4gTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBXcml0ZXIgbG9nRm9yU3RyZWFtKE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXQsICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXQpKTsKLQkJfQotCX0KLQkKLQkKLQkvKgotCSAqIFNodXRzIGRvd24gdGhlIHVwZGF0ZSBtYW5hZ2VyIGxvZy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobG9nRmlsZSAhPSBudWxsKSB7Ci0JCQkJY2xvc2VMb2dGaWxlKCk7Ci0JCQkJbG9nRmlsZSA9IG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChsb2cgIT0gbnVsbCkgewotCQkJCQlXcml0ZXIgb2xkID0gbG9nOwotCQkJCQlsb2cgPSBudWxsOwotCQkJCQlvbGQuZmx1c2goKTsKLQkJCQkJb2xkLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL3dlJ3ZlIHNodXRkb3duIHRoZSBsb2csIHNvIG5vdCBtdWNoIGVsc2Ugd2UgY2FuIGRvIQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzYWZlV3JpdGVDb25maWd1cmF0aW9uKERhdGUgZGF0ZSwgSUFjdGl2aXR5W10gYWN0aXZpdGllcykgewotCQkvLyB0aHJlYWQgc2FmZXR5OiAoQ29uY3VycmVuY3kwMDMpCi0JCWlmIChsb2dGaWxlICE9IG51bGwpCi0JCQlvcGVuTG9nRmlsZSgpOwotCQlpZiAobG9nID09IG51bGwpCi0JCQlsb2cgPSBsb2dGb3JTdHJlYW0oU3lzdGVtLmVycik7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCXdyaXRlKGRhdGUsIGFjdGl2aXRpZXMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobG9nRmlsZSAhPSBudWxsKQotCQkJCQljbG9zZUxvZ0ZpbGUoKTsKLQkJCQllbHNlCi0JCQkJCWxvZy5mbHVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgd3JpdGluZyB0byB0aGUgdXBkYXRlIG1hbmFnZXIgbG9nOiIpOyAvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTG9nZ2luZyB0byB0aGUgY29uc29sZSBpbnN0ZWFkLiIpOyAvLyROT04tTkxTLTEkCi0JCQkvL3dlIGZhaWxlZCB0byB3cml0ZSwgc28gZHVtcCBsb2cgZW50cnkgdG8gY29uc29sZSBpbnN0ZWFkCi0JCQl0cnkgewotCQkJCWxvZyA9IGxvZ0ZvclN0cmVhbShTeXN0ZW0uZXJyKTsKLQkJCQl3cml0ZShkYXRlLCBhY3Rpdml0aWVzKTsKLQkJCQlsb2cuZmx1c2goKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQllMi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlsb2cgPSBudWxsOwotCQl9Ci0JfQotCQotCi0JLyoKLQkgKiAhQ09ORklHVVJBVElPTiA8bGFiZWw+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlKERhdGUgZGF0ZSwgSUFjdGl2aXR5W10gYWN0aXZpdGllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd3JpdGVsbigpOwotCQl3cml0ZShDT05GSUdVUkFUSU9OKTsKLQkJd3JpdGVTcGFjZSgpOwkKLQkJd3JpdGUoU3RyaW5nLnZhbHVlT2YoZGF0ZS5nZXRUaW1lKCkpKTsKLQkJd3JpdGVTcGFjZSgpOwotCQl3cml0ZShkYXRlLnRvU3RyaW5nKCkpOwotCQl3cml0ZWxuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aXZpdGllcy5sZW5ndGg7IGkrKykgewotCQkJd3JpdGUoYWN0aXZpdGllc1tpXSk7Ci0JCX0JCQkJCi0JfQotCi0JLyoKLQkgKiAhQUNUSVZJVFkgPGRhdGU+IDx0YXJnZXQ+IDxhY3Rpb24+IDxzdGF0dXM+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlKElBY3Rpdml0eSBhY3Rpdml0eSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd3JpdGUoQUNUSVZJVFkpOwotCQl3cml0ZVNwYWNlKCk7CQotCQl3cml0ZShTdHJpbmcudmFsdWVPZihhY3Rpdml0eS5nZXREYXRlKCkuZ2V0VGltZSgpKSk7Ci0JCXdyaXRlU3BhY2UoKTsKLQkJd3JpdGUoZ2V0Rm9ybWF0dGVkRGF0ZShhY3Rpdml0eS5nZXREYXRlKCkpKTsKLQkJd3JpdGVTcGFjZSgpOwotCQl3cml0ZShhY3Rpdml0eS5nZXRMYWJlbCgpKTsKLQkJd3JpdGVTcGFjZSgpOwotCQl3cml0ZShnZXRBY3Rpb24oYWN0aXZpdHkuZ2V0QWN0aW9uKCkpKTsKLQkJd3JpdGVTcGFjZSgpOwotCQl3cml0ZSgoYWN0aXZpdHkuZ2V0U3RhdHVzKCk9PUlBY3Rpdml0eS5TVEFUVVNfT0spP1NVQ0NFU1M6RkFJTFVSRSk7Ci0JCXdyaXRlbG4oKTsJCQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QWN0aW9uKGludCBpKSB7Ci0JCXN3aXRjaCAoaSkgewotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfSU5TVEFMTCA6Ci0JCQkJcmV0dXJuIEZFQVRVUkVfSU5TVEFMTDsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX1JFTU9WRSA6Ci0JCQkJcmV0dXJuIEZFQVRVUkVfUkVNT1ZFOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTCA6Ci0JCQkJcmV0dXJuIFNJVEVfSU5TVEFMTDsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9TSVRFX1JFTU9WRSA6Ci0JCQkJcmV0dXJuIFNJVEVfUkVNT1ZFOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1VOQ09ORklHVVJFIDoKLQkJCQlyZXR1cm4gVU5DT05GSUdVUkU7Ci0JCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fQ09ORklHVVJFIDoKLQkJCQlyZXR1cm4gQ09ORklHVVJFOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1JFVkVSVCA6Ci0JCQkJcmV0dXJuIFJFVkVSVDsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9SRUNPTkNJTElBVElPTiA6Ci0JCQkJcmV0dXJuIFJFQ09OQ0lMSUFUSU9OOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0FERF9QUkVTRVJWRUQgOgotCQkJCXJldHVybiBQUkVTRVJWRUQ7Ci0JCQkJCQkJCi0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gVU5LTk9XTisiIFsiK2krIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGVsbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdyaXRlKExJTkVfU0VQQVJBVE9SKTsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGUoU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpCi0JCQlsb2cud3JpdGUobWVzc2FnZSk7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlU3BhY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3cml0ZSgiICIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyVXRpbHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTY5NWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOw0KLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi4qOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5hZ2VyVXRpbHMgew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIE9TX1VOSVggPSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLk9TX0hQVVgNCi0JCQkuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpDQotCQkJfHwgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19BSVgNCi0JCQkJCS5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkNCi0JCQl8fCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLk9TX0xJTlVYDQotCQkJCQkuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpDQotCQkJfHwgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19TT0xBUklTDQotCQkJCQkuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBGcmFnbWVudEVudHJ5W10gbm9GcmFnbWVudHMgPSBuZXcgRnJhZ21lbnRFbnRyeVswXTsNCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHRhYmxlOw0KLQ0KLQlzdGF0aWMgew0KLQkJdGFibGUgPSBuZXcgSGFzaE1hcCgpOw0KLQkJdGFibGUucHV0KCJjb21wYXRpYmxlIiwgbmV3IEludGVnZXIoSUltcG9ydC5SVUxFX0NPTVBBVElCTEUpKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGFibGUucHV0KCJwZXJmZWN0IiwgbmV3IEludGVnZXIoSUltcG9ydC5SVUxFX1BFUkZFQ1QpKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGFibGUucHV0KCJlcXVpdmFsZW50IiwgbmV3IEludGVnZXIoSUltcG9ydC5SVUxFX0VRVUlWQUxFTlQpKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGFibGUucHV0KCJncmVhdGVyT3JFcXVhbCIsIG5ldyBJbnRlZ2VyKElJbXBvcnQuUlVMRV9HUkVBVEVSX09SX0VRVUFMKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBXcml0ZXIgd3JpdGVyOw0KLQkvLyBtYW5hZ2UgVVJMIHRvIEZpbGUNCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHVybEZpbGVNYXA7DQotDQotCXByaXZhdGUgc3RhdGljIE1hcCBsb2NhbEZpbGVGcmFnbWVudE1hcDsNCi0JcHJpdmF0ZSBzdGF0aWMgU3RhY2sgYnVmZmVyUG9vbDsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsgLy8gNGtieXRlcw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5DUkVNRU5UX1NJWkUgPSAxMDI0MDsgLy8gMTBrYnl0ZXMNCi0JLyoqDQotCSAqIHJldHVybiB0aGUgdXJsU3RyaW5nIGlmIGl0IGlzIGEgYWJzb2x1dGUgVVJMDQotCSAqIG90aGVyd2lzZSwgcmV0dXJuIHRoZSBkZWZhdWx0IFVSTCBpZiB0aGUgdXJsU3RyaW5nIGlzIG51bGwNCi0JICogVGhlIGRlZmF1bHRVUkwgbWF5IHBvaW50IG90IGEgZmlsZSwgY3JlYXRlIGEgZmlsZSBVUkwgdGhlbg0KLQkgKiBpZiB0aGUgdXJsU3RyaW5nIG9yIHRoZSBkZWZhdWx0IFVSTCBhcmUgcmVsYXRpdmVzLCBwcmVwZW5kIHRoZSByb290VVJMIHRvIGl0DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRVUkwoVVJMIHJvb3RVUkwsIFN0cmluZyB1cmxTdHJpbmcsIFN0cmluZyBkZWZhdWx0VVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVVSTCB1cmwgPSBudWxsOw0KLQ0KLQkJLy8gaWYgbm8gVVJMICwgcHJvdmlkZSBEZWZhdWx0DQotCQlpZiAodXJsU3RyaW5nID09IG51bGwgfHwgdXJsU3RyaW5nLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQkvLyBubyBVUkwsIG5vIGRlZmF1bHQsIHJldHVybiByaWdodCBub3cuLi4NCi0JCQlpZiAoZGVmYXVsdFVSTCA9PSBudWxsIHx8IGRlZmF1bHRVUkwudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJZWxzZQ0KLQkJCQl1cmxTdHJpbmcgPSBkZWZhdWx0VVJMOw0KLQkJfQ0KLQ0KLQkJLy8gVVJMIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZQkNCi0JCWlmICh1cmxTdHJpbmcuc3RhcnRzV2l0aCgiLyIpICYmIHVybFN0cmluZy5sZW5ndGgoKSA+IDEpIC8vJE5PTi1OTFMtMSQNCi0JCQl1cmxTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKDEpOw0KLQkJdHJ5IHsNCi0JCQl1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCS8vIHRoZSB1cmwgaXMgbm90IGFuIGFic29sdXRlIFVSTA0KLQkJCS8vIHRyeSByZWxhdGl2ZQ0KLQkJCXVybCA9IG5ldyBVUkwocm9vdFVSTCwgdXJsU3RyaW5nKTsNCi0JCX0NCi0NCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0JLyoqDQotCSAqIHJldHVybiBhIHJlbGF0aXZlIFN0cmluZyB0byByb290VVJMIA0KLQkgKiBpZiB1cmwgY29udGFpbnMgcm9vdFVSTCBzbw0KLQkgKiBuZXcgVVJMKHJvb3RVUkwsIHJlc3VsdFN0cmluZykgPT0gdXJsDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJMQXNTdHJpbmcoVVJMIHJvb3RVUkwsIFVSTCB1cmwpIHsNCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOw0KLQ0KLQkJaWYgKHJvb3RVUkwgPT0gbnVsbCkgew0KLQkJCXJldHVybiAodXJsID09IG51bGwpID8gbnVsbCA6IHVybC50b1N0cmluZygpOw0KLQkJfQ0KLQ0KLQkJLy8gaWYgbm8gVVJMICwgcmV0dXJuIG51bGwNCi0JCWlmICh1cmwgIT0gbnVsbCkgew0KLQ0KLQkJCXJlc3VsdCA9IHVybC50b0V4dGVybmFsRm9ybSgpOw0KLQ0KLQkJCWlmIChyb290VVJMLmdldEhvc3QoKSAhPSBudWxsICYmICFyb290VVJMLmdldEhvc3QoKS5lcXVhbHModXJsLmdldEhvc3QoKSkpDQotCQkJCXJldHVybiByZXN1bHQ7DQotDQotCQkJaWYgKHJvb3RVUkwuZ2V0UHJvdG9jb2woKSAhPSBudWxsICYmICFyb290VVJMLmdldFByb3RvY29sKCkuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0NCi0JCQlpZiAocm9vdFVSTC5nZXRQb3J0KCkgIT0gdXJsLmdldFBvcnQoKSkNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0NCi0JCQlTdHJpbmcgcm9vdFVSTEZpbGVTdHJpbmcgPSByb290VVJMLmdldEZpbGUoKTsNCi0JCQlyb290VVJMRmlsZVN0cmluZyA9IHJvb3RVUkxGaWxlU3RyaW5nLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOw0KLQkJCWlmICghcm9vdFVSTEZpbGVTdHJpbmcuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCWludCBpbmRleCA9IHJvb3RVUkxGaWxlU3RyaW5nLmxhc3RJbmRleE9mKCcvJyk7DQotCQkJCWlmIChpbmRleCAhPSAtMSkgew0KLQkJCQkJcm9vdFVSTEZpbGVTdHJpbmcgPSByb290VVJMRmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCVN0cmluZyB1cmxGaWxlU3RyaW5nID0gdXJsLmdldEZpbGUoKTsNCi0NCi0JCQlpZiAodXJsRmlsZVN0cmluZy5zdGFydHNXaXRoKHJvb3RVUkxGaWxlU3RyaW5nKSkgew0KLQkJCQlyZXN1bHQgPSB1cmxGaWxlU3RyaW5nLnN1YnN0cmluZyhyb290VVJMRmlsZVN0cmluZy5sZW5ndGgoKSk7DQotCQkJCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQkvLyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBmb2xsb3dpbmcNCi0JCQkJLy8gZmlsZTovQzovIGFuZCBmaWxlOkM6Lw0KLQkJCQlpZiAoImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UodXJsLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCUZpbGUgcm9vdEZpbGUgPSBuZXcgRmlsZShyb290VVJMRmlsZVN0cmluZyk7DQotCQkJCQlGaWxlIHVybEZpbGUgPSBuZXcgRmlsZSh1cmxGaWxlU3RyaW5nKTsNCi0NCi0JCQkJCUZpbGUgcmVsYXRpdmVQYXRoID0gdXJsRmlsZTsNCi0JCQkJCXdoaWxlIChyZWxhdGl2ZVBhdGggIT0gbnVsbCAmJiAhcm9vdEZpbGUuZXF1YWxzKHJlbGF0aXZlUGF0aC5nZXRQYXJlbnRGaWxlKCkpKSB7DQotCQkJCQkJcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoLmdldFBhcmVudEZpbGUoKTsNCi0JCQkJCX0NCi0NCi0JCQkJCWlmIChyZWxhdGl2ZVBhdGggPT0gbnVsbCkgew0KLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiQ2Fubm90IGNhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCVN0cmluZyByZWxhdGl2ZVJvb3RTdHJpbmcgPSByZWxhdGl2ZVBhdGguZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOw0KLQkJCQkJCVN0cmluZyBmdWxsU3RyaW5nID0gdXJsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0JCQkJCQlpZiAoIWZ1bGxTdHJpbmcuc3RhcnRzV2l0aChyZWxhdGl2ZVJvb3RTdHJpbmcpKSB7DQotCQkJCQkJCVVwZGF0ZUNvcmUud2FybigiRnVsbCBwYXRoOiIgKyBmdWxsU3RyaW5nICsgIiBkb2VzIG5vdCBzdGFydCB3aXRoICIgKyByZWxhdGl2ZVJvb3RTdHJpbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQkJCQkJcmV0dXJuIHVybC50b1N0cmluZygpOw0KLQkJCQkJCX0gZWxzZSB7DQotCQkJCQkJCVN0cmluZyByZXR1cm5TdHJpbmcgPSBmdWxsU3RyaW5nLnN1YnN0cmluZyhyZWxhdGl2ZVJvb3RTdHJpbmcubGVuZ3RoKCkgKyAxKTsNCi0JCQkJCQkJaWYgKHVybEZpbGUuaXNEaXJlY3RvcnkoKSkNCi0JCQkJCQkJCXJldHVyblN0cmluZyArPSBGaWxlLnNlcGFyYXRvcjsNCi0JCQkJCQkJLy8gd2UgbG9zdCB0aGUgbGFzdCBzbGFzaCB3aGVuIHRyYW5mb3JtaW5nIGluIEZpbGUNCi0JCQkJCQkJcmV0dXJuU3RyaW5nID0gcmV0dXJuU3RyaW5nLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOw0KLQkJCQkJCQlyZXR1cm4gcmV0dXJuU3RyaW5nOw0KLQkJCQkJCX0NCi0NCi0JCQkJCX0NCi0NCi0JCQkJfSBlbHNlIHsNCi0JCQkJCXJlc3VsdCA9IHVybC50b1N0cmluZygpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogcmV0dXJucyBhIHRyYW5zbGF0ZWQgU3RyaW5nDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcgaW5mb1VSTCwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlKSB7DQotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsNCi0JCWlmIChpbmZvVVJMICE9IG51bGwpIHsNCi0JCQlyZXN1bHQgPSBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCBpbmZvVVJMLCBidW5kbGUpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFVSTCBjb3B5VG9Mb2NhbChJbnB1dFN0cmVhbSBzb3VyY2VDb250ZW50UmVmZXJlbmNlU3RyZWFtLCBTdHJpbmcgbG9jYWxOYW1lLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gew0KLQkJVVJMIHJlc3VsdCA9IG51bGw7DQotCQkvLyBjcmVhdGUgdGhlIERpciBpZiB0aGV5IGRvIG5vdCBleGlzdA0KLQkJLy8gZ2V0IHRoZSBwYXRoIGZyb20gdGhlIEZpbGUgdG8gcmVzb2x2ZSBGaWxlLnNlcGFyYXRvci4uDQotCQkvLyBkbyBub3QgdXNlIHRoZSBTdHJpbmcgYXMgaXQgbWF5IGNvbnRhaW4gVVJMIGxpa2Ugc2VwYXJhdG9yDQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKGxvY2FsTmFtZSk7DQotCQlpbnQgaW5kZXggPSBsb2NhbEZpbGUuZ2V0UGF0aCgpLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsNCi0JCWlmIChpbmRleCAhPSAtMSkgew0KLQkJCUZpbGUgZGlyID0gbmV3IEZpbGUobG9jYWxGaWxlLmdldFBhdGgoKS5zdWJzdHJpbmcoMCwgaW5kZXgpKTsNCi0JCQlpZiAoIWRpci5leGlzdHMoKSkNCi0JCQkJZGlyLm1rZGlycygpOw0KLQkJfQ0KLQ0KLQkJLy8gdHJhbnNmZXIgdGhlIGNvbnRlbnQgb2YgdGhlIEZpbGUNCi0JCWlmICghbG9jYWxGaWxlLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQlPdXRwdXRTdHJlYW0gbG9jYWxDb250ZW50UmVmZXJlbmNlU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obG9jYWxGaWxlKTsNCi0JCQl0cnkgew0KLQkJCQlVdGlsaXRpZXMuY29weShzb3VyY2VDb250ZW50UmVmZXJlbmNlU3RyZWFtLCBsb2NhbENvbnRlbnRSZWZlcmVuY2VTdHJlYW0sIG1vbml0b3IpOw0KLQkJCX0gZmluYWxseSB7DQotCQkJCXRyeSB7DQotCQkJCQlsb2NhbENvbnRlbnRSZWZlcmVuY2VTdHJlYW0uY2xvc2UoKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7fQ0KLQkJCX0NCi0JCX0NCi0JCXJlc3VsdCA9IGxvY2FsRmlsZS50b1VSTCgpOw0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBbMjAzMDVdIG5lZWQgdG8gc2xhbSBwZXJtaXNzaW9ucyBmb3IgZXhlY3V0YWJsZSBsaWJzIG9uIHNvbWUNCi0JICogcGxhdGZvcm1zLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGZpeA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrUGVybWlzc2lvbnMoQ29udGVudFJlZmVyZW5jZSByZWYsIFN0cmluZyBmaWxlUGF0aCkgew0KLQ0KLQkJaWYgKHJlZi5nZXRQZXJtaXNzaW9uKCkgIT0gMCkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiQ2hhbmdlIHBlcm1pc3Npb24gZm9yICIgKyBmaWxlUGF0aCArICIgdG8gIiArIHJlZi5nZXRQZXJtaXNzaW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQkvLyBGSVhNRTogY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSBKTkkNCi0JCX0NCi0NCi0JCWlmIChmaWxlUGF0aCAhPSBudWxsICYmIE9TX1VOSVggJiYgcmVmLmdldFBlcm1pc3Npb24oKSAhPSAwKSB7DQotCQkJLy8gYWRkIGV4ZWN1dGUgcGVybWlzc2lvbiBvbiBzaGFyZWQgbGlicmFyaWVzIDIwMzA1DQotCQkJLy8gZG8gbm90IHJlbW92ZSB3cml0ZSBwZXJtaXNzaW9uIDIwODk2DQotCQkJLy8gY2htb2QgYSt4ICouc2wNCi0JCQl0cnkgew0KLQkJCQlQcm9jZXNzIHByID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhuZXcgU3RyaW5nW10geyAiY2htb2QiLCAiYSt4IiwgZmlsZVBhdGggfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCQlUaHJlYWQgY2htb2RPdXRwdXQgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHIuZ2V0SW5wdXRTdHJlYW0oKSk7DQotCQkJCWNobW9kT3V0cHV0LnNldE5hbWUoImNobW9kIG91dHB1dCByZWFkZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQljaG1vZE91dHB1dC5zdGFydCgpOw0KLQkJCQlUaHJlYWQgY2htb2RFcnJvciA9IG5ldyBTdHJlYW1Db25zdW1lcihwci5nZXRFcnJvclN0cmVhbSgpKTsNCi0JCQkJY2htb2RFcnJvci5zZXROYW1lKCJjaG1vZCBlcnJvciByZWFkZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQljaG1vZEVycm9yLnN0YXJ0KCk7DQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7DQotCQkJfQ0KLQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgcmFuZG9tIGZpbGUgbmFtZSBmb3IgdGhlIGxvY2FsIHN5c3RlbQ0KLQkgKiBhdHRlbXB0IHRvIGNvbnNlcnZlIHRoZSBleHRlbnNpb24gaWYgdGhlcmUgaXMgYSAnLicgaW4gdGhlIHBhdGgNCi0JICogYW5kIG5vIEZpbGUuU2VwZXJhdG9yIGFmdGVyIHRoZSAnLicNCi0JICogDQotCSAqIFxhXGJcYy50eHQgLT4gYzk4NzY1OTM4NS50eHQNCi0JICogYy50eHQgLT4gYzM4NTQ3NjMudHh0DQotCSAqIGMJLT4gYzk1Mzg2NzU0OQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKFN0cmluZyByZW1vdGVQYXRoLCBEYXRlIGRhdGUpIHsNCi0JCWludCBkb3RJbmRleCA9IHJlbW90ZVBhdGgubGFzdEluZGV4T2YoIi4iKTsJLy8kTk9OLU5MUy0xJA0KLQkJaW50IGZpbGVJbmRleCA9IHJlbW90ZVBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOw0KLQkJLy8gaWYgdGhlcmUgaXMgYSBzZXBhcmF0b3IgYWZ0ZXIgdGhlIGRvdA0KLQkJLy8gZG8gbm90IGNvbnNpZGVyIGl0IGFzIGFuIGV4dGVuc2lvbg0KLQkJU3RyaW5nIGV4dCA9IChkb3RJbmRleCAhPSAtMSAmJiBmaWxlSW5kZXggPCBkb3RJbmRleCkgPyByZW1vdGVQYXRoLnN1YnN0cmluZyhkb3RJbmRleCkgOiAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJLy8gdGhlIG5hbWUgaXMgdGhlIHN0cmluZyBiZXR3ZWVuIHRoZSBzZXBhcmF0b3IgYW5kIHRoZSBkb3QNCi0JCS8vIGlmIHRoZXJlIGlzIG5vIHNlcGFyYXRvciwgaXQgaXMgdGhlIHN0cmluZyB1cCB0byB0aGUgZG90CQkNCi0JCS8vIGlmIHRoZXJlIGlzIG5vIGRvdCwgZ28gdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIA0KLQkJaWYgKGZpbGVJbmRleCA9PSAtMSkNCi0JCQlmaWxlSW5kZXggPSAwOw0KLQkJaWYgKGRvdEluZGV4ID09IC0xKQ0KLQkJCWRvdEluZGV4ID0gcmVtb3RlUGF0aC5sZW5ndGgoKTsNCi0JCS8vIGlmIEkgaGF2ZSBhIHNlcGFyYXRvciBhbmQgbm8gZG90OiAvYS9iL2MgLT4gYw0KLQkJLy8gaWYgbXkgc2VwYXJhdG9yIGlzIHRoZSBsYXN0IC9hL2IvYy8sIGZpbGVJbmRleCBhbmQgZG90SW5kZXggYXJlIHRoZSBzYW1lLCBzbyBpdCB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCB0ZW1wIG5hbWUNCi0JCVN0cmluZyBuYW1lID0gKGZpbGVJbmRleCA8IGRvdEluZGV4KSA/IHJlbW90ZVBhdGguc3Vic3RyaW5nKGZpbGVJbmRleCwgZG90SW5kZXgpIDogIkVjbGlwc2VfVXBkYXRlX1RNUF8iOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgcmVzdWx0ID0gbmFtZSArIGRhdGUuZ2V0VGltZSgpICsgZXh0Ow0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogcmVtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uDQotCSAqIHVzZWQgdG8gY2xlYW4gdXAgaW5zdGFsbA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21GaWxlU3lzdGVtKEZpbGUgZmlsZSkgew0KLQkJaWYgKCFmaWxlLmV4aXN0cygpKQ0KLQkJCXJldHVybjsNCi0NCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQlTdHJpbmdbXSBmaWxlcyA9IGZpbGUubGlzdCgpOw0KLQkJCWlmIChmaWxlcyAhPSBudWxsKSAvLyBiZSBjYXJlZnVsIHNpbmNlIGZpbGUubGlzdCgpIGNhbiByZXR1cm4gbnVsbA0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKQ0KLQkJCQkJcmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoZmlsZSwgZmlsZXNbaV0pKTsNCi0JCX0NCi0NCi0JCWlmICghZmlsZS5kZWxldGUoKSkgew0KLQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiVXBkYXRlTWFuYWdlclV0aWxzLlVuYWJsZVRvUmVtb3ZlRmlsZSIsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQlVcGRhdGVDb3JlLmxvZyhtc2csIG5ldyBFeGNlcHRpb24oKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIHJlbW92ZSBhbGwgdGhlIGVtcHR5IGRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5DQotCSAqIHVzZWQgdG8gY2xlYW4gdXAgaW5zdGFsbA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUVtcHR5RGlyZWN0b3JpZXNGcm9tRmlsZVN5c3RlbShGaWxlIGZpbGUpIHsNCi0JCWlmICghZmlsZS5pc0RpcmVjdG9yeSgpKQ0KLQkJCXJldHVybjsNCi0NCi0JCVN0cmluZ1tdIGZpbGVzID0gZmlsZS5saXN0KCk7DQotCQlpZiAoZmlsZXMgIT0gbnVsbCkgeyAvLyBiZSBjYXJlZnVsIHNpbmNlIGZpbGUubGlzdCgpIGNhbiByZXR1cm4gbnVsbA0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsNCi0JCQkJcmVtb3ZlRW1wdHlEaXJlY3Rvcmllc0Zyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSk7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKCFmaWxlLmRlbGV0ZSgpKSB7DQotCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJVcGRhdGVNYW5hZ2VyVXRpbHMuVW5hYmxlVG9SZW1vdmVGaWxlIiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCVVwZGF0ZUNvcmUubG9nKG1zZywgbmV3IEV4Y2VwdGlvbigpKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGx1Z2luIGVudHJpZXMgdGhhdCBhcmUgaW4gc291cmNlIGFycmF5IGFuZA0KLQkgKiBub3QgaW4gdGFyZ2V0IGFycmF5DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElQbHVnaW5FbnRyeVtdIGRpZmYoSVBsdWdpbkVudHJ5W10gc291cmNlQXJyYXksIElQbHVnaW5FbnRyeVtdIHRhcmdldEFycmF5KSB7IC8vIE5vIHBsdWdpbkVudHJ5IHRvIEluc3RhbGwsIHJldHVybiBOb3RoaW5nIHRvIGluc3RhbA0KLQkJaWYgKHNvdXJjZUFycmF5ID09IG51bGwgfHwgc291cmNlQXJyYXkubGVuZ3RoID09IDApIHsNCi0JCQlyZXR1cm4gbmV3IElQbHVnaW5FbnRyeVswXTsNCi0JCX0gLy8gTm8gcGx1Z2luRW50cnkgaW5zdGFsbGVkLCBJbnN0YWxsIHRoZW0gYWxsDQotCQlpZiAodGFyZ2V0QXJyYXkgPT0gbnVsbCB8fCB0YXJnZXRBcnJheS5sZW5ndGggPT0gMCkgew0KLQkJCXJldHVybiBzb3VyY2VBcnJheTsNCi0JCX0gLy8gaWYgYSBJUGx1Z2luRW50cnkgZnJvbSBzb3VyY2VBcnJheSBpcyBOT1QgaW4NCi0JCS8vIHRhcmdldEFycmF5LCBhZGQgaXQgdG8gdGhlIGxpc3QNCi0JCUxpc3QgbGlzdDEgPSBBcnJheXMuYXNMaXN0KHRhcmdldEFycmF5KTsNCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgwKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlQXJyYXkubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoIWxpc3QxLmNvbnRhaW5zKHNvdXJjZUFycmF5W2ldKSkNCi0JCQkJcmVzdWx0LmFkZChzb3VyY2VBcnJheVtpXSk7DQotCQl9DQotDQotCQlJUGx1Z2luRW50cnlbXSByZXN1bHRFbnRyeSA9IG5ldyBJUGx1Z2luRW50cnlbcmVzdWx0LnNpemUoKV07DQotCQlpZiAocmVzdWx0LnNpemUoKSA+IDApDQotCQkJcmVzdWx0LnRvQXJyYXkocmVzdWx0RW50cnkpOw0KLQkJcmV0dXJuIHJlc3VsdEVudHJ5Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgVVJMIG9mIHRoZSBnaXZlbiBVUkwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQ0KLQkgKiBnaXZlbiBVUkwgaXMgdGhlIHJvb3QuDQotCSAqIDx0YWJsZT4NCi0JICogPGNhcHRpb24+RXhhbXBsZTwvY2FwdGlvbj4NCi0JICogPHRyPg0KLQkgKiAgIDx0aD5HaXZlbiBVUkw8L3RoPg0KLQkgKiAgIDx0aD5QYXJlbnQgVVJMPC90aD4NCi0JICogPHRyPg0KLQkgKiAgIDx0ZD4iaHR0cDovL2hvc3RuYW1lLyI8L3RkPg0KLQkgKiAgIDx0ZD5udWxsPC90ZD4NCi0JICogPHRyPg0KLQkgKiAgIDx0ZD4iaHR0cDovL2hvc3RuYW1lL2ZvbGRlci9maWxlPC90ZD4NCi0JICogICA8dGQ+Imh0dHA6Ly9ob3N0bmFtZS9mb2xkZXIvPC90ZD4NCi0JICogPC90YWJsZT4NCi0JICoNCi0JICogQHBhcmFtIHVybCBhIFVSTA0KLQkgKiBAcmV0dXJuICAgIHRoZSBwYXJlbnQgb2YgdGhlIGdpdmVuIFVSTA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0UGFyZW50KFVSTCB1cmwpIHsNCi0JCVN0cmluZyBmaWxlID0gdXJsLmdldEZpbGUoKTsNCi0JCWludCBsZW4gPSBmaWxlLmxlbmd0aCgpOw0KLQkJaWYgKGxlbiA9PSAwIHx8IGxlbiA9PSAxICYmIGZpbGUuY2hhckF0KDApID09ICcvJykNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCWludCBsYXN0U2xhc2hJbmRleCA9IC0xOw0KLQkJZm9yIChpbnQgaSA9IGxlbiAtIDI7IGxhc3RTbGFzaEluZGV4ID09IC0xICYmIGkgPj0gMDsgLS1pKSB7DQotCQkJaWYgKGZpbGUuY2hhckF0KGkpID09ICcvJykNCi0JCQkJbGFzdFNsYXNoSW5kZXggPSBpOw0KLQkJfQ0KLQkJaWYgKGxhc3RTbGFzaEluZGV4ID09IC0xKQ0KLQkJCWZpbGUgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJZWxzZQ0KLQkJCWZpbGUgPSBmaWxlLnN1YnN0cmluZygwLCBsYXN0U2xhc2hJbmRleCArIDEpOw0KLQkJdHJ5IHsNCi0JCQl1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCBmaWxlKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJcmV0dXJuIHVybDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFVSTCBhc0RpcmVjdG9yeVVSTChVUkwgdXJsKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCS8vdXJsID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsNCi0JCVN0cmluZyBwYXRoID0gdXJsLmdldEZpbGUoKTsNCi0JCWlmICghcGF0aC5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7DQotCQkJaWYgKGluZGV4ICE9IC0xKQ0KLQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsNCi0JCQkvLyBpZ25vcmUgYW55IHJlZiBpbiBvcmlnaW5hbCBVUkwNCi0JCQl1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCBwYXRoKTsNCi0JCX0NCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0JLyoNCi0JICogQ29tcGFyZXMgdHdvIFVSTCBmb3IgZXF1YWxpdHkNCi0JICogUmV0dXJuIGZhbHNlIGlmIG9uZSBvZiB0aGVtIGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYW1lVVJMKFVSTCB1cmwxLCBVUkwgdXJsMikgew0KLQ0KLQkJaWYgKHVybDEgPT0gbnVsbCB8fCB1cmwyID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJaWYgKHVybDEgPT0gdXJsMikNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCWlmICh1cmwxLmVxdWFscyh1cmwyKSkNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0NCi0JCS8vIGNoZWNrIGlmIFVSTCBhcmUgZmlsZTogVVJMIGFzIHdlIG1heQ0KLQkJLy8gaGF2ZSAyIFVSTCBwb2ludGluZyB0byB0aGUgc2FtZSBmZWF0dXJlUmVmZXJlbmNlDQotCQkvLyBidXQgd2l0aCBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb24NCi0JCS8vIChpLmUuIGZpbGU6L0M7LyBhbmQgZmlsZTpDOi8pDQotCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybDEuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybDIuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlGaWxlIGZpbGUxID0gZ2V0RmlsZUZvcih1cmwxKTsvL25ldyBGaWxlKHVybDEuZ2V0RmlsZSgpKTsNCi0JCUZpbGUgZmlsZTIgPSBnZXRGaWxlRm9yKHVybDIpOw0KLQ0KLQkJaWYgKGZpbGUxID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJcmV0dXJuIChmaWxlMS5lcXVhbHMoZmlsZTIpKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogTWV0aG9kIGdldEZpbGVGb3IuDQotCSAqIEBwYXJhbSB1cmwxDQotCSAqIEByZXR1cm4gRmlsZQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRGaWxlRm9yKFVSTCB1cmwxKSB7DQotCQlpZiAodXJsRmlsZU1hcCA9PSBudWxsKSB1cmxGaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsNCi0JCWlmICh1cmxGaWxlTWFwLmdldCh1cmwxKSE9bnVsbCkgcmV0dXJuIChGaWxlKXVybEZpbGVNYXAuZ2V0KHVybDEpOw0KLQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUodXJsMS5nZXRGaWxlKCkpOw0KLQkJdXJsRmlsZU1hcC5wdXQodXJsMSxuZXdGaWxlKTsNCi0JCXJldHVybiBuZXdGaWxlOyANCi0JfQ0KLQ0KLQkvKg0KLQkgKiByZXR1cm5zIHRoZSBsaXN0IG9mIEZlYXR1cmVSZWZlcmVuY2UgdGhhdCBhcmUgcGFyZW50IG9mIA0KLQkgKiB0aGUgRmVhdHVyZSBvciBhbiBlbXB0eSBhcnJheSBpZiBubyBwYXJlbnQgZm91bmQuDQotCSAqIEBwYXJhbSBvbmx5T3B0aW9uYWwgaWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IG9ubHkgcmV0dXJuIHBhcmVudHMgdGhhdCBjb25zaWRlciB0aGUgZmVhdHVyZSBvcHRpb25hbA0KLQkgKiBAcGFyYW0gY2hpbGQNCi0JICogQHBhcmFtIHBvc3NpYmxlc1BhcmVudA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldFBhcmVudEZlYXR1cmVzKElGZWF0dXJlIGNoaWxkRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBwb3NzaWJsZXNQYXJlbnQsIGJvb2xlYW4gb25seU9wdGlvbmFsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlpZiAoY2hpbGRGZWF0dXJlID09IG51bGwpDQotCQkJcmV0dXJuIG5ldyBJRmVhdHVyZVJlZmVyZW5jZVswXTsNCi0NCi0JCUxpc3QgcGFyZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IG51bGw7DQotCQlJRmVhdHVyZSBjb21wYXJlRmVhdHVyZSA9IG51bGw7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc3NpYmxlc1BhcmVudC5sZW5ndGg7IGkrKykgew0KLQkJCXRyeSB7DQotCQkJCUlGZWF0dXJlIHBvc3NpYmxlUGFyZW50RmVhdHVyZSA9IHBvc3NpYmxlc1BhcmVudFtpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQlpZiAocG9zc2libGVQYXJlbnRGZWF0dXJlICE9IG51bGwpIHsNCi0JCQkJCWNoaWxkcmVuID0gcG9zc2libGVQYXJlbnRGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsNCi0JCQkJCQl0cnkgew0KLQkJCQkJCQljb21wYXJlRmVhdHVyZSA9IGNoaWxkcmVuW2pdLmdldEZlYXR1cmUobnVsbCk7DQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCQl9DQotCQkJCQkJaWYgKGNoaWxkRmVhdHVyZS5lcXVhbHMoY29tcGFyZUZlYXR1cmUpKSB7DQotCQkJCQkJCWlmIChvbmx5T3B0aW9uYWwpIHsNCi0JCQkJCQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuaXNPcHRpb25hbChjaGlsZHJlbltqXSkpIHsNCi0JCQkJCQkJCQlwYXJlbnRMaXN0LmFkZChwb3NzaWJsZXNQYXJlbnRbaV0pOw0KLQkJCQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgOiIgKyBjaGlsZHJlbltqXSArICIgbm90IG9wdGlvbmFsLiBOb3QgaW5jbHVkZWQgaW4gcGFyZW50cyBsaXN0LiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQkJCQkJCX0NCi0JCQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJCXBhcmVudExpc3QuYWRkKHBvc3NpYmxlc1BhcmVudFtpXSk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0NCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcGFyZW50cyA9IG5ldyBJRmVhdHVyZVJlZmVyZW5jZVswXTsNCi0JCWlmIChwYXJlbnRMaXN0LnNpemUoKSA+IDApIHsNCi0JCQlwYXJlbnRzID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW3BhcmVudExpc3Quc2l6ZSgpXTsNCi0JCQlwYXJlbnRMaXN0LnRvQXJyYXkocGFyZW50cyk7DQotCQl9DQotCQlyZXR1cm4gcGFyZW50czsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiByZXR1cm5zIHRoZSBsaXN0IG9mIEZlYXR1cmVzIHRoYXQgYXJlIHBhcmVudCBvZiANCi0JICogdGhlIEZlYXR1cmUgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcGFyZW50IGZvdW5kDQotCSAqIEBwYXJhbSBvbmx5T3B0aW9uYWwgaWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IG9ubHkgcmV0dXJuIHBhcmVudHMgdGhhdCBjb25zaWRlciB0aGUgZmVhdHVyZSBvcHRpb25hbA0KLQkgKiBAcGFyYW0gY2hpbGQNCi0JICogQHBhcmFtIHBvc3NpYmxlc1BhcmVudA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldFBhcmVudEZlYXR1cmVzKElGZWF0dXJlUmVmZXJlbmNlIGNoaWxkLCBJRmVhdHVyZVJlZmVyZW5jZVtdIHBvc3NpYmxlc1BhcmVudCwgYm9vbGVhbiBvbmx5T3B0aW9uYWwpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChjaGlsZCA9PSBudWxsKQ0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07DQotDQotCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQljaGlsZEZlYXR1cmUgPSBjaGlsZC5nZXRGZWF0dXJlKG51bGwpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOw0KLQkJfQ0KLQ0KLQkJaWYgKGNoaWxkRmVhdHVyZSA9PSBudWxsKQ0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07DQotDQotCQlyZXR1cm4gZ2V0UGFyZW50RmVhdHVyZXMoY2hpbGRGZWF0dXJlLCBwb3NzaWJsZXNQYXJlbnQsIG9ubHlPcHRpb25hbCk7DQotCX0NCi0NCi0JLyoNCi0JICogSWYgdGhlIHJldHVybiBjb2RlIG9mIHRoZSBIVFRQIGNvbm5lY3Rpb24gaXMgbm90IDIwMCAoT0spDQotCSAqIHRob3cgYW4gSU8gZXhjZXB0aW9uDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQ29ubmVjdGlvblJlc3VsdChSZXNwb25zZSByZXNwb25zZSxVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJLy8gZGlkIHRoZSBzZXJ2ZXIgcmV0dXJuIGFuIGVycm9yIGNvZGUgPw0KLQkJCWludCByZXN1bHQgPSByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCk7DQotDQotCQkJaWYgKHJlc3VsdCAhPSBJU3RhdHVzQ29kZXMuSFRUUF9PSykgew0KLQkJCQlTdHJpbmcgc2VydmVyTXNnID0gcmVzcG9uc2UuZ2V0U3RhdHVzTWVzc2FnZSgpOw0KLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oUG9saWN5LmJpbmQoIkNvbnRlbnRSZWZlcmVuY2UuSHR0cE5vayIsIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKHJlc3VsdCksIHNlcnZlck1zZywgdXJsIH0pKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQ0KLQkJCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmVhbUNvbnN1bWVyIGV4dGVuZHMgVGhyZWFkIHsNCi0JCUlucHV0U3RyZWFtIGlzOw0KLQkJYnl0ZVtdIGJ1ZjsNCi0JCXB1YmxpYyBTdHJlYW1Db25zdW1lcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgew0KLQkJCXN1cGVyKCk7DQotCQkJdGhpcy5zZXREYWVtb24odHJ1ZSk7DQotCQkJdGhpcy5pcyA9IGlucHV0U3RyZWFtOw0KLQkJCWJ1ZiA9IG5ldyBieXRlWzUxMl07DQotCQl9DQotCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJdHJ5IHsNCi0JCQkJaW50IG4gPSAwOw0KLQkJCQl3aGlsZSAobiA+PSAwKQ0KLQkJCQkJbiA9IGlzLnJlYWQoYnVmKTsNCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgb3B0aW9uYWwgY2hpbGRyZW4gdG8gaW5zdGFsbA0KLQkgKiBUaGUgb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5zdGFsbCBtYXkgbm90IGFsbCBiZSBkaXJlY3QgY2hpbGRyZW4gDQotCSAqIG9mIHRoZSBmZWF0dXJlLg0KLQkgKiBBbHNvIGluY2x1ZGUgbm9uLW9wdGlvbmFsIGZlYXR1cmVzDQotCSAqIA0KLQkgKiBAcGFyYW0gY2hpbGRyZW4gYWxsIHRoZSBuZXN0ZWQgZmVhdHVyZXMNCi0JICogQHBhcmFtIG9wdGlvbmFsZmVhdHVyZXMgb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5zdGFsbA0KLQkgKiBAcmV0dXJuIElGZWF0dXJlUmVmZXJlbmNlW10NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsKElGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4sIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcykgew0KLQ0KLQkJTGlzdCBvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgew0KLQkJCUlGZWF0dXJlUmVmZXJlbmNlIG9wdGlvbmFsRmVhdHVyZSA9IGNoaWxkcmVuW2ldOw0KLQkJCWlmICghVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwob3B0aW9uYWxGZWF0dXJlKSkgew0KLQkJCQlvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsLmFkZChvcHRpb25hbEZlYXR1cmUpOw0KLQkJCX0gZWxzZSB7DQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb3B0aW9uYWxmZWF0dXJlcy5sZW5ndGg7IGorKykgew0KLQkJCQkJaWYgKG9wdGlvbmFsRmVhdHVyZS5lcXVhbHMob3B0aW9uYWxmZWF0dXJlc1tqXSkpIHsNCi0JCQkJCQlvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsLmFkZChvcHRpb25hbEZlYXR1cmUpOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgSUZlYXR1cmVSZWZlcmVuY2Vbb3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbC5zaXplKCldOw0KLQkJaWYgKG9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwuc2l6ZSgpID4gMCkgew0KLQkJCW9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwudG9BcnJheShyZXN1bHQpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogcmV0dXJucyB0aGUgbWFwcGluZyBvZiBtYXRjaGluZyBydWxlcw0KLQkgKiB0aGUgZGVmYXVsdCByZXR1cm5zIHBlcmZlY3QNCi0JICogDQotCSAqIEBzaW5jZSAyLjAuMg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF0Y2hpbmdSdWxlKFN0cmluZyBydWxlKSB7DQotCQlpZiAocnVsZSA9PSBudWxsKQ0KLQkJCXJldHVybiBJSW1wb3J0LlJVTEVfUEVSRkVDVDsNCi0JCWludCBydWxlSW50ID0gKChJbnRlZ2VyKSB0YWJsZS5nZXQocnVsZSkpLmludFZhbHVlKCk7DQotCQlpZiAocnVsZUludCA9PSBJSW1wb3J0LlJVTEVfTk9ORSkNCi0JCQlyZXR1cm4gSUltcG9ydC5SVUxFX1BFUkZFQ1Q7DQotCQlyZXR1cm4gcnVsZUludDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIHJldHVybnMgdGhlIG1hcHBpbmcgb2YgbWF0Y2hpbmcgaWQgcnVsZXMNCi0JICogdGhlIGRlZmF1bHQgcmV0dXJucyBwZXJmZWN0DQotCSAqIA0KLQkgKiBAc2luY2UgMi4wLjINCi0JICovDQotCXB1YmxpYyBzdGF0aWMgaW50IGdldE1hdGNoaW5nSWRSdWxlKFN0cmluZyBydWxlKSB7DQotCQlpZiAocnVsZSE9bnVsbCAmJiBydWxlLmVxdWFsc0lnbm9yZUNhc2UoInByZWZpeCIpKSAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuIElJbXBvcnQuUlVMRV9QUkVGSVg7DQotCQlyZXR1cm4gSUltcG9ydC5SVUxFX1BFUkZFQ1Q7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgaXNPcHRpb25hbC4NCi0JICogQHBhcmFtIGZlYXR1cmVSZWZlcmVuY2UNCi0JICogQHJldHVybiBib29sZWFuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPcHRpb25hbChJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlKSB7DQotCQlpZiAoZmVhdHVyZVJlZmVyZW5jZT09bnVsbCkgcmV0dXJuIGZhbHNlOw0KLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKXsNCi0JCQlyZXR1cm4gKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKWZlYXR1cmVSZWZlcmVuY2UpLmlzT3B0aW9uYWwoKTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEVudmlyb25tZW50KElQbGF0Zm9ybUVudmlyb25tZW50IGNhbmRpZGF0ZSkgew0KLQkJaWYgKGNhbmRpZGF0ZT09bnVsbCkgcmV0dXJuIGZhbHNlOw0KLQkJU3RyaW5nIG9zID0gY2FuZGlkYXRlLmdldE9TKCk7DQotCQlTdHJpbmcgd3MgPSBjYW5kaWRhdGUuZ2V0V1MoKTsNCi0JCVN0cmluZyBhcmNoID0gY2FuZGlkYXRlLmdldE9TQXJjaCgpOw0KLQkJU3RyaW5nIG5sID0gY2FuZGlkYXRlLmdldE5MKCk7DQotCQlpZiAob3MhPW51bGwgJiYgIWlzTWF0Y2hpbmcob3MsIFNpdGVNYW5hZ2VyLmdldE9TKCkpKSByZXR1cm4gZmFsc2U7DQotCQlpZiAod3MhPW51bGwgJiYgIWlzTWF0Y2hpbmcod3MsIFNpdGVNYW5hZ2VyLmdldFdTKCkpKSByZXR1cm4gZmFsc2U7DQotCQlpZiAoYXJjaCE9bnVsbCAmJiAhaXNNYXRjaGluZyhhcmNoLCBTaXRlTWFuYWdlci5nZXRPU0FyY2goKSkpIHJldHVybiBmYWxzZTsNCi0JCWlmIChubCE9bnVsbCAmJiAhaXNNYXRjaGluZ0xvY2FsZShubCwgU2l0ZU1hbmFnZXIuZ2V0TkwoKSkpIHJldHVybiBmYWxzZTsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICovCQ0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWF0Y2hpbmcoU3RyaW5nIGNhbmRpZGF0ZVZhbHVlcywgU3RyaW5nIHNpdGVWYWx1ZXMpIHsNCi0JCWlmIChzaXRlVmFsdWVzPT1udWxsKSByZXR1cm4gZmFsc2U7DQotCQlpZiAoIioiLmVxdWFscyhjYW5kaWRhdGVWYWx1ZXMpKSByZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKCIiLmVxdWFscyhjYW5kaWRhdGVWYWx1ZXMpKSByZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJA0KLQkJc2l0ZVZhbHVlcyA9IHNpdGVWYWx1ZXMudG9VcHBlckNhc2UoKTsJCQ0KLQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNhbmRpZGF0ZVZhbHVlcywgIiwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7DQotCQkJU3RyaW5nIHRva2VuID0gc3Rvay5uZXh0VG9rZW4oKS50b1VwcGVyQ2FzZSgpOw0KLQkJCWlmIChzaXRlVmFsdWVzLmluZGV4T2YodG9rZW4pIT0tMSkgcmV0dXJuIHRydWU7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiANCi0JICovCQ0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWF0Y2hpbmdMb2NhbGUoU3RyaW5nIGNhbmRpZGF0ZVZhbHVlcywgU3RyaW5nIGxvY2FsZSkgew0KLQkJaWYgKGxvY2FsZT09bnVsbCkgcmV0dXJuIGZhbHNlOw0KLQkJaWYgKCIqIi5lcXVhbHMoY2FuZGlkYXRlVmFsdWVzKSkgcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQNCi0JCWlmICgiIi5lcXVhbHMoY2FuZGlkYXRlVmFsdWVzKSkgcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJbG9jYWxlID0gbG9jYWxlLnRvVXBwZXJDYXNlKCk7DQotCQljYW5kaWRhdGVWYWx1ZXMgPSBjYW5kaWRhdGVWYWx1ZXMudG9VcHBlckNhc2UoKTsJDQotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2FuZGlkYXRlVmFsdWVzLCAiLCIpOyAvLyROT04tTkxTLTEkDQotCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsNCi0JCQlTdHJpbmcgY2FuZGlkYXRlID0gc3Rvay5uZXh0VG9rZW4oKTsNCi0JCQlpZiAobG9jYWxlLmluZGV4T2YoY2FuZGlkYXRlKSA9PSAwKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQlpZiAoY2FuZGlkYXRlLmluZGV4T2YobG9jYWxlKSA9PSAwKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkNCi0vKioNCi0gKiB3cml0ZSBYTUwgZmlsZQ0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgV3JpdGVyIHsNCi0NCi0JcHJpdmF0ZSBQcmludFdyaXRlciB3Ow0KLQlwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7DQotCXByaXZhdGUgT3V0cHV0U3RyZWFtV3JpdGVyIG91dFdyaXRlcjsNCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRlciBidWZmV3JpdGVyOw0KLQlwcml2YXRlIFN0cmluZyBlbmNvZGluZzsNCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIFdyaXRlcigpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGluaXQoRmlsZSBmaWxlLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb257DQotCQl0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7DQotCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsNCi0JCW91dFdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBlbmNvZGluZyk7IC8vJE5PTi1OTFMtMSQNCi0JCWJ1ZmZXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIob3V0V3JpdGVyKTsNCi0JCXcgPSBuZXcgUHJpbnRXcml0ZXIoYnVmZldyaXRlcik7DQotCX0NCi0NCi0JDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgd3JpdGUoSVdyaXRhYmxlIGVsZW1lbnQpIHsNCi0JCXcucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIitlbmNvZGluZysiXCI/PiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXcucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQNCi0JCXcucHJpbnRsbigiPCEtLSBGaWxlIHdyaXR0ZW4gYnkgVXBkYXRlIG1hbmFnZXIgMi4wIC0tPiIpOyAvLyROT04tTkxTLTEkDQotCQl3LnByaW50bG4oIjwhLS0gY29tbWVudHMgaW4gdGhpcyBmaWxlIGFyZSBub3QgcHJlc2VydmVkIC0tPiIpOyAvLyROT04tTkxTLTEkDQotCQl3LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkDQotCQkgKChJV3JpdGFibGUpIGVsZW1lbnQpLndyaXRlKDAsIHcpOw0KLQkJY2xvc2UoKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogDQotCSAqLw0KLQkgcHVibGljIHZvaWQgY2xvc2UoKXsNCi0JIAkJdy5jbG9zZSgpOw0KLQkgfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kRXNjYXBlZENoYXIoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgY2hhciBjKSB7DQotCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSBnZXRSZXBsYWNlbWVudChjKTsNCi0JCWlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7DQotCQkJYnVmZmVyLmFwcGVuZCgnJicpOw0KLQkJCWJ1ZmZlci5hcHBlbmQocmVwbGFjZW1lbnQpOw0KLQkJCWJ1ZmZlci5hcHBlbmQoJzsnKTsNCi0JCX0gZWxzZSB7DQotCQkJaWYgKChjID49ICcgJyAmJiBjIDw9IDB4N0UpIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXHQnKSB7DQotCQkJCWJ1ZmZlci5hcHBlbmQoYyk7DQotCQkJfSBlbHNlIHsNCi0JCQkJYnVmZmVyLmFwcGVuZCgiJiMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlidWZmZXIuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYykpOw0KLQkJCQlidWZmZXIuYXBwZW5kKCc7Jyk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sU2FmZShTdHJpbmcgcykgew0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSArIDEwKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytpKQ0KLQkJCWFwcGVuZEVzY2FwZWRDaGFyKHJlc3VsdCwgcy5jaGFyQXQoaSkpOw0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLQl9DQotCQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZXBsYWNlbWVudChjaGFyIGMpIHsNCi0JCS8vIEVuY29kZSBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzIGludG8gdGhlIGVxdWl2YWxlbnQgY2hhcmFjdGVyIHJlZmVyZW5jZXMuDQotCQkvLyBUaGVzZSBmaXZlIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgZm9yIGFsbCBYTUwgZG9jdW1lbnRzLg0KLQkJc3dpdGNoIChjKSB7DQotCQkJY2FzZSAnPCcgOg0KLQkJCQlyZXR1cm4gImx0IjsgLy8kTk9OLU5MUy0xJA0KLQkJCWNhc2UgJz4nIDoNCi0JCQkJcmV0dXJuICJndCI7IC8vJE5PTi1OTFMtMSQNCi0JCQljYXNlICciJyA6DQotCQkJCXJldHVybiAicXVvdCI7IC8vJE5PTi1OTFMtMSQNCi0JCQljYXNlICdcJycgOg0KLQkJCQlyZXR1cm4gImFwb3MiOyAvLyROT04tTkxTLTEkDQotCQkJY2FzZSAnJicgOg0KLQkJCQlyZXR1cm4gImFtcCI7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KLQlwdWJsaWMgc3RhdGljIFdyaXRlciBnZXRXcml0ZXIoRmlsZSBmaWxlLFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7DQotCQlpZiAod3JpdGVyPT1udWxsKSB3cml0ZXIgPSBuZXcgV3JpdGVyKCk7DQotCQl3cml0ZXIuaW5pdChmaWxlLGVuY29kaW5nKTsNCi0JCXJldHVybiB3cml0ZXI7DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NhbWVUaW1lc3RhbXAoVVJMIHVybCwgbG9uZyB0aW1lc3RhbXApIHsJDQotCQl0cnkgew0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7DQotCQkJUmVzcG9uc2UgcmVzcG9uc2UgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChyZXNvbHZlZFVSTCk7DQotCQkJbG9uZyByZW1vdGVMYXN0TW9kaWZpZWQgPSByZXNwb25zZS5nZXRMYXN0TW9kaWZpZWQoKTsNCi0JCQkvLyAyIHNlY29uZHMgdG9sZXJhbmNlLCBhcyBzb21lIE9TJ3MgbWF5IHJvdW5kIHVwIHRoZSB0aW1lIHN0YW1wDQotCQkJLy8gdG8gdGhlIGNsb3Nlc3Qgc2Vjb25kLiBGb3Igc2FmZXR5LCB3ZSBtYWtlIGl0IDIgc2Vjb25kcy4NCi0JCQlyZXR1cm4gTWF0aC5hYnMocmVtb3RlTGFzdE1vZGlmaWVkIC0gdGltZXN0YW1wKS8xMDAwIDw9IDI7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0NCi0JLyoqDQotCSAqIFRoZSBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGxvb2t1cCBrZXkuDQotCSAqIEBwYXJhbSBrZXkgb3B0aW9uYWwgbG9va3VwIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBwYXJhbSB0ZW1wIHRoZSBsb2NhbCB3b3JraW5nIGZpbGUNCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgbWFwTG9jYWxGaWxlRnJhZ21lbnQoU3RyaW5nIGtleSwgRmlsZUZyYWdtZW50IHRlbXApIHsNCi0JCS8vIGNyZWF0ZSBmaWxlIGFzc29jaWF0aW9uIA0KLQkJaWYgKGtleSAhPSBudWxsKSB7DQotCQkJaWYgKGxvY2FsRmlsZUZyYWdtZW50TWFwID09IG51bGwpDQotCQkJCWxvY2FsRmlsZUZyYWdtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsNCi0JCQlsb2NhbEZpbGVGcmFnbWVudE1hcC5wdXQoa2V5LCB0ZW1wKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbG9va3VwIGtleS4NCi0JICogQHBhcmFtIGtleSBvcHRpb25hbCBsb29rdXAga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgdW5NYXBMb2NhbEZpbGVGcmFnbWVudChTdHJpbmcga2V5KSB7DQotCQkvLyByZW1vdmUgZmlsZSBhc3NvY2lhdGlvbiANCi0JCWlmIChrZXkgIT0gbnVsbCAmJiBsb2NhbEZpbGVGcmFnbWVudE1hcCAhPW51bGwpIHsNCi0JCQlsb2NhbEZpbGVGcmFnbWVudE1hcC5yZW1vdmUoa2V5KTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgYSBwcmV2aW91c2x5IGNhY2hlZCBsb2NhbCBmaWxlIChpbiB0ZW1wb3JhcnkgYXJlYSkgbWF0Y2hpbmcgdGhlDQotCSAqIHNwZWNpZmllZCBrZXkuIA0KLQkgKiANCi0JICogQHBhcmFtIGtleSBsb29rdXAga2V5DQotCSAqIEByZXR1cm4gY2FjaGVkIGZpbGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRmlsZUZyYWdtZW50IGxvb2t1cExvY2FsRmlsZUZyYWdtZW50KFN0cmluZyBrZXkpIHsNCi0JCWlmIChsb2NhbEZpbGVGcmFnbWVudE1hcCA9PSBudWxsKQ0KLQkJCXJldHVybiBudWxsOw0KLQkJcmV0dXJuIChGaWxlRnJhZ21lbnQpIGxvY2FsRmlsZUZyYWdtZW50TWFwLmdldChrZXkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ29waWVzIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0uIE5laXRoZXIgc3RyZWFtDQotCSAqIGlzIGNsb3NlZCBhcyBwYXJ0IG9mIHRoaXMgb3BlcmF0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIGlzIGlucHV0IHN0cmVhbQ0KLQkgKiBAcGFyYW0gb3Mgb3V0cHV0IHN0cmVhbQ0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yDQotICAgICAqIEBwYXJhbSBleHBlY3RlZExlbmd0aCAtIGlmID4gMCwgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIElucHV0U3RyZWFtIHdpbGwgYmUgdmVyaWZpZWQNCi0JICogQEByZXR1cm4gdGhlIG9mZnNldCBpbiB0aGUgaW5wdXQgc3RyZWFtIHdoZXJlIGNvcHlpbmcgc3RvcHBlZC4gUmV0dXJucyAtMSBpZiBlbmQgb2YgaW5wdXQgc3RyZWFtIGlzIHJlYWNoZWQuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgbG9uZyBjb3B5KElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MsIEluc3RhbGxNb25pdG9yIG1vbml0b3IsIGxvbmcgZXhwZWN0ZWRMZW5ndGgpIHsNCi0JCWJ5dGVbXSBidWYgPSBnZXRCdWZmZXIoKTsNCi0JCWxvbmcgb2Zmc2V0PTA7DQotCQl0cnkgew0KLQkJCWludCBsZW4gPSBpcy5yZWFkKGJ1Zik7DQotCQkJaW50IG5leHRJbmNyZW1lbnQgPSAwOw0KLQkJCXdoaWxlIChsZW4gIT0gLTEpIHsNCi0JCQkJb3Mud3JpdGUoYnVmLCAwLCBsZW4pOw0KLQkJCQkJb2Zmc2V0ICs9IGxlbjsNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQkJbmV4dEluY3JlbWVudCArPSBsZW47DQotCQkJCQkvLyB1cGRhdGUgbW9uaXRvciBwZXJpb2RpY2FsbHkNCi0JCQkJCWlmIChuZXh0SW5jcmVtZW50ID49IElOQ1JFTUVOVF9TSVpFKXsgCQ0KLQkJCQkJCW1vbml0b3IuaW5jcmVtZW50Q291bnQobmV4dEluY3JlbWVudCk7DQotCQkJCQkJbmV4dEluY3JlbWVudCA9IDA7DQotCQkJCQl9DQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQlyZXR1cm4gb2Zmc2V0Ow0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWlmIChleHBlY3RlZExlbmd0aCA+IDAgJiYgb2Zmc2V0ID09IGV4cGVjdGVkTGVuZ3RoKSB7DQotCQkJCQkvLyBldmVyeXRoaW5nIHJlYWQgZG8gbm90IHJldHVybiBvZmZzZXQsIG90aGVyd2lzZSB0cnlpbmcNCi0JCQkJCS8vIHRvIHJlYWQgYWdhaW4gZnJvbSB0aGlzIG9mZnNldCB3aWxsIHJlc3VsdCBpbiBIVFRQIDQxNg0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJDQotCQkJCWxlbiA9IGlzLnJlYWQoYnVmKTsNCi0JCQl9DQotCQkJaWYgKG5leHRJbmNyZW1lbnQgPiAwICYmIG1vbml0b3IgIT0gbnVsbCkNCi0JCQkJbW9uaXRvci5pbmNyZW1lbnRDb3VudChuZXh0SW5jcmVtZW50KTsNCi0JCQlpZihleHBlY3RlZExlbmd0aD4wICYmIG9mZnNldCE9ZXhwZWN0ZWRMZW5ndGgpDQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihQb2xpY3kuYmluZCgiVXBkYXRlTWFuYWdlclV0aWxzLmlucHV0U3RyZWFtRW5kZWQiLCBTdHJpbmcudmFsdWVPZihvZmZzZXQpLCBTdHJpbmcudmFsdWVPZihleHBlY3RlZExlbmd0aCkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQlyZXR1cm4gLTE7DQotCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpew0KLQkJCS8vIExvZyB0aGUgYWN0dWFsIGVycm9yLCBhcyB0aGlzIGlzIG5vIGxvbmdlcg0KLQkJCS8vIHBhc3NlZCB1cCB0aGUgY2FsbGluZyBzdGFjaw0KLQkJCVVwZGF0ZUNvcmUubG9nKFBvbGljeS5iaW5kKCJVcGRhdGVNYW5hZ2VyVXRpbHMuY29weSIpICsgb2Zmc2V0LCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybiBvZmZzZXQ7DQotCQl9IGZpbmFsbHkgew0KLQkJCWZyZWVCdWZmZXIoYnVmKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvcHlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gew0KLQkJRXhjZXB0aW9uIHJvb3RFeGNlcHRpb247DQotCQlpbnQgYnl0ZXNDb3BpZWQ7DQotDQotCQkvKioNCi0JCSAqIA0KLQkJICovDQotCQlwdWJsaWMgQ29weUV4Y2VwdGlvbihFeGNlcHRpb24gcm9vdEV4Y2VwdGlvbiwgaW50IGJ5dGVzQ29waWVkKSB7DQotCQkJc3VwZXIoKTsNCi0JCQl0aGlzLnJvb3RFeGNlcHRpb249IHJvb3RFeGNlcHRpb247DQotCQkJdGhpcy5ieXRlc0NvcGllZD1ieXRlc0NvcGllZDsNCi0JCX0NCi0JCS8qKg0KLQkJICogSW5zdGFuY2Ugb2YgSU9FeGNlcHRpb24gb3IgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24NCi0JCSAqIEByZXR1cm4NCi0JCSAqLw0KLQkJcHVibGljIEV4Y2VwdGlvbiBnZXRSb290RXhjZXB0aW9uKCl7DQotCQkJcmV0dXJuIHJvb3RFeGNlcHRpb247DQotCQl9DQotCQlwdWJsaWMgaW50IGdldEJ5dGVzQ29waWVkKCl7DQotCQkJcmV0dXJuIGJ5dGVzQ29waWVkOw0KLQkJfQ0KLQ0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgYnl0ZVtdIGdldEJ1ZmZlcigpIHsNCi0JCWlmIChidWZmZXJQb29sID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOw0KLQkJfQ0KLQ0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gKGJ5dGVbXSkgYnVmZmVyUG9vbC5wb3AoKTsNCi0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgYnl0ZVtCVUZGRVJfU0laRV07DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgZnJlZUJ1ZmZlcihieXRlW10gYnVmKSB7DQotCQlpZiAoYnVmZmVyUG9vbCA9PSBudWxsKQ0KLQkJCWJ1ZmZlclBvb2wgPSBuZXcgU3RhY2soKTsNCi0JCWJ1ZmZlclBvb2wucHVzaChidWYpOw0KLQl9DQotCQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgYSBsaXN0IG9mIGZyYWdtZW50cy4gWmVybyBsZW5ndGggaWYgbm8gZnJhZ21lbnRzLg0KLQkgKiBAcGFyYW0gYnVuZGxlIHRoZSBidW5kbGUgdG8gZ2V0IGZyYWdtZW50cyBmb3INCi0JICovDQotCXB1YmxpYyBzdGF0aWMgRnJhZ21lbnRFbnRyeVtdIGdldEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlKSB7DQotCQlQYWNrYWdlQWRtaW4gcGtnQWRtaW4gPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBhY2thZ2VBZG1pbigpOw0KLQkJQnVuZGxlW10gZnJhZ21lbnRCdW5kbGVzID0gcGtnQWRtaW4uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7DQotCQlpZiAoZnJhZ21lbnRCdW5kbGVzID09IG51bGwpIA0KLQkJCXJldHVybiBub0ZyYWdtZW50czsNCi0JCQ0KLQkJRnJhZ21lbnRFbnRyeVtdIGZyYWdtZW50cyA9IG5ldyBGcmFnbWVudEVudHJ5W2ZyYWdtZW50QnVuZGxlcy5sZW5ndGhdOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQlmcmFnbWVudHNbaV0gPSBuZXcgRnJhZ21lbnRFbnRyeSgoU3RyaW5nKSBmcmFnbWVudEJ1bmRsZXNbaV0NCi0JCQkJCS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwNCi0JCQkJCShTdHJpbmcpIGZyYWdtZW50QnVuZGxlc1tpXS5nZXRIZWFkZXJzKCkuZ2V0KA0KLQkJCQkJCQlDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBQbGF0Zm9ybQ0KLQkJCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoZnJhZ21lbnRCdW5kbGVzW2ldLA0KLQkJCQkJCQkJCShTdHJpbmcpIGZyYWdtZW50QnVuZGxlc1tpXS5nZXRIZWFkZXJzKCkNCi0JCQkJCQkJCQkJCS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSksDQotCQkJCQlmcmFnbWVudEJ1bmRsZXNbaV0uZ2V0TG9jYXRpb24oKSk7DQotCQl9DQotCQlyZXR1cm4gZnJhZ21lbnRzOwkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlUHJlZmVyZW5jZXNJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzE3NWRjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlUHJlZmVyZW5jZXNJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotCi0vKioKLSAqIENsYXNzIHRvIGluaXRpYWxpemUgdGhlIHByZWZlcmVuY2VzIGZvciB0aGUgVXBkYXRlIGNvcmUgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlUHJlZmVyZW5jZXNJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVXBkYXRlUHJlZmVyZW5jZXNJbml0aWFsaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBzZXR0aW5ncyBmb3IgdGhpcyBwbHVnLWluLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBzb21ldGltZSBhZnRlciB0aGUgcHJlZmVyZW5jZSBzdG9yZSBmb3IgdGhpcwotCSAqIHBsdWctaW4gaXMgY3JlYXRlZC4gRGVmYXVsdCB2YWx1ZXMgYXJlIG5ldmVyIHN0b3JlZCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmVzOyB0aGV5IG11c3QgYmUgZmlsbGVkIGluIGVhY2ggdGltZS4gVGhpcyBtZXRob2QgcHJvdmlkZXMgdGhlCi0JICogb3Bwb3J0dW5pdHkgdG8gaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB2YWx1ZXMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4gQSBzdWJjbGFzcyB0aGF0IG5lZWRzCi0JICogdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBpdHMgcHJlZmVyZW5jZXMgbXVzdCByZWltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiBEZWZhdWx0IHZhbHVlcyBzZXQgYXQgYSBsYXRlciBwb2ludCB3aWxsIG92ZXJyaWRlIGFueSBkZWZhdWx0IG92ZXJyaWRlCi0JICogc2V0dGluZ3Mgc3VwcGxpZWQgZnJvbSBvdXRzaWRlIHRoZSBwbHVnLWluIChwcm9kdWN0IGNvbmZpZ3VyYXRpb24gb3IKLQkgKiBwbGF0Zm9ybSBzdGFydCB1cCkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCVBsdWdpbiBwbHVnaW4gPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpOwotCQlwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KFVwZGF0ZUNvcmUuUF9DSEVDS19TSUdOQVRVUkUsIHRydWUpOwkJCi0JCXBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldERlZmF1bHQoVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSwgVXBkYXRlQ29yZS5ERUZBVUxUX0hJU1RPUlkpOwotCQlwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KFVwZGF0ZUNvcmUuUF9VUERBVEVfVkVSU0lPTlMsIFVwZGF0ZUNvcmUuRVFVSVZBTEVOVF9WQUxVRSk7Ci0JCQotCQkvLyBJZiBwcm94eSBob3N0IGFuZCBwb3J0IGFyZSBzZXQgYXMgc3lzdGVtIHByb3BlcnRpZXMsIHVzZSB0aGVtIGFzIGRlZmF1bHRzCi0JCVN0cmluZyBwcm94eUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAucHJveHlIb3N0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHByb3h5SG9zdCAhPSBudWxsICYmIHByb3h5SG9zdC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgcHJveHlQb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocHJveHlQb3J0ID09IG51bGwgfHwgcHJveHlQb3J0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCXByb3h5UG9ydCA9ICI4MCI7IC8vJE5PTi1OTFMtMSQKLQkJCXBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldERlZmF1bHQoVXBkYXRlQ29yZS5IVFRQX1BST1hZX0VOQUJMRSwgdHJ1ZSk7Ci0JCQlwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KFVwZGF0ZUNvcmUuSFRUUF9QUk9YWV9IT1NULCBwcm94eUhvc3QpOwotCQkJcGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChVcGRhdGVDb3JlLkhUVFBfUFJPWFlfUE9SVCwgcHJveHlQb3J0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVm9sdW1lLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1ZvbHVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY5MjhmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVm9sdW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGEgSVZvbHVtZQotICovCi1wdWJsaWMgY2xhc3MgVm9sdW1lIGV4dGVuZHMgTW9kZWxPYmplY3QgaW1wbGVtZW50cyBJVm9sdW1lIHsKLQotCXByaXZhdGUgbG9uZyBzaXplOwotCXByaXZhdGUgaW50IHR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBGaWxlIHJvb3Q7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVm9sdW1lLgotCSAqLwotCXB1YmxpYyBWb2x1bWUoRmlsZSByb290LFN0cmluZyBsYWJlbCxpbnQgdHlwZSxsb25nIHNpemUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290ID0gcm9vdDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnNpemUgPSBzaXplOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZvbHVtZSNnZXRGcmVlU3BhY2UoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldEZyZWVTcGFjZSgpIHsKLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVm9sdW1lI2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVm9sdW1lI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVm9sdW1lI2dldEZpbGUoKQotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiByb290OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhcmcwKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzVlMjQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBJbnN0YWxsIFVwZGF0ZSBDb3JlIFByb3BlcnRpZXMgRmlsZQotIyAKLQotQmFzZVNpdGVGYWN0b3J5LkNhbm5vdFJldHJpdmVQYXJlbnREaXJlY3Rvcnk9VW5hYmxlIHRvIHJldHJpZXZlIHBhcmVudCBkaXJlY3RvcnkgZm9yIFVSTCBcInswfVwiLgotQmFzZVNpdGVGYWN0b3J5LkNhbm5vdEVuY29kZVVSTD0gVW5hYmxlIHRvIGVuY29kZSBVUkwgXCJ7MH1cIi4KLUNvbnRlbnRSZWZlcmVuY2UuVW5hYmxlVG9DcmVhdGVJbnB1dFN0cmVhbT0gVW5hYmxlIHRvIGNyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gZm9yIHRoZSByZWZlcmVuY2UgXCJ7MH1cIi4KLUNvbnRlbnRSZWZlcmVuY2UuVW5hYmxlVG9SZXR1cm5SZWZlcmVuY2VBc0ZpbGU9IFVuYWJsZSB0byByZXR1cm4gcmVmZXJlbmNlIFwiezB9XCIgYXMgRmlsZS4KLUNvbnRlbnRSZWZlcmVuY2UuVW5hYmxlVG9SZXR1cm5SZWZlcmVuY2VBc1VSTD0gVW5hYmxlIHRvIHJldHVybiByZWZlcmVuY2UgXCJ7MH1cIiBhcyBVUkwuCi1Db250ZW50UmVmZXJlbmNlLkh0dHBOb2s9IFNlcnZlciByZXR1cm5lZCBIVFRQIHJlc3BvbnNlIGNvZGU6IFwiezB9IHsxfVwiIGZvciBVUkw6IHsyfS4KLUNvbnRlbnRSZWZlcmVuY2UuRmlsZURvZXNOb3RFeGlzdD1UaGUgZmlsZSBcInswfVwiIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBmaWxlIHN5c3RlbS4KLUZlYXR1cmUuU2l0ZUFscmVhZHlTZXQ9IEludGVybmFsIEVycm9yOiBTaXRlIGFscmVhZHkgc2V0IGZvciB0aGUgZmVhdHVyZSBcInswfVwiLgotRmVhdHVyZS5UYXNrSW5zdGFsbEZlYXR1cmVGaWxlcz0gSW5zdGFsbGluZyBmZWF0dXJlIGZpbGVzOiAKLUZlYXR1cmUuVGFza0luc3RhbGxQbHVnaW5GaWxlcz0gSW5zdGFsbGluZyBwbHVnLWluIFwiezB9XCIgZmlsZXM6Ci1GZWF0dXJlLlRhc2tJbnN0YWxsTm9uUGx1Z2luc0ZpbGVzPSBJbnN0YWxsaW5nIG5vbi1wbHVnLWluIGZpbGVzOiAKLUZlYXR1cmUuTm9Db250ZW50UHJvdmlkZXI9IEludGVybmFsIEVycm9yLiBUaGUgZmVhdHVyZSBcInswfVwiIGRvZXMgbm90IGhhdmUgYSBjb250ZW50IHByb3ZpZGVyLgotRmVhdHVyZS5Ob0ZlYXR1cmVDb250ZW50Q29uc3VtZXI9IEludGVybmFsIEVycm9yLiBUaGUgRmVhdHVyZSBcInswfVwiIGRvZXMgbm90IGhhdmUgYSBjb250ZW50IGNvbnN1bWVyLgotRmVhdHVyZS5Ob1VSTD0gVW5rbm93biBVUkwuCi1GZWF0dXJlLkZlYXR1cmVWZXJzaW9uVG9TdHJpbmc9IEZlYXR1cmU6IFwiezB9XCIgVmVyc2lvbjogXCJ7MX1cIi4KLUZlYXR1cmUuSW5zdGFsbGF0aW9uQ2FuY2VsbGVkPSBJbnN0YWxsYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHRoZSBVc2VyLgotRmVhdHVyZS5VbmFibGVUb0luaXRpYWxpemVGZWF0dXJlUmVmZXJlbmNlPSBVbmFibGUgdG8gaW5pdGlhbGl6ZSBmZWF0dXJlIHJlZmVyZW5jZSBmb3IgdmVyc2lvbmVkIGlkZW50aWZpZXIgXCJ7MH1cIi4KLUZlYXR1cmVDb250ZW50UHJvdmlkZXIuRG93bmxvYWRpbmc9IERvd25sb2FkaW5nOgotRmVhdHVyZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb1JldHJpZXZlPSBVbmFibGUgdG8gcmV0cmlldmUgcmVtb3RlIHJlZmVyZW5jZSBcInswfVwiLgotRmVhdHVyZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb0NyZWF0ZT0gVW5hYmxlIHRvIGNyZWF0ZSBsb2NhbCBmaWxlIFwiezB9XCIuCi1GZWF0dXJlQ29udGVudFByb3ZpZGVyLkV4Y2VwdGlvbkRvd25sb2FkaW5nID0gQW4gZXhjZXB0aW9uIG9jY3VyZWQgd2hpbGUgZG93bmxvYWRpbmcgZmVhdHVyZSBmcm9tIFwiezB9XCIuCi1JbnN0YWxsSGFuZGxlci51bmFibGVUb0NyZWF0ZUhhbmRsZXIgPSBVbmFibGUgdG8gY3JlYXRlIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgZm9yIGZlYXR1cmUgXCJ7MH1cIi4KLUluc3RhbGxIYW5kbGVyLm5vdEZvdW5kID0gQ3VzdG9tIGluc3RhbGwgaGFuZGxlciByZXF1aXJlZCBieSBmZWF0dXJlIFwiezB9XCIgd2FzIG5vdCBmb3VuZC4KLUluc3RhbGxIYW5kbGVyLmludmFsaWRIYW5kbGVyID0gRmVhdHVyZSBcInswfVwiIGNvbnRhaW5zIGludmFsaWQgY3VzdG9tIGluc3RhbGwgaGFuZGxlci4KLUluc3RhbGxIYW5kbGVyLmNhbGxFeGNlcHRpb24gPSBFcnJvciByZXBvcnRlZCBieSBjdXN0b20gaW5zdGFsbCBoYW5kbGVyIGZvciBmZWF0dXJlIFwiezB9XCIuCi1JbnN0YWxsSGFuZGxlci5kZWFjdGl2YXRlZCA9IEN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgZm9yIGZlYXR1cmUgXCJ7MH1cIiBkZWFjdGl2YXRlZCBkdWUgdG8gZXJyb3JzLgotSW5zdGFsbEhhbmRsZXIuZXJyb3IgPSBVbmFibGUgdG8gY29tcGxldGUgYWN0aW9uIGZvciBmZWF0dXJlIFwiezB9XCIgZHVlIHRvIGVycm9ycy4KLUluc3RhbGxNb25pdG9yLkRvd25sb2FkU2l6ZSA9ICh7MH1LIGJ5dGVzKQotSW5zdGFsbE1vbml0b3IuRG93bmxvYWRTaXplTG9uZyA9ICh7MH1LIG9mIHsxfUsgYnl0ZXMpCi1SZWNvbmNpbGVyLmFwcE5vdEZvdW5kID0gQXBwbGljYXRpb24gXCJ7MH1cIiBub3QgZm91bmQuCi1KYXJDb250ZW50UmVmZXJlbmNlLlVucGFja2luZz0gVW5wYWNraW5nOgotU2l0ZS5DYW5ub3RTYXZlU2l0ZUludG89IENhbm5vdCBzYXZlIFNpdGUgaW5mb3JtYXRpb24gaW50byB0aGUgRmlsZTogXCJ7MH1cIi4KLVNpdGUuQ2Fubm90RmluZENhdGVnb3J5PSBVbmFibGUgdG8gZmluZCBjYXRlZ29yeTogXCJ7MH1cIiBpbiBTaXRlOiBcInsxfVwiLgotU2l0ZS5Ob0NhdGVnb3JpZXM9IFRoZSBTaXRlIGRvZXMgbm90IGNvbnRhaW4gYW55IGNhdGVnb3JpZXMuCi1TaXRlLk5vQ29udGVudFByb3ZpZGVyPSBJbnRlcm5hbCBFcnJvci4gQ29udGVudCBQcm92aWRlciBub3Qgc2V0IGZvciBTaXRlOiBcInswfVwiLgotVmVyc2lvbmVkSWRlbnRpZmllci5JZE9yVmVyc2lvbk51bGw9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gY3JlYXRlIGFuIElkZW50aWZpZXIuIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvciB0aGUgdmVyc2lvbiBpcyBudWxsIG9yIGVtcHR5OiB1bmlxdWUgaWRlbnRpZmllcj1cInswfVwiIHZlcnNpb249XCJ7MX1cIi4KLVNpdGVGaWxlLkNhbm5vdFJlbW92ZVBsdWdpbj0gVW5hYmxlIHRvIHJlbW92ZSBwbHVnLWluOiBcInswfVwiIGZyb20gU2l0ZTogXCJ7MX1cIi4KLVNpdGVGaWxlLkNhbm5vdFJlbW92ZUZlYXR1cmU9IFVuYWJsZSB0byByZW1vdmUgZmVhdHVyZTogXCJ7MH1cIiBmcm9tIFNpdGU6IFwiezF9XCIuCi1TaXRlRmlsZS5VbmFibGVUb0NyZWF0ZVVSTD0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIGxvY2F0aW9uIFwiezB9XCIuCi1TaXRlRmlsZS5SZW1vdmluZz0gUmVtb3Zpbmc6IAotU2l0ZUZpbGVGYWN0b3J5LlVuYWJsZVRvQ3JlYXRlVVJMPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgotU2l0ZUZpbGVGYWN0b3J5LlVuYWJsZVRvQWNjZXNzU2l0ZT0gVW5hYmxlIHRvIGFjY2VzcyBzaXRlIAotU2l0ZUZpbGVGYWN0b3J5LkRpcmVjdG9yeURvZXNOb3RFeGlzdD1UaGUgZGlyZWN0b3J5IFwiezB9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGZpbGUgc3lzdGVtLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuTm9GZWF0dXJlVGFnPSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBVbmFibGUgdG8gZmluZCByb290IGVsZW1lbnQgXCJmZWF0dXJlXCIgaW4gdGhlIHN0cmVhbS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyLldyb25nUGFyc2luZ1N0YWNrPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBVbmV4cGVjdGVkIFBhcnNpbmcgU3RhY2s6IFwiezB9XCIKLURlZmF1bHRGZWF0dXJlUGFyc2VyLlVua25vd25FbGVtZW50PSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBVbmtub3duIGVsZW1lbnQgXCJ7MH1cIiBpbiBwYXJzaW5nIHN0YXRlIFwiezF9XCIuIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgWE1MIGZpbGUuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5Ub29NYW55VVJMdGFnPSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBUaGVyZSBpcyBtb3JlIHRoYW4gb25lIFwiVVJMXCIgZWxlbWVudCBpbiB0aGUgWE1MIHN0cmVhbS4gVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93blN0YXJ0U3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFVua25vd24gc3RhcnQgc3RhdGUgXCJ7MH1cIi4KLURlZmF1bHRGZWF0dXJlUGFyc2VyLklkT3JWZXJzaW9uSW52YWxpZD0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9yIHRoZSB2ZXJzaW9uIGlzIG51bGwgb3IgZW1wdHkgZm9yIHRoZSBTdGF0ZTogXCJ7Mn1cIjogdW5pcXVlIGlkZW50aWZpZXI9XCJ7MH1cIiB2ZXJzaW9uPVwiezF9XCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5NaXNzaW5nSWQ9IEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFRoZSBcImlkXCIgdGFnIG9mIHRoZSBlbGVtZW50IFwiezB9XCIgaXMgbnVsbCBvciBlbXB0eS4gVmFsdWUgaXMgcmVxdWlyZWQuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5QYXJzaW5nU3RhY2tCYWNrVG9Jbml0aWFsU3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFBhcnNpbmcgc3RhY2sgYmFjayB0byBJbml0aWFsIFN0YXRlLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuRWxlbWVudEFscmVhZHlTZXQ9IEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIEVsZW1lbnQ6IFwiezB9XCIgYWxyZWFkeSBzZXQgZm9yIHRoZSBmZWF0dXJlLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuU3RhdGVJbmNsdWRlV3JvbmdFbGVtZW50PSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBTdGF0ZTogXCJ7MH1cIiBzaG91bGQgbm90IGluY2x1ZGUgRWxlbWVudCBcInsxfVwiLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuUmVxdWlyZVN0YXRlV2l0aG91dEltcG9ydEVsZW1lbnQ9RXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gU3RhdGU6IFwicmVxdWlyZVwiIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBhbiBcImltcG9ydFwiIGVsZW1lbnQuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5NaXNzaW5nUGF0Y2hWZXJzaW9uPUVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIEF0dHJpYnV0ZSAidmVyc2lvbiIgb2YgdGhlIGVsZW1lbnQgImltcG9ydCIgbXVzdCBiZSBzZXQgd2hlbiAicGF0Y2giIGlzIHNldCB0byAidHJ1ZSIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci53cm9uZ01hdGNoRm9yUGF0Y2g9RXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gV2hlbiBhdHRyaWJ1dGUgInBhdGNoIiBvZiB0aGUgZWxlbWVudCAiaW1wb3J0IiBpcyBzZXQgdG8gInRydWUiLCB0aGUgb25seSB2YWxpZCB2YWx1ZSBmb3IgdGhlICJtYXRjaCIgYXR0cmlidXRlIGlzICJwZXJmZWN0Ii4gCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5wYXRjaFdpdGhQbHVnaW49RXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gQXR0cmlidXRlICJwYXRjaCIgY2FuIG9ubHkgYmUgdXNlZCBmb3IgZmVhdHVyZXMuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5NdWx0aXBsZVBhdGNoSW1wb3J0cz1FcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBTdGF0ZTogInJlcXVpcmUiIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSAiaW1wb3J0IiBlbGVtZW50IHdpdGggdGhlIGF0dHJpYnV0ZSAicGF0Y2giIHNldCB0byAidHJ1ZSIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duRW5kU3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFVua25vd24gZW5kIHN0YXRlIFwiezB9XCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5FcnJvclBhcnNpbmc9IEVycm9yIFBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIEVycm9yOiBcInswfVwiCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5FcnJvcmxpbmVDb2x1bW5NZXNzYWdlPSBFcnJvciBQYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBFbGVtZW50IFwiezB9XCIgbGluZTogXCJ7MX1cIiBjb2x1bW46XCJ7Mn1cIi4gRXJyb3I6IFwiezN9XCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5FcnJvclBhcnNpbmdGZWF0dXJlPSBFcnJvciBQYXJzaW5nIGZlYXR1cmUgc3RyZWFtLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93blN0YXRlPSBVbmtub3duIFN0YXRlIFwiezB9XCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5Ob0xpY2Vuc2VUZXh0PSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBTdGF0ZTogXCJsaWNlbnNlXCIgbXVzdCBpbmNsdWRlIHNvbWUgdGV4dC4KLURlZmF1bHRGZWF0dXJlUGFyc2VyLlBsdWdpbkFuZEZlYXR1cmVJZD1PbmUgSW1wb3J0IHN0YXRlbWVudCBpcyBpbmNvcnJlY3Q6IEJvdGggZmVhdHVyZSBhbmQgcGx1Zy1pbiBJRCBhcmUgZWl0aGVyIG51bGwgb3Igc3BlY2lmaWVkLgotU2l0ZUNvbnRlbnRQcm92aWRlci5FcnJvckNyZWF0aW5nVVJMRm9yQXJjaGl2ZUlEPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIEFyY2hpdmUgSWRlbnRpZmllciBcInswfVwiIG9uIFNpdGUgXCJ7MX1cIi4KLURlZmF1bHRTaXRlUGFyc2VyLk5vU2l0ZVRhZz0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5hYmxlIHRvIGZpbmQgcm9vdCBlbGVtZW50IFwic2l0ZVwiIGluIHRoZSBzdHJlYW0uCi1EZWZhdWx0U2l0ZVBhcnNlci5Xcm9uZ1BhcnNpbmdTdGFjaz0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5leHBlY3RlZCBQYXJzaW5nIFN0YWNrOiBcInswfVwiCi1EZWZhdWx0U2l0ZVBhcnNlci5Vbmtub3duRWxlbWVudD0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5rbm93biBlbGVtZW50IFwiezB9XCIgaW4gcGFyc2luZyBzdGF0ZSBcInsxfVwiLiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIFhNTCBmaWxlLgotRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93blN0YXJ0U3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVua25vd24gc3RhcnQgc3RhdGUgXCJ7MH1cIi4KLURlZmF1bHRTaXRlUGFyc2VyLk1pc3Npbmc9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFRoZSBcInswfVwiIHRhZyBvZiB0aGUgZWxlbWVudCBcInsxfVwiIGlzIG51bGwgb3IgZW1wdHkuIFZhbHVlIGlzIHJlcXVpcmVkLgotRGVmYXVsdFNpdGVQYXJzZXIuUGFyc2luZ1N0YWNrQmFja1RvSW5pdGlhbFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBQYXJzaW5nIHN0YWNrIGJhY2sgdG8gSW5pdGlhbCBTdGF0ZS4KLURlZmF1bHRTaXRlUGFyc2VyLkVsZW1lbnRBbHJlYWR5U2V0PSBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBFbGVtZW50OiBcInswfVwiIGFscmVhZHkgc2V0IGZvciB0aGUgU2l0ZS4KLURlZmF1bHRTaXRlUGFyc2VyLkNhdGVnb3J5QWxyZWFkeVNldD0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gRWxlbWVudDogXCJ7MH1cIjogXCJ7MX1cIiBhbHJlYWR5IHNldCBmb3IgdGhlIFNpdGUuCi1EZWZhdWx0U2l0ZVBhcnNlci5Vbmtub3duRW5kU3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVua25vd24gZW5kIHN0YXRlIFwiezB9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlci5FcnJvclBhcnNpbmc9IEVycm9yIFBhcnNpbmcgc2l0ZSBzdHJlYW0uIEVycm9yOiBcInswfVwiCi1EZWZhdWx0U2l0ZVBhcnNlci5FcnJvcmxpbmVDb2x1bW5NZXNzYWdlPSBFcnJvciBQYXJzaW5nIHNpdGUgc3RyZWFtLiBFbGVtZW50IFwiezB9XCIgbGluZTogXCJ7MX1cIiBjb2x1bW46XCJ7Mn1cIi4gRXJyb3I6IFwiezN9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlci5FcnJvclBhcnNpbmdTaXRlPSBFcnJvciBQYXJzaW5nIHNpdGUgc3RyZWFtLgotRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93blN0YXRlPSBVbmtub3duIFN0YXRlIFwiezB9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlci5JbnZhbGlkWE1MU3RyZWFtPSBUaGUgWE1MIHN0cmVhbSBpcyBub3QgYSB2YWxpZCBkZWZhdWx0IFwic2l0ZS54bWxcIiBmaWxlLiBUaGUgcm9vdCB0YWcgaXMgbm90IHNpdGUuCi1Nb2RlbE9iamVjdC5Nb2RlbFJlYWRPbmx5PSBJbnRlcm5hbCBFcnJvci4gVGhlIE1vZGVsIE9iamVjdCBpcyByZWFkLW9ubHkuCi1TaXRlTW9kZWxPYmplY3QuRXJyb3JQYXJzaW5nU2l0ZVN0cmVhbT0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4KLVNpdGVNb2RlbE9iamVjdC5FcnJvckFjY2Vzc2luZ1NpdGVTdHJlYW09IEVycm9yIGFjY2Vzc2luZyBzaXRlIHN0cmVhbS4KLUluc3RhbGxDb25maWd1cmF0aW9uLlBhcnNpbmdFcnJvckR1cmluZ0NyZWF0aW9uPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIFwiezB9XCI6IFwiezF9XCIuCi1JbnN0YWxsQ29uZmlndXJhdGlvbi5FcnJvckR1cmluZ0ZpbGVBY2Nlc3M9IEVycm9yIGFjY2Vzc2luZyBmaWxlOiBcInswfVwiLgotUGFyc2VyLlVuYWJsZVRvQ3JlYXRlVVJMPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHN0cmVhbS4gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBVUkxzLgotUGFyc2VyLkludGVybmFsRXJyb3I9IEVycm9yIFBhcnNpbmcgU3RyZWFtLiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gXCJ7MH1cIi4KLVBhcnNlci5VbmFibGVUb1Jlc29sdmVVUkw9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc3RyZWFtLiBVbmFibGUgdG8gcmVzb2x2ZSBVUkwgXCJ7MH1cIi4KLUluc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyLkZlYXR1cmVSZWZlcmVuY2VOb1VSTD0gRXJyb3IgUGFyc2luZyBTdHJlYW0uIEEgZmVhdHVyZSByZWZlcmVuY2UgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgVVJMIHRhZy4gVmFsdWUgaXMgcmVxdWlyZWQuCi1GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5GaWxlRG9lc05vdEV4aXN0PSBUaGUgZmlsZSBcInswfVwiIGRvZXMgbm90IGV4aXN0LgotRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuSW52YWxpZERpcmVjdG9yeT0gVGhlIHBhdGggXCJ7MH1cIiBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnkuCi1GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb0NyZWF0ZVVSTEZvcj1VbmFibGUgdG8gY3JlYXRlIGEgVVJMIGZvciBcInswfVwiLgotRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9SZXRyaWV2ZUFyY2hpdmU9RXJyb3IgcmV0cmlldmluZyB0aGUgYXJjaGl2ZSBlbnRyeTogXCJ7MH1cIi4KLUZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLlVuYWJsZVRvUmV0cmlldmVOb25QbHVnaW5FbnRyeT1FcnJvciByZXRyaWV2aW5nIHRoZSBub24tcGx1Zy1pbiBlbnRyeTogXCJ7MH1cIi4gCi1GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb1JldHJpZXZlRmVhdHVyZUVudHJ5PUVycm9yIHJldHJpZXZpbmcgZmVhdHVyZSBlbnRyeSBjb250ZW50IHJlZmVyZW5jZTogXCJ7MH1cIi4KLUZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLlVuYWJsZVRvUmV0cmlldmVQbHVnaW5FbnRyeSA9RXJyb3IgcmV0cmlldmluZyB0aGUgcGx1Zy1pbiBlbnRyeTogXCJ7MH1cIi4gCi1Db25maWd1cmVkU2l0ZS5Ob25JbnN0YWxsYWJsZVNpdGU9IFlvdSBjYW5ub3QgaW5zdGFsbCBpbiB0aGUgc2l0ZSBcInswfVwiLiBJdCBpcyBjb25zaWRlcmVkIG5vbiB1cGRhdGVhYmxlLgotQ29uZmlndXJlZFNpdGUuTnVsbEZlYXR1cmVUb0luc3RhbGw9IEludGVybmFsIEVycm9yLiBUaGUgZmVhdHVyZSB0byBiZSBpbnN0YWxsZWQgaXMgbnVsbC4KLUNvbmZpZ3VyZWRTaXRlLk5vblVuaW5zdGFsbGFibGVTaXRlPSBZb3UgY2Fubm90IHVuaW5zdGFsbCBmcm9tIHRoZSBzaXRlIFwiezB9XCIuIEl0IGlzIGNvbnNpZGVyZWQgbm9uIHVwZGF0ZWFibGUuCi1Db25maWd1cmVkU2l0ZS5Ob1NpdGU9IE5vIFNpdGUKLUNvbmZpZ3VyZWRTaXRlLkNhbm5vdEZpbmRGZWF0dXJlVG9VbmNvbmZpZ3VyZT0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byBkaXNhYmxlIGZlYXR1cmUgXCJ7MH1cIiBvbiBzaXRlIFwiezF9XCIuIENhbm5vdCBmaW5kIGZlYXR1cmUuCi1Db25maWd1cmVkU2l0ZS5DYW5ub3RGaW5kRmVhdHVyZVRvQ29uZmlndXJlPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGVuYWJsZSBmZWF0dXJlIFwiezB9XCIuIENhbm5vdCBmaW5kIGZlYXR1cmUuIAotQ29uZmlndXJlZFNpdGUuQ2Fubm90RmluZFBsdWdpbkVudHJ5PSBVbmFibGUgdG8gcmV0cmlldmUgUGx1Zy1pbiBFbnRyeSBcInswfVwiIG9uIHNpdGUgXCJ7MX1cIi4gQ2Fubm90IGZpbmQgcGx1Zy1pbiBlbnRyeS4gRG8geW91IHdhbnQgdG8gQ29udGludWUgPwotQ29uZmlndXJlZFNpdGUuTWlzc2luZ1BsdWdpbnNCcm9rZW5GZWF0dXJlPSBQbHVnLWluIFwiezB9XCIgdmVyc2lvbiBcInsxfVwiIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlIGlzIG1pc3NpbmcuCi1Db25maWd1cmVkU2l0ZS5VbmFibGVUb1JlbW92ZUNvbmZpZ3VyZWRGZWF0dXJlPSBVbmFibGUgdG8gcmVtb3ZlIGEgZW5hYmxlZCBmZWF0dXJlOiBcInswfVwiIFlvdSBtdXN0IGRpc2FibGUgdGhlIGZlYXR1cmUgZmlyc3QuCi1Db25maWd1cmVkU2l0ZS5VbmFibGVUb0ZpbmRGZWF0dXJlPSBVbmFibGUgdG8gRmluZCB0aGUgZmVhdHVyZSBcInswfVwiIG9uIHRoaXMgc2l0ZS4KLUNvbmZpZ3VyZWRTaXRlLlNpdGVVUkxOdWxsPVRoZSBTaXRlIFVSTCBpcyBudWxsLgotQ29uZmlndXJlZFNpdGUuTm9uTG9jYWxTaXRlPVRoZSBTaXRlIGlzIG5vdCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uIENhbm5vdCB2YWxpZGF0ZS4gCi1Db25maWd1cmVkU2l0ZS5Ob3RTYW1lUHJvZHVjdElkPVRoZSBzaXRlIGNhbm5vdCBiZSBtb2RpZmllZCBieSB0aGlzIHByb2R1Y3QuIEl0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHByb2R1Y3Q6IFwiezB9XCIuCi1Db25maWd1cmVkU2l0ZS5Db250YWluZWRJbkFub3RoZXJTaXRlPVRoaXMgc2l0ZSBpcyBjb250YWluZWQgaW4gYW5vdGhlciBzaXRlOiBcInswfVwiLgotQ29uZmlndXJlZFNpdGUuUmVhZE9ubHlTaXRlPVRoZSBzaXRlIGlzIG1hcmtlZCBhcyByZWFkIG9ubHkuCi1Db25maWd1cmVkU2l0ZS5VbmFibGVSZXNvbHZlVVJMPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIHJlc29sdmUgVVJMIFwiezB9XCIuCi1Db25maWd1cmVkU2l0ZS5VbmFibGVUb0FjY2Vzc1NpdGU9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gYWNjZXNzIHBsYXRmb3JtIHNpdGUgXCJ7MH1cIi4KLUZlYXR1cmVGYWN0b3J5LkNyZWF0aW5nRXJyb3I9IEVycm9yIGNyZWF0aW5nIGZlYXR1cmUgXCJ7MH1cIi4KLUZlYXR1cmVNb2RlbEZhY3RvcnkuRXJyb3JBY2Nlc2luZ0ZlYXR1cmVTdHJlYW09IEVycm9yIGFjY2Vzc2luZyBmZWF0dXJlIHN0cmVhbS4KLUZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeS5OdWxsVVJMPSBFcnJvciBjcmVhdGluZyBmZWF0dXJlLiBUaGUgVVJMIHVzZWQgdG8gY3JlYXRlIHRoZSBmZWF0dXJlIGlzIG51bGwuCi1GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkuQ2Fubm90Q3JlYXRlVVJMPSBFcnJvciBjcmVhdGluZyBmZWF0dXJlLiBVbmFibGUgdG8gY3JlYXRlIFVSTCBmb3IgXCJ7MH1cIi4KLUZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5Ob01hbmlmZXN0RmlsZT0gVW5hYmxlIHRvIHJldHJpZXZlIFwiezB9XCIgaW4gZmVhdHVyZSBsb2NhdGVkIGF0IFwiezF9XCIuIAotRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLk5vRmVhdHVyZT0gTm8gZmVhdHVyZQotRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLkZpbGVEb2VzTm90RXhpc3Q9IFRoZSBGaWxlIFwiezB9XCIgZG9lcyBub3QgZXhpc3QuCi1GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuSW52YWxpZERpcmVjdG9yeT0gVGhlIGRpcmVjdG9yeSBcInswfVwiIGlzIG5vdCBhIHZhbGlkIGRpcmVjdG9yeS4KLUZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5FcnJvclJldHJpZXZpbmc9IEVycm9yIHJldHJpZXZpbmcgXCJ7MH1cIi4KLUZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5Db250ZW50UmVmZXJlbmNlU3RyaW5nPSBmcm9tIFwiezB9XCIKLUZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5VUkxTdHJpbmc9IGxvY2F0ZWQgYXQgXCJ7MH1cIgotRmVhdHVyZVJlZmVyZW5jZS5VbmFibGVUb1Jlc29sdmVVUkw9IEludGVybmFsIEVycm9yOiBVbmFibGUgdG8gcmVzb2x2ZSBtb2RlbCB1c2luZyBVUkw6IFwiezB9XCIuCi1GZWF0dXJlVHlwZUZhY3RvcnkuVW5hYmxlVG9GaW5kRmVhdHVyZUZhY3Rvcnk9IFVuYWJsZSB0byBmaW5kIGEgZmVhdHVyZSBmYWN0b3J5IGZvciB0aGUgZXh0ZW5zaW9uIGlkIFwiezB9XCIuIAotSW5zdGFsbENvbmZpZ3VyYXRpb24uVW5hYmxlVG9TYXZlQ29uZmlndXJhdGlvbj0gVW5hYmxlIHRvIHNhdmUgY29uZmlndXJhdGlvbiBpbiBcInswfVwiLgotSW5zdGFsbENvbmZpZ3VyYXRpb24uVW5hYmxlVG9FbmNvZGVDb25maWd1cmF0aW9uPSBVbmFibGUgdG8gZW5jb2RlIGNvbmZpZ3VyYXRpb24gaW4gXCJ7MH1cIi4KLUluc3RhbGxDb25maWd1cmF0aW9uLlVuYWJsZVRvQ3JlYXRlVVJMPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCi1JbnN0YWxsQ29uZmlndXJhdGlvbi5VbmFibGVUb0Nhc3Q9IEludGVybmFsIEVycm9yLiBUaGUgQ29uZmlndXJhdGlvbiBTaXRlIG9iamVjdCBpcyBub3QgYSBzdWJjbGFzcyBvZiBDb25maWd1cmVkU2l0ZU1vZGVsCi1JbnN0YWxsQ29uZmlndXJhdGlvbi5VbmFibGVUb1NhdmVQbGF0Zm9ybUNvbmZpZ3VyYXRpb249VW5hYmxlIHRvIHNhdmUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBpbiBcInswfVwiLgotSW5zdGFsbENvbmZpZ3VyYXRpb24uQWxyZWFkeU5hdGl2ZWx5TGlua2VkPVRoZSBzaXRlIGlzIGFscmVhZHkgbGlua2VkLgotSW5zdGFsbENvbmZpZ3VyYXRpb24uQWxyZWFkeVByb2R1Y3RTaXRlPVRoZSBsb2NhdGlvbiBpcyBhbHJlYWR5IGEgcHJvZHVjdCBzaXRlLgotSW5zdGFsbENvbmZpZ3VyYXRpb24uTm90QW5FeHRlbnNpb25TaXRlPVRoZSBzaXRlIGNhbm5vdCBiZSBsaW5rZWQgdG8uIEl0IGlzIG5vdCBhbiBleHRlbnNpb24gc2l0ZS4KLUludGVybmFsU2l0ZU1hbmFnZXIuVW5hYmxlVG9DcmVhdGVTaXRlV2l0aFR5cGU9IEV4dGVuc2lvbiBFcnJvci4gVGhlIFNpdGUgRmFjdG9yeSBvZiB0eXBlIFwiezB9XCIgY2Fubm90IGFjY2VzcyB0aGUgU2l0ZSBcInsxfVwiLgotSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0FjY2Vzc1VSTD0gVW5hYmxlIHRvIGFjY2VzcyBcInswfVwiLgotSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0NyZWF0ZVVSTD0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgotSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb1BhcnNlVVJMPSBVbmFibGUgdG8gcGFyc2UgdGhlIHN0cmVhbSBcInswfVwiLgotSW50ZXJuYWxTaXRlTWFuYWdlci5GYWlsZWRSZXRyeUFjY2Vzc2luZ1NpdGU9IEZhaWxlZCByZXRyeSBhY2Nlc3Npbmcgc2l0ZSB1c2luZyBkZWZhdWx0IGluc3RhbGxlZCBmb3JtYXQgaW5zdGVhZCBvZiBkZWZhdWx0IHBhY2thZ2VkIGZvcm1hdC4KLUludGVybmFsU2l0ZU1hbmFnZXIuQ29ubmVjdGluZ1RvU2l0ZSA9IENvbm5lY3RpbmcgVG8gU2l0ZS4uLgotU2l0ZVJlY29uY2lsZXIuVW5hYmxlVG9GaW5kSW5zdGFsbERlbHRhRmFjdG9yeT0gSW50ZXJuYWwgRXJyb3I6IFVuYWJsZSB0byBmaW5kIGZhY3RvcnkgdG8gZGlzcGxheSBjaGFuZ2VzLiBPcGVuIHRoZSBVcGRhdGUgTWFuYWdlciBtYW51YWxseS4KLVBvbGljeS5Ob01lc3NhZ2VBdmFpbGFibGU9IE5vIG1lc3NhZ2UgYXZhaWxhYmxlLgotUG9saWN5Lk1pc3NpbmdNZXNzYWdlPSBNaXNzaW5nIG1lc3NhZ2U6IFwiezB9XCIuCi1Qb2xpY3kuTWlzc2luZz0gbWlzc2luZyBcInswfVwiLgotR2xvYmFsQ29uc3VtZXIuRXJyb3JDcmVhdGluZ0ZpbGU9IFVuYWJsZSB0byBjcmVhdGUgZmlsZSBcInswfVwiLgotU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIuVW5hYmxlVG9DcmVhdGVVUkw9IFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KLVNpdGVGaWxlQ29udGVudENvbnN1bWVyLlVuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZT0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIHRoZSBmaWxlIFwiezB9XCIuCi1Db250ZW50Q29uc3VtZXIuVW5hYmxlVG9SZW5hbWUgPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIHJlbmFtZSBcInswfVwiIHRvIFwiezF9XCIuCi1TaXRlRmlsZUZhY3RvcnkuVW5hYmxlVG9SZXRyaXZlU2l0ZT0gVW5hYmxlIHJldHJpZXZlIHRoaXMgU2l0ZSBmcm9tIGEgZGlyZWN0b3J5LiBUaGUgVVJMIHNob3VsZCBwb2ludCB0byBhIGZpbGUgaW5zdGVhZC4KLVNpdGVGaWxlRmFjdG9yeS5VbmFibGVUb09idGFpblBhcmVudERpcmVjdG9yeT0gVW5hYmxlIG9idGFpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSBmcm9tIHRoZSBmaWxlIFwiezB9XCIuCi1TaXRlRmlsZUZhY3RvcnkuRmlsZURvZXNOb3RFeGlzdD0gVW5hYmxlIHRvIGFjY2VzcyBzaXRlIFwiezB9XCIuIFRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCi1TaXRlRmlsZUZhY3RvcnkuVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCi1TaXRlRmlsZUZhY3RvcnkuRXJyb3JQYXJzaW5nRmlsZT0gVW5hYmxlIHRvIHBhcnNlIGZpbGUgXCJ7MH1cIi4KLVNpdGVGaWxlRmFjdG9yeS5FcnJvckFjY2Vzc2luZz0gVW5hYmxlIHRvIGFjY2VzcyBmaWxlIFwiezB9XCIuCi1TaXRlVHlwZUZhY3RvcnkuVW5hYmxlVG9GaW5kU2l0ZUZhY3Rvcnk9IFVuYWJsZSB0byBmaW5kIGEgc2l0ZSBmYWN0b3J5IGZvciB0aGUgZXh0ZW5zaW9uIGlkIFwiezB9XCIuIAotVXBkYXRlTWFuYWdlclV0aWxzLlVuYWJsZVRvUmVtb3ZlRmlsZT0gVW5hYmxlIHRvIHJlbW92ZSBcInswfVwiIGZyb20gdGhlIGZpbGUgc3lzdGVtLgotVXBkYXRlTWFuYWdlclV0aWxzLkZpbGVBbHJlYWR5RXhpc3RzPSBVbmFibGUgdG8gY3JlYXRlIFwiezB9XCIgb24gdGhlIGZpbGUgc3lzdGVtLiBGaWxlIGFscmVhZHkgZXhpc3RzLgotU2l0ZUxvY2FsLkVycm9yUGFyc2luZ1NhdmVkU3RhdGU9IEVycm9yIGR1cmluZyBwYXJzaW5nIG9mIHRoZSBjb25maWd1cmF0aW9uIHNhdmVkIHN0YXRlIFwiezB9XCIuCi1TaXRlTG9jYWwuVW5hYmxlVG9DcmVhdGVVUkxGb3I9IFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KLVNpdGVMb2NhbC5VbmFibGVUb0FjY2Vzc0ZpbGU9IFVuYWJsZSB0byBhY2Nlc3MgZmlsZSBcInswfVwiLgotU2l0ZUxvY2FsLlVuYWJsZVRvU2F2ZVN0YXRlSW49IFVuYWJsZSB0byBwZXJzaXN0IGNvbmZpZ3VyYXRpb25zIGludG8gXCJ7MH1cIi4KLVNpdGVMb2NhbC5VbmFibGVUb0VuY29kZUNvbmZpZ3VyYXRpb249IFVuYWJsZSB0byBlbmNvZGUgY29uZmlndXJhdGlvbnMgaW50byBcInswfVwiLgotU2l0ZUxvY2FsLlVuYWJsZVRvUmVzb2x2ZT0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byByZXNvbHZlIFwiezB9XCIuCi1TaXRlTG9jYWwuVW5hYmxlVG9SZXRyaWV2ZVJXQXJlYT0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byByZXRyaWV2ZSBsb2NhdGlvbiB0byB3cml0ZSBtZXRhZGF0YS4KLVNpdGVMb2NhbC5TaXRlVXJsSXNOdWxsPSBJbnRlcm5hbCBFcnJvcjogVVJMIG9mIGxvY2FsIHNpdGUgaXMgbnVsbC4KLVNpdGVMb2NhbC5VbmFibGVUb0RldGVybWluZUZlYXR1cmVTdGF0dXNTaXRlTnVsbD1VbmFibGUgdG8gZGV0ZXJtaW5lIHN0YXR1cyBvZiBmZWF0dXJlXCJ7MH1cIiBUaGUgc2l0ZSBpcyBOVUxMLgotU2l0ZUxvY2FsLlR3b1ZlcnNpb25TYW1lUGx1Z2luMT1QbHVnLWluOiBcInswfVwiIHZlcnNpb246IFwiezF9XCIgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUgaXMgbm90IGluY2x1ZGVkIGF0IHJ1bnRpbWUuIFJ1bnRpbWUgaW5jbHVkZXMgcGx1Zy1pbiB2ZXJzaW9uIFwiezJ9XCIuCi1TaXRlTG9jYWwuVHdvVmVyc2lvblNhbWVQbHVnaW4yPVBsdWctaW46IFwiezB9XCIgdmVyc2lvbjogXCJ7MX1cIiByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZSBpcyBub3QgaW5jbHVkZWQgYXQgcnVudGltZS4gUnVudGltZSBpbmNsdWRlcyBwbHVnLWluIHZlcnNpb24gXCJ7Mn1cIiBzdXBwbGllZCBieSBmZWF0dXJlIFwiezN9XCIgdmVyc2lvbiBcIns0fVwiLgotU2l0ZUxvY2FsLkZlYXR1cmVVbkhhcHB5PVRoZSBmZWF0dXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LgotU2l0ZUxvY2FsLkZlYXR1cmVIYXBweT1UaGUgZmVhdHVyZSBpcyBjb25maWd1cmVkIHByb3Blcmx5LgotU2l0ZUxvY2FsLkZlYXR1cmVBbWJpZ3VvdXM9VGhlIGZlYXR1cmUgbWF5IG5vdCBiZSBjb25maWd1cmVkIHByb3Blcmx5LgotU2l0ZUxvY2FsLk5lc3RlZEZlYXR1cmVVbkhhcHB5PUluY2x1ZGVkIGZlYXR1cmUgXCJ7MH1cIiB2ZXJzaW9uIFwiezF9XCIgY29udGFpbnMgcHJvYmxlbXMuCi1TaXRlTG9jYWwuTmVzdGVkRmVhdHVyZVVuYXZhaWxhYmxlPUluY2x1ZGVkIGZlYXR1cmUgXCJ7MH1cIiBpcyBtaXNzaW5nLgotU2l0ZUxvY2FsLk5vUGx1Z2luVmVyc2lvbj1ObyBwbHVnLWluOiBcInswfVwiIGluY2x1ZGVkIGF0IHJ1bnRpbWUuCi1TaXRlTG9jYWwuVW5hYmxlVG9EZXRlcm1pbmVGZWF0dXJlU3RhdHVzQ29uZmlndXJlZFNpdGVOdWxsPVVuYWJsZSB0byBkZXRlcm1pbmUgc3RhdHVzIG9mIGZlYXR1cmVcInswfVwiIFRoZSBDb25maWd1cmVkIFNpdGUgaXMgTlVMTC4KLVNpdGVMb2NhbC5GZWF0dXJlRGlzYWJsZT1UaGUgZmVhdHVyZSBpcyBkaXNhYmxlZC4KLVNpdGVMb2NhbC5GZWF0dXJlU3RhdHVzVW5rbm93bj1Vbmtub3duIHN0YXRlLgotU2l0ZUxvY2FsLk5lc3RlZEZlYXR1cmVEaXNhYmxlPUluY2x1ZGVkIGZlYXR1cmUgXCJ7MH1cIiB2ZXJzaW9uIFwiezF9XCIgaXMgZGlzYWJsZWQuCi1TaXRlTG9jYWwuTnVsbEZlYXR1cmU9VGhlIGZlYXR1cmUgaXMgbnVsbC4KLVNpdGVMb2NhbC5Xcm9uZ1VSTD1BIFVSTCBvZiBhbiBPcmlnaW5hdGluZyBzaXRlIGlzIG5vdCB2YWxpZC4KLVNpdGVSZWNvbmNpbGVyLlVuYWJsZVRvU2F2ZVN0YXRlSW49IFVuYWJsZSB0byBwZXJzaXN0IGRlbHRhIGNoYW5nZSBpbnRvIFwiezB9XCIuCi1TaXRlUmVjb25jaWxlci5VbmFibGVUb0VuY29kZUNvbmZpZ3VyYXRpb249IFVuYWJsZSB0byBlbmNvZGUgZGVsdGEgY2hhbmdlIGludG8gXCJ7MH1cIi4KLVNpdGVVUkxGYWN0b3J5LlVuYWJsZVRvQ3JlYXRlVVJMPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGNyZWF0ZSBhIFVSTCBmcm9tIFwiezB9XCIuCi1TaXRlVVJMRmFjdG9yeS5VbmFibGVUb0FjY2Vzc1NpdGVTdHJlYW09IFVuYWJsZSB0byBhY2Nlc3Mgc2l0ZTogXCJ7MH1cIgotSmFyVmVyaWZpZXIuVmVyaWZ5PSBWZXJpZnlpbmc6IFwiezB9XCIKLUphclZlcmlmaWVyLlVuYWJsZVRvRmluZEVuY3J5cHRpb249IFVuYWJsZSB0byBmaW5kIGFsZ29yaXRobSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIEtleVN0b3JlIFwiezB9XCIuCi1KYXJWZXJpZmllci5VbmFibGVUb0xvYWRDZXJ0aWZpY2F0ZT0gVW5hYmxlIHRvIGxvYWQgb25lIG9yIG11bHRpcGxlcyBjZXJ0aWZpY2F0ZXMgaW4gdGhlIEtleVN0b3JlIFwiezB9XCIuCi1KYXJWZXJpZmllci5VbmFibGVUb0ZpbmRQcm92aWRlckZvcktleXN0b3JlPSBVbmFibGUgdG8gZmluZCBwcm92aWRlciBmb3IgdGhlIEtleVN0b3JlIHR5cGUgXCJ7MH1cIi4KLUphclZlcmlmaWVyLktleVN0b3JlTm90TG9hZGVkPSBJbnRlcm5hbCBFcnJvci4gS2V5U3RvcmUgbm90IEluaXRpYWxpemVkL0xvYWRlZC4KLUphclZlcmlmaWVyLlVuYWJsZVRvQWNjZXNzSmFyPSBVbmFibGUgdG8gYWNjZXNzIEpBUiBmaWxlIFwiezB9XCIuCi1KYXJWZXJpZmllci5JbnZhbGlkRmlsZT0gVGhlIEZpbGUgXCJ7MH1cIiBpcyBub3QgYSB2YWxpZCBKQVIgZmlsZS4gSXQgZG9lcyBub3QgY29udGFpbiBhIE1hbmlmZXN0LgotSmFyVmVyaWZpZXIuSW52YWxpZEphcj0gVGhlIEZpbGUgXCJ7MH1cIiBpcyBub3QgYSB2YWxpZCBKQVIgZmlsZS4KLUphclZlcmlmaWNhdGlvblJlc3VsdC5WYWxpZEJldHdlZW49IFZhbGlkIGJldHdlZW4gXCJ7MH1cIiBhbmQgXCJ7MX1cIi4KLUphclZlcmlmaWNhdGlvblJlc3VsdC5FeHBpcmVkQ2VydGlmaWNhdGU9ICogRVhQSVJFRCBDRVJUSUZJQ0FURSAqCi1KYXJWZXJpZmljYXRpb25SZXN1bHQuQ2VydGlmaWNhdGVOb3RZZXRWYWxpZD0gKiBDRVJUSUZJQ0FURSBOT1QgWUVUIFZBTElEICoKLUphclZlcmlmaWNhdGlvblJlc3VsdC5DZXJ0aWZpY2F0ZVZhbGlkPSBWYWxpZCBjZXJ0aWZpY2F0ZS4KLUphclZlcmlmaWNhdGlvblNlcnZpY2UuVW5zdWNlc3NmdWxWZXJpZmljYXRpb249VmVyaWZpY2F0aW9uIG9mIGZlYXR1cmUgdW5zdWNjZXNzZnVsLiBJbnN0YWxsYXRpb24gY2FuY2VsbGVkLgotSmFyVmVyaWZpY2F0aW9uU2VydmljZS5DYW5jZWxJbnN0YWxsPUluc3RhbGxhdGlvbiBjYW5jZWxsZWQuCi1VcGRhdGVNYW5hZ2VyVXRpbHMuVW5hYmxlVG9Mb2c9VW5hYmxlIHRvIGFjY2VzcyBlcnJvciByZWNvdmVyeSBsb2cgZmlsZTogXCJ7MH1cIi4KLUNvbmZpZ3VyYXRpb25Qb2xpY3kuVW5hYmxlVG9EaXNhYmxlPSBVbmFibGUgdG8gZGlzYWJsZSBmZWF0dXJlIFwiezB9XCIuCi1Db25maWd1cmF0aW9uUG9saWN5LlBhcmVudElzRW5hYmxlPSBUaGUgcGFyZW50IGZlYXR1cmU6IFwiezB9XCIgaXMgZW5hYmxlLgotQ29ubmVjdGlvblRocmVhZE1hbmFnZXIudG9vTWFueUNvbm5lY3Rpb25zID0gVGhlcmUgYXJlIHRvbyBtYW55IG5ldHdvcmsgY29ubmVjdGlvbnMgc3RpbGwgYWN0aXZlLiBcCi1JZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBuZXR3b3JrIHByb2JsZW1zLCB0cnkgYWdhaW4gbGF0ZXIuIElmIHRoZSBlcnJvciBwZXJzaXN0cywgcmVzdGFydCB0aGUgXAotYXBwbGljYXRpb24uCi1Db25uZWN0aW9uVGhyZWFkTWFuYWdlci51bnJlc3BvbnNpdmVVUkwgPSBTdGlsbCB3YWl0aW5nIGZvciByZXNwb25zZTogezB9Ci1JbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UuZmVhdHVyZVVuaW5zdGFsbGVkPSBGZWF0dXJlIHswfSBpcyB1bmluc3RhbGxlZC4KLQotIyBQcm9wZXJ0aWVzIG1vdmVkIG1vc3RseSBmcm9tIHRoZSB1aSBwbHVnaW4KLQotQWN0aXZpdHlDb25zdHJhaW50cy53YXJuaW5nPVRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gY29udGFpbnMgZXJyb3JzIGFuZCB0aGlzIG9wZXJhdGlvbiBjYW4gaGF2ZSB1bnByZWRpY3RhYmxlIHJlc3VsdHMuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnJvb3RNZXNzYWdlID0gUmVxdWVzdGVkIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgaXQgd291bGQgaW52YWxpZGF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBTZWUgZGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLUFjdGl2aXR5Q29uc3RyYWludHMucm9vdE1lc3NhZ2VJbml0aWFsID0gQ3VycmVudCBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGVycm9ycyB0aGF0IGFyZSBub3QgY29ycmVjdGVkIGJ5IHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGFuZCBtb3JlIGVycm9ycyB3b3VsZCBiZSBpbnRyb2R1Y2VkLiBTZWUgZGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLUFjdGl2aXR5Q29uc3RyYWludHMuYmVmb3JlTWVzc2FnZSA9IC0tLS0tIEN1cnJlbnQgY29uZmlndXJhdGlvbiBwcm9ibGVtcyAtLS0tLQotQWN0aXZpdHlDb25zdHJhaW50cy5hZnRlck1lc3NhZ2UgPSAtLS0tLSBDb25maWd1cmF0aW9uIHByb2JsZW1zIGFmdGVyIHRoZSBvcGVyYXRpb24gLS0tLS0KLUFjdGl2aXR5Q29uc3RyYWludHMucGxhdGZvcm0gPSBSZXN1bHRpbmcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBwbGF0Zm9ybS4KLUFjdGl2aXR5Q29uc3RyYWludHMucHJpbWFyeSA9IFJlc3VsdGluZyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlIHByaW1hcnkgZmVhdHVyZS4KLUFjdGl2aXR5Q29uc3RhaW50cy5wcmVyZXEucGx1Z2luID0gcGx1Zy1pbgotQWN0aXZpdHlDb25zdGFpbnRzLnByZXJlcS5mZWF0dXJlID0gZmVhdHVyZQotQWN0aXZpdHlDb25zdHJhaW50cy5wcmVyZXEgPSByZXF1aXJlcyB7MH0gInsxfSIuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcVBlcmZlY3QgPSByZXF1aXJlcyB7MH0gInsxfSAoezJ9KSIuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUVxdWl2YWxlbnQgPSByZXF1aXJlcyB7MH0gInsxfSAoezJ9KSIsIG9yIGVxdWl2YWxlbnQuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUNvbXBhdGlibGUgPSByZXF1aXJlcyB7MH0gInsxfSAoezJ9KSIsIG9yIGNvbXBhdGlibGUuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUdyZWF0ZXJPckVxdWFsID0gcmVxdWlyZXMgezB9ICJ7MX0gKHsyfSkiLCBvciBsYXRlciB2ZXJzaW9uLgotQWN0aXZpdHlDb25zdHJhaW50cy5vcyA9IG9wZXJhdGluZyBzeXN0ZW0gZG9lcyBub3QgbWF0Y2ggY3VycmVudCBlbnZpcm9ubWVudC4KLUFjdGl2aXR5Q29uc3RyYWludHMud3MgPSB3aW5kb3dpbmcgc3lzdGVtIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgZW52aXJvbm1lbnQuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLmFyY2ggPSBwbGF0Zm9ybSBhcmNoaXRlY3R1cmUgZG9lcyBub3QgbWF0Y2ggY3VycmVudCBlbnZpcm9ubWVudC4KLUFjdGl2aXR5Q29uc3RyYWludHMuY3ljbGUgPSBkZWZpbml0aW9uIGNvbnRhaW5zIGEgbmVzdGVkIGZlYXR1cmVzIGN5Y2xlOiB7MH1fezF9cHJlcmVxCi1BY3Rpdml0eUNvbnN0cmFpbnRzLmNvbmZsaWN0ID0gVXBkYXRlIGNvbmZsaWN0IGRldGVjdGVkIChzZWUgZGV0YWlscykuIFBsZWFzZSBkZXNlbGVjdCB0aGlzIHVwZGF0ZSBhbmQgdHJ5IGFnYWluLgotQWN0aXZpdHlDb25zdHJhaW50cy5jaGlsZE1lc3NhZ2UgPSB7MH0gKHsxfSkgezJ9Ci1BY3Rpdml0eUNvbnN0cmFpbnRzLm9wdGlvbmFsQ2hpbGQgPSBGZWF0dXJlIGluY2x1ZGVkIGluIGFub3RoZXIgZmVhdHVyZSBjYW5ub3QgYmUgZW5hYmxlZCBpZiB0aGUgcGFyZW50IGlzIGRpc2FibGVkLiBFbmFibGUgdGhlIHBhcmVudCBmaXJzdC4KLUFjdGl2aXR5Q29uc3RyYWludHMucGF0Y2hVbmNvbmZpZ3VyZSA9IGlzIGEgcGF0Y2ggYW5kIGNhbm5vdCBiZSBkaXJlY3RseSBkaXNhYmxlZC4gVXNlICdSZXZlcnQnIHRvIHJlc3RvcmUgXAotdGhlIGxhc3QgY29uZmlndXJhdGlvbiBiZWZvcmUgdGhlIHBhdGNoIHdhcyBpbnN0YWxsZWQuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnBhdGNoVW5jb25maWd1cmVCYWNrdXAgPSBpcyBhIHBhdGNoIGFuZCBjYW5ub3QgYmUgZGlyZWN0bHkgZGlzYWJsZWQuIFVzZSAnUmV2ZXJ0JyB0byByZXN0b3JlIFwKLWNvbmZpZ3VyYXRpb24gInswfSIgaW4gU2F2ZWQgQ29uZmlndXJhdGlvbnMuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnRpbWVsaW5lID0gQ2Fubm90IHJldmVydCB0byAiezB9IiBiZWNhdXNlIGl0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLUFjdGl2aXR5Q29uc3RyYWludHMuZXhjbHVzaXZlID0gbXVzdCBiZSBwcm9jZXNzZWQgc2VwYXJhdGVseSBmcm9tIG90aGVyIGZlYXR1cmVzLgotQWN0aXZpdHlDb25zdHJhaW50cy5ub0xpY2Vuc2UgPSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgbGljZW5zZSBhZ3JlZW1lbnQuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnJlYWRPbmx5ID0gVGhlIHNpdGUgaXMgbm90IHVwZGF0ZWFibGU6IHswfS4KLUFjdGl2aXR5Q29uc3RyYWludHMucGxhdGZvcm1Nb2RpZmllZCA9IFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbW9kaWZpZWQgb3V0c2lkZSB0aGlzIHByb2dyYW0uIEEgcmVzdGFydCBpcyByZWNvbW1lbmRlZC4KLUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5jb25mbGljdCA9IFZlcnNpb24gezB9IGluIHsxfQotVXBkYXRlTWFuYWdlci5zYXZlZENvbmZpZyA9IHswfSBiYWNrdXAKLU9wZXJhdGlvbnNNYW5hZ2VyLmVycm9yLnVuYWJsZT17MH06IHVuYWJsZSB0byBsb2NhdGUgY29uZmlndXJhdGlvbiBzaXRlCi1PcGVyYXRpb25zTWFuYWdlci5lcnJvci5vbGQ9IHswfTogRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIG9sZCBmZWF0dXJlIHZlcnNpb24KLU9wZXJhdGlvbnNNYW5hZ2VyLmluc3RhbGxpbmc9SW5pdGlhbGl6aW5nLi4uCi1PcGVyYXRpb25zTWFuYWdlci5lcnJvci51bmluc3RhbGw9IHswfSA6IEVycm9yIHdoaWxlIHVuaW5zdGFsbGluZyBmZWF0dXJlCi1TZWFyY2gubmV0d29ya1Byb2JsZW1zPU5ldHdvcmsgY29ubmVjdGlvbiBwcm9ibGVtcyBlbmNvdW50ZXJlZCBkdXJpbmcgc2VhcmNoLgotTWlzc2luZ0ZlYXR1cmUuaWQ9dW5rbm93bgotTWlzc2luZ0ZlYXR1cmUuZGVzYy51bmtub3duPVRoaXMgZmVhdHVyZSByZWZlcmVuY2UgY2Fubm90IGJlIHJlc29sdmVkLgotTWlzc2luZ0ZlYXR1cmUuZGVzYy5vcHRpb25hbD1UaGlzIGZlYXR1cmUgaXMgcmVmZXJlbmNlZCBhcyBvcHRpb25hbCBhbmQgaXMgY3VycmVudGx5IG5vdCBpbnN0YWxsZWQuCi1NaXNzaW5nRmVhdHVyZS5wcm92aWRlcj1Vbmtub3duCi1JbnN0YWxsQ29uZmlndXJhdGlvbi5sb2NhdGlvbi5leGlzdHMgPSBTaXRlIGFscmVhZHkgZXhpc3RzLgotSW5zdGFsbExvZ1BhcnNlci5lcnJvcnMgPSBFcnJvcnMgZ2VuZXJhdGVkIHdoaWxlIHBhcnNpbmcgaW5zdGFsbGF0aW9uIGhpc3RvcnkgZmlsZS4KLVNpdGVMb2NhbC5jbG9uZUNvbmZpZz1FcnJvciBjbG9ubmluZyBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVVwZGF0ZU1hbmFnZXJVdGlscy5pbnB1dFN0cmVhbUVuZGVkPUlucHV0U3RyZWFtIGVuZGVkIGFmdGVyIHswfSBieXRlcyAoZXhwZWN0ZWQgezF9ICkKLVVwZGF0ZVNlYXJjaFJlcXVlc3QubG9hZGluZ1BvbGljeT1Mb2FkaW5nIHVwZGF0ZSBwb2xpY3kgLi4uCi1VcGRhdGVNYW5hZ2VyVXRpbHMuY29weT1VcGRhdGVNYW5hZ2VyVXRpbHMgY29weSgpIGF0IG9mZnNldDogCi1VcGRhdGVQb2xpY3kucGFyc2VQb2xpY3k9RXJyb3JzIHdoaWxlIHBhcnNpbmcgdXBkYXRlIHBvbGljeQotVXBkYXRlUG9saWN5LnBhcnNlUG9saWN5PUVycm9ycyB3aGlsZSBwYXJzaW5nIHVwZGF0ZSBwb2xpY3kKLVVwZGF0ZVBvbGljeS5wb2xpY3lFeHBlY3RlZD0nIGlzIGV4cGVjdGVkLgotVXBkYXRlU2VhcmNoUmVxdWVzdC5zZWFyY2hpbmc9U2VhcmNoaW5nLi4uCi1VcGRhdGVTZWFyY2hSZXF1ZXN0LmNvbnRhY3Rpbmc9Q29udGFjdGluZyAKLVVwZGF0ZVNlYXJjaFJlcXVlc3QuY2hlY2tpbmc9Q2hlY2tpbmcgCi1VcGRhdGVQb2xpY3kuaW52YWxpZFVSTD1pbnZhbGlkIFVSTCAtIAotVXBkYXRlUG9saWN5Lm5hbWVOb051bGw9IGNhbm5vdCBiZSBudWxsLgotVXBkYXRlUG9saWN5LlVwZGF0ZVBvbGljeT1VcGRhdGUgUG9saWN5OiAKLVNpdGVGaWxlLmZlYXR1cmVOb3RSZW1vdmVkPUZlYXR1cmUgezB9IHdhcyBub3QgcmVtb3ZlZAotU2l0ZUZpbGUucGx1Z2luTm90UmVtb3ZlZD1QbHVnaW4gezB9IHdhcyBub3QgcmVtb3ZlZAotRXJyb3JSZWNvdmVyeUxvZy5yZWNvdmVyaW5nU3RhdHVzPVJlY292ZXJpbmcgc3RhdHVzCi1FcnJvclJlY292ZXJ5TG9nLmNhbm5vdEZpbmRMb2dGaWxlPVVuYWJsZSB0byBmaW5kIGxvZyBmaWxlOgotRXJyb3JSZWNvdmVyeUxvZy5ub1Byb3BlcnR5RmlsZT1VbmFibGUgdG8gYWNjZXNzIHByb3BlcnR5IGZpbGU6Ci1FcnJvclJlY292ZXJ5TG9nLm5vTG9nRW50cnk9VW5hYmxlIHRvIHJlYWQgbG9nIGZpbGUuIEZpbGUgZG9lc24ndCBjb250YWluIHRoZSBsb2cgZW50cnk6Ci1FcnJvclJlY292ZXJ5TG9nLm5vUmVjb3ZlcnlUb0V4ZWN1dGU9VW5hYmxlIHRvIHJlYWQgbG9nIGZpbGUuIFVuYWJsZSB0byBkZXRlcm1pbmUgcmVjb3ZlcnkgdG8gZXhlY3V0ZSBiYXNlZCBvbiB0aGUgZmlyc3QgbGluZSBvZiA6Ci1FcnJvclJlY292ZXJ5TG9nLndyb25nTG9nRmlsZT1Xcm9uZyBsb2cgZmlsZS4gVW5hYmxlIHRvIGZpbmQgZW50cnkgZm9yOgotRXJyb3JSZWNvdmVyeUxvZy5ub0FjdGlvbj1VbmFibGUgdG8gZGV0ZXJtaW5lIHdoYXQgYWN0aW9uIHdhcyB0YWtlbiBieSBwYXJzaW5nCi1FcnJvclJlY292ZXJ5TG9nLmZpbGVBbHJlYWR5UmVuYW1lZD1GaWxlIGFscmVhZHkgcmVuYW1lZCBpbnRvOgotRXJyb3JSZWNvdmVyeUxvZy5jYW5ub3RGaW5kRmlsZT1VbmFibGUgdG8gZmluZCBmaWxlOgotRXJyb3JSZWNvdmVyeUxvZy5vbGRUb05ldz1VbmFibGUgdG8gcmVuYW1lIG9sZCBpbiBuZXc6Ci1FcnJvclJlY292ZXJ5TG9nLnJlbmFtZWQ9U3VjZXNzZnVsbHkgcmVuYW1lZDoKLUVycm9yUmVjb3ZlcnlMb2cudG89IHRvOgotRXJyb3JSZWNvdmVyeUxvZy5ub0FjdGlvbj1VbmFibGUgdG8gZGV0ZXJtaW5lIHdoYXQgYWN0aW9uIHdhcyB0YWtlbiBieSBwYXJzaW5nCi1FcnJvclJlY292ZXJ5TG9nLmNhbm5vdEZpbmRGaWxlPVVuYWJsZSB0byBmaW5kIGZpbGU6Ci1FcnJvclJlY292ZXJ5TG9nLm5vRmlsZXRvUmVtb3ZlPVVuYWJsZSB0byBmaW5kIGZpbGUgdG8gcmVtb3ZlOgotRXJyb3JSZWNvdmVyeUxvZy5yZW1vdmVGZWF0dXJlPVRoZSByZW1vdmUgcHJvY2VzcyBkaWRuJ3Qgc3RhcnQuIFBsZWFzZSByZW1vdmUgdGhlIGRpc2FibGUgZmVhdHVyZSBmcm9tIHRoZSBwcm9ncmFtLgotRXJyb3JSZWNvdmVyeUxvZy53cm9uZ0xvZ0ZpbGU9V3JvbmcgbG9nIGZpbGUuIFVuYWJsZSB0byBmaW5kIGVudHJ5IGZvcjoKLVVwZGF0ZXNTZWFyY2hDYXRlZ29yeS5lcnJvclNlYXJjaGluZ0ZvclVwZGF0ZXM9RXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBzZWFyY2ggZm9yIG5ldyB1cGRhdGVzCi1TdGFuZGFsb25lLnNpdGVDb25maWd1cmVkPVNpdGUgaXMgYWxyZWFkeSBjb25maWd1cmVkOiAKLVN0YW5kYWxvbmUubm9TaXRlPUNhbm5vdCBmaW5kIHNpdGU6ICAKLVN0YW5kYWxvbmUubm9TaXRlMj1DYW5ub3QgZmluZCBzaXRlIHRvIGluc3RhbGwgdG86IAotU3RhbmRhbG9uZS5ub1NpdGUzPU5vIHNpdGUgc3BlY2lmaWVkCi1TdGFuZGFsb25lLm5vQ29uZmlndXJlZFNpdGU9Q2Fubm90IGZpbmQgY29uZmlndXJlZCBzaXRlOgotU3RhbmRhbG9uZS5pbnN0YWxsaW5nPUluc3RhbGxpbmcgZmVhdHVyZQotU3RhbmRhbG9uZS5mZWF0dXJlPUZlYXR1cmUgCi1TdGFuZGFsb25lLm5vdEZvdW5kPSBjYW5ub3QgYmUgZm91bmQgb24gCi1TdGFuZGFsb25lLm5ld2VySW5zdGFsbGVkPVxub3IgYSBuZXdlciB2ZXJzaW9uIGlzIGFscmVhZHkgaW5zdGFsbGVkLgotU3RhbmRhbG9uZS5kdXBsaWNhdGU9RHVwbGljYXRlIGNvbmZsaWN0cwotU3RhbmRhbG9uZS5mZWF0dXJlPUZlYXR1cmUgCi1TdGFuZGFsb25lLmluc3RhbGxlZD0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGluc3RhbGxlZAotU3RhbmRhbG9uZS5jYW5ub3RJbnN0YWxsPUNhbm5vdCBpbnN0YWxsIGZlYXR1cmUgCi1TdGFuZGFsb25lLm5vRmVhdHVyZXMxPVRoZXJlIGFyZSBubyB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgd2l0aCBpZCB7MH0KLVN0YW5kYWxvbmUubm9GZWF0dXJlczI9Q2Fubm90IGZpbmQgdW5jb25maWd1cmVkIGZlYXR1cmUgIHswfSB3aXRoIHZlcnNpb24gezF9Ci1TdGFuZGFsb25lLm5vRmVhdHVyZXMzPVRoZXJlIGFyZSBubyBjb25maWd1cmVkIGZlYXR1cmVzIHdpdGggaWQgezB9Ci1TdGFuZGFsb25lLm5vRmVhdHVyZXM0PUNhbm5vdCBmaW5kIGNvbmZpZ3VyZWQgZmVhdHVyZSAgezB9IHdpdGggdmVyc2lvbiB7MX0KLVN0YW5kYWxvbmUubm9Db25maWdTaXRlRm9yRmVhdHVyZT1UaGVyZSBhcmUgbm8gY29uZmlndXJlZCBzaXRlcyBmb3IgZmVhdHVyZSB7MH0KLVN0YW5kYWxvbmUuZmVhdHVyZU5vdEluc3RhbGxlZEJ5VU09RmVhdHVyZSB7MH0gd2FzIG5vdCBpbnN0YWxsZWQgYnkgdGhlIHVwZGF0ZSBtYW5hZ2VyLCBzbyBpdCBjYW5ub3QgYmUgdW5pbnN0YWxsZWQuCi1TdGFuZGFsb25lLmludmFsaWRDbWQ9SW52YWxpZCBjb21tYW5kOgotU3RhbmRhbG9uZS5jb25uZWN0aW9uID0gQ29ubmVjdGlvbiBlcnJvcgotU3RhbmRhbG9uZS5zZWFyY2hpbmcgPSBTZWFyY2hpbmcgb246IAotU3RhbmRhbG9uZS5jbWRGYWlsZWQgPSBDb21tYW5kIGZhaWxlZC4gUGxlYXNlIGNoZWNrIGxvZyBmaWxlIHswfSBmb3IgZGV0YWlscy4KLVN0YW5kYWxvbmUuY21kRmFpbGVkTm9Mb2cgPSBDb21tYW5kIGZhaWxlZC4KLVN0YW5kYWxvbmUuY21kQ29tcGxldGVXaXRoRXJyb3JzID0gQ29tbWFuZCBjb21wbGV0ZWQgd2l0aCBlcnJvcnMuIFBsZWFzZSBjaGVjayBsb2cgZmlsZSB7MH0gZm9yIGRldGFpbHMuCi1TdGFuZGFsb25lLmNtZE9LID0gQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotU3RhbmRhbG9uZS51cGRhdGluZyA9IEJlZ2luIHVwZGF0aW5nCi1TdGFuZGFsb25lLm5vVXBkYXRlID0gRmVhdHVyZSB7MH0gY2Fubm90IGJlIHVwZGF0ZWQuCi1TdGFuZGFsb25lLnVwZGF0ZWQ9IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB1cGRhdGVkLgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbWlycm9yL01pcnJvckNvbW1hbmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjVkNGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbWlycm9yL01pcnJvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5taXJyb3I7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi0vKioKLSAqIE1pcnJvcnMgYSByZW1vdGUgc2l0ZSBsb2NhbGx5LgotICovCi1wdWJsaWMgY2xhc3MgTWlycm9yQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZVZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZnJvbVNpdGVVcmw7Ci0JcHJpdmF0ZSBTdHJpbmcgdG9TaXRlRGlyOwotCXByaXZhdGUgU3RyaW5nIG1pcnJvclVSTDsKLQlwcml2YXRlIE1pcnJvclNpdGUgbWlycm9yU2l0ZTsKLQotCXB1YmxpYyBNaXJyb3JDb21tYW5kKAotCQlTdHJpbmcgZmVhdHVyZUlkLAotCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24sCi0JCVN0cmluZyBmcm9tU2l0ZVVybCwKLQkJU3RyaW5nIHRvU2l0ZURpciwKLQkJU3RyaW5nIG1pcnJvclVybCkgewotCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKLQkJdGhpcy5mZWF0dXJlVmVyc2lvbiA9IGZlYXR1cmVWZXJzaW9uOwotCQl0aGlzLmZyb21TaXRlVXJsID0gZnJvbVNpdGVVcmw7Ci0JCXRoaXMudG9TaXRlRGlyID0gdG9TaXRlRGlyOwotCQl0aGlzLm1pcnJvclVSTCA9IG1pcnJvclVybDsKLQl9Ci0KLQkvKioKLQkgKiB0cnVlIGlmIHN1Y2Nlc3MKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICghdmFsaWRhdGVQYXJhbWV0ZXJzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZiAoZ2V0TWlycm9yU2l0ZSgpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlVUkwgcmVtb3RlU2l0ZVVybCA9IG5ldyBVUkwoZnJvbVNpdGVVcmwpOwotCQkJSVNpdGUgcmVtb3RlU2l0ZSA9Ci0JCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVTaXRlVXJsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2VzVG9NaXJyb3JbXSA9Ci0JCQkJZmluZEZlYXR1cmVzVG9NaXJyb3IocmVtb3RlU2l0ZSk7Ci0JCQlpZiAoZmVhdHVyZVJlZmVyZW5jZXNUb01pcnJvci5sZW5ndGggPT0gMCkgewotCQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCQlVcGRhdGVDb3JlLmxvZygKLQkJCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCQkiTm8gbWF0Y2hpbmcgZmVhdHVyZXMgZm91bmQgb24gIiArIHJlbW90ZVNpdGVVcmwgKyAiLiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbnVsbCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJbWlycm9yU2l0ZS5taXJyb3JBbmRFeHBvc2UoCi0JCQkJcmVtb3RlU2l0ZSwKLQkJCQlmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yLAotCQkJCW51bGwsCi0JCQkJbWlycm9yVVJMKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGNlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCUphckNvbnRlbnRSZWZlcmVuY2Uuc2h1dGRvd24oKTsKLQkJfQotCX0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJzKCkgewotCQlpZiAoZnJvbVNpdGVVcmwgPT0gbnVsbCB8fCBmcm9tU2l0ZVVybC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZygKLQkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiZnJvbSBwYXJhbWV0ZXIgaXMgbWlzc2luZy4iLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0cnkgewotCQkJbmV3IFVSTChmcm9tU2l0ZVVybCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKAotCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJmcm9tIG11c3QgYmUgYSB2YWxpZCBVUkwiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodG9TaXRlRGlyID09IG51bGwgfHwgdG9TaXRlRGlyLmxlbmd0aCgpIDw9IDApIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKAotCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJ0byBwYXJhbWV0ZXIgaXMgbWlzc2luZy4iLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHJpdmF0ZSBNaXJyb3JTaXRlIGdldE1pcnJvclNpdGUoKQotCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gQ3JlYXRlIG1pcnJvciBzaXRlCi0JCWlmIChtaXJyb3JTaXRlID09IG51bGwpIHsKLQkJCWlmICh0b1NpdGVEaXIgIT0gbnVsbCkgewotCQkJCU1pcnJvclNpdGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgTWlycm9yU2l0ZUZhY3RvcnkoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCJBbmFseXppbmcgZmVhdHVyZXMgYWxyZWFkeSBtaXJyb3JlZCAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCW1pcnJvclNpdGUgPQotCQkJCQkJKE1pcnJvclNpdGUpIGZhY3RvcnkuY3JlYXRlU2l0ZShuZXcgRmlsZSh0b1NpdGVEaXIpKTsKLQkJCQl9IGNhdGNoIChJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gaXN0ZSkgewotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgRG9uZS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG1pcnJvclNpdGUgPT0gbnVsbCkgewotCQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCQlVcGRhdGVDb3JlLmxvZygKLQkJCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCQkiTWlycm9yIHNpdGUgYXQgIiArIHRvU2l0ZURpciArICIgY2Fubm90IGJlIGFjY2Vzc2VkLiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbnVsbCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBtaXJyb3JTaXRlOwotCi0JfQotCS8qKgotCSAqIFJldHVybnMgc3Vic2V0IG9mIGZlYXR1cmUgcmVmZXJlbmNlcyBvbiByZW1vdGUgc2l0ZQotCSAqIGFzIHNwZWNpZmllZCBieSBvcHRpb25hbCBmZWF0dXJlSWQgYW5kIGZlYXR1cmVWZXJzaW9uCi0JICogcGFyYW1ldGVycwotCSAqIEBwYXJhbSByZW1vdGVTaXRlCi0JICogQHJldHVybiBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmluZEZlYXR1cmVzVG9NaXJyb3IoSVNpdGUgcmVtb3RlU2l0ZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVtb3RlU2l0ZUZlYXR1cmVSZWZlcmVuY2VzW10gPQotCQkJcmVtb3RlU2l0ZS5nZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGV4aXN0aW5nRmVhdHVyZU1vZGVsc1tdID0KLQkJCW1pcnJvclNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlDb2xsZWN0aW9uIGZlYXR1cmVSZWZlcmVuY2VzVG9NaXJyb3IgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgZmVhdHVyZVZlcnNpb25JZGVudGlmaWVyID0gbnVsbDsKLQotCQlpZiAoZmVhdHVyZUlkID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkiUGFyYW1ldGVyIGZlYXR1cmUgbm90IHNwZWNpZmllZC4gIEFsbCBmZWF0dXJlcyBvbiB0aGUgcmVtb3RlIHNpdGUgd2lsbCBiZSBtaXJyb3JlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChmZWF0dXJlVmVyc2lvbiA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIlBhcmFtZXRlciB2ZXJzaW9uIG5vdCBzcGVjaWZpZWQuICBBbGwgdmVyc2lvbnMgb2YgZmVhdHVyZXMgb24gdGhlIHJlbW90ZSBzaXRlIHdpbGwgYmUgbWlycm9yZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWZlYXR1cmVWZXJzaW9uSWRlbnRpZmllciA9Ci0JCQkJbmV3IFBsdWdpblZlcnNpb25JZGVudGlmaWVyKGZlYXR1cmVWZXJzaW9uKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW90ZVNpdGVGZWF0dXJlUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJVmVyc2lvbmVkSWRlbnRpZmllciByZW1vdGVGZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllciA9Ci0JCQkJcmVtb3RlU2l0ZUZlYXR1cmVSZWZlcmVuY2VzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQotCQkJaWYgKGZlYXR1cmVJZCAhPSBudWxsCi0JCQkJJiYgIWZlYXR1cmVJZC5lcXVhbHMoCi0JCQkJCXJlbW90ZUZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkvLyBpZCBkb2VzIG5vdCBtYXRjaAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZlYXR1cmVWZXJzaW9uSWRlbnRpZmllciAhPSBudWxsCi0JCQkJJiYgIWZlYXR1cmVWZXJzaW9uSWRlbnRpZmllci5pc1BlcmZlY3QoCi0JCQkJCXJlbW90ZUZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyLmdldFZlcnNpb24oKSkpIHsKLQkJCQkvLyB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGUgPSAwOyBlIDwgZXhpc3RpbmdGZWF0dXJlTW9kZWxzLmxlbmd0aDsgZSsrKSB7Ci0JCQkJaWYgKGV4aXN0aW5nRmVhdHVyZU1vZGVsc1tlXQotCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCS5lcXVhbHMocmVtb3RlRmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkJCSJGZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgcmVtb3RlRmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIKLQkJCQkJCQkrICIgYWxyZWFkeSBtaXJyb3JlZCBhbmQgZXhwb3NlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBmZWF0dXJlIGFscmVhZHkgbWlycm9yZWQgYW5kIGV4cG9zZWQgaW4gc2l0ZS54bWwKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDaGVjayBmZWF0dXJlIHR5cGUKLQkJCVN0cmluZyB0eXBlID0KLQkJCQkoKFNpdGVGZWF0dXJlUmVmZXJlbmNlKSByZW1vdGVTaXRlRmVhdHVyZVJlZmVyZW5jZXNbaV0pCi0JCQkJCS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSAhPSBudWxsCi0JCQkJJiYgIUlTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFLmVxdWFscyh0eXBlKSkgewotCQkJCS8vIHVuc3VwcG9ydGVkCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCSJGZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyByZW1vdGVGZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllcgotCQkJCQkJKyAiIGlzIG9mIHR5cGUgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIHR5cGUKLQkJCQkJCSsgIi4gIE9ubHkgZmVhdHVyZXMgb2YgdHlwZSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUKLQkJCQkJCSsgIiBhcmUgc3VwcG9ydGVkLiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCk7Ci0JCQl9Ci0KLQkJCWZlYXR1cmVSZWZlcmVuY2VzVG9NaXJyb3IuYWRkKHJlbW90ZVNpdGVGZWF0dXJlUmVmZXJlbmNlc1tpXSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIkZlYXR1cmUgIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgcmVtb3RlU2l0ZUZlYXR1cmVSZWZlcmVuY2VzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkrICIgd2lsbCBiZSBtaXJyb3JlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAoSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10pIGZlYXR1cmVSZWZlcmVuY2VzVG9NaXJyb3IudG9BcnJheSgKLQkJCW5ldyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbZmVhdHVyZVJlZmVyZW5jZXNUb01pcnJvci5zaXplKCldKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTVjODc2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubWlycm9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi0vKioKLSAqIExvY2FsIG1pcnJvciBzaXRlLiAgUmVhZC9Xcml0ZQotICovCi1wdWJsaWMgY2xhc3MgTWlycm9yU2l0ZSBleHRlbmRzIFNpdGUgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTkRFTlQgPSAiICAgIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5OwotCS8qKgotCSAqIHBsdWdpbiBlbnRyaWVzIAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBkb3dubG9hZGVkUGx1Z2luRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIENvbGxlY3Rpb24gZG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHVibGljIE1pcnJvclNpdGUoU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogTWlycm9ycyB0aGUgc3BlY2lmaWVkIGZlYXR1cmVzIGFuZCBsaXN0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgb24gdGhpcyBzaXRlLgotCSAqIEBzZWUgSVNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBwYXJhbSBtaXJyb3JTaXRlVXJsIGV4dGVybmFsIFVSTCBvZiB0aGUgbWlycm9yIHNpdGUgb3IgbnVsbDsKLQkgKiBpZiBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQgcG9saWN5IGZyYWdtZW50IHdpbGwgYmUgZ2VuZXJhdGVkCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbWlycm9yQW5kRXhwb3NlKAotCQlJU2l0ZSByZW1vdGVTaXRlLAotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBzb3VyY2VGZWF0dXJlUmVmcywKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzLAotCQlTdHJpbmcgbWlycm9yU2l0ZVVybCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCW1pcnJvckFuZEV4cG9zZUZlYXR1cmVzKAotCQkJcmVtb3RlU2l0ZSwKLQkJCXNvdXJjZUZlYXR1cmVSZWZzLAotCQkJb3B0aW9uYWxmZWF0dXJlcyk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJIkluc3RhbGxpbmcgZmVhdHVyZXMgZmluaXNoZWQuIFVwZGF0aW5nIGNhdGVnb3JpZXMgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJdXBkYXRlQ2F0ZWdvcmllcyhyZW1vdGVTaXRlKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJIlVwZGF0aW5nIGNhdGVnb3JpZXMgZmluaXNoZWQuIFVwZGF0aW5nIHNpdGUgZGVzY3JpcHRpb24gLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJdXBkYXRlRGVzY3JpcHRpb24ocmVtb3RlU2l0ZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCSJVcGRhdGluZyBzaXRlIGRlc2NyaXB0aW9uIGZpbmlzaGVkLiBTYXZpbmcgc2l0ZS54bWwgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJc2F2ZSgpOwotCQlpZiAobWlycm9yU2l0ZVVybCAhPSBudWxsKSB7Ci0JCQlnZW5lcmF0ZVVwZGF0ZVBvbGljeShtaXJyb3JTaXRlVXJsKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgbWlycm9yQW5kRXhwb3NlRmVhdHVyZXMoCi0JCUlTaXRlIHJlbW90ZVNpdGUsCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHNvdXJjZUZlYXR1cmVSZWZzLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBGZWF0dXJlcyB0aGF0IGZhaWxlZCB3aWxsIGJlIHJldHJpZWQgb25jZSBhZ2FpbgotCQlDb2xsZWN0aW9uIGZhaWxlZEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIHNvdXJjZUZlYXR1cmUgPQotCQkJCQlzb3VyY2VGZWF0dXJlUmVmc1tpXS5nZXRGZWF0dXJlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZiA9Ci0JCQkJCW1pcnJvckZlYXR1cmUoCi0JCQkJCQlyZW1vdGVTaXRlLAotCQkJCQkJc291cmNlRmVhdHVyZSwKLQkJCQkJCW9wdGlvbmFsZmVhdHVyZXMsCi0JCQkJCQkxKTsKLQkJCQkvLyBTZXQgY2F0ZWdvcmllcyBvZiB0aGUgbmV3IGZlYXR1cmUKLQkJCQlJQ2F0ZWdvcnkgcmVtb3RlQ2F0ZWdvcmllc1tdID0KLQkJCQkJc291cmNlRmVhdHVyZVJlZnNbaV0uZ2V0Q2F0ZWdvcmllcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVtb3RlQ2F0ZWdvcmllcy5sZW5ndGg7IGorKykgewotCQkJCQlmZWF0dXJlUmVmLmFkZENhdGVnb3J5TmFtZShyZW1vdGVDYXRlZ29yaWVzW2pdLmdldE5hbWUoKSk7Ci0JCQkJfQotCi0JCQkJYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKHJlbW90ZVNpdGUsIGZlYXR1cmVSZWYpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCWZhaWxlZEZlYXR1cmVzLmFkZChzb3VyY2VGZWF0dXJlUmVmc1tpXSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBkbyB3ZSBuZWVkIHRvIHJldHJ5PwotCQlpZiAoZmFpbGVkRmVhdHVyZXMuc2l6ZSgpID4gMCkgewotCQkJc291cmNlRmVhdHVyZVJlZnMgPQotCQkJCShJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSkgZmFpbGVkRmVhdHVyZXMudG9BcnJheSgKLQkJCQkJbmV3IElTaXRlRmVhdHVyZVJlZmVyZW5jZVtmYWlsZWRGZWF0dXJlcy5zaXplKCldKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlRmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIHNvdXJjZUZlYXR1cmUgPQotCQkJCXNvdXJjZUZlYXR1cmVSZWZzW2ldLmdldEZlYXR1cmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWYgPQotCQkJCW1pcnJvckZlYXR1cmUocmVtb3RlU2l0ZSwgc291cmNlRmVhdHVyZSwgb3B0aW9uYWxmZWF0dXJlcywgMSk7Ci0JCQkvLyBTZXQgY2F0ZWdvcmllcyBvZiB0aGUgbmV3IGZlYXR1cmUKLQkJCUlDYXRlZ29yeSByZW1vdGVDYXRlZ29yaWVzW10gPSBzb3VyY2VGZWF0dXJlUmVmc1tpXS5nZXRDYXRlZ29yaWVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJlbW90ZUNhdGVnb3JpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlmZWF0dXJlUmVmLmFkZENhdGVnb3J5TmFtZShyZW1vdGVDYXRlZ29yaWVzW2pdLmdldE5hbWUoKSk7Ci0JCQl9Ci0KLQkJCWFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChyZW1vdGVTaXRlLCBmZWF0dXJlUmVmKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc3RhbGwgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGFuZCBsaXN0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgb24gdGhpcyBzaXRlLgotCSAqIEBzZWUgSVNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBtaXJyb3JGZWF0dXJlKAotCQlJU2l0ZSByZW1vdGVTaXRlLAotCQlJRmVhdHVyZSBzb3VyY2VGZWF0dXJlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsCi0JCWludCBpbmRlbnQpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRhYiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0JCQl0YWIgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIk1pcnJvcmluZyBmZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBleGlzdGluZ0ZlYXR1cmVzW10gPQotCQkJZ2V0RG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJZm9yIChpbnQgZSA9IDA7IGUgPCBleGlzdGluZ0ZlYXR1cmVzLmxlbmd0aDsgZSsrKSB7Ci0JCQlpZiAoZXhpc3RpbmdGZWF0dXJlc1tlXQotCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkuZXF1YWxzKHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkJdGFiCi0JCQkJCQkrICJGZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJKyAiIGFscmVhZHkgZXhpc3RzLiAgU2tpcHBpbmcgZG93bmxvYWRpbmcuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZXhpc3RpbmdGZWF0dXJlc1tlXTsKLQkJCX0KLQkJfQotCi0JCWZpbmFsIElGZWF0dXJlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0KLQkJCXNvdXJjZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJHZXR0aW5nIHBsdWdpbiBlbnRyaWVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIElQbHVnaW5FbnRyeVtdIHNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzID0KLQkJCXNvdXJjZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCi0JCS8vIGRldGVybWluZSBsaXN0IG9mIHBsdWdpbnMgdG8gaW5zdGFsbAotCQkvLyBmaW5kIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgcGx1Z2luIGVudHJpZXMgYWxyZWFkeSBjb250YWluZWQKLQkJLy8gb24gdGhlIHRhcmdldCBzaXRlLCBhbmQgcGx1Z2luIGVudHJpZXMgcGFja2FnZWQgaW4gc291cmNlIGZlYXR1cmUKLQotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zVG9JbnN0YWxsID0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5kaWZmKAotCQkJCXNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzLAotCQkJCWdldERvd25sb2FkZWRQbHVnaW5FbnRyaWVzKCkpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIkdldHRpbmcgbm9uIHBsdWdpbiBlbnRyaWVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIElOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbnNUb0luc3RhbGwgPQotCQkJc291cmNlRmVhdHVyZS5nZXRSYXdOb25QbHVnaW5FbnRyaWVzKCk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiR2V0dGluZyBpbmNsdWRlZCBmZWF0dXJlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJCXNvdXJjZUZlYXR1cmUuZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAob3B0aW9uYWxmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9Ci0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLm9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwoCi0JCQkJCWNoaWxkcmVuLAotCQkJCQlvcHRpb25hbGZlYXR1cmVzKTsKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIkRvd25sb2FkaW5nIGZlYXR1cmUgYXJjaGl2ZXMgZm9yICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZG93bmxvYWQgZmVhdHVyZSBhcmNoaXZlcwotCQlwcm92aWRlci5nZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhudWxsKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJEb3dubG9hZGluZyBwbHVnLWluIGFyY2hpdmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGRvd25sb2FkIHBsdWdpbiBhcmNoaXZlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKLQkJCXByb3ZpZGVyLmdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMocGx1Z2luc1RvSW5zdGFsbFtpXSwgbnVsbCk7Ci0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJEb3dubG9hZGluZyBub24gcGx1Zy1pbiBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBkb3dubG9hZCBub24tcGx1Z2luIGFyY2hpdmVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uUGx1Z2luc1RvSW5zdGFsbC5sZW5ndGg7IGkrKykgewotCQkJcHJvdmlkZXIuZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygKLQkJCQlub25QbHVnaW5zVG9JbnN0YWxsW2ldLAotCQkJCW51bGwpOwotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiSW5zdGFsbGluZyBjaGlsZCBmZWF0dXJlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBpbnN0YWxsIGNoaWxkIGZlYXR1cmVzIGZpcnN0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQltaXJyb3JGZWF0dXJlKAotCQkJCXJlbW90ZVNpdGUsCi0JCQkJY2hpbGRGZWF0dXJlLAotCQkJCW9wdGlvbmFsZmVhdHVyZXMsCi0JCQkJaW5kZW50ICsgMSk7Ci0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJTdG9yaW5nIHBsdWctaW4gYXJjaGl2ZXMgZm9yICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc3RvcmUgcGx1Z2lucycgYXJjaGl2ZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9Ci0JCQkJcHJvdmlkZXIuZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygKLQkJCQkJcGx1Z2luc1RvSW5zdGFsbFtpXSwKLQkJCQkJbnVsbCk7Ci0JCQlzdG9yZVBsdWdpbkFyY2hpdmUocmVmZXJlbmNlc1swXSk7Ci0JCQlhZGREb3dubG9hZGVkUGx1Z2luRW50cnkocGx1Z2luc1RvSW5zdGFsbFtpXSk7Ci0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJTdG9yaW5nIG5vbiBwbHVnLWluIGFyY2hpdmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHN0b3JlIG5vbiBwbHVnaW5zJyBhcmNoaXZlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vblBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0KLQkJCQlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAotCQkJCQlub25QbHVnaW5zVG9JbnN0YWxsW2ldLAotCQkJCQludWxsKTsKLQkJCWZvciAoaW50IHIgPSAwOyByIDwgcmVmZXJlbmNlcy5sZW5ndGg7IHIrKykgewotCQkJCXN0b3JlTm9uUGx1Z2luQXJjaGl2ZSgKLQkJCQkJc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksCi0JCQkJCXJlZmVyZW5jZXNbcl0pOwotCQkJfQotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiU3RvcmluZyBmZWF0dXJlIGFyY2hpdmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHN0b3JlIGZlYXR1cmUgYXJjaGl2ZQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9Ci0JCQlwcm92aWRlci5nZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhudWxsKTsKLQkJc3RvcmVGZWF0dXJlQXJjaGl2ZShyZWZlcmVuY2VzWzBdKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJBZGRpbmcgZmVhdHVyZSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIHRvIG1vZGVsIC4uLiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gYWRkIGZlYXR1cmUgbW9kZWwgdG8gc2l0ZSBtb2RlbAotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWYgPQotCQkJZmFjdG9yeS5jcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsKLQkJZmVhdHVyZVJlZi5zZXRTaXRlTW9kZWwodGhpcyk7Ci0JCS8vZmVhdHVyZVJlZi5zZXRVUkxTdHJpbmcoZmVhdHVyZVVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQkJZmVhdHVyZVJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLQkJZmVhdHVyZVJlZi5zZXRGZWF0dXJlSWRlbnRpZmllcigKLQkJCXNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSk7Ci0JCWZlYXR1cmVSZWYuc2V0RmVhdHVyZVZlcnNpb24oCi0JCQlzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCWFkZERvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoZmVhdHVyZVJlZik7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiTWlycm9yaW5nIGZlYXR1cmUgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiBmaW5pc2hlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmVhdHVyZVJlZjsKLQotCX0KLQkvKioKLQkgKiBBZGRzIGEgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwgdG8gdGhpcyBzaXRlLAotCSAqIGFuZCBleHBvc2VzIGluIHNpdGUueG1sIGlmIHJlbW90ZSBzaXRlIGV4cG9zZXMgZ2l2ZW4gZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoCi0JCUlTaXRlIHJlbW90ZVNpdGUsCi0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZmVyZW5jZSkgewotCQkvLyBjaGVjayBpZiByZW1vdGUgc2l0ZSBleHBvc2VzIHRoaXMgZmVhdHVyZQotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVtb3RlRmVhdHVyZXNbXSA9Ci0JCQlyZW1vdGVTaXRlLmdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3RlRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZW1vdGVGZWF0dXJlUmVmID0gcmVtb3RlRmVhdHVyZXNbaV07Ci0JCQl0cnkgewotCQkJCWlmIChyZW1vdGVGZWF0dXJlUmVmCi0JCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJLmVxdWFscyhmZWF0dXJlUmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQkJYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWZlcmVuY2UpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQkJVXBkYXRlQ29yZS5sb2coY2UpOwotCQkJfQotCQl9Ci0JCXNhdmUoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJIkZlYXR1cmUgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBmZWF0dXJlUmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiBhZGRlZCB0byBzaXRlLnhtbC4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBBZGRzIGZlYXR1cmUgbW9kZWwgdG8gc2l0ZSBtb2RlbCwgcmVtb3Zpbmcgb2xkIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmZXJlbmNlKSB7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBleGlzdGluZ01vZGVscyA9Ci0JCQlnZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZXhpc3RpbmdNb2RlbHMubGVuZ3RoOyBqKyspIHsKLQkJCWlmIChleGlzdGluZ01vZGVsc1tqXQotCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmVSZWZlcmVuY2UuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgewotCQkJCXN1cGVyLnJlbW92ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbChleGlzdGluZ01vZGVsc1tqXSk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVGZWF0dXJlQXJjaGl2ZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlVUkwgbmV3VVJMID0KLQkJCQluZXcgVVJMKAotCQkJCQl0aGlzLmdldFVSTCgpLAotCQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkJKyBjb250ZW50UmVmZXJlbmNlLmdldElkZW50aWZpZXIoKQotCQkJCQkJKyAiLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQlmZWF0dXJlUGF0aCA9IG5ld1VSTC5nZXRGaWxlKCk7Ci0JCQlpblN0cmVhbSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5VG9Mb2NhbChpblN0cmVhbSwgZmVhdHVyZVBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkiRXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgIisgZmVhdHVyZVBhdGgrIiBmaWxlLiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQkvKioKLQkqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikKLQkqLwotCXByaXZhdGUgdm9pZCBzdG9yZVBsdWdpbkFyY2hpdmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgbmV3VVJMID0gbmV3IFVSTChnZXRVUkwoKSwgY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkpOwotCQkJcGx1Z2luUGF0aCA9IG5ld1VSTC5nZXRGaWxlKCk7Ci0JCQlpblN0cmVhbSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5VG9Mb2NhbChpblN0cmVhbSwgcGx1Z2luUGF0aCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJIkVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nICIrIHBsdWdpblBhdGgrIiBmaWxlLiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcmVOb25QbHVnaW5BcmNoaXZlKAotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyLAotCQlDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JCUZpbGUgbm9uUGx1Z2luQXJjaGl2ZVBhdGggPSBudWxsOwotCQl0cnkgewotCQkJVVJMIG5ld0RpclVSTCA9Ci0JCQkJbmV3IFVSTCgKLQkJCQkJZ2V0VVJMKCksCi0JCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCQkrICIvIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIGZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyKTsKLQkJCUZpbGUgZGlyID0gbmV3IEZpbGUobmV3RGlyVVJMLmdldEZpbGUoKSk7Ci0JCQlkaXIubWtkaXJzKCk7Ci0JCQlpblN0cmVhbSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCW5vblBsdWdpbkFyY2hpdmVQYXRoID0KLQkJCQluZXcgRmlsZShkaXIsIGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5VG9Mb2NhbCgKLQkJCQlpblN0cmVhbSwKLQkJCQlub25QbHVnaW5BcmNoaXZlUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQludWxsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkiRXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgIisgbm9uUGx1Z2luQXJjaGl2ZVBhdGguZ2V0QWJzb2x1dGVQYXRoKCkrIiBmaWxlLiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZSgpIHsKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIHNpdGVVUkwgPSBuZXcgVVJMKHRoaXMuZ2V0VVJMKCksICJzaXRlLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShzaXRlVVJMLmdldEZpbGUoKSkpOwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dFdyaXRlcik7Ci0JCQlzYXZlKHdyaXRlcik7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZygKLQkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJIlNpdGUgWE1MIGNvdWxkIG5vdCBiZSBzYXZlZC4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWlvZSkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZvcyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lMikgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgc2F2ZShQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVyLnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOyAvLyROT04tTkxTLTEkCi0JCS8vd3JpdGVyLnByaW50bG4oIjwhRE9DVFlQRSBzaXRlIFNZU1RFTSBcImR0ZC9zaXRlLmR0ZFwiPiIpOwotCQl3cml0ZVNpdGUoIiIsIHdyaXRlcik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVTaXRlKFN0cmluZyBpbmRlbnQsIFByaW50V3JpdGVyIHdyaXRlcikgewotCQl3cml0ZXIucHJpbnQoaW5kZW50ICsgIjxzaXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGluZGVudDIgPSBpbmRlbnQgKyBJTkRFTlQ7Ci0JCS8vIGRlZmF1bHQgdHlwZQotCQkvL3dyaXRlSWZEZWZpbmVkKGluZGVudGEsIHdyaXRlciwgInR5cGUiLCBnZXRUeXBlKCkpOwotCQkvLyBzdG9yZWQgcmVsYXRpdmUgdG8gc2l0ZS54bWwKLQkJLy93cml0ZUlmRGVmaW5lZChpbmRlbnRhLCB3cml0ZXIsICJ1cmwiLCBnZXRVUkwoKSk7Ci0JCXdyaXRlci5wcmludGxuKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uTW9kZWwoKTsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXdyaXRlci5wcmludGxuKCk7Ci0JCQl3cml0ZURlc2NyaXB0aW9uKGluZGVudDIsIHdyaXRlciwgZGVzY3JpcHRpb24pOwotCQkJd3JpdGVyLnByaW50bG4oKTsKLQkJfQotCQl3cml0ZUZlYXR1cmVzKGluZGVudDIsIHdyaXRlcik7Ci0JCXdyaXRlQ2F0ZWdvcmllcyhpbmRlbnQyLCB3cml0ZXIpOwotCQl3cml0ZXIucHJpbnRsbihpbmRlbnQgKyAiPC9zaXRlPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgdm9pZCB3cml0ZUZlYXR1cmVzKFN0cmluZyBpbmRlbnQsIFByaW50V3JpdGVyIHdyaXRlcikgewotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZVJlZmVyZW5jZU1vZGVscyA9Ci0JCQlnZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZmVyZW5jZU1vZGVscy5sZW5ndGg7IGkrKykgewotCQkJd3JpdGVyLnByaW50KGluZGVudCk7Ci0JCQl3cml0ZXIucHJpbnQoIjxmZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludCgKLQkJCQkiIHVybD1cImZlYXR1cmVzLyIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmVSZWZlcmVuY2VNb2RlbHNbaV0uZ2V0RmVhdHVyZUlkZW50aWZpZXIoKQotCQkJCQkrICJfIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRGZWF0dXJlVmVyc2lvbigpCi0JCQkJCSsgIi5qYXJcIiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnQoCi0JCQkJIiBpZD1cIiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmVSZWZlcmVuY2VNb2RlbHNbaV0uZ2V0RmVhdHVyZUlkZW50aWZpZXIoKQotCQkJCQkrICJcIiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnQoCi0JCQkJIiB2ZXJzaW9uPVwiIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRGZWF0dXJlVmVyc2lvbigpCi0JCQkJCSsgIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludGxuKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJU3RyaW5nW10gY2F0ZWdvcnlOYW1lcyA9Ci0JCQkJZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRDYXRlZ29yeU5hbWVzKCk7Ci0JCQlmb3IgKGludCBjbiA9IDA7IGNuIDwgY2F0ZWdvcnlOYW1lcy5sZW5ndGg7IGNuKyspIHsKLQkJCQl3cml0ZXIucHJpbnQoaW5kZW50ICsgSU5ERU5UKTsKLQkJCQl3cml0ZXIucHJpbnRsbigKLQkJCQkJIjxjYXRlZ29yeSBuYW1lPVwiIiArIGNhdGVnb3J5TmFtZXNbY25dICsgIlwiIC8+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQl9Ci0KLQkJCXdyaXRlci5wcmludChpbmRlbnQpOwotCQkJd3JpdGVyLnByaW50bG4oIjwvZmVhdHVyZT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50bG4oKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgd3JpdGVDYXRlZ29yaWVzKFN0cmluZyBpbmRlbnQsIFByaW50V3JpdGVyIHdyaXRlcikgewotCQlDYXRlZ29yeU1vZGVsW10gY2F0ZWdvcnlNb2RlbHMgPSBnZXRDYXRlZ29yeU1vZGVscygpOwotCQlpZiAoY2F0ZWdvcnlNb2RlbHMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3J5TW9kZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZXIucHJpbnQoaW5kZW50KTsKLQkJCXdyaXRlci5wcmludCgiPGNhdGVnb3J5LWRlZiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnQoCi0JCQkJIiBuYW1lPVwiIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgY2F0ZWdvcnlNb2RlbHNbaV0uZ2V0TmFtZSgpCi0JCQkJCSsgIlwiIGxhYmVsPVwiIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgY2F0ZWdvcnlNb2RlbHNbaV0uZ2V0TGFiZWwoKQotCQkJCQkrICJcIiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZURlc2NyaXB0aW9uKAotCQkJCWluZGVudCArIElOREVOVCwKLQkJCQl3cml0ZXIsCi0JCQkJY2F0ZWdvcnlNb2RlbHNbaV0uZ2V0RGVzY3JpcHRpb25Nb2RlbCgpKTsKLQkJCXdyaXRlci5wcmludChpbmRlbnQpOwotCQkJd3JpdGVyLnByaW50bG4oIjwvY2F0ZWdvcnktZGVmPiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnRsbigpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCB3cml0ZURlc2NyaXB0aW9uKAotCQlTdHJpbmcgaW5kZW50LAotCQlQcmludFdyaXRlciB3cml0ZXIsCi0JCVVSTEVudHJ5TW9kZWwgdXJsRW50cnlNb2RlbCkgewotCQlTdHJpbmcgdXJsID0gdXJsRW50cnlNb2RlbC5nZXRVUkxTdHJpbmcoKTsKLQkJU3RyaW5nIHRleHQgPSB1cmxFbnRyeU1vZGVsLmdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKTsKLQkJaWYgKHVybCA9PSBudWxsICYmIHRleHQgPT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQl3cml0ZXIucHJpbnQoaW5kZW50KTsKLQkJd3JpdGVyLnByaW50KCI8ZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsICE9IG51bGwpCi0JCQl3cml0ZXIucHJpbnQoIiB1cmw9XCIiICsgdXJsICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPD0gMCkgewotCQkJd3JpdGVyLnByaW50bG4oIiAvPiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl3cml0ZXIucHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLnByaW50bG4oCi0JCQkJCWluZGVudCArIElOREVOVCArIFVwZGF0ZU1hbmFnZXJVdGlscy5Xcml0ZXIueG1sU2FmZSh0ZXh0KSk7Ci0JCQl9Ci0JCQl3cml0ZXIucHJpbnRsbihpbmRlbnQgKyAiPC9kZXNjcmlwdGlvbj4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qKgotCSAqIEFkZHMgYSBwbHVnaW4gZW50cnkgCi0JICogRWl0aGVyIGZyb20gcGFyc2luZyB0aGUgZmlsZSBzeXN0ZW0gb3IgCi0JICogaW5zdGFsbGluZyBhIGZlYXR1cmUKLQkgKiAKLQkgKiBXZSBjYW5ub3QgZmlndXJlIG91dCB0aGUgbGlzdCBvZiBwbHVnaW5zIGJ5IHJlYWRpbmcgdGhlIFNpdGUueG1sIGFzCi0JICogdGhlIGFyY2hpdmVzIHRhZyBhcmUgb3B0aW9uYWxzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRG93bmxvYWRlZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewotCQlkb3dubG9hZGVkUGx1Z2luRW50cmllcy5hZGQocGx1Z2luRW50cnkpOwotCX0KLQotCXByaXZhdGUgSVBsdWdpbkVudHJ5W10gZ2V0RG93bmxvYWRlZFBsdWdpbkVudHJpZXMoKSB7Ci0JCXJldHVybiAoSVBsdWdpbkVudHJ5W10pIGRvd25sb2FkZWRQbHVnaW5FbnRyaWVzLnRvQXJyYXkoCi0JCQluZXcgSVBsdWdpbkVudHJ5W2Rvd25sb2FkZWRQbHVnaW5FbnRyaWVzLnNpemUoKV0pOwotCX0KLQkvKioKLQkgKiBBZGRzIGEgcGx1Z2luIGVudHJ5IAotCSAqIEVpdGhlciBmcm9tIHBhcnNpbmcgdGhlIGZpbGUgc3lzdGVtIG9yIAotCSAqIGluc3RhbGxpbmcgYSBmZWF0dXJlCi0JICogCi0JICogV2UgY2Fubm90IGZpZ3VyZSBvdXQgdGhlIGxpc3Qgb2YgcGx1Z2lucyBieSByZWFkaW5nIHRoZSBTaXRlLnhtbCBhcwotCSAqIHRoZSBhcmNoaXZlcyB0YWcgYXJlIG9wdGlvbmFscwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlTW9kZWwpIHsKLQkJZG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMuYWRkKGZlYXR1cmVNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZ2V0RG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKSB7Ci0JCXJldHVybiAoCi0JCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10pIGRvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzCi0JCQkJLnRvQXJyYXkoCi0JCQluZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtkb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVscwotCQkJCS5zaXplKCldKTsKLQl9Ci0JLyoqCi0JICogQ2hlY2tzIGlmIG1pcnJvciBzaXRlIGNvbnRhaW5zIGEgZmVhdHVyZSB3aXRoIGdpdmVuIElEIGFuZCB2ZXJzaW9uCi0JICogQHBhcmFtIGZlYXR1cmVSZWZNb2RlbAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNoIGZlYXR1cmUgZXhpc3RzCi0JICovCi0JLypwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmTW9kZWwpIHsKLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZzW10gPSBnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmZWF0dXJlUmVmc1tpXQotCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCS5lcXVhbHMoZmVhdHVyZVJlZk1vZGVsLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCWNlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ki8KLQotCS8qKgotCSAqIFVwZGF0ZXMgZGVzY3JpcHRpb24gb2YgdGhpcyBzaXRlCi0JICogZnJvbSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVtb3RlIHNpdGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURlc2NyaXB0aW9uKElTaXRlIHJlbW90ZVNpdGUpIHsKLQkJSVVSTEVudHJ5IHVybEVudHJ5ID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbigpOwotCQlpZiAodXJsRW50cnkgIT0gbnVsbCkgewotCQkJVVJMRW50cnlNb2RlbCBuZXdVcmxFbnRyeU1vZGVsID0gbmV3IFVSTEVudHJ5TW9kZWwoKTsKLQkJCVVSTCB1cmwgPSB1cmxFbnRyeS5nZXRVUkwoKTsKLQkJCW5ld1VybEVudHJ5TW9kZWwuc2V0QW5ub3RhdGlvbih1cmxFbnRyeS5nZXRBbm5vdGF0aW9uKCkpOwotCQkJbmV3VXJsRW50cnlNb2RlbC5zZXRVUkxTdHJpbmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJdGhpcy5zZXREZXNjcmlwdGlvbk1vZGVsKG5ld1VybEVudHJ5TW9kZWwpOwotCQl9Ci0JfQotCS8qKgotCSAqIFVwZGF0ZXMgYWxsIGNhdGVnb3JpZXMgdXNlZCBieSBmZWF0dXJlcyBvbiB0aGlzIHNpdGUKLQkgKiBmcm9tIGNhdGVnb3JpZXMgZGVmaW5lZCBvbiByZW1vdGUgc2l0ZS4KLQkgKiBDYXRlZ29yaWVzIG5vdCBkZWZpbmVkIG9uIHJlbW90ZSBzaXRlIGFyZSB1bmNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhdGVnb3JpZXMoSVNpdGUgcmVtb3RlU2l0ZSkgewotCQkvLyBjb2xsZWN0IG5hbWUgb2YgY2F0ZWdvcmllcyB1c2VkIG9uIHRoaXMgc2l0ZQotCQlTZXQgdXNlZENhdGVnb3J5TmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZNb2RlbHNbXSA9Ci0JCQlnZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdHVyZVJlZk1vZGVscy5sZW5ndGg7IGYrKykgewotCQkJU3RyaW5nW10gZmVhdHVyZUNhdGVnb3J5TmFtZXMgPQotCQkJCWZlYXR1cmVSZWZNb2RlbHNbZl0uZ2V0Q2F0ZWdvcnlOYW1lcygpOwotCi0JCQlmb3IgKGludCBjID0gMDsgYyA8IGZlYXR1cmVDYXRlZ29yeU5hbWVzLmxlbmd0aDsgYysrKSB7Ci0JCQkJdXNlZENhdGVnb3J5TmFtZXMuYWRkKGZlYXR1cmVDYXRlZ29yeU5hbWVzW2NdKTsKLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb24gbmV3Q2F0ZWdvcnlNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB1c2VkQ2F0ZWdvcnlOYW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCUlDYXRlZ29yeSByZW1vdGVDYXRlZ29yeSA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnkobmFtZSk7Ci0JCQlpZiAocmVtb3RlQ2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJCS8vIHJlbW90ZSBzaXRlIGRvZXMgbm90IGRlZmluZSB0aGlzIGNhdGVnb3J5Ci0JCQkJQ2F0ZWdvcnlNb2RlbCBvbGRDYXRlZ29yeSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJb2xkQ2F0ZWdvcnkgPSAoQ2F0ZWdvcnlNb2RlbCkgZ2V0Q2F0ZWdvcnkobmFtZSk7Ci0JCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCQkJCS8vIGNhbm5vdCByZXByb2R1Y2UgbnBlIGFueW1vcmUKLQkJCQl9Ci0JCQkJaWYgKG9sZENhdGVnb3J5ICE9IG51bGwpIHsKLQkJCQkJbmV3Q2F0ZWdvcnlNb2RlbHMuYWRkKG9sZENhdGVnb3J5KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5ld0NhdGVnb3J5TW9kZWxzLmFkZChyZW1vdGVDYXRlZ29yeSk7Ci0JCQl9Ci0KLQkJfQotCQlzZXRDYXRlZ29yeU1vZGVscygKLQkJCShDYXRlZ29yeU1vZGVsW10pIG5ld0NhdGVnb3J5TW9kZWxzLnRvQXJyYXkoCi0JCQkJbmV3IENhdGVnb3J5TW9kZWxbbmV3Q2F0ZWdvcnlNb2RlbHMuc2l6ZSgpXSkpOwotCi0JfQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVVwZGF0ZVBvbGljeShTdHJpbmcgdXJsKSB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCBzaXRlVVJMID0gbmV3IFVSTCh0aGlzLmdldFVSTCgpLCAicG9saWN5LnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShzaXRlVVJMLmdldEZpbGUoKSkpOwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dFdyaXRlcik7Ci0KLQkJCXdyaXRlci5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50bG4oIjx1cGRhdGUtcG9saWN5PiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXdyaXRlci5wcmludGxuKAotCQkJCSI8IS0tIFlvdSBjYW4gcGFzdGUgdGhlIGZvbGxvd2luZyBmcmFnbWVudCwgY29udGFpbmluZyB1cmwtbWFwIGVsZW1lbnRzLCBpbnRvIGFub3RoZXIgcG9saWN5IGZpbGUuIC0tPiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZVVybE1hcHMod3JpdGVyLCB1cmwpOwotCQkJd3JpdGVyLnByaW50bG4oIjwhLS0gRW5kIG9mIGZyYWdtZW50IHdpdGggdXJsLW1hcCBlbGVtZW50cy4gLS0+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJd3JpdGVyLnByaW50bG4oIjwvdXBkYXRlLXBvbGljeT4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZygKLQkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJInBvbGljeS54bWwgY291bGQgbm90IGJlIHNhdmVkIiwgLy8kTk9OLU5MUy0xJAotCQkJCQlpb2UpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChmb3MgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZTIpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHdyaXRlVXJsTWFwcyhQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyB1cmwpIHsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWZlcmVuY2VNb2RlbHMgPQotCQkJZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZlcmVuY2VNb2RlbHMubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlci5wcmludCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KCI8dXJsLW1hcCIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnQoCi0JCQkJIiBwYXR0ZXJuPVwiIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpCi0JCQkJCSsgIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludCgiIHVybD1cIiIgKyB1cmwgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl3cml0ZXIucHJpbnRsbigiIC8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbWlycm9yL01pcnJvclNpdGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODE1ZTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbWlycm9yL01pcnJvclNpdGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubWlycm9yOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1wdWJsaWMgY2xhc3MgTWlycm9yU2l0ZUZhY3RvcnkgZXh0ZW5kcyBCYXNlU2l0ZUZhY3RvcnkgewotCS8qCi0JICogQHNlZSBTaXRlTW9kZWxGYWN0b3J5I2NyZWF0ZVNpdGVNYXBNb2RlbCgpCi0JICovCi0JcHVibGljIFNpdGVNb2RlbCBjcmVhdGVTaXRlTWFwTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTWlycm9yU2l0ZSh0aGlzKTsKLQl9Ci0JLyoKLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCkKLQkgKi8KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVNpdGUobmV3IEZpbGUodXJsLmdldEZpbGUoKSkpOwotCX0KLQkvKgotCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMKQotCSAqLwotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKEZpbGUgc2l0ZUxvY2F0aW9uKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKLQotCQlJbnB1dFN0cmVhbSBzaXRlU3RyZWFtID0gbnVsbDsKLQotCQlpZiAoIXNpdGVMb2NhdGlvbi5leGlzdHMoKSkgewotCQkJaWYgKCFzaXRlTG9jYXRpb24ubWtkaXJzKCkpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJIkRpcmVjdG9yeSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgc2l0ZUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpCi0JCQkJCQkrICIgY291bGQgbm90IGJlIGNyZWF0ZWQuIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsKTsKLQkJCX0KLQkJfQotCQlpZiAoIXNpdGVMb2NhdGlvbi5pc0RpcmVjdG9yeSgpIHx8ICFzaXRlTG9jYXRpb24uY2FuV3JpdGUoKSkKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCXNpdGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCQkrICIgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGlzIG5vdCB3cml0dGFibGUuIiwgLy8kTk9OLU5MUy0xJAotCQkJCW51bGwpOwotCi0JCU1pcnJvclNpdGUgc2l0ZSA9IG51bGw7Ci0JCS8vIHBhcnNlIHB1YmxpYyBmZWF0dXJlcwotCQlpZiAobmV3IEZpbGUoc2l0ZUxvY2F0aW9uLCBTaXRlLlNJVEVfWE1MKS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlzaXRlU3RyZWFtID0KLQkJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShzaXRlTG9jYXRpb24sIFNpdGUuU0lURV9YTUwpKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0JCQl9Ci0JCQlzaXRlID0gKE1pcnJvclNpdGUpIHBhcnNlU2l0ZShzaXRlU3RyZWFtKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHNpdGVTdHJlYW0gIT0gbnVsbCkKLQkJCQkJc2l0ZVN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWlmIChzaXRlID09IG51bGwpIHsKLQkJCXNpdGUgPSAoTWlycm9yU2l0ZSkgY3JlYXRlU2l0ZU1hcE1vZGVsKCk7Ci0JCX0KLQkJLy8gcGFyc2UgZG93bmxvYWRlZCBwbHVnaW5zIGFuZCBmcmFnbWVudHMKLQkJcGFyc2VEb3dubG9hZGVkUGx1Z2luc0FuZEZyYWdtZW50cygKLQkJCXNpdGUsCi0JCQluZXcgRmlsZShzaXRlTG9jYXRpb24sIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCkpOwotCQkvLyBwYXJzZSBkb3dubG9hZGVkIGZlYXR1cmVzCi0JCXBhcnNlRG93bmxvYWRlZEZlYXR1cmVzKAotCQkJc2l0ZSwKLQkJCW5ldyBGaWxlKHNpdGVMb2NhdGlvbiwgU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCkpOwotCi0JCVVSTCB1cmw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBzaXRlTG9jYXRpb24udG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJIkEgVVJMIGZvciBzaXRlICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIHNpdGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCQkrICIgY291bGQgbm90IGJlIGNyZWF0ZWQuIiwgLy8kTk9OLU5MUy0xJAotCQkJCW11ZSk7Ci0JCX0KLQkJU2l0ZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIodXJsKTsKLQotCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJY29udGVudFByb3ZpZGVyLnNldFNpdGUoc2l0ZSk7Ci0JCXRyeSB7Ci0JCQlzaXRlLnJlc29sdmUodXJsLCB1cmwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkiVW5hYmxlIHRvIHJlc29sdmUgVVJMICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICh1cmwgPT0gbnVsbCA/ICIiIDogdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJbXVlKTsKLQkJfQotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZURvd25sb2FkZWRQbHVnaW5zQW5kRnJhZ21lbnRzKE1pcnJvclNpdGUgc2l0ZSwKLQkJCUZpbGUgcGx1Z2luRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghcGx1Z2luRGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nW10gZGlyID0gcGx1Z2luRGlyLmxpc3QoRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLmZpbHRlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyLmxlbmd0aDsgaSsrKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBsdWdpbkRpciwgZGlyW2ldKTsKLQkJCQlKYXJDb250ZW50UmVmZXJlbmNlIGphclJlZmVyZW5jZSA9IG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKAotCQkJCQkJbnVsbCwgZmlsZSk7Ci0JCQkJQ29udGVudFJlZmVyZW5jZSByZWYgPSBqYXJSZWZlcmVuY2UucGVlaygiTUVUQS1JTkYvTUFOSUZFU1QuTUYiLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCQlpbiA9IHJlZi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQlCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBCdW5kbGVNYW5pZmVzdChpbik7Ci0JCQkJCWlmIChtYW5pZmVzdC5leGlzdHMoKSkgewotCQkJCQkJc2l0ZQotCQkJCQkJCQkuYWRkRG93bmxvYWRlZFBsdWdpbkVudHJ5KG1hbmlmZXN0Ci0JCQkJCQkJCQkJLmdldFBsdWdpbkVudHJ5KCkpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVmID0gamFyUmVmZXJlbmNlLnBlZWsoInBsdWdpbi54bWwiLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZWYgPT0gbnVsbCkgewotCQkJCQlyZWYgPSBqYXJSZWZlcmVuY2UucGVlaygiZnJhZ21lbnQueG1sIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJCWluID0gcmVmLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCVBsdWdpbkVudHJ5IGVudHJ5ID0gbmV3IERlZmF1bHRQbHVnaW5QYXJzZXIoKS5wYXJzZShpbik7Ci0JCQkJCXNpdGUuYWRkRG93bmxvYWRlZFBsdWdpbkVudHJ5KGVudHJ5KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmKGluICE9bnVsbCl7Ci0JCQkJCXRyeXsKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCX1jYXRjaChJT0V4Y2VwdGlvbiBjZSl7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JKiBNZXRob2QgcGFyc2VGZWF0dXJlLgotCSogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VEb3dubG9hZGVkRmVhdHVyZXMoTWlycm9yU2l0ZSBzaXRlLCBGaWxlIGZlYXR1cmVEaXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZlYXR1cmVEaXIuZXhpc3RzKCkpIHsKLQkJCVN0cmluZ1tdIGRpcjsKLQkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZjsKLQkJCVVSTCBmZWF0dXJlVVJMOwotCQkJRmlsZSBjdXJyZW50RmVhdHVyZUZpbGU7Ci0JCQlTdHJpbmcgbmV3RmlsZVBhdGggPSBudWxsOwotCi0JCQl0cnkgewotCQkJCS8vIG9ubHkgbGlzdCBKQVIgZmlsZXMKLQkJCQlkaXIgPSBmZWF0dXJlRGlyLmxpc3QoRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLmZpbHRlcik7Ci0JCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRpci5sZW5ndGg7IGluZGV4KyspIHsKLQotCQkJCQkvLyBjaGVjayBpZiB0aGUgSkFSIGZpbGUgY29udGFpbnMgYSBmZWF0dXJlLnhtbAotCQkJCQljdXJyZW50RmVhdHVyZUZpbGUgPSBuZXcgRmlsZShmZWF0dXJlRGlyLCBkaXJbaW5kZXhdKTsKLQkJCQkJSmFyQ29udGVudFJlZmVyZW5jZSByZWYgPQotCQkJCQkJbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoIiIsIGN1cnJlbnRGZWF0dXJlRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29udGVudFJlZmVyZW5jZSByZXN1bHQgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0ID0gcmVmLnBlZWsoRmVhdHVyZS5GRUFUVVJFX1hNTCwgbnVsbCwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVVwZGF0ZUNvcmUud2FybigKLQkJCQkJCQkiRXhjZXB0aW9uIHJldHJpZXZpbmcgZmVhdHVyZS54bWwgaW4gZmlsZToiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyBjdXJyZW50RmVhdHVyZUZpbGUsCi0JCQkJCQkJZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLndhcm4oCi0JCQkJCQkJIlVuYWJsZSB0byBmaW5kIGZlYXR1cmUueG1sIGluIGZpbGU6IiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgY3VycmVudEZlYXR1cmVGaWxlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWZlYXR1cmVVUkwgPSBjdXJyZW50RmVhdHVyZUZpbGUudG9VUkwoKTsKLQkJCQkJCWZlYXR1cmVSZWYgPSBjcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsKLQkJCQkJCWZlYXR1cmVSZWYuc2V0U2l0ZU1vZGVsKHNpdGUpOwotCQkJCQkJZmVhdHVyZVJlZi5zZXRVUkxTdHJpbmcoZmVhdHVyZVVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCQkJCWZlYXR1cmVSZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCQkJCQlmZWF0dXJlUmVmLnNldEZlYXR1cmVJZGVudGlmaWVyKAotCQkJCQkJCWZlYXR1cmVSZWYKLQkJCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJCQkuZ2V0SWRlbnRpZmllcigpKTsKLQkJCQkJCWZlYXR1cmVSZWYuc2V0RmVhdHVyZVZlcnNpb24oCi0JCQkJCQkJZmVhdHVyZVJlZgotCQkJCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkJCS5nZXRWZXJzaW9uKCkKLQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJc2l0ZS5hZGREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgVVJMIGZvciBmaWxlICIgKyBuZXdGaWxlUGF0aCArICIuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9CdW5kbGVNYW5pZmVzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQnVuZGxlTWFuaWZlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1N2NmNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9CdW5kbGVNYW5pZmVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotLyoqCi0gKiBQYXJzZXMgTUFOSUZFU1QuTUYKLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZU1hbmlmZXN0IHsKLQlwcml2YXRlIFBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5OwotCXByaXZhdGUgSU9FeGNlcHRpb24gZXhjZXB0aW9uOwotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBsb2NhbCBmaWxlCi0JICovCi1wdWJsaWMgQnVuZGxlTWFuaWZlc3QoRmlsZSBtYW5pZmVzdCkgewotCQlzdXBlcigpOwotCQlpZiAobWFuaWZlc3QuZXhpc3RzKCkgJiYgIW1hbmlmZXN0LmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmb3MgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlmb3MgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0KTsKLQkJCQlwYXJzZShmb3MpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChmb3MgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgbG9jYWwgZmlsZQotCSAqLwotCXB1YmxpYyBCdW5kbGVNYW5pZmVzdChJbnB1dFN0cmVhbSBpbnB1dCkgewotCQlzdXBlcigpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJcGFyc2UoaW5wdXQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFBhcnNlcyBtYW5pZmVzdCwgY3JlYXRlcyBQbHVnaW5FbnRyeSBpZiBtYW5pZmVzdCBpcyB2YWxpZCwgc3RvcmVzCi0JICogZXhjZXB0aW9uIGlmIGFueSBvY2N1cnMKLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIElucHV0U3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGluKSB7Ci0JCXRyeSB7Ci0JCQlNYW5pZmVzdCBtID0gbmV3IE1hbmlmZXN0KGluKTsKLQkJCUF0dHJpYnV0ZXMgYSA9IG0uZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJCS8vIHBsdWdpbiBpZAotCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGEuZ2V0VmFsdWUoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOwotCQkJaWYgKHN5bWJvbGljTmFtZSA9PSBudWxsKSB7Ci0JCQkJLy8gSW4gRWNsaXBzZSBtYW5pZmVzdCBtdXN0IGhhdmUgQnVuZGxlLVN5bWJvbGljTmFtZSBhdHRyaWJ1dGUKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgaWQ7Ci0JCQl0cnkgewotCQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnRzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKAotCQkJCQkJQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIHN5bWJvbGljTmFtZSk7Ci0JCQkJaWQgPSBlbGVtZW50c1swXS5nZXRWYWx1ZSgpOwotCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQkvLyBwbHVnaW4gdmVyc2lvbgotCQkJU3RyaW5nIHZlcnNpb24gPSBhLmdldFZhbHVlKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIGhvc3RQbHVnaW4gPSBhLmdldFZhbHVlKENvbnN0YW50cy5GUkFHTUVOVF9IT1NUKTsKLQkJCXBsdWdpbkVudHJ5ID0gbmV3IFBsdWdpbkVudHJ5KCk7Ci0JCQlwbHVnaW5FbnRyeS5zZXRWZXJzaW9uZWRJZGVudGlmaWVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLAotCQkJCQl2ZXJzaW9uKSk7Ci0JCQlwbHVnaW5FbnRyeS5pc0ZyYWdtZW50KGhvc3RQbHVnaW4gIT0gbnVsbAotCQkJCQkmJiBob3N0UGx1Z2luLmxlbmd0aCgpID4gMCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJZXhjZXB0aW9uID0gaW9lOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbiAhPSBudWxsIHx8IHBsdWdpbkVudHJ5ICE9IG51bGw7Ci0JfQotCS8qKgotCSAqIE9idGFpbnMgUGx1Z2luRW50cnkgZnJvbSBhIG1hbmlmZXN0LgotCSAqIAotCSAqIEByZXR1cm4gUGx1Z2luRW50cnkgb3IgbnVsbCBpZiB2YWxpZCBtYW5pZmVzdCBkb2VzIG5vdCBleGlzdAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBleGNlcHRpb24gZHVyaW5nIHBhcnNpbmcKLQkgKi8KLQlwdWJsaWMgUGx1Z2luRW50cnkgZ2V0UGx1Z2luRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwbHVnaW5FbnRyeTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ5ODFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7Ci0gCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdHsKLQkKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIGludCBhY3Rpb247Ci0JcHJpdmF0ZSBEYXRlIGRhdGU7Ci0JcHJpdmF0ZSBpbnQgc3RhdHVzOwotCXByaXZhdGUgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBpbnN0YWxsQ29uZmlndXJhdGlvbjsKLQkKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWN0aW9uKCkgewotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXREYXRlKCkgewotCQlyZXR1cm4gZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGF0ZS4KLQkgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRlKERhdGUgZGF0ZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmRhdGUgPSBkYXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXR1cy4KLQkgKiBAcGFyYW0gc3RhdHVzIFRoZSBzdGF0dXMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXMpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aW9uLgotCSAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb24oaW50IGFjdGlvbikgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YWxsQ29uZmlndXJhdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsCi0JICovCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIGluc3RhbGxDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluc3RhbGxDb25maWd1cmF0aW9uLgotCSAqIEBwYXJhbSBpbnN0YWxsQ29uZmlndXJhdGlvbiBUaGUgaW5zdGFsbENvbmZpZ3VyYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGluc3RhbGxDb25maWd1cmF0aW9uKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7CQkKLQkJdGhpcy5pbnN0YWxsQ29uZmlndXJhdGlvbiA9IGluc3RhbGxDb25maWd1cmF0aW9uOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmF0aW9uUG9saWN5TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzM2M2ZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQotCQotCQotCi0JcHJpdmF0ZSBpbnQgcG9saWN5OwotCXByaXZhdGUgTWFwIC8qIG9mIEZlYXR1cmVSZWZlcmVuY2VNb2RlbCAqL2NvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlczsKLQlwcml2YXRlIE1hcCAvKiBvZiBGZWF0dXJlUmVmZXJlbmNlTW9kZWwgKi91bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlczsKLQkKLQkvLyBzaW5jZSAyLjAuMgotCXByaXZhdGUgQ29uZmlndXJlZFNpdGVNb2RlbCBjb25maWd1cmVkU2l0ZU1vZGVsOwotCQotCS8vIHNpbmNlIDIuMQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWVuYWJsZSA9IHRydWU7Ci0JCWNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwkJCi0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UG9saWN5KCkgewotCQlyZXR1cm4gcG9saWN5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBvbGljeS4KLQkgKiBAcGFyYW0gcG9saWN5IFRoZSBwb2xpY3kgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UG9saWN5KGludCBwb2xpY3kpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5wb2xpY3kgPSBwb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBnZXRDb25maWd1cmVkRmVhdHVyZXNNb2RlbCgpIHsKLQkJaWYgKGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcz09bnVsbCB8fCBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBGZWF0dXJlUmVmZXJlbmNlTW9kZWxbMF07Ci0JCXJldHVybiAoRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10pIGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5rZXlTZXQoKS50b0FycmF5KGFycmF5VHlwZUZvcihjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMua2V5U2V0KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGdldFVuY29uZmlndXJlZEZlYXR1cmVzTW9kZWwoKSB7Ci0JCS8vIG9idGFpbiB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgYnkgY29tcGFyaW5nIGNvbmZpZ3VyZWQgb25lcyB3aXRoIHRob3NlIGluc3RhbGxlZAotCQlpZiAodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbAotCQkJCSYmIGNvbmZpZ3VyZWRTaXRlTW9kZWwgIT0gbnVsbAotCQkJCSYmIGNvbmZpZ3VyZWRTaXRlTW9kZWwuZ2V0U2l0ZU1vZGVsKCkgIT0gbnVsbCkgewotCQkJSVNpdGUgc2l0ZSA9IChJU2l0ZSkgY29uZmlndXJlZFNpdGVNb2RlbC5nZXRTaXRlTW9kZWwoKTsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHNpdGVGZWF0dXJlcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWlmIChzaXRlRmVhdHVyZXMubGVuZ3RoID4gZ2V0Q29uZmlndXJlZEZlYXR1cmVzTW9kZWwoKS5sZW5ndGgpIHsKLQkJCQlmb3IgKGludCBpPTA7IGk8c2l0ZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghKHNpdGVGZWF0dXJlc1tpXSBpbnN0YW5jZW9mIFNpdGVGZWF0dXJlUmVmZXJlbmNlKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCXdoaWxlKCFmb3VuZCAmJiBpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmID0gKEZlYXR1cmVSZWZlcmVuY2VNb2RlbClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwoZi5nZXRVUkwoKSwgc2l0ZUZlYXR1cmVzW2ldLmdldFVSTCgpKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKCFmb3VuZCkKLQkJCQkJCWFkZFVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2UoKFNpdGVGZWF0dXJlUmVmZXJlbmNlKXNpdGVGZWF0dXJlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9PSBudWxsCi0JCQkJfHwgdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBGZWF0dXJlUmVmZXJlbmNlTW9kZWxbMF07Ci0JCXJldHVybiAoRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10pIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmtleVNldCgpCi0JCQkJLnRvQXJyYXkoYXJyYXlUeXBlRm9yKHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmtleVNldCgpKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJlZFNpdGVNb2RlbC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBDb25maWd1cmVkU2l0ZU1vZGVsCi0JICogQHNpbmNlIDIuMC4yCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWwgZ2V0Q29uZmlndXJlZFNpdGVNb2RlbCgpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWRTaXRlTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29uZmlndXJlZFNpdGVNb2RlbC4KLQkgKiBAcGFyYW0gY29uZmlndXJlZFNpdGVNb2RlbCBUaGUgY29uZmlndXJlZFNpdGVNb2RlbCB0byBzZXQKLQkgKiBAc2luY2UgMi4wLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmVkU2l0ZU1vZGVsKENvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlndXJlZFNpdGVNb2RlbCkgewotCQl0aGlzLmNvbmZpZ3VyZWRTaXRlTW9kZWwgPSBjb25maWd1cmVkU2l0ZU1vZGVsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZW1vdmUoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUsIE1hcCBsaXN0KSB7Ci0JCVVSTCBmZWF0dXJlVVJMID0gZmVhdHVyZS5nZXRVUkwoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyID0gbGlzdC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgIWZvdW5kKSB7Ci0JCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZWxlbWVudCA9IChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGl0ZXIubmV4dCgpOwotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGVsZW1lbnQuZ2V0VVJMKCksZmVhdHVyZVVSTCkpIHsKLQkJCQlsaXN0LnJlbW92ZShlbGVtZW50KTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvdW5kOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gcGx1Z2lucyBmaWxlCi0JICovCi0JLypwYWNrYWdlKi8KLQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGQoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUsIE1hcCBsaXN0KSB7Ci0JCVVSTCBmZWF0dXJlVVJMID0gZmVhdHVyZS5nZXRVUkwoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyID0gbGlzdC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgIWZvdW5kKSB7Ci0JCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZWxlbWVudCA9IChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGl0ZXIubmV4dCgpOwotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGVsZW1lbnQuZ2V0VVJMKCksZmVhdHVyZVVSTCkpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWZvdW5kKSB7Ci0JCQlsaXN0LnB1dChmZWF0dXJlLG51bGwpOwotCQl9IGVsc2UgewotCQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlIFJlZmVyZW5jZSA6IitmZWF0dXJlKyIgYWxyZWFkeSBwYXJ0IG9mIHRoZSBsaXN0LiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZHMgYSBmZWF0dXJlIGluIHRoZSBjb25maWd1cmVkUmVmZXJlbmNlIGxpc3QKLQkgKiBhbHNvIHVzZWQgYnkgdGhlIHBhcnNlciB0byBhdm9pZCBjcmVhdGluZyBhbm90aGVyIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2UoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJCi0JCWlmIChjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKCFjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMuY29udGFpbnNLZXkoZmVhdHVyZSkpewotCQkJLy9ERUJVRzoKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKXsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJDb25maWd1cmluZyAiK2ZlYXR1cmUuZ2V0VVJMU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmFkZChmZWF0dXJlLCBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMpOwotCQl9CQotCi0JCS8vIHdoZW4gdXNlciBjb25maWd1cmUgYSBmZWF0dXJlLAotCQkvLyB3ZSBoYXZlIHRvIHJlbW92ZSBpdCBmcm9tIHVuY29uZmlndXJlZCBmZWF0dXJlIGlmIGl0IGV4aXN0cwotCQkvLyBiZWNhdXNlIHRoZSB1c2VyIGRvZXNuJ3Qga25vdy4uLgotCQlpZiAodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gcmVtb3ZlKGZlYXR1cmUsIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJCWlmICghc3VjY2VzcykKLQkJCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgbm90IHBhcnQgb2YgVW5jb25maWd1cmVkIGxpc3Q6ICIrZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSk7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JLyoqCi0JICogYWRkcyBhIGZlYXR1cmUgaW4gdGhlIGxpc3QKLQkgKiBhbHNvIHVzZWQgYnkgdGhlIHBhcnNlciB0byBhdm9pZCBjcmVhdGluZyBhbm90aGVyIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkVW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZShGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMudW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoIXVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmNvbnRhaW5zS2V5KGZlYXR1cmUpKXsKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKXsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJVbmNvbmZpZ3VyaW5nICIrZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMuYWRkKGZlYXR1cmUsIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJfQkKLQotCQkvLyBhbiB1bmNvbmZpZ3VyZWQgZmVhdHVyZSBpcyBhbHdheXMgZnJvbSBhIGNvbmZpZ3VyZWQgb25lIG5vID8KLQkJLy8gdW5sZXNzIGl0IHdhcyBwYXJzZWQgcmlnaHQgPwotCQlpZiAoY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHJlbW92ZShmZWF0dXJlLCBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMpOwotCQkJaWYgKCFzdWNjZXNzKQotCQkJCVVwZGF0ZUNvcmUud2FybigiRmVhdHVyZSBub3QgcGFydCBvZiBDb25maWd1cmVkIGxpc3Q6ICIrZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSk7CQkJCSAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVzIGEgZmVhdHVyZSBmcm9tIGFueSBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRmVhdHVyZVJlZmVyZW5jZShGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMhPW51bGwpewotCQkJYm9vbGVhbiBzdWNjZXNzID0gcmVtb3ZlKGZlYXR1cmUsIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJCWlmICghc3VjY2VzcykKLQkJCQlVcGRhdGVDb3JlLndhcm4oZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSsiIG5vdCBwYXJ0IG9mIHVuY29uZmlndXJlZCBsaXN0LiIpOwkJCQkJCQkgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSByZW1vdmUoZmVhdHVyZSwgY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJCWlmICghc3VjY2VzcykKLQkJCQlVcGRhdGVDb3JlLndhcm4oZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSsiIG5vdCBwYXJ0IG9mIGNvbmZpZ3VyZWQgbGlzdC4iKTsJCQkJCQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy4KLQkgKiBAcGFyYW0gZmVhdHVyZVJlZmVyZW5jZXMgVGhlIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzIHRvIHNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKElGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZVJlZmVyZW5jZXMpIHsKLQkJdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQl1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5wdXQoZmVhdHVyZVJlZmVyZW5jZXNbaV0sbnVsbCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy4KLQkgKiBAcGFyYW0gZmVhdHVyZVJlZmVyZW5jZXMgVGhlIGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMoSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmZXJlbmNlcykgewotCQljb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMucHV0KGZlYXR1cmVSZWZlcmVuY2VzW2ldLG51bGwpOwotCQl9CQkKLQkKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIHZhbHVlKSB7Ci0JCWVuYWJsZSA9IHZhbHVlOwotCX0KLQotCi0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmVkU2l0ZU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmVkU2l0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NmE3NzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJlZFNpdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyZWRTaXRlTW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBwcmV2aW91c1BsdWdpblBhdGg7Ci0KLQlwcml2YXRlIFNpdGVNb2RlbCBzaXRlOwotCXByaXZhdGUgU3RyaW5nIHBsYXRmb3JtVVJMU3RyaW5nOwotCXByaXZhdGUgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIHBvbGljeTsKLQlwcml2YXRlIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaW5zdGFsbENvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBib29sZWFuIGluc3RhbGxhYmxlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBDb25maWd1cmVkU2l0ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIHNpdGUKLQkgKiBAcmV0dXJuIFRoZSBJU2l0ZSAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFNpdGVNb2RlbCBnZXRTaXRlTW9kZWwoKSB7Ci0JCXJldHVybiBzaXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUuCi0JICogQHBhcmFtIHNpdGUgVGhlIHNpdGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2l0ZU1vZGVsKFNpdGVNb2RlbCBzaXRlKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgcG9saWN5Ci0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBnZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKSB7Ci0JCXJldHVybiBwb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbChDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgcG9saWN5KSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMucG9saWN5ID0gcG9saWN5OwotCQlwb2xpY3kuc2V0Q29uZmlndXJlZFNpdGVNb2RlbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIGluc3RhbGxhYmxlOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoYm9vbGVhbiBpbnN0YWxsYWJsZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmluc3RhbGxhYmxlID0gaW5zdGFsbGFibGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFsbENvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbAotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGdldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBpbnN0YWxsQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnN0YWxsQ29uZmlndXJhdGlvbi4KLQkgKiBAcGFyYW0gaW5zdGFsbENvbmZpZ3VyYXRpb24gVGhlIGluc3RhbGxDb25maWd1cmF0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBpbnN0YWxsQ29uZmlndXJhdGlvbikgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmluc3RhbGxDb25maWd1cmF0aW9uID0gaW5zdGFsbENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGxhdGZvcm1VUkxTdHJpbmcuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbGF0Zm9ybVVSTFN0cmluZygpIHsKLQkJcmV0dXJuIHBsYXRmb3JtVVJMU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBsYXRmb3JtVVJMU3RyaW5nLgotCSAqIEBwYXJhbSBwbGF0Zm9ybVVSTFN0cmluZyBUaGUgcGxhdGZvcm1VUkxTdHJpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UGxhdGZvcm1VUkxTdHJpbmcoU3RyaW5nIHBsYXRmb3JtVVJMU3RyaW5nKSB7Ci0JCXRoaXMucGxhdGZvcm1VUkxTdHJpbmcgPSBwbGF0Zm9ybVVSTFN0cmluZzsKLQl9Ci0KLQkKLQkJLyoqCi0JICogR2V0cyB0aGUgcHJldmlvdXNQbHVnaW5QYXRoLiBUaGUgbGlzdCBvZiBwbHVnaW5zIHRoZSBwbGF0Zm9ybSBoYWQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJldmlvdXNQbHVnaW5QYXRoKCkgewotCQlpZiAocHJldmlvdXNQbHVnaW5QYXRoID09IG51bGwpCi0JCQlwcmV2aW91c1BsdWdpblBhdGggPSBuZXcgU3RyaW5nWzBdOwotCQlyZXR1cm4gcHJldmlvdXNQbHVnaW5QYXRoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByZXZpb3VzUGx1Z2luUGF0aC4KLQkgKiBAcGFyYW0gcHJldmlvdXNQbHVnaW5QYXRoIFRoZSBwcmV2aW91c1BsdWdpblBhdGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXNQbHVnaW5QYXRoKFN0cmluZ1tdIHByZXZpb3VzUGx1Z2luUGF0aCkgewotCQl0aGlzLnByZXZpb3VzUGx1Z2luUGF0aCA9IG5ldyBTdHJpbmdbcHJldmlvdXNQbHVnaW5QYXRoLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldmlvdXNQbHVnaW5QYXRoLCAwLCB0aGlzLnByZXZpb3VzUGx1Z2luUGF0aCwgMCwgcHJldmlvdXNQbHVnaW5QYXRoLmxlbmd0aCk7Ci0JfQotCi0JLyoKLQkgKiBjcmVhdGVzIGEgU3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzdGF0dXNUeXBlLCBTdHJpbmcgbXNnLCBFeGNlcHRpb24gZSl7Ci0JCWlmIChzdGF0dXNUeXBlIT1JU3RhdHVzLk9LKSBzdGF0dXNUeXBlID0gSVN0YXR1cy5FUlJPUjsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzdGF0dXNUeXBlLElTdGF0dXMuT0ssIG1zZy50b1N0cmluZygpLCBlKTsKLQl9Ci0KLQkvKgotCSAqIGNyZWF0ZXMgYSBTdGF0dXMKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHN0YXR1c1NldmVyaXR5LCBpbnQgc3RhdHVzQ29kZSwgU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpewotCQlTdHJpbmcgaWQgPQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQotCQlTdHJpbmdCdWZmZXIgY29tcGxldGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobXNnIT1udWxsKQotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKG1zZyk7Ci0JCWlmIChlIT1udWxsKXsKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXHJcblsiKTsgLy8kTk9OLU5MUy0xJAotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKGUudG9TdHJpbmcoKSk7Ci0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIl1cclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhzdGF0dXNTZXZlcml0eSwgaWQsIHN0YXR1c0NvZGUsIGNvbXBsZXRlU3RyaW5nLnRvU3RyaW5nKCksIGUpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZSNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpLmlzRW5hYmxlZCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlI3NldEVuYWJsZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJZ2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvRGVmYXVsdFBsdWdpblBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvRGVmYXVsdFBsdWdpblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjJmOWRkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0RlZmF1bHRQbHVnaW5QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7Ci0KLS8qKgotICogUGFyc2UgZGVmYXVsdCBmZWF0dXJlLnhtbAotICovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UGx1Z2luUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9Ci0JCVNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb24gPSBudWxsOwotCXByaXZhdGUgUGx1Z2luRW50cnkgcGx1Z2luRW50cnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlQgPSAiZnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGNsYXNzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gZXh0ZW5kcyBTQVhFeGNlcHRpb24gewotCQlwdWJsaWMgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQkJc3VwZXIoYXJnMCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdEZlYXR1cmVQYXJzZXIKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdFBsdWdpblBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFBsdWdpbkVudHJ5IHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlwbHVnaW5FbnRyeSA9IG5ldyBQbHVnaW5FbnRyeSgpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOwotCQl9IGNhdGNoIChQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkLCB3ZSBzdG9wcGVkIHRoZSBwYXJzaW5nIHdoZW4gd2UgaGF2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZAotCQkJLy8vIG5vIG5lZWQgdG8gcHVyc3VlIHRoZSBwYXJzaW5nCi0JCX0KLQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCWlkID0gIl9ub19pZF8iOyAvLyROT04tTkxTLTEkCi0JCXBsdWdpbkVudHJ5LnNldFZlcnNpb25lZElkZW50aWZpZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXIoaWQsIHZlcnNpb24pKTsKLQkJcmV0dXJuIHBsdWdpbkVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgdGFnID0gbG9jYWxOYW1lLnRyaW0oKTsKLQotCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoUExVR0lOKSkgewotCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudChmYWxzZSk7CQkJCi0JCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKEZSQUdNRU5UKSkgewotCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudCh0cnVlKTsJCQkKLQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiogCi0JICogcHJvY2VzcyBwbHVnaW4gZW50cnkgaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGx1Z2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gewotCQlpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl0aHJvdyBuZXcgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmY0M2YuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIEFuIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaXMgCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQotCS8vIHBlcmZvcm1hbmNlCi0JcHJpdmF0ZSBVUkwgYnVuZGxlVVJMOwotCXByaXZhdGUgVVJMIGJhc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDdXJyZW50OwotCXByaXZhdGUgVVJMIGxvY2F0aW9uVVJMOwotCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nOwotCXByb3RlY3RlZCBEYXRlIGRhdGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIENvbmZpZ3VyZXRpb25BY3Rpdml0eU1vZGVsICovIGFjdGl2aXRpZXM7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIGNvbmZpZ3VyYXRpb25TaXRlTW9kZWwgKi8gY29uZmlndXJhdGlvblNpdGVzOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZQotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCkgewotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJlZFNpdGVNb2RlbFtdIGdldENvbmZpZ3VyYXRpb25TaXRlc01vZGVsKCkgewotCQlpZiAoIWluaXRpYWxpemVkKSAKLQkJCWluaXRpYWxpemUoKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb25TaXRlcyA9PSBudWxsIHx8IGNvbmZpZ3VyYXRpb25TaXRlcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgQ29uZmlndXJlZFNpdGVNb2RlbFswXTsKLQkKLQkJcmV0dXJuIChDb25maWd1cmVkU2l0ZU1vZGVsW10pIGNvbmZpZ3VyYXRpb25TaXRlcy50b0FycmF5KGFycmF5VHlwZUZvcihjb25maWd1cmF0aW9uU2l0ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBsaXN0Ci0JICogaXMgY2FsbGVkIHdoZW4gYWRkaW5nIGEgU2l0ZSBvciBwYXJzaW5nIHRoZSBYTUwgZmlsZQotCSAqIGluIHRoaXMgY2FzZSB3ZSBkbyBub3Qgd2FudCB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHksIHNvIHdlIGRvIG5vdCB3YW50IHQgY2FsbAotCSAqIGFkZENvbmZpZ3VyYXRpb25TaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKENvbmZpZ3VyZWRTaXRlTW9kZWwgc2l0ZSkgewotCQlpZiAoY29uZmlndXJhdGlvblNpdGVzID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25TaXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlpZiAoIWNvbmZpZ3VyYXRpb25TaXRlcy5jb250YWlucyhzaXRlKSkgewotCQkJY29uZmlndXJhdGlvblNpdGVzLmFkZChzaXRlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25TaXRlTW9kZWwoQ29uZmlndXJlZFNpdGVNb2RlbFtdIHNpdGVzKSB7Ci0JCWNvbmZpZ3VyYXRpb25TaXRlcyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFkZENvbmZpZ3VyYXRpb25TaXRlTW9kZWwoc2l0ZXNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUNvbmZpZ3VyYXRpb25TaXRlTW9kZWwoQ29uZmlndXJlZFNpdGVNb2RlbCBzaXRlKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIGluaXRpYWxpemUoKTsKLQotCQlpZiAoY29uZmlndXJhdGlvblNpdGVzICE9IG51bGwpIHsKLQkJCXJldHVybiBjb25maWd1cmF0aW9uU2l0ZXMucmVtb3ZlKHNpdGUpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnQoKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIGluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGlzQ3VycmVudDsKLQl9Ci0KLQkvKioKLQkgKiAgQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQoYm9vbGVhbiBpc0N1cnJlbnQpIHsKLQkJLy8gZG8gbm90IGNoZWNrIGlmIHdyaXRhYmxlIGFzIHdlIG1heQotCQkvLyBzZXQgYW4gaW5zdGFsbCBjb25maWcgYXMgTm90IGN1cnJlbnQKLQkJdGhpcy5pc0N1cnJlbnQgPSBpc0N1cnJlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbFtdIGdldEFjdGl2aXR5TW9kZWwoKSB7Ci0JCWlmIChhY3Rpdml0aWVzID09IG51bGwgJiYgIWluaXRpYWxpemVkKSAKLQkJCWluaXRpYWxpemUoKTsKLQkJaWYgKGFjdGl2aXRpZXMgPT0gbnVsbCB8fCBhY3Rpdml0aWVzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbFswXTsKLQkJcmV0dXJuIChDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbFtdKSBhY3Rpdml0aWVzLnRvQXJyYXkoYXJyYXlUeXBlRm9yKGFjdGl2aXRpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aXZpdHlNb2RlbChDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCBhY3Rpdml0eSkgewotCQlpZiAoYWN0aXZpdGllcyA9PSBudWxsKQotCQkJYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFhY3Rpdml0aWVzLmNvbnRhaW5zKGFjdGl2aXR5KSkgewotCQkJYWN0aXZpdGllcy5hZGQoYWN0aXZpdHkpOwotCQkJYWN0aXZpdHkuc2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCh0aGlzKTsKLQkJfQotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRDcmVhdGlvbkRhdGUoKSB7Ci0vLwkJaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOwotCQlpZiAoZGF0ZSA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gZGF0ZTsKLQl9Ci0JLyoqCi0JICogU2V0cyB0aGUgZGF0ZS4KLQkgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoRGF0ZSBkYXRlKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMuZGF0ZSA9IGRhdGU7Ci0JfQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJLy9pZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7Ci0JCS8vbm8gbmVlZCB0byBpbml0aWFsaXplLCBhbHdheXMgc2V0Ci0JCWRlbGF5ZWRSZXNvbHZlKCk7Ci0JCXJldHVybiBsb2NhdGlvblVSTDsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLS8vCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7Ci0JCWlmIChsYWJlbCA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMC4yCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9jYXRpb25VUkxTdHJpbmcuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTFN0cmluZygpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkgZGVsYXllZFJlc29sdmUoKTsKLQkJcmV0dXJuIGxvY2F0aW9uVVJMU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvY2F0aW9uVVJMU3RyaW5nLgotCSAqIEBwYXJhbSBsb2NhdGlvblVSTFN0cmluZyBUaGUgbG9jYXRpb25VUkxTdHJpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkxTdHJpbmcoU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubG9jYXRpb25VUkxTdHJpbmcgPSBsb2NhdGlvblVSTFN0cmluZzsKLQkJdGhpcy5sb2NhdGlvblVSTCA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsT2JqZWN0I3Jlc29sdmUoVVJMLCBSZXNvdXJjZUJ1bmRsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLCBVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQotCQl0aGlzLmJhc2UgPSBiYXNlOwotCQl0aGlzLmJ1bmRsZVVSTCA9IGJ1bmRsZVVSTDsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpbWVsaW5lLgotCSAqIEByZXR1cm4gbG9uZwotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpbWVsaW5lKCkgewotCQlyZXR1cm4gMDsKLS8vCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7Ci0vLwkJcmV0dXJuIHRpbWVsaW5lOwotCX0KLQotCi0JLyoKLQkgKiBpbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9ucyBmcm9tIHRoZSBwZXJzaXN0ZW50IG1vZGVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQkKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZzsKLQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwoZ2V0VVJMKCksIENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSkpCi0JCQkJCXBsYXRmb3JtQ29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQkJCWVsc2UgCi0JCQkJCXBsYXRmb3JtQ29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKGdldFVSTCgpKTsKLQkJCQkKLQkJCQluZXcgSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIocGxhdGZvcm1Db25maWcsIHRoaXMpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCVVwZGF0ZUNvcmUud2Fybihsb2NhdGlvblVSTFN0cmluZyArICIgZG9lcyBub3QgZXhpc3QsIFRoZSBsb2NhbCBzaXRlIGlzIG5vdCBpbiBzeW5jaCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBhbmQgaXMgcG9pbnRpbmcgdG8gYSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdC4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxDb25maWd1cmF0aW9uLkVycm9yRHVyaW5nRmlsZUFjY2VzcyIsIGxvY2F0aW9uVVJMU3RyaW5nKSwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxDb25maWd1cmF0aW9uLkVycm9yRHVyaW5nRmlsZUFjY2VzcyIsIGxvY2F0aW9uVVJMU3RyaW5nKSwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24gaGlzdG9yeToiICsgbG9jYXRpb25VUkwudG9FeHRlcm5hbEZvcm0oKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCQkKLQkJLy9maW5pc2ggcmVzb2x2ZQotCQkvLyBQRVJGOgotCQl0cnkgewotCQkJLy8gZGVsZWdhdGUKLQkJCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldEFjdGl2aXR5TW9kZWwoKSwgYmFzZSwgYnVuZGxlVVJMKTsKLQkJCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldENvbmZpZ3VyYXRpb25TaXRlc01vZGVsKCksIGJhc2UsIGJ1bmRsZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXt9CQkKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBkZWxheWVkUmVzb2x2ZSgpIHsKLQotCQkvLyBQRVJGOiBkZWxheSByZXNvbHV0aW9uCi0JCWlmIChyZXNvbHZlZCkKLQkJCXJldHVybjsKLQotCQlyZXNvbHZlZCA9IHRydWU7Ci0JCS8vIHJlc29sdmUgbG9jYWwgZWxlbWVudHMKLQkJdHJ5IHsKLQkJCS8vbG9jYXRpb25VUkwgPSByZXNvbHZlVVJMKGJhc2UsIGJ1bmRsZVVSTCwgbG9jYXRpb25VUkxTdHJpbmcpOwkJCi0JCQlsb2NhdGlvblVSTCA9IG5ldyBVUkwobG9jYXRpb25VUkxTdHJpbmcpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShsb2NhdGlvblVSTFN0cmluZyk7Ci0JCQl0cnkgewotCQkJCWlmIChmLmV4aXN0cygpKQotCQkJCQlsb2NhdGlvblVSTCA9IGYudG9VUkwoKTsKLQkJCQllbHNlCi0JCQkJCWxvY2F0aW9uVVJMID0gYmFzZTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotCQkJCWxvY2F0aW9uVVJMID0gYmFzZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldEFjdGl2aXRpZXMoKSB7Ci0JCWFjdGl2aXRpZXMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0luc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQ1MDgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0luc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0KLS8qKgotICogcGFyc2UgdGhlIGRlZmF1bHQgc2l0ZS54bWwKLSAqLwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIgewotCXByaXZhdGUgUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlnOwotCXByaXZhdGUgVVJMIHNpdGVVUkw7Ci0JcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZzsKLQlwcml2YXRlIENvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlnU2l0ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWZhdWx0U2l0ZVBhcnNlcgotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlcigKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZywKLQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzVHJ1ZShwbGF0Zm9ybUNvbmZpZyBpbnN0YW5jZW9mIFBsYXRmb3JtQ29uZmlndXJhdGlvbik7Ci0JCXRoaXMucGxhdGZvcm1Db25maWcgPSAoUGxhdGZvcm1Db25maWd1cmF0aW9uKXBsYXRmb3JtQ29uZmlnOwotCQkKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJLy8gREVCVUc6CQkKLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKLQkJCVVwZGF0ZUNvcmUuZGVidWcoIlN0YXJ0IHBhcnNpbmcgQ29uZmlndXJhdGlvbjoiICsgKGNvbmZpZykuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcHJvY2Vzc0NvbmZpZyh0aGlzLnBsYXRmb3JtQ29uZmlnKTsKLQl9Ci0KLQotCi0JLyoqIAotCSAqIHByb2Nlc3MgdGhlIFNpdGUgaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzU2l0ZShTaXRlRW50cnkgc2l0ZUVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCS8vc2l0ZSB1cmwKLQkJc2l0ZVVSTCA9IHNpdGVFbnRyeS5nZXRVUkwoKTsKLQkJdHJ5IHsKLQkJCXNpdGVVUkwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHNpdGVVUkwpOwotCQkJLy8gVE9ETyB3b3JrYXJvdW5kIGJ1ZyBpbiBwbGF0Zm9ybSB1cmwgcmVzb2x1dGlvbgotCQkJaWYgKHNpdGVVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXNpdGVVUkwgPSBuZXcgRmlsZShzaXRlVVJMLmdldEZpbGUoKSkudG9VUkwoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8ga2VlcCBvcmlnaW5hbCB1cmwKLQkJfQotCi0JCS8vIHBvbGljeQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShzaXRlVVJMLG51bGwpOwotCi0JCS8vIGNvbmZpZ3VyYXRpb24gc2l0ZQotCQlCYXNlU2l0ZUxvY2FsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCk7Ci0JCWNvbmZpZ1NpdGUgPSBmYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25TaXRlTW9kZWwoKFNpdGVNb2RlbCkgc2l0ZSwgc2l0ZUVudHJ5LmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCkpOwotCi0JCS8vcGxhdGZvcm0gdXJsCi0JCWNvbmZpZ1NpdGUuc2V0UGxhdGZvcm1VUkxTdHJpbmcoc2l0ZUVudHJ5LmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkKLQkJLy8gY29uZmlndXJlZAotCQljb25maWdTaXRlLnNldEVuYWJsZWQoc2l0ZUVudHJ5LmlzRW5hYmxlZCgpKTsKLQotCQkvLyBjaGVjayBpZiB0aGUgc2l0ZSBleGlzdHMgYW5kIGlzIHVwZGF0YWJsZQotCSAJY29uZmlnU2l0ZS5zZXRVcGRhdGFibGUoc2l0ZUVudHJ5LmlzVXBkYXRlYWJsZSgpKTsKLQkgCQotCQkvLyBhZGQgdG8gaW5zdGFsbCBjb25maWd1cmF0aW9uCi0JIAljb25maWcuYWRkQ29uZmlndXJhdGlvblNpdGVNb2RlbChjb25maWdTaXRlKTsKLQkgCWNvbmZpZ1NpdGUuc2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbChjb25maWcpOwotCQkKLQkJRmVhdHVyZUVudHJ5W10gZmVhdHVyZXMgPSBzaXRlRW50cnkuZ2V0RmVhdHVyZUVudHJpZXMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9jZXNzRmVhdHVyZShmZWF0dXJlc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKiogCi0JICogcHJvY2VzcyB0aGUgRGVmYXVsdEZlYXR1cmUgaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRmVhdHVyZShGZWF0dXJlRW50cnkgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQkvLyB1cmwKLQkJU3RyaW5nIHBhdGggPSBmZWF0dXJlLmdldFVSTCgpOyAvLyROT04tTkxTLTEkCi0JCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGVVUkwsIHBhdGgsIG51bGwpOwotCi0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCQlyZWYuc2V0U2l0ZSgoSVNpdGUpIGNvbmZpZ1NpdGUuZ2V0U2l0ZU1vZGVsKCkpOwotCQkJcmVmLnNldFVSTCh1cmwpOwotCQkJKGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkpLmFkZENvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlKHJlZik7Ci0KLQkJCS8vdXBkYXRlVVJMCi0vL1RPRE8gZG8gd2UgbmVlZCB0aGUgdXBkYXRlIHVybCBhbmQgdG8gcmVzb2x2ZSBpdD8KLS8vCQkJU3RyaW5nIHVwZGF0ZVVSTFN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVwZGF0ZVVSTCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCVVSTEVudHJ5IGVudHJ5ID0gbmV3IFVSTEVudHJ5KCk7Ci0vLwkJCWVudHJ5LnNldFVSTFN0cmluZyh1cGRhdGVVUkxTdHJpbmcpOwotLy8JCQllbnRyeS5yZXNvbHZlKHNpdGVVUkwsbnVsbCk7Ci0KLQkJCS8vIERFQlVHOgkJCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgewotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkVuZCBQcm9jZXNzaW5nIERlZmF1bHRGZWF0dXJlIFRhZzogdXJsOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJVXBkYXRlQ29yZS5sb2coIFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlci5GZWF0dXJlUmVmZXJlbmNlTm9VUkwiKSwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQkvKiogCi0JICogcHJvY2VzcyB0aGUgQWN0aXZpdHkgaW5mbwotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY3Rpdml0eShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLS8vCi0vLwkJLy8gYWN0aW9uCi0vLwkJU3RyaW5nIGFjdGlvblN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0vLwkJaW50IGFjdGlvbiA9IEludGVnZXIucGFyc2VJbnQoYWN0aW9uU3RyaW5nKTsKLS8vCi0vLwkJLy8gY3JlYXRlCi0vLwkJQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwgYWN0aXZpdHkgPQotLy8JCQluZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKS5jcmVhdGVDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCgpOwotLy8JCWFjdGl2aXR5LnNldEFjdGlvbihhY3Rpb24pOwotLy8KLS8vCQkvLyBsYWJlbAotLy8JCVN0cmluZyBsYWJlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlpZiAobGFiZWwgIT0gbnVsbCkKLS8vCQkJYWN0aXZpdHkuc2V0TGFiZWwobGFiZWwpOwotLy8KLS8vCQkvLyBkYXRlCi0vLwkJU3RyaW5nIGRhdGVTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJkYXRlIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZShMb25nLnBhcnNlTG9uZyhkYXRlU3RyaW5nKSk7Ci0vLwkJYWN0aXZpdHkuc2V0RGF0ZShkYXRlKTsKLS8vCi0vLwkJLy8gc3RhdHVzCi0vLwkJU3RyaW5nIHN0YXR1c1N0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInN0YXR1cyIpOyAvLyROT04tTkxTLTEkCi0vLwkJaW50IHN0YXR1cyA9IEludGVnZXIucGFyc2VJbnQoc3RhdHVzU3RyaW5nKTsKLS8vCQlhY3Rpdml0eS5zZXRTdGF0dXMoc3RhdHVzKTsKLS8vCi0vLwkJY29uZmlnLmFkZEFjdGl2aXR5TW9kZWwoYWN0aXZpdHkpOwotLy8KLS8vCQkvLyBERUJVRzoJCQotLy8JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7Ci0vLwkJCVVwZGF0ZUNvcmUuZGVidWcoIkVuZCBQcm9jZXNzaW5nIEFjdGl2aXR5OiBhY3Rpb246IiArIGFjdGlvblN0cmluZyArICIgbGFiZWw6ICIgKyBsYWJlbCArICIgZGF0ZToiICsgZGF0ZVN0cmluZyArICIgc3RhdHVzIiArIHN0YXR1c1N0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLS8vCQl9Ci0vLwotLy8JfQotCi0JLyoqIAotCSAqIHByb2Nlc3MgdGhlIENvbmZpZyBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25maWcoUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlnKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCS8vIGRhdGUKLQkJRGF0ZSBkYXRlID0gbmV3IERhdGUocGxhdGZvcm1Db25maWcuZ2V0Q2hhbmdlU3RhbXAoKSk7Ci0JCWNvbmZpZy5zZXRDcmVhdGlvbkRhdGUoZGF0ZSk7Ci0JCWNvbmZpZy5zZXRMYWJlbChkYXRlLnRvU3RyaW5nKCkpOwotCQkKLQkJLy90aW1lbGluZQotLy8JCVN0cmluZyB0aW1lbGluZVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInRpbWVsaW5lIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlsb25nIHRpbWVsaW5lID0gY29uZmlnLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsKLS8vCQlpZiAodGltZWxpbmVTdHJpbmchPW51bGwpIHsKLS8vCQkJdGltZWxpbmUgPSBMb25nLnBhcnNlTG9uZyh0aW1lbGluZVN0cmluZyk7Ci0vLwkJfQotLy8JCWNvbmZpZy5zZXRUaW1lbGluZSh0aW1lbGluZSk7Ci0KLQkJU2l0ZUVudHJ5W10gc2l0ZXMgPSBwbGF0Zm9ybUNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0U2l0ZXMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHNpdGVzLmxlbmd0aDsgaSsrKQotCQkJcHJvY2Vzc1NpdGUoc2l0ZXNbaV0pOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvU2l0ZUxvY2FsTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVMb2NhbE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2IyNmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvU2l0ZUxvY2FsTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGNvbmZpZ3VyYXRpb25zLgotICovCi0KLXB1YmxpYyBjbGFzcyBTaXRlTG9jYWxNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRklMRSA9ICJwbGF0Zm9ybS54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBsb25nIHN0YW1wOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgVVJMIGxvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nOwotCXByaXZhdGUgaW50IGhpc3RvcnkgPSBVcGRhdGVDb3JlLkRFRkFVTFRfSElTVE9SWTsKLQlwcml2YXRlIExpc3QgLyogb2YgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCAqL2NvbmZpZ3VyYXRpb25zOwotCXByaXZhdGUgTGlzdCAvKiBvZiBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsICovcHJlc2VydmVkQ29uZmlndXJhdGlvbnM7Ci0JcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGN1cnJlbnRDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvY2FsU2l0ZQotCSAqLwotCXB1YmxpYyBTaXRlTG9jYWxNb2RlbCgpewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gY3VycmVudENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsW10gZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb25zPT1udWxsKQotCQkJLy8gaW5pdGlhbGl6ZSBoaXN0b3J5Ci0JCQlwcm9jZXNzSGlzdG9yeSgpOwotCQkKLQkJaWYgKGNvbmZpZ3VyYXRpb25zID09IG51bGwgfHwgY29uZmlndXJhdGlvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWxbMF07Ci0JCWVsc2UKLQkJCXJldHVybiAoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFtdKWNvbmZpZ3VyYXRpb25zLnRvQXJyYXkoYXJyYXlUeXBlRm9yKGNvbmZpZ3VyYXRpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogYWRkcyBhIG5ldyBjb25maWd1cmF0aW9uIHRvIHRoZSBMb2NhbFNpdGUKLQkgKiAgdGhlIG5ld2x5IGFkZGVkIGNvbmZpZ3VyYXRpb24gaXMgdGVoIGN1cnJlbnQgb25lCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbk1vZGVsKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlnKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJaWYgKGNvbmZpZ3VyYXRpb25zID09IG51bGwpCi0JCQkJY29uZmlndXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoIWNvbmZpZ3VyYXRpb25zLmNvbnRhaW5zKGNvbmZpZykpCi0JCQkJY29uZmlndXJhdGlvbnMuYWRkKGNvbmZpZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGRzIGEgbmV3IGNvbmZpZ3VyYXRpb24gdG8gdGhlIExvY2FsU2l0ZQotCSAqICB0aGUgbmV3bHkgYWRkZWQgY29uZmlndXJhdGlvbiBpcyB0ZWggY3VycmVudCBvbmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29uZmlndXJhdGlvbnMucmVtb3ZlKGNvbmZpZyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbG9jYWwgc2l0ZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBVUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldExvY2F0aW9uVVJMKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9jYXRpb25VUkxTdHJpbmcuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTFN0cmluZygpIHsKLQkJcmV0dXJuIGxvY2F0aW9uVVJMU3RyaW5nOwotCX0KLQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9jYXRpb25VUkxTdHJpbmcuCi0JICogQHBhcmFtIGxvY2F0aW9uVVJMU3RyaW5nIFRoZSBsb2NhdGlvblVSTFN0cmluZyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVSTFN0cmluZyhTdHJpbmcgbG9jYXRpb25VUkxTdHJpbmcpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5sb2NhdGlvblVSTFN0cmluZyA9IGxvY2F0aW9uVVJMU3RyaW5nOwotCQl0aGlzLmxvY2F0aW9uPW51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRNYXhpbXVtSGlzdG9yeUNvdW50KCkgewotCQlyZXR1cm4gaGlzdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4aW11bUhpc3RvcnlDb3VudChpbnQgaGlzdG9yeSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmhpc3RvcnkgPSBoaXN0b3J5OwotCX0KLQotCQotCS8qKgotCSAqIEFkZHMgYSBwcmVzZXJ2ZWQgY29uZmlndXJhdGlvbiBpbnRvIHRlaCBjb2xsZWN0aW9uCi0JICogZG8gbm90IHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJlc2VydmVkSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZ3VyYXRpb24pIHsKLQkJaWYgKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zID09IG51bGwpCi0JCQlwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucy5hZGQoY29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVByZXNlcnZlZENvbmZpZ3VyYXRpb25Nb2RlbChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZ3VyYXRpb24pIHsKLQkJaWYgKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zICE9IG51bGwpIHsKLQkJCXJldHVybiBwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucy5yZW1vdmUoY29uZmlndXJhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFtdIGdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zTW9kZWwoKSB7Ci0JCWlmIChwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucz09bnVsbCB8fCBwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmV3IEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWxbMF07Ci0JCXJldHVybiAoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFtdKXByZXNlcnZlZENvbmZpZ3VyYXRpb25zLnRvQXJyYXkoYXJyYXlUeXBlRm9yKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50Q29uZmlndXJhdGlvbi4KLQkgKiBAcGFyYW0gY3VycmVudENvbmZpZ3VyYXRpb24gVGhlIGN1cnJlbnRDb25maWd1cmF0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjdXJyZW50Q29uZmlndXJhdGlvbikgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmN1cnJlbnRDb25maWd1cmF0aW9uID0gY3VycmVudENvbmZpZ3VyYXRpb247Ci0JCQotCQkvLzIuMC4yIHNldCB0aGUgY29uZmlndXJlZFNpdGUgb2Ygc2l0ZXMKLQkJQ29uZmlndXJlZFNpdGVNb2RlbFtdIGNvbmZTaXRlcyA9IGN1cnJlbnRDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyYXRpb25TaXRlc01vZGVsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZlNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb25mU2l0ZXNbaV0uZ2V0U2l0ZU1vZGVsKCkuc2V0Q29uZmlndXJlZFNpdGVNb2RlbChjb25mU2l0ZXNbaV0pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsT2JqZWN0I3Jlc29sdmUoVVJMKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCS8vIGxvY2FsCi0JCWxvY2F0aW9uID0gcmVzb2x2ZVVSTChiYXNlLGJ1bmRsZVVSTCxnZXRMb2NhdGlvblVSTFN0cmluZygpKTsKLQkJCi0JCS8vIGRlbGVnYXRlCi0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldENvbmZpZ3VyYXRpb25IaXN0b3J5TW9kZWwoKSxiYXNlLGJ1bmRsZVVSTCk7Ci0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zTW9kZWwoKSxiYXNlLGJ1bmRsZVVSTCk7Ci0JCXJlc29sdmVSZWZlcmVuY2UoZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgpLGJhc2UsYnVuZGxlVVJMKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdGFtcC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBsb25nCi0JICovCi0JcHVibGljIGxvbmcgZ2V0U3RhbXAoKSB7Ci0JCXJldHVybiBzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGFtcC4KLQkgKiBAcGFyYW0gc3RhbXAgVGhlIHN0YW1wIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW1wKGxvbmcgc3RhbXApIHsKLQkJdGhpcy5zdGFtcCA9IHN0YW1wOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuTW9kZWxPYmplY3QjZ2V0UHJvcGVydHlOYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIHJlYWRzIHRoZSBjb25maWd1cmF0aW9uL2hpc3RvcnkgZGlyZWN0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NIaXN0b3J5KCkgewotCQl0cnkgewotCQkJVVJMIGhpc3RvcnlVUkwgPSBuZXcgVVJMKGdldExvY2F0aW9uVVJMKCksICJoaXN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWhpc3RvcnlVUkwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKGhpc3RvcnlVUkwpOwotCQkJRmlsZSBoaXN0b3J5RGlyID0gbmV3IEZpbGUoaGlzdG9yeVVSTC5nZXRGaWxlKCkpOwotCQkJaWYgKGhpc3RvcnlEaXIuZXhpc3RzKCkpIHsKLQkJCQlGaWxlW10gYmFja2VkQ29uZmlncyA9IGhpc3RvcnlEaXIubGlzdEZpbGVzKCk7Ci0JCQkJQmFzZVNpdGVMb2NhbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxiYWNrZWRDb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gYmFja2VkQ29uZmlnc1tpXS5nZXROYW1lKCk7Ci0JCQkJCWlmIChuYW1lLmVuZHNXaXRoKCIueG1sIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpLTQpOwotCQkJCQllbHNlIAotCQkJCQkJY29udGludWU7Ci0JCQkJCURhdGUgZGF0ZSA9IG5ldyBEYXRlKExvbmcucGFyc2VMb25nKG5hbWUpKTsKLQkJCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcgPSBmYWN0b3J5LmNyZWF0ZUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKTsKLQkJCQkJY29uZmlnLnNldExvY2F0aW9uVVJMU3RyaW5nKGJhY2tlZENvbmZpZ3NbaV0uZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpKTsKLQkJCQkJY29uZmlnLnNldExhYmVsKGRhdGUudG9TdHJpbmcoKSk7Ci0JCQkJCWNvbmZpZy5zZXRDcmVhdGlvbkRhdGUoZGF0ZSk7Ci0JCQkJCWNvbmZpZy5yZXNvbHZlKGJhY2tlZENvbmZpZ3NbaV0udG9VUkwoKSwgZ2V0UmVzb3VyY2VCdW5kbGVVUkwoKSk7Ci0JCi0JCQkJCS8vIGFkZCB0aGUgY29uZmlnCi0JCQkJCWFkZENvbmZpZ3VyYXRpb25Nb2RlbChjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiRXJyb3IgcHJvY2Vzc2luZyBoaXN0b3J5OiAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgc2l0ZWxvY2FsCi0JICovCi0JVVJMIGdldFJlc291cmNlQnVuZGxlVVJMKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5hc0RpcmVjdG9yeVVSTChnZXRMb2NhdGlvblVSTCgpKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICI6IiArIHVybC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlTG9jYWxQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVMb2NhbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E3MzdkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVMb2NhbFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLS8qKgotICogcGFyc2UgdGhlIGRlZmF1bHQgc2l0ZS54bWwKLSAqLwotCi1wdWJsaWMgY2xhc3MgU2l0ZUxvY2FsUGFyc2VyIHsKLQotCXByaXZhdGUgUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlnOwotCXByaXZhdGUgU2l0ZUxvY2FsTW9kZWwgc2l0ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUcgPSAiY29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgYnVuZGxlOwotCXByaXZhdGUgQmFzZVNpdGVMb2NhbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpOwotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgc2l0ZWxvY2FsCi0JICovCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuYXNEaXJlY3RvcnlVUkwoc2l0ZS5nZXRMb2NhdGlvblVSTCgpKTsKLQkJCUNsYXNzTG9hZGVyIGwgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgdXJsIH0sIG51bGwpOwotCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJwbGF0Zm9ybSIsIExvY2FsZS5nZXREZWZhdWx0KCksIGwpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgKyAiOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWZhdWx0U2l0ZVBhcnNlcgotCSAqLwotCXB1YmxpYyBTaXRlTG9jYWxQYXJzZXIoSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZywgSUxvY2FsU2l0ZSBzaXRlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNUcnVlKHBsYXRmb3JtQ29uZmlnIGluc3RhbmNlb2YgUGxhdGZvcm1Db25maWd1cmF0aW9uKTsKLQkJdGhpcy5wbGF0Zm9ybUNvbmZpZyA9IChQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pcGxhdGZvcm1Db25maWc7Ci0JCQotCQlBc3NlcnQuaXNUcnVlKHNpdGUgaW5zdGFuY2VvZiBTaXRlTG9jYWxNb2RlbCk7Ci0JCXRoaXMuc2l0ZSA9IChTaXRlTG9jYWxNb2RlbCkgc2l0ZTsKLQotCQkvLyBERUJVRzoJCQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygiU3RhcnQgcGFyc2luZyBsb2NhbHNpdGU6IiArICgoU2l0ZUxvY2FsTW9kZWwpIHNpdGUpLmdldExvY2F0aW9uVVJMU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCQotCQlwcm9jZXNzQ29uZmlnKCk7Ci0JCS8vcHJvY2Vzc0hpc3RvcnkoKTsKLQl9Ci0KLQkKLS8vCS8qKiAKLS8vCSAqIHByb2Nlc3MgdGhlIFNpdGUgaW5mbwotLy8JICovCi0vLwlwcml2YXRlIHZvaWQgcHJvY2Vzc1NpdGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLS8vCQkvLwotLy8JCVN0cmluZyBpbmZvID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJAotLy8JCWluZm8gPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0UmVzb3VyY2VTdHJpbmcoaW5mbywgYnVuZGxlKTsKLS8vCQlzaXRlLnNldExhYmVsKGluZm8pOwotLy8JCi0vLwkJLy8gaGlzdG9yeQotLy8JCVN0cmluZyBoaXN0b3J5U3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaGlzdG9yeSIpOyAvLyROT04tTkxTLTEkCi0vLwkJaW50IGhpc3Rvcnk7Ci0vLwkJaWYgKGhpc3RvcnlTdHJpbmcgPT0gbnVsbCB8fCBoaXN0b3J5U3RyaW5nLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotLy8JCQloaXN0b3J5ID0gU2l0ZUxvY2FsTW9kZWwuREVGQVVMVF9ISVNUT1JZOwotLy8JCX0gZWxzZSB7Ci0vLwkJCWhpc3RvcnkgPSBJbnRlZ2VyLnBhcnNlSW50KGhpc3RvcnlTdHJpbmcpOwotLy8JCX0KLS8vCQlzaXRlLnNldE1heGltdW1IaXN0b3J5Q291bnQoaGlzdG9yeSk7Ci0vLwkKLS8vCQkvL3N0YW1wCi0vLwkJU3RyaW5nIHN0YW1wU3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgic3RhbXAiKTsgLy8kTk9OLU5MUy0xJAotLy8JCWxvbmcgc3RhbXAgPSBMb25nLnBhcnNlTG9uZyhzdGFtcFN0cmluZyk7Ci0vLwkJc2l0ZS5zZXRTdGFtcChzdGFtcCk7Ci0vLwkKLS8vCQkvLyBERUJVRzoJCQotLy8JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7Ci0vLwkJCVVwZGF0ZUNvcmUuZGVidWcoIkVuZCBwcm9jZXNzIFNpdGUgbGFiZWw6IiArIGluZm8pOyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8JCi0vLwl9Ci0KLQkvKiogCi0JICogcHJvY2VzcyB0aGUgQ29uZmlnIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZygpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCVN0cmluZyBsYWJlbCA9IHBsYXRmb3JtQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXREYXRlKCkudG9TdHJpbmcoKTsKLQkJbGFiZWwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0UmVzb3VyY2VTdHJpbmcobGFiZWwsIGJ1bmRsZSk7Ci0JCXNpdGUuc2V0TGFiZWwobGFiZWwpOwotCi0JCVVSTCB1cmwgPSBzaXRlLmdldExvY2F0aW9uVVJMKCk7Ci0JCUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlnID0gZmFjdG9yeS5jcmVhdGVJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCk7Ci0JCWNvbmZpZy5zZXRMb2NhdGlvblVSTFN0cmluZyh1cmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWNvbmZpZy5zZXRMYWJlbChsYWJlbCk7Ci0JCWNvbmZpZy5yZXNvbHZlKHVybCwgc2l0ZS5nZXRSZXNvdXJjZUJ1bmRsZVVSTCgpKTsKLQotCQkvLyBhZGQgdGhlIGNvbmZpZwotCQkoKFNpdGVMb2NhbClzaXRlKS5hZGRDb25maWd1cmF0aW9uKChJbnN0YWxsQ29uZmlndXJhdGlvbiljb25maWcpOwotCi0JCS8vIERFQlVHOgkJCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7Ci0JCQlVcGRhdGVDb3JlLmRlYnVnKCJFbmQgUHJvY2Vzc2luZyBDb25maWcgVGFnOiB1cmw6IiArIHVybC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9CYXRjaEluc3RhbGxPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQmF0Y2hJbnN0YWxsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTNiNTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9CYXRjaEluc3RhbGxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBCYXRjaEluc3RhbGxPcGVyYXRpb24KLQlleHRlbmRzIE9wZXJhdGlvbgotCWltcGxlbWVudHMgSUJhdGNoT3BlcmF0aW9uIHsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JTlNUQUxMSU5HID0gIk9wZXJhdGlvbnNNYW5hZ2VyLmluc3RhbGxpbmciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIG9wZXJhdGlvbnM7Ci0KLQlwdWJsaWMgQmF0Y2hJbnN0YWxsT3BlcmF0aW9uKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIG9wZXJhdGlvbnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JTXVsdGlPcGVyYXRpb24jZ2V0T3BlcmF0aW9ucygpCi0JICovCi0JcHVibGljIElGZWF0dXJlT3BlcmF0aW9uW10gZ2V0T3BlcmF0aW9ucygpIHsKLQkJcmV0dXJuIG9wZXJhdGlvbnM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaW50IGluc3RhbGxDb3VudCA9IDA7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQkKLQkJaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCB8fCBvcGVyYXRpb25zLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkKLS8vCQkvLyBDaGVjayBmb3IgZHVwbGljYXRpb24gY29uZmxpY3RzCi0vLwkJQXJyYXlMaXN0IGNvbmZsaWN0cyA9Ci0vLwkJCUR1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5jb21wdXRlRHVwbGljYXRlQ29uZmxpY3RzKAotLy8JCQkJb3BlcmF0aW9ucywKLS8vCQkJCWNvbmZpZyk7Ci0vLwkJaWYgKGNvbmZsaWN0cyAhPSBudWxsKSB7Ci0vLwkJCWJvb2xlYW4gY29udGludWVQcm9jZXNzaW5nID0gZmFsc2U7Ci0vLwkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotLy8JCQkJY29udGludWVQcm9jZXNzaW5nID0gbGlzdGVuZXIuYmVmb3JlRXhlY3V0ZSh0aGlzLCBjb25mbGljdHMpOwotLy8JCQlpZiAoIWNvbnRpbnVlUHJvY2Vzc2luZykKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0JCQotCQlPcGVyYXRpb25zTWFuYWdlci5zZXRJblByb2dyZXNzKHRydWUpOwotCQlpZiAobW9uaXRvciA9PSBudWxsKSAKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJCi0JCXRyeSB7CQkJCi0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlsaXN0ZW5lci5iZWZvcmVFeGVjdXRlKHRoaXMsIG51bGwpOwotCQkJCi0JCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQlQb2xpY3kuYmluZChLRVlfSU5TVEFMTElORyksCi0JCQkJb3BlcmF0aW9ucy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPQotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotCQkJCQkJbW9uaXRvciwKLQkJCQkJCTEsCi0JCQkJCQlTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCi0JCQkJb3BlcmF0aW9uc1tpXS5leGVjdXRlKHN1Yk1vbml0b3IsIGxpc3RlbmVyKTsKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5hZGRQZW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbnNbaV0pOwotCi0JCQkJb3BlcmF0aW9uc1tpXS5tYXJrUHJvY2Vzc2VkKCk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJCWxpc3RlbmVyLmFmdGVyRXhlY3V0ZShvcGVyYXRpb25zW2ldLCBudWxsKTsKLQotCQkJCS8vbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJaW5zdGFsbENvdW50Kys7Ci0JCQl9Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCXJldHVybiBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNhdmVzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KLQkJCWlmIChpbnN0YWxsQ291bnQgPiAwKQotCQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKTsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNhdmVzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KLQkJCWlmIChpbnN0YWxsQ291bnQgPiAwKQotCQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKTsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJT3BlcmF0aW9uc01hbmFnZXIuc2V0SW5Qcm9ncmVzcyhmYWxzZSk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQ29uZmlnT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbmZpZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGRhNjE2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQ29uZmlnT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLS8qKgotICogQ29uZmlndXJlIGEgZmVhdHVyZS4KLSAqIENvbmZpZ09wZXJhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnT3BlcmF0aW9uCi0JZXh0ZW5kcyBGZWF0dXJlT3BlcmF0aW9uCi0JaW1wbGVtZW50cyBJQ29uZmlnRmVhdHVyZU9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQ29uZmlnT3BlcmF0aW9uKAotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihzaXRlLCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlTdGF0dXMgc3RhdHVzID0KLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ0NvbmZpZyhmZWF0dXJlKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCi0JCXRhcmdldFNpdGUuY29uZmlndXJlKGZlYXR1cmUpOwotLy8JCWVuc3VyZVVuaXF1ZSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBSZXN0YXJ0IG5vdCBuZWVkZWQKLQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IGZhbHNlOwotCi0JCQkvLyBDaGVjayBpZiB0aGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsaW5nIG9uZSB0aGF0J3MgYWxyZWFkeSBwZW5kaW5nCi0JCQlJT3BlcmF0aW9uIHBlbmRpbmdPcGVyYXRpb24gPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGZlYXR1cmUpOwotCi0JCQlpZiAocGVuZGluZ09wZXJhdGlvbiBpbnN0YW5jZW9mIElVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24pIHsKLQkJCQkvLyBubyBuZWVkIHRvIGRvIGVpdGhlciBwZW5kaW5nIGNoYW5nZQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLnJlbW92ZVBlbmRpbmdPcGVyYXRpb24ocGVuZGluZ09wZXJhdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmFkZFBlbmRpbmdPcGVyYXRpb24odGhpcyk7Ci0JCQl9Ci0KLQkJCW1hcmtQcm9jZXNzZWQoKTsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCWxpc3RlbmVyLmFmdGVyRXhlY3V0ZSh0aGlzLCBudWxsKTsKLQotCQkJcmVzdGFydE5lZWRlZCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKSAmJiByZXN0YXJ0TmVlZGVkOwotCi0JCQkvLyBub3RpZnkgdGhlIG1vZGVsCi0JCQlPcGVyYXRpb25zTWFuYWdlci5maXJlT2JqZWN0Q2hhbmdlZChmZWF0dXJlLCBudWxsKTsKLQotCQkJcmV0dXJuIHJlc3RhcnROZWVkZWQ7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdW5kbygpOwotCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRhcmdldFNpdGUudW5jb25maWd1cmUoZmVhdHVyZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9EdXBsaWNhdGVDb25mbGljdHNWYWxpZGF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YWJkYjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9EdXBsaWNhdGVDb25mbGljdHNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEdXBsaWNhdGVDb25mbGljdHNWYWxpZGF0b3IgIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09ORkxJQ1QgPQotCQkiRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLmNvbmZsaWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJZEVudHJ5IHsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlOwotCQlJRmVhdHVyZSBmZWF0dXJlOwotCi0JCXB1YmxpYyBJZEVudHJ5KElGZWF0dXJlIGZlYXR1cmUsIElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJCXRoaXMuY3NpdGUgPSBjc2l0ZTsKLQkJCWlmIChjc2l0ZSA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjc2l0ZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbGxDYW5kaWRhdGUoKSB7Ci0JCQlyZXR1cm4gY3NpdGUgIT0gbnVsbDsKLQkJfQotCQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJCXJldHVybiBmZWF0dXJlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQkJcmV0dXJuIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJfQotCQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldENvbmZpZ3VyZWRTaXRlKCkgewotCQkJaWYgKGNzaXRlICE9IG51bGwpCi0JCQkJcmV0dXJuIGNzaXRlOwotCQkJcmV0dXJuIGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHNhbWVMZXZlbChJZEVudHJ5IGVudHJ5KSB7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciBldmlkID0KLQkJCQllbnRyeS5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJcmV0dXJuIHZpZC5lcXVhbHMoZXZpZCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0KLQkJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGNvbmZpZ1NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJCXJldHVybiBQb2xpY3kuYmluZCgKLQkJCQlLRVlfQ09ORkxJQ1QsCi0JCQkJbmV3IFN0cmluZ1tdIHsgdmVyc2lvbiwgbG9jYXRpb24gfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRHVwbGljYXRlQ29uZmxpY3RzKAotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzKSB7Ci0JCUhhc2h0YWJsZSBmZWF0dXJlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXRyeSB7Ci0JCQljb21wdXRlUHJlc2VudFN0YXRlKGZlYXR1cmVUYWJsZSwgY29uZmlnKTsKLQkJCWNvbXB1dGVOZXdGZWF0dXJlKAotCQkJCWpvYi5nZXRGZWF0dXJlKCksCi0JCQkJdGFyZ2V0U2l0ZSwKLQkJCQlmZWF0dXJlVGFibGUsCi0JCQkJb3B0aW9uYWxGZWF0dXJlcyk7Ci0JCQlyZXR1cm4gY29tcHV0ZUNvbmZsaWN0cyhmZWF0dXJlVGFibGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUR1cGxpY2F0ZUNvbmZsaWN0cygKLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icywKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQljb21wdXRlUHJlc2VudFN0YXRlKGZlYXR1cmVUYWJsZSwgY29uZmlnKTsKLQkJY29tcHV0ZU5ld0ZlYXR1cmVzKGpvYnMsIGZlYXR1cmVUYWJsZSk7Ci0JCXJldHVybiBjb21wdXRlQ29uZmxpY3RzKGZlYXR1cmVUYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVDb25mbGljdHMoSGFzaHRhYmxlIGZlYXR1cmVUYWJsZSkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtID0gZmVhdHVyZVRhYmxlLmVsZW1lbnRzKCk7Ci0JCQllbnVtLmhhc01vcmVFbGVtZW50cygpOwotCQkJKSB7Ci0JCQlBcnJheUxpc3QgY2FuZGlkYXRlID0gKEFycmF5TGlzdCkgZW51bS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGNhbmRpZGF0ZS5zaXplKCkgPT0gMSkKLQkJCQljb250aW51ZTsKLQkJCUFycmF5TGlzdCBjb25mbGljdCA9IGNoZWNrRm9yQ29uZmxpY3QoY2FuZGlkYXRlKTsKLQkJCWlmIChjb25mbGljdCAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVzdWx0LmFkZChjb25mbGljdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY2hlY2tGb3JDb25mbGljdChBcnJheUxpc3QgY2FuZGlkYXRlKSB7Ci0JCUlkRW50cnkgZmlyc3RFbnRyeSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FuZGlkYXRlLnNpemUoKTsgaSsrKSB7Ci0JCQlJZEVudHJ5IGVudHJ5ID0gKElkRW50cnkpIGNhbmRpZGF0ZS5nZXQoaSk7Ci0JCQlpZiAoZmlyc3RFbnRyeSA9PSBudWxsKQotCQkJCWZpcnN0RW50cnkgPSBlbnRyeTsKLQkJCWVsc2UgaWYgKCFlbnRyeS5zYW1lTGV2ZWwoZmlyc3RFbnRyeSkpCi0JCQkJcmV0dXJuIGNhbmRpZGF0ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVQcmVzZW50U3RhdGUoCi0JCUhhc2h0YWJsZSB0YWJsZSwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewotCQkJCXRyeSB7Ci0JCQkJCWFkZEVudHJ5KHJlZnNbal0uZ2V0RmVhdHVyZShudWxsKSwgY3NpdGUsIHRhYmxlKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gZG9uJ3QgbGV0IG9uZSBiYWQgZmVhdHVyZSBzdG9wIHRoZSBsb29wCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wdXRlTmV3RmVhdHVyZXMoCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMsCi0JCUhhc2h0YWJsZSBmZWF0dXJlVGFibGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gam9ic1tpXTsKLQkJCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlID0gam9iLmdldFRhcmdldFNpdGUoKTsKLQkJCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBqb2IuZ2V0RmVhdHVyZSgpOwotCQkJdHJ5IHsKLQkJCQljb21wdXRlTmV3RmVhdHVyZShuZXdGZWF0dXJlLCB0YXJnZXRTaXRlLCBmZWF0dXJlVGFibGUsIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVOZXdGZWF0dXJlKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUsCi0JCUhhc2h0YWJsZSB0YWJsZSwKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWFkZEVudHJ5KGZlYXR1cmUsIGNzaXRlLCB0YWJsZSk7Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07Ci0JCQlib29sZWFuIGFkZCA9IHRydWU7Ci0KLQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSAmJiBvcHRpb25hbEZlYXR1cmVzICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNoZWNrZWQgPSBvcHRpb25hbEZlYXR1cmVzW2pdOwotCQkJCQlpZiAoY2hlY2tlZC5lcXVhbHMoaXJlZikpIHsKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWFkZCA9IGZvdW5kOwotCQkJfQotCQkJaWYgKGFkZCkKLQkJCQljb21wdXRlTmV3RmVhdHVyZSgKLQkJCQkJaXJlZi5nZXRGZWF0dXJlKG51bGwpLAotCQkJCQljc2l0ZSwKLQkJCQkJdGFibGUsCi0JCQkJCW9wdGlvbmFsRmVhdHVyZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFbnRyeSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlLAotCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlKSB7Ci0JCVN0cmluZyBpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJQXJyYXlMaXN0IGVudHJpZXMgPSAoQXJyYXlMaXN0KSBmZWF0dXJlVGFibGUuZ2V0KGlkKTsKLQkJaWYgKGVudHJpZXMgPT0gbnVsbCkgewotCQkJZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZlYXR1cmVUYWJsZS5wdXQoaWQsIGVudHJpZXMpOwotCQl9Ci0JCUlkRW50cnkgZW50cnkgPSBuZXcgSWRFbnRyeShmZWF0dXJlLCBjc2l0ZSk7Ci0JCWJvb2xlYW4gcmVwbGFjZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJZEVudHJ5IGV4aXN0aW5nRW50cnkgPSAoSWRFbnRyeSkgZW50cmllcy5nZXQoaSk7Ci0JCQlJQ29uZmlndXJlZFNpdGUgZXhpc3RpbmdTaXRlID0gZXhpc3RpbmdFbnRyeS5nZXRDb25maWd1cmVkU2l0ZSgpOwotCQkJaWYgKGV4aXN0aW5nU2l0ZS5lcXVhbHMoZW50cnkuZ2V0Q29uZmlndXJlZFNpdGUoKSkpIHsKLQkJCQkvLyBzYW1lIHNpdGUgLSByZXBsYWNlIGl0IGlmIG5vdCBuZXcKLQkJCQlpZiAoZW50cnkuaXNJbnN0YWxsQ2FuZGlkYXRlKCkpIHsKLQkJCQkJZW50cmllcy5zZXQoaSwgZW50cnkpOwotCQkJCQllbnRyaWVzLnJlbW92ZShleGlzdGluZ0VudHJ5KTsKLQkJCQl9Ci0JCQkJcmVwbGFjZWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghcmVwbGFjZWQpCi0JCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlSGllcmFyY2h5RWxlbWVudC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlSGllcmFyY2h5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNmYjlkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY29uc3RydWN0IGEgam9pbnQgZmVhdHVyZSBoaWVhcmNoeS4KLSAqIE9sZCBmZWF0dXJlIHJlZmVyZW5jZSByZXByZXNlbnRzIGZlYXR1cmUgdGhhdCBpcwotICogZm91bmQgb24gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gTmV3IGZlYXR1cmUKLSAqIHJlZmVyZW5jZSBpcyBmb3VuZCBpbiB0aGUgZmVhdHVyZSB0aGF0IGlzIGFuIGluc3RhbGwvdXBkYXRlCi0gKiBjYW5kaWRhdGUuIFRoZSBlbGVtZW50IGlzIHVzZWQgdG8gam9pbiBub2RlcyBvZiB0aGUKLSAqIGhpZWFyY2h5IGZvcm1lZCBieSBpbmNsdWRpbmcgZmVhdHVyZXMgc28gdGhhdAotICogZWFjaCBub2RlIGluIHRoZSBoaWVhcmNoeSBjb250YWlucyByZWZlcmVuY2VzIHRvIHRoZQotICogb2xkIGFuZCB0aGUgbmV3IGZlYXR1cmUuIE9sZCBhbmQgbmV3IGZlYXR1cmVzIGhhdmUKLSAqIHRoZSBzYW1lIElEcyBidXQgZGlmZmVyZW50IHZlcnNpb25zLCBleGNlcHQgaW4gCi0gKiB0aGUgY2FzZSBvZiBvcHRpb25hbCBmZWF0dXJlcywgd2hlcmUgdGhlIHRyZWUgbWF5Ci0gKiBiZSBjb25zdHJ1Y3RlZCB0byBicmluZyBpbiBhbiBvcHRpb25hbCBmZWF0dXJlCi0gKiB0aGF0IHdhcyBub3QgaW5zdGFsbGVkIGluaXRpYWxseS4gSW4gdGhhdCBjYXNlLAotICogc29tZSBub2RlcyBtYXkgaGF2ZSBvbGQgYW4gbmV3IHJlZmVyZW5jZXMgd2l0aCB0aGUKLSAqIHNhbWUgSUQgYW5kIHZlcnNpb24uIAotICogPHA+Ci0gKiBPbGQgZmVhdHVyZSByZWZlcmVuY2UgbWF5IGJlIG51bGwuIFRoYXQgbWVhbnMKLSAqIHRoYXQgdGhlIG9sZGVyIGZlYXR1cmUgd2l0aCB0aGUgc2FtZSBJRCBidXQgbG93ZXIKLSAqIHZlcnNpb24gd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgewotCi0JcHJpdmF0ZSBPYmplY3Qgcm9vdDsKLQlwcml2YXRlIEFycmF5TGlzdCBjaGlsZHJlbjsKLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIG9sZEZlYXR1cmVSZWY7Ci0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZSBuZXdGZWF0dXJlUmVmOwotCXByaXZhdGUgYm9vbGVhbiBjaGVja2VkOwotCXByaXZhdGUgYm9vbGVhbiBvcHRpb25hbENoaWxkcmVuOwotCXByaXZhdGUgYm9vbGVhbiBuYXRpdmVVcGdyYWRlID0gZmFsc2U7Ci0KLQlwdWJsaWMgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQoCi0JCUlGZWF0dXJlUmVmZXJlbmNlIG9sZFJlZiwKLQkJSUZlYXR1cmVSZWZlcmVuY2UgbmV3UmVmKSB7Ci0JCW9sZEZlYXR1cmVSZWYgPSBvbGRSZWY7Ci0JCW5ld0ZlYXR1cmVSZWYgPSBuZXdSZWY7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdChPYmplY3Qgcm9vdCkgewotCQl0aGlzLnJvb3QgPSByb290OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IGNhbiBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJLy8gY2Fubm90IHVuY2hlY2sgbm9uLW9wdGlvbmFsIGZlYXR1cmVzCi0JCWlmIChpc09wdGlvbmFsKCkgPT0gZmFsc2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIGNhbm5vdCB1bmNoZWNrIG9wdGlvbmFsIGZlYXR1cmUgdGhhdAotCQkvLyBoYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZAotCQlpZiAob2xkRmVhdHVyZVJlZiAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBIGhpcmVhcmNoeSBub2RlIHJlcHJlc2VudHMgYSAnZmFsc2UgdXBkYXRlJyBpZgotCSAqIGJvdGggb2xkIGFuZCBuZXcgcmVmZXJlbmNlcyBleGlzdCBhbmQgYm90aAotCSAqIHBvaW50IHRvIHRoZSBmZWF0dXJlIHdpdGggdGhlIHNhbWUgSUQgYW5kIHZlcnNpb24uCi0JICogVGhlc2Ugbm9kZXMgd2lsbCBub3QgYW55IGJ5dGVzIHRvIGJlIGRvd25sb2FkZWQgLSAKLQkgKiB0aGV5IHNpbXBseSBleGlzdCB0byBhbGxvdyB0aGUgaGlyYXJjaHkgdG8KLQkgKiByZWFjaCB0aGUgb3B0aW9uYWwgY2hpbGRyZW4gdGhhdCBhcmUgbWlzc2luZwotCSAqIGFuZCB3aWxsIGJlIGluc3RhbGxlZC4KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGlzRmFsc2VVcGRhdGUoKSB7Ci0JCWlmIChvbGRGZWF0dXJlUmVmICE9IG51bGwgJiYgbmV3RmVhdHVyZVJlZiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBvbGRGZWF0dXJlUmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoCi0JCQkJCW5ld0ZlYXR1cmVSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGZlYXR1cmUgaXMgaW5jbHVkZWQgYXMgb3B0aW9uYWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIG5ld0ZlYXR1cmVSZWYgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlCi0JCQkmJiAoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIG5ld0ZlYXR1cmVSZWYpLmlzT3B0aW9uYWwoKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb3B0aW9uYWwgZmVhdHVyZSBpcyBzZWxlY3RlZAotCSAqIGZvciBpbnN0YWxsYXRpb24uIE5vbi1vcHRpb25hbCBmZWF0dXJlcyBvciBub24tZWRpdGFibGUKLQkgKiBmZWF0dXJlcyBhcmUgYWx3YXlzIGNoZWNrZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCkgewotCQlyZXR1cm4gY2hlY2tlZDsKLQl9Ci0KLQl2b2lkIHNldE5hdGl2ZVVwZ3JhZGUoYm9vbGVhbiBuYXRpdmVVcGdyYWRlKSB7Ci0JCXRoaXMubmF0aXZlVXBncmFkZSA9IG5hdGl2ZVVwZ3JhZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb3B0aW9uYWwgZmVhdHVyZSBzaG91bGQKLQkgKiBiZSBlbmFibGVkIHdoZW4gaW5zdGFsbGVkLiBCeSBkZWZhdWx0LCBhbGwKLQkgKiBmZWF0dXJlcyBpbiB0aGUgaGllYXJjaHkgc2hvdWxkIGJlIGVuYWJsZWQuCi0JICogVGhlIGV4Y2VwdGlvbiBpcyBmb3Igb3B0aW9uYWwgZmVhdHVyZXMgdGhhdAotCSAqIGFyZSB1cGRhdGVkIHRvIGEgbmV3IHZlcnNpb24gaW4gY2FzZSB3aGVyZQotCSAqIHRoZSBvbGRlciB2ZXJzaW9uIG9mIHRoZSBvcHRpb25hbCBmZWF0dXJlCi0JICogaXMgZGlzYWJsZWQgaW4gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIAotCSAqIEluIHRoaXMgY2FzZSwgdGhlIGZlYXR1cmUgaXMKLQkgKiB1cGRhdGVkIGFuZCBkaXNhYmxlZCBpbiBvcmRlciB0byBtYWludGFpbgotCSAqIGl0cyBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAobmF0aXZlVXBncmFkZSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoaXNPcHRpb25hbCgpICYmIG9sZEZlYXR1cmVSZWYgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gb2xkRmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9Ci0JCQkJCVVwZGF0ZVV0aWxzLmdldENvbmZpZ1NpdGUob2xkRmVhdHVyZSwgY29uZmlnKTsKLQkJCQlyZXR1cm4gY3NpdGUuaXNDb25maWd1cmVkKG9sZEZlYXR1cmUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXRyeSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gbmV3RmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIGFuIGVkaXRhYmxlIGZlYXR1cmUgZm9yIGluc3RhbGxhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgewotCQl0aGlzLmNoZWNrZWQgPSBjaGVja2VkOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGxhYmVsIGZvciBVSSBwcmVzZW50YXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRGZWF0dXJlTGFiZWwobmV3RmVhdHVyZVJlZik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYgKG5ld0ZlYXR1cmVSZWYgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSB7Ci0JCQkJU3RyaW5nIGluYW1lID0KLQkJCQkJKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSBuZXdGZWF0dXJlUmVmKS5nZXROYW1lKCk7Ci0JCQkJaWYgKGluYW1lICE9IG51bGwpCi0JCQkJCXJldHVybiBpbmFtZTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPQotCQkJCQluZXdGZWF0dXJlUmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQlyZXR1cm4gdmlkLnRvU3RyaW5nKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUyKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIENvbXB1dGVzIGxhYmVsIGZyb20gdGhlIGZlYXR1cmUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZUxhYmVsKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKQotCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogQ29tcHV0ZXMgY2hpbGRyZW4gYnkgbGlua2luZyBtYXRjaGluZyBmZWF0dXJlcyBmcm9tIHRoZQotCSAqIG9sZCBmZWF0dXJlJ3MgYW5kIG5ldyBmZWF0dXJlJ3MgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGdldENoaWxkcmVuKAotCQlib29sZWFuIHVwZGF0ZSwKLQkJYm9vbGVhbiBwYXRjaCwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQljb21wdXRlQ2hpbGRyZW4odXBkYXRlLCBwYXRjaCwgY29uZmlnKTsKLQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBhcnJheSA9Ci0JCQluZXcgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbY2hpbGRyZW4uc2l6ZSgpXTsKLQkJY2hpbGRyZW4udG9BcnJheShhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gYXJyYXkgPQotCQkJCW5ldyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtjaGlsZHJlbi5zaXplKCldOwotCQkJY2hpbGRyZW4udG9BcnJheShhcnJheSk7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50WzBdOwotCX0KLQkvKioKLQkgKiBDb21wdXRlcyBjaGlsZHJlbiBvZiB0aGlzIG5vZGUuCi0JICovCi0JcHVibGljIHZvaWQgY29tcHV0ZUNoaWxkcmVuKAotCQlib29sZWFuIHVwZGF0ZSwKLQkJYm9vbGVhbiBwYXRjaCwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBudWxsOwotCQkJCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBudWxsOwotCQkJCW5ld0ZlYXR1cmUgPSBuZXdGZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKG9sZEZlYXR1cmVSZWYgIT0gbnVsbCkKLQkJCQkJb2xkRmVhdHVyZSA9IG9sZEZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlvcHRpb25hbENoaWxkcmVuID0KLQkJCQkJY29tcHV0ZUVsZW1lbnRzKAotCQkJCQkJb2xkRmVhdHVyZSwKLQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQl1cGRhdGUsCi0JCQkJCQlwYXRjaCwKLQkJCQkJCWNvbmZpZywKLQkJCQkJCWNoaWxkcmVuKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGVsZW1lbnQgPQotCQkJCQkJKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQkJCWVsZW1lbnQuc2V0Um9vdChnZXRSb290KCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBvcHRpb25hbENoaWxkcmVuOwotCX0KLQkvKioKLQkgKiBBZGRzIGNoZWNrZWQgb3B0aW9uYWwgZmVhdHVyZXMgdG8gdGhlIHByb3ZpZGVkIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcygKLQkJYm9vbGVhbiB1cGRhdGUsCi0JCWJvb2xlYW4gcGF0Y2gsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCVNldCBzZXQpIHsKLQkJaWYgKGlzT3B0aW9uYWwoKSAmJiBpc0NoZWNrZWQoKSkgewotCQkJLy8gRG8gbm90IGFkZCBjaGVja2VkIG9wdGlvbmFsIGZlYXR1cmVzCi0JCQkvLyBpZiB0aGlzIGlzIGFuIHVwZGF0ZSBjYXNlIGJ1dAotCQkJLy8gdGhlIG5vZGUgaXMgbm90IGEgJ3RydWUnIHVwZGF0ZQotCQkJLy8gKG9sZCBhbmQgbmV3IGZlYXR1cmUgYXJlIHRoZSBlcXVhbCkKLQkJCWlmICghdXBkYXRlIHx8ICFpc0ZhbHNlVXBkYXRlKCkpCi0JCQkJc2V0LmFkZChuZXdGZWF0dXJlUmVmKTsKLQkJfQotCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0Q2hpbGRyZW4odXBkYXRlLCBwYXRjaCwgY29uZmlnKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJZWxlbWVudHNbaV0uYWRkQ2hlY2tlZE9wdGlvbmFsRmVhdHVyZXModXBkYXRlLCBwYXRjaCwgY29uZmlnLCBzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgZmlyc3QtbGV2ZWwgY2hpbGRyZW4gb2YgdGhlIGxpbmtlZCBoaWVyYXJjaHkKLQkgKiBmb3IgdGhlIHByb3ZpZGVkIG9sZCBhbmQgbmV3IGZlYXR1cmVzIChzYW1lIElELCBkaWZmZXJlbnQgdmVyc2lvbgotCSAqIHdoZXJlIG5ldyB2ZXJzaW9uIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhlIG9sZCB2ZXJzaW9uKS4KLQkgKiBPbGQgZmVhdHVyZSBtYXkgYmUgbnVsbC4gCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXB1dGVFbGVtZW50cygKLQkJSUZlYXR1cmUgb2xkRmVhdHVyZSwKLQkJSUZlYXR1cmUgbmV3RmVhdHVyZSwKLQkJYm9vbGVhbiB1cGRhdGUsCi0JCWJvb2xlYW4gcGF0Y2gsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUFycmF5TGlzdCBsaXN0KSB7Ci0JCU9iamVjdFtdIG9sZENoaWxkcmVuID0gbnVsbDsKLQkJT2JqZWN0W10gbmV3Q2hpbGRyZW4gPSBnZXRJbmNsdWRlZEZlYXR1cmVzKG5ld0ZlYXR1cmUpOwotCQlib29sZWFuIG9wdGlvbmFsQ2hpbGRyZW4gPSBmYWxzZTsKLQotCQl0cnkgewotCQkJaWYgKG9sZEZlYXR1cmUgIT0gbnVsbCkgewotCQkJCW9sZENoaWxkcmVuID0gZ2V0SW5jbHVkZWRGZWF0dXJlcyhvbGRGZWF0dXJlKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBvbGRSZWYgPSBudWxsOwotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIG5ld1JlZiA9IChJRmVhdHVyZVJlZmVyZW5jZSkgbmV3Q2hpbGRyZW5baV07Ci0JCQkJaWYgKG9sZENoaWxkcmVuICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG5ld0lkID0KLQkJCQkJCW5ld1JlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNyZWYgPQotCQkJCQkJCShJRmVhdHVyZVJlZmVyZW5jZSkgb2xkQ2hpbGRyZW5bal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChjcmVmCi0JCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmdldElkZW50aWZpZXIoKQotCQkJCQkJCQkuZXF1YWxzKG5ld0lkKSkgewotCQkJCQkJCQlvbGRSZWYgPSBjcmVmOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHBhdGNoKSB7Ci0JCQkJCS8vIDMwODQ5IC0gZmluZCB0aGUgb2xkIHJlZmVyZW5jZSBpbiB0aGUKLQkJCQkJLy8gY29uZmlndXJhdGlvbi4KLQkJCQkJaWYgKCFVcGRhdGVVdGlscy5pc1BhdGNoKG5ld0ZlYXR1cmUpKSB7Ci0JCQkJCQlvbGRSZWYgPSBmaW5kUGF0Y2hlZFJlZmVyZW5jZShuZXdSZWYsIGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gdGVzdCBpZiB0aGUgb2xkIG9wdGlvbmFsIGZlYXR1cmUgZXhpc3RzCi0JCQkJaWYgKG9sZFJlZiAhPSBudWxsCi0JCQkJCSYmICgob2xkUmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZQotCQkJCQkJJiYgKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSBvbGRSZWYpLmlzT3B0aW9uYWwoKSkKLQkJCQkJCXx8IHBhdGNoKSkgewotCQkJCQl0cnkgewotCQkJCQkJSUZlYXR1cmUgZiA9IG9sZFJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQkJaWYgKGYgPT0gbnVsbCkKLQkJCQkJCQlvbGRSZWYgPSBudWxsOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIG1pc3NpbmcKLQkJCQkJCW9sZFJlZiA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZWxlbWVudCA9Ci0JCQkJCW5ldyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudChvbGRSZWYsIG5ld1JlZik7Ci0JCQkJLy8gSWYgdGhpcyBpcyBhbiB1cGRhdGUgKG9sZCBmZWF0dXJlIGV4aXN0cyksIAotCQkJCS8vIG9ubHkgY2hlY2sgdGhlIG5ldyBvcHRpb25hbCBmZWF0dXJlIGlmIHRoZSBvbGQgZXhpc3RzLgotCQkJCS8vIE90aGVyd2lzZSwgYWx3YXlzIGNoZWNrLgotCQkJCWlmIChlbGVtZW50LmlzT3B0aW9uYWwoKSAmJiAodXBkYXRlIHx8IHBhdGNoKSkgewotCQkJCQllbGVtZW50LnNldENoZWNrZWQob2xkUmVmICE9IG51bGwpOwotCQkJCQlpZiAob2xkUmVmID09IG51bGwpIHsKLQkJCQkJCS8vIERvZXMgbm90IGhhdmUgYW4gb2xkIHJlZmVyZW5jZSwKLQkJCQkJCS8vIGJ1dCBpdCBtYXkgY29udGFpbiBhbiBvbGRlcgotCQkJCQkJLy8gZmVhdHVyZSB0aGF0IG1heSBzdGlsbCBxdWFsaWZ5Ci0JCQkJCQkvLyBmb3IgdXBkYXRlLiBGb3IgZXhhbXBsZSwKLQkJCQkJCS8vIGFuIG9sZGVyIHZlcnNpb24gbWF5IGhhdmUgYmVlbgotCQkJCQkJLy8gaW5zdGFsbGVkIG5hdGl2ZWx5IGZyb20gdGhlIENELVJPTS4KLQkJCQkJCWlmIChoYXNPbGRlclZlcnNpb24obmV3UmVmKSkgewotCQkJCQkJCWVsZW1lbnQuc2V0TmF0aXZlVXBncmFkZSh0cnVlKTsKLQkJCQkJCQllbGVtZW50LnNldENoZWNrZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJZWxlbWVudC5zZXRDaGVja2VkKHRydWUpOwotCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCWVsZW1lbnQuY29tcHV0ZUNoaWxkcmVuKHVwZGF0ZSwgcGF0Y2gsIGNvbmZpZyk7Ci0JCQkJaWYgKGVsZW1lbnQuaXNPcHRpb25hbCgpIHx8IGVsZW1lbnQuaGFzT3B0aW9uYWxDaGlsZHJlbigpKQotCQkJCQlvcHRpb25hbENoaWxkcmVuID0gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG9wdGlvbmFsQ2hpbGRyZW47Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPbGRlclZlcnNpb24oSUZlYXR1cmVSZWZlcmVuY2UgbmV3UmVmKSB7Ci0JCXRyeSB7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG5ld1JlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2ZXJzaW9uID0gdmlkLmdldFZlcnNpb24oKTsKLQkJCVN0cmluZyBtb2RlID0gZ2V0VXBkYXRlVmVyc2lvbnNNb2RlKCk7Ci0KLQkJCUlGZWF0dXJlW10gYWxsSW5zdGFsbGVkID0KLQkJCQlVcGRhdGVVdGlscy5nZXRJbnN0YWxsZWRGZWF0dXJlcyh2aWQsIGZhbHNlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsSW5zdGFsbGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmUgY2FuZGlkYXRlID0gYWxsSW5zdGFsbGVkW2ldOwotCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGN2ZXJzaW9uID0KLQkJCQkJY2FuZGlkYXRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7Ci0JCQkJLy8gVmVyaWZ5IHRoYXQgdGhlIGRpZmZlcmVuY2UgcXVhbGlmaWVzIGFzCi0JCQkJLy8gYW4gdXBkYXRlLgotCQkJCWlmIChtb2RlLmVxdWFscyhVcGRhdGVDb3JlLkVRVUlWQUxFTlRfVkFMVUUpKSB7Ci0JCQkJCWlmICh2ZXJzaW9uLmlzRXF1aXZhbGVudFRvKGN2ZXJzaW9uKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAobW9kZS5lcXVhbHMoVXBkYXRlQ29yZS5DT01QQVRJQkxFX1ZBTFVFKSkgewotCQkJCQlpZiAodmVyc2lvbi5pc0NvbXBhdGlibGVXaXRoKGN2ZXJzaW9uKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElGZWF0dXJlUmVmZXJlbmNlIGZpbmRQYXRjaGVkUmVmZXJlbmNlKAotCQlJRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBuZXdSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbal07Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciByZWZWaWQgPSByZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCWlmICh2aWQuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhyZWZWaWQuZ2V0SWRlbnRpZmllcigpKSkKLQkJCQkJcmV0dXJuIHJlZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldEluY2x1ZGVkRmVhdHVyZXMoSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCXRyeSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlyZXR1cm4gZ2V0SW5jbHVkZWRGZWF0dXJlcyhmZWF0dXJlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmNsdWRlZCBmZWF0dXJlIHJlZmVyZW5jZXMgZm9yIHRoZSBnaXZlbiBmZWF0dXJlLgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVwZGF0ZVZlcnNpb25zTW9kZSgpIHsKLQkJUHJlZmVyZW5jZXMgc3RvcmUgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBzdG9yZS5nZXRTdHJpbmcoVXBkYXRlQ29yZS5QX1VQREFURV9WRVJTSU9OUyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzOTBiZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzIE9wZXJhdGlvbiBpbXBsZW1lbnRzIElGZWF0dXJlT3BlcmF0aW9uIHsKLQkKLQlwcm90ZWN0ZWQgSUZlYXR1cmUgZmVhdHVyZTsKLQlwcm90ZWN0ZWQgSUZlYXR1cmUgb2xkRmVhdHVyZTsKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGU7Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiBvcHRpb25hbERlbHRhOwotCQotCQotCXB1YmxpYyBGZWF0dXJlT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLCBJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMudGFyZ2V0U2l0ZSA9IHRhcmdldFNpdGU7Ci0JfQotCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQkKLQlwdWJsaWMgSUZlYXR1cmUgZ2V0T2xkRmVhdHVyZSgpIHsKLQkJcmV0dXJuIG9sZEZlYXR1cmU7Ci0JfQotCQotLy8JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbERlbHRhKCkgewotLy8JCXJldHVybiBvcHRpb25hbERlbHRhOwotLy8JfQotCQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0VGFyZ2V0U2l0ZSgpIHsKLQkJcmV0dXJuIHRhcmdldFNpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0U2l0ZShJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSkgewotCQl0aGlzLnRhcmdldFNpdGUgPSB0YXJnZXRTaXRlOwotCX0KLQkKLQotCXN0YXRpYyBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUsIElDb25maWd1cmVkU2l0ZSBzaXRlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJc2l0ZSA9IFVwZGF0ZVV0aWxzLmdldENvbmZpZ1NpdGUoZmVhdHVyZSwgY29uZmlnKTsKLQkJCi0JCWlmIChzaXRlICE9IG51bGwpIHsKLQkJCVBhdGNoQ2xlYW5lciBjbGVhbmVyID0gbmV3IFBhdGNoQ2xlYW5lcihzaXRlLCBmZWF0dXJlKTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gc2l0ZS51bmNvbmZpZ3VyZShmZWF0dXJlKTsKLQkJCWNsZWFuZXIuZGlzcG9zZSgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlU3RhdHVzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ2NDJkYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLQotLyoqCi0gKiBUaGUgZmVhdHVyZSBzdGF0dXMgcHJvdmlkZSBpbmZvIGFib3V0IHRoZSBicm9rZW4gZmVhdHVyZXMgYW5kIHdoYXQgaXMKLSAqIHdyb25nLgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVN0YXR1cyBleHRlbmRzIFN0YXR1cyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9PVEhFUiA9IElTdGF0dXMuT0s7Ly8wCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9QUkVSRVFfRkVBVFVSRSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9QUkVSRVFfUExVR0lOID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT0RFX0VYQ0xVU0lWRSA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9DWUNMRSA9IDg7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9PUFRJT05BTF9DSElMRCA9IDE2OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfRU5WSVJPTk1FTlQgPSAzMjsKLQlJRmVhdHVyZSBmZWF0dXJlOwotCi0JcHVibGljIEZlYXR1cmVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSwgaW50IHNldmVyaXR5LCBTdHJpbmcgcGx1Z2luSWQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgRmVhdHVyZVN0YXR1cykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUZlYXR1cmVTdGF0dXMgZnMgPSAoRmVhdHVyZVN0YXR1cykgb2JqOwotCQkvLyBvbmx5IGNoZWNrIGZvciBmZWF0dXJlLCByZWdhcmRsZXNzIG9mIHN0YXR1cyB0eXBlCi0JCWlmIChmcy5nZXRGZWF0dXJlKCkgPT0gZmVhdHVyZSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChmcy5nZXRGZWF0dXJlKCkgPT0gbnVsbCAmJiBmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gZnMuZ2V0TWVzc2FnZSgpLmVxdWFscyhnZXRNZXNzYWdlKCkpOwotCQllbHNlIGlmIChmcy5nZXRGZWF0dXJlKCkgPT0gbnVsbCAmJiBmZWF0dXJlICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKGZzLmdldEZlYXR1cmUoKSAhPSBudWxsICYmIGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSBpZiAoZnMuZ2V0RmVhdHVyZSgpLmVxdWFscyhmZWF0dXJlKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JbnN0YWxsT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0luc3RhbGxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2OWI4ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0luc3RhbGxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIENvbmZpZ3VyZSBhIGZlYXR1cmUuCi0gKiBDb25maWdPcGVyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxPcGVyYXRpb24KLQlleHRlbmRzIEZlYXR1cmVPcGVyYXRpb24KLQlpbXBsZW1lbnRzIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PTEQgPSAiT3BlcmF0aW9uc01hbmFnZXIuZXJyb3Iub2xkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXM7Ci0JcHJpdmF0ZSBJRmVhdHVyZVtdIHVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXM7Ci0JcHJpdmF0ZSBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBzaXRlCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gb3B0aW9uYWxGZWF0dXJlcyBvcHRpb25hbCBmZWF0dXJlcyB0byBpbnN0YWxsLiBJZiBudWxsLCB0aGUgb3BlcmF0aW9uIHdpbGwgaW5zdGFsbCB0aGVtIGFsbCAoaWYgYW55KQotCSAqIEBwYXJhbSB1bmNvbmZpZ3VyZWRPcHRpb25hbEVsZW1lbnRzIG9wdGlvbmFsIGZlYXR1cmVzIHVuY29uZmlndXJlZCBiZWZvcmUgdGhlIG9wZXJhdGlvbi4gVGhleSBzaG91bGQgcmVtYWluIHVuY29uZmlndXJlZCBhZnRlciB0aGUgaW5zdGFsbC4KLQkgKiBAcGFyYW0gdmVyaWZpZXIKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbE9wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywKLQkJSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEVsZW1lbnRzLAotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpZXIpIHsKLQkJc3VwZXIoc2l0ZSwgZmVhdHVyZSk7Ci0JCUlGZWF0dXJlW10gaW5zdGFsbGVkID0gVXBkYXRlVXRpbHMuZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZSk7Ci0JCWlmIChpbnN0YWxsZWQubGVuZ3RoID4gMCkKLQkJCXRoaXMub2xkRmVhdHVyZSA9IGluc3RhbGxlZFswXTsKLQkJdGhpcy51bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID0gdW5jb25maWd1cmVkT3B0aW9uYWxFbGVtZW50czsKLQkJdGhpcy5vcHRpb25hbEZlYXR1cmVzID0gb3B0aW9uYWxGZWF0dXJlczsKLQkJdGhpcy52ZXJpZmllciA9IHZlcmlmaWVyOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldE9wdGlvbmFsRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBvcHRpb25hbEZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJYm9vbGVhbiByZWluc3RhbGwgPSBmYWxzZTsKLQkJaWYgKG9sZEZlYXR1cmUgIT0gbnVsbAotCQkJJiYgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKAotCQkJCW9sZEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkKLQkJCXJlaW5zdGFsbCA9IHRydWU7Ci0KLQkJc2V0T3B0aW9uYWxGZWF0dXJlcygpOwotCi0JCWlmIChvcHRpb25hbEZlYXR1cmVzID09IG51bGwpCi0JCQl0YXJnZXRTaXRlLmluc3RhbGwoZmVhdHVyZSwgdmVyaWZpZXIsIHBtKTsKLQkJZWxzZQotCQkJdGFyZ2V0U2l0ZS5pbnN0YWxsKGZlYXR1cmUsIG9wdGlvbmFsRmVhdHVyZXMsIHZlcmlmaWVyLCBwbSk7Ci0KLQkJaWYgKCFyZWluc3RhbGwpIHsKLQotCQkJaWYgKG9sZEZlYXR1cmUgIT0gbnVsbCkgeyAvLyYmIGlzT3B0aW9uYWxEZWx0YSgpKSB7Ci0JCQkJcHJlc2VydmVPcHRpb25hbFN0YXRlKCk7Ci0KLQkJCQlib29sZWFuIG9sZFN1Y2Nlc3MgPSB1bmNvbmZpZ3VyZShvbGRGZWF0dXJlLCBudWxsKTsgLy8gcGljayBhbnkgc2l0ZSBjb250YWluaW5nIG9sZCBmZWF0dXJlCi0JCQkJaWYgKCFvbGRTdWNjZXNzKSB7Ci0JCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJCQlpZiAoIVVwZGF0ZVV0aWxzLmlzTmVzdGVkQ2hpbGQoY29uZmlnLCBvbGRGZWF0dXJlKSkgewotCQkJCQkJLy8gImVhdCIgdGhlIGVycm9yIGlmIG5lc3RlZCBjaGlsZAotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJCQlLRVlfT0xELAotCQkJCQkJCQlvbGRGZWF0dXJlLmdldExhYmVsKCkpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCVVwZGF0ZVV0aWxzLmdldFBsdWdpbklkKCksCi0JCQkJCQkJCUlTdGF0dXMuT0ssCi0JCQkJCQkJCW1lc3NhZ2UsCi0JCQkJCQkJCW51bGwpOwotCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotLy8JCQlpZiAob2xkRmVhdHVyZSA9PSBudWxsKSB7Ci0vLwkJCQllbnN1cmVVbmlxdWUoKTsKLS8vCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVzZXJ2ZU9wdGlvbmFsU3RhdGUoKSB7Ci0JCWlmICh1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCS8vIEdldCB0aGUgZmVhdHVyZSB0aGF0IG1hdGNoZXMgdGhlIG9yaWdpbmFsIHVuY29uZmlndXJlZCBvbmVzLgotCQkJCUlGZWF0dXJlIGxvY2FsRmVhdHVyZSA9Ci0JCQkJCVVwZGF0ZVV0aWxzLmdldExvY2FsRmVhdHVyZSgKLQkJCQkJCXRhcmdldFNpdGUsCi0JCQkJCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzW2ldKTsKLQkJCQlpZiAobG9jYWxGZWF0dXJlICE9IG51bGwpCi0JCQkJCXRhcmdldFNpdGUudW5jb25maWd1cmUobG9jYWxGZWF0dXJlKTsKLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIHRoaXMgLSB3ZSB3aWxsIGxlYXZlIHdpdGggaXQKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0T3B0aW9uYWxGZWF0dXJlcygpIHsKLQkJdHJ5IHsKLQkJCS8vIEVuc3VyZSBvcHRpb25hbCBmZWF0dXJlcyBhcmUgY29ycmVjdGx5IHNldAotCQkJaWYgKG9wdGlvbmFsRmVhdHVyZXMgPT0gbnVsbCAmJiBVcGRhdGVVdGlscy5oYXNPcHRpb25hbEZlYXR1cmVzKGZlYXR1cmUpICkgewotCQkJCUpvYlJvb3Qgam9iUm9vdCA9IG5ldyBKb2JSb290KHRoaXMpOwotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlib29sZWFuIHVwZGF0ZSA9IG9sZEZlYXR1cmUgIT0gbnVsbDsKLQkJCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVXRpbHMuaXNQYXRjaChmZWF0dXJlKTsKLQkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGVsZW1lbnRzID0gam9iUm9vdC5nZXRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZWxlbWVudHNbaV0uYWRkQ2hlY2tlZE9wdGlvbmFsRmVhdHVyZXModXBkYXRlLCBwYXRjaCwgY29uZmlnLCBzZXQpOwotCQkJCX0KLQkJCQlvcHRpb25hbEZlYXR1cmVzID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW3NldC5zaXplKCldOwotCQkJCXNldC50b0FycmF5KG9wdGlvbmFsRmVhdHVyZXMpOwotCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMgPSBqb2JSb290LmdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoY29uZmlnLCB0YXJnZXRTaXRlKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Kb2JSb290LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pvYlJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5ZjZlZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pvYlJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIEpvYlJvb3QgewotCXByaXZhdGUgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYjsKLQlwcml2YXRlIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZWxlbWVudHM7Ci0KLQlwdWJsaWMgSm9iUm9vdChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iKSB7Ci0JCXRoaXMuam9iID0gam9iOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZ2V0Sm9iKCkgewotCQlyZXR1cm4gam9iOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGdldEVsZW1lbnRzKCkgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKLQkJCWNvbXB1dGVFbGVtZW50cygpOwotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgYmVmb3JlIGFuIGluc3RhbGwuCi0JICogQWZ0ZXIgaW5zdGFsbGluZyB0aGUgZmVhdHVyZXMsIHRoZSBjYWxsZXIgbXVzdCBnZXQgdGhlIGxvY2FsIGZlYXR1cmVzIHRoYXQgbWF0Y2gKLQkgKiB0aGVzZSB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgYW5kIHVuY29uZmlndXJlIHRoZW0uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB0YXJnZXRTaXRlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVtdIGdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlKSB7Ci0KLQkJQXJyYXlMaXN0IHVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXModW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcywgY29uZmlnLCB0YXJnZXRTaXRlLCBnZXRFbGVtZW50cygpLCBVcGRhdGVVdGlscy5pc1BhdGNoKGpvYi5nZXRGZWF0dXJlKCkpKTsKLQkJSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzQXJyYXkgPQotCQkJbmV3IElGZWF0dXJlW3VuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMuc2l6ZSgpXTsKLQkJdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcy50b0FycmF5KHVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXNBcnJheSk7Ci0JCXJldHVybiB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzQXJyYXk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoCi0JCUFycmF5TGlzdCB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBvcHRpb25hbEVsZW1lbnRzLAotCQlib29sZWFuIGlzUGF0Y2gpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25hbEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGNoaWxkcmVuID0KLQkJCQlvcHRpb25hbEVsZW1lbnRzW2ldLmdldENoaWxkcmVuKHRydWUsIGlzUGF0Y2gsIGNvbmZpZyk7Ci0JCQlnZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKAotCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsCi0JCQkJY29uZmlnLAotCQkJCXRhcmdldFNpdGUsCi0JCQkJY2hpbGRyZW4sCi0JCQkJaXNQYXRjaCk7Ci0JCQlpZiAoIW9wdGlvbmFsRWxlbWVudHNbaV0uaXNFbmFibGVkKGNvbmZpZykpIHsKLQkJCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLmFkZChvcHRpb25hbEVsZW1lbnRzW2ldLmdldEZlYXR1cmUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZUVsZW1lbnRzKCkgewotCQl0cnkgewotCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYm9vbGVhbiBwYXRjaCA9IFVwZGF0ZVV0aWxzLmlzUGF0Y2gobmV3RmVhdHVyZSk7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudC5jb21wdXRlRWxlbWVudHMoCi0JCQkJb2xkRmVhdHVyZSwKLQkJCQluZXdGZWF0dXJlLAotCQkJCW9sZEZlYXR1cmUgIT0gbnVsbCwKLQkJCQlwYXRjaCwKLQkJCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLAotCQkJCWxpc3QpOwotCQkJZWxlbWVudHMgPSBuZXcgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KGVsZW1lbnRzKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQllbGVtZW50c1tpXS5zZXRSb290KHRoaXMpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxNmM4NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE9wZXJhdGlvbiBpbXBsZW1lbnRzIElPcGVyYXRpb24gewotCQotCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzZWQ7Ci0JCi0JCi0JcHVibGljIE9wZXJhdGlvbigpIHsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcm9jZXNzZWQoKSB7Ci0JCXJldHVybiBwcm9jZXNzZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1hcmtQcm9jZXNzZWQoKSB7Ci0JCXByb2Nlc3NlZCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25GYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2ZDAyZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkZhY3RvcnkgaW1wbGVtZW50cyBJT3BlcmF0aW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgT3BlcmF0aW9uRmFjdG9yeSgpIHsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gY3JlYXRlQ29uZmlnT3BlcmF0aW9uKAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IENvbmZpZ09wZXJhdGlvbih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgSUJhdGNoT3BlcmF0aW9uIGNyZWF0ZUJhdGNoSW5zdGFsbE9wZXJhdGlvbihJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcGVyYXRpb25zKSB7Ci0JCXJldHVybiBuZXcgQmF0Y2hJbnN0YWxsT3BlcmF0aW9uKG9wZXJhdGlvbnMpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3JlYXRlSW5zdGFsbE9wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywKLQkJSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLAotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpZXIpIHsKLQkJcmV0dXJuIG5ldyBJbnN0YWxsT3BlcmF0aW9uKAotCQkJdGFyZ2V0U2l0ZSwKLQkJCWZlYXR1cmUsCi0JCQlvcHRpb25hbEZlYXR1cmVzLAotCQkJdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcywKLQkJCXZlcmlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbiBjcmVhdGVVbmNvbmZpZ09wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBVbmNvbmZpZ09wZXJhdGlvbih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gY3JlYXRlUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSkgewotCQotCQlyZXR1cm4gbmV3IFJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbihmZWF0dXJlLCBhbm90aGVyRmVhdHVyZSk7CQkKLQl9Ci0JCQotCXB1YmxpYyBJVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjcmVhdGVVbmluc3RhbGxPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgVW5pbnN0YWxsT3BlcmF0aW9uKHRhcmdldFNpdGUsIGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBJUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbiBjcmVhdGVSZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJUHJvYmxlbUhhbmRsZXIgcHJvYmxlbUhhbmRsZXIpIHsKLQkJcmV0dXJuIG5ldyBSZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uKAotCQkJY29uZmlnLAotCQkJcHJvYmxlbUhhbmRsZXIpOwotCX0KLQotCXB1YmxpYyBJVG9nZ2xlU2l0ZU9wZXJhdGlvbiBjcmVhdGVUb2dnbGVTaXRlT3BlcmF0aW9uKAotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSkgewotCQlyZXR1cm4gbmV3IFRvZ2dsZVNpdGVPcGVyYXRpb24oc2l0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25WYWxpZGF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjIwOWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0vL2ltcG9ydCBqYXZhLmlvLio7Ci0vL2ltcG9ydCBqYXZhLm5ldC4qOwotLy9pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5QbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvblZhbGlkYXRvciBpbXBsZW1lbnRzIElPcGVyYXRpb25WYWxpZGF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUk9PVF9NRVNTQUdFID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMucm9vdE1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ST09UX01FU1NBR0VfSU5JVCA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnJvb3RNZXNzYWdlSW5pdGlhbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NISUxEX01FU1NBR0UgPQotCQkiQWN0aXZpdHlDb25zdHJhaW50cy5jaGlsZE1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFURk9STSA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLnBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJJTUFSWSA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLnByaW1hcnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PUyA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLm9zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfV1MgPSAiQWN0aXZpdHlDb25zdHJhaW50cy53cyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FSQ0ggPSAiQWN0aXZpdHlDb25zdHJhaW50cy5hcmNoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFUkVRID0gIkFjdGl2aXR5Q29uc3RyYWludHMucHJlcmVxIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFUkVRX1BMVUdJTiA9Ci0JCSJBY3Rpdml0eUNvbnN0YWludHMucHJlcmVxLnBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUV9GRUFUVVJFID0KLQkJIkFjdGl2aXR5Q29uc3RhaW50cy5wcmVyZXEuZmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUV9QRVJGRUNUID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMucHJlcmVxUGVyZmVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUV9FUVVJVkFMRU5UID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMucHJlcmVxRXF1aXZhbGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUV9DT01QQVRJQkxFID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMucHJlcmVxQ29tcGF0aWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUV9HUkVBVEVSID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMucHJlcmVxR3JlYXRlck9yRXF1YWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PUFRJT05BTF9DSElMRCA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLm9wdGlvbmFsQ2hpbGQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DWUNMRSA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLmN5Y2xlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09ORkxJQ1QgPSAiQWN0aXZpdHlDb25zdHJhaW50cy5jb25mbGljdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYQ0xVU0lWRSA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLmV4Y2x1c2l2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05PX0xJQ0VOU0UgPQotCQkiQWN0aXZpdHlDb25zdHJhaW50cy5ub0xpY2Vuc2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbW9kaWZpZWQgb3V0c2lkZSB0aGlzIHByb2dyYW0uCi0JICogQHJldHVybiB0aGUgZXJyb3Igc3RhdHVzLCBvciBudWxsIGlmIG5vIGVycm9ycwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpIHsKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChzdGF0dXMpOwotCQkKLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlpZiAoc3RhdHVzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoS0VZX1JPT1RfTUVTU0FHRSwgc3RhdHVzLCBJU3RhdHVzLkVSUk9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogQ2FsbGVkIGJ5IFVJIGJlZm9yZSBwZXJmb3JtaW5nIG9wZXJhdGlvbi4gUmV0dXJucyBudWxsIGlmIG5vIGVycm9ycywgYQotCSAqIHN0YXR1cyB3aXRoIElTdGF0dXMuV0FSTklORyBjb2RlIHdoZW4gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBpcwotCSAqIGJyb2tlbiwgb3IgYSBzdGF0dXMgd2l0aCBJU3RhdHVzLkVSUk9SIHdoZW4gdGhlcmUgdGhlIG9wZXJhdGlvbgotCSAqIGludHJvZHVjZXMgbmV3IGVycm9ycwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ0luc3RhbGwoCi0JCUlGZWF0dXJlIG9sZEZlYXR1cmUsCi0JCUlGZWF0dXJlIG5ld0ZlYXR1cmUpIHsKLQkJLy8gY2hlY2sgaW5pdGlhbCBzdGF0ZQotCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShiZWZvcmVTdGF0dXMpOwotCi0JCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQotCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKLQkJdmFsaWRhdGVJbnN0YWxsKG9sZEZlYXR1cmUsIG5ld0ZlYXR1cmUsIHN0YXR1cyk7Ci0KLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlyZXR1cm4gY3JlYXRlQ29tYmluZWRSZXBvcnRTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpOwotCX0KLQotCS8qCi0JICogQ2FsbGVkIGJ5IFVJIGJlZm9yZSBwZXJmb3JtaW5nIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ1VuY29uZmlnKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJLy8gY2hlY2sgaW5pdGlhbCBzdGF0ZQotCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShiZWZvcmVTdGF0dXMpOwotCi0JCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQotCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKLQkJdmFsaWRhdGVVbmNvbmZpZ3VyZShmZWF0dXJlLCBzdGF0dXMpOwotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJcmV0dXJuIGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKGJlZm9yZVN0YXR1cywgc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIENhbGxlZCBieSBVSSBiZWZvcmUgcGVyZm9ybWluZyBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdDb25maWcoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7Ci0KLQkJLy8gY2hlY2sgcHJvcG9zZWQgY2hhbmdlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChzdGF0dXMpOwotCQl2YWxpZGF0ZUNvbmZpZ3VyZShmZWF0dXJlLCBzdGF0dXMpOwotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJcmV0dXJuIGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKGJlZm9yZVN0YXR1cywgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYmVmb3JlIHBlcmZvcm1pbmcgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ1JlcGxhY2VWZXJzaW9uKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSkgewotCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7Ci0KLQkJLy8gY2hlY2sgcHJvcG9zZWQgY2hhbmdlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChzdGF0dXMpOwotCQl2YWxpZGF0ZVJlcGxhY2VWZXJzaW9uKGZlYXR1cmUsIGFub3RoZXJGZWF0dXJlLCBzdGF0dXMpOwotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJcmV0dXJuIGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKGJlZm9yZVN0YXR1cywgc3RhdHVzKTsKLQl9Ci0KLQotCS8qCi0JICogQ2FsbGVkIGJ5IHRoZSBVSSBiZWZvcmUgZG9pbmcgYSByZXZlcnQvIHJlc3RvcmUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nUmV2ZXJ0KElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJLy8gY2hlY2sgaW5pdGlhbCBzdGF0ZQotCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShiZWZvcmVTdGF0dXMpOwotCi0JCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQotCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKLQkJdmFsaWRhdGVSZXZlcnQoY29uZmlnLCBzdGF0dXMpOwotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJcmV0dXJuIGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKGJlZm9yZVN0YXR1cywgc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIENhbGxlZCBieSB0aGUgVUkgYmVmb3JlIGRvaW5nIGEgYmF0Y2hlZCBwcm9jZXNzaW5nIG9mIHNldmVyYWwgcGVuZGluZwotCSAqIGNoYW5nZXMuCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nQ2hhbmdlcyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKSB7Ci0JCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKLQkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKGJlZm9yZVN0YXR1cyk7Ci0KLQkJLy8gY2hlY2sgcHJvcG9zZWQgY2hhbmdlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoam9icywgc3RhdHVzLCBiZWZvcmVTdGF0dXMpOwotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJcmV0dXJuIGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKGJlZm9yZVN0YXR1cywgc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIHRoZSBjdXJyZW50IHN0YXRlLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlQ3VycmVudFN0YXRlKCkgewotCQkvLyBjaGVjayB0aGUgc3RhdGUKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKHN0YXR1cyk7Ci0KLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlpZiAoc3RhdHVzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoS0VZX1JPT1RfTUVTU0FHRSwgc3RhdHVzLCBJU3RhdHVzLkVSUk9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIG5vdCBicm9rZW4gZXZlbiBiZWZvcmUgd2Ugc3RhcnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlSW5pdGlhbFN0YXRlKEFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlcygpOwotCQkJLy8gdW5jb21tZW50IHRoaXMgd2hlbiBwYXRjaCByZWxlYXNlZCBpbiBib290Ci0JCQkvL2NoZWNrQ29uZmlndXJhdGlvbkxvY2soc3RhdHVzKTsKLQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogaGFuZGxlIHVuY29uZmlndXJlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVVuY29uZmlndXJlKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCXRyeSB7Ci0JCQljaGVja1NpdGVSZWFkT25seShmZWF0dXJlLHN0YXR1cyk7Ci0JCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKLQkJCWZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oZmVhdHVyZXMsIG51bGwsIGZlYXR1cmUpOwotCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0KLQkvKgotCSAqIGhhbmRsZSBjb25maWd1cmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUsIEFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCWNoZWNrU2l0ZVJlYWRPbmx5KGZlYXR1cmUsc3RhdHVzKTsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlcygpOwotCQkJY2hlY2tPcHRpb25hbENoaWxkQ29uZmlndXJpbmcoZmVhdHVyZSwgc3RhdHVzKTsKLQkJCWNoZWNrRm9yQ3ljbGVzKGZlYXR1cmUsIG51bGwsIGZlYXR1cmVzKTsKLQkJCWZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oZmVhdHVyZXMsIGZlYXR1cmUsIG51bGwpOwotCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGhhbmRsZSByZXBsYWNlIHZlcnNpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUmVwbGFjZVZlcnNpb24oCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCXRyeSB7Ci0JCQljaGVja1NpdGVSZWFkT25seShmZWF0dXJlLHN0YXR1cyk7Ci0JCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKLQkJCWNoZWNrRm9yQ3ljbGVzKGZlYXR1cmUsIG51bGwsIGZlYXR1cmVzKTsKLQkJCWZlYXR1cmVzID0KLQkJCQljb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbigKLQkJCQkJZmVhdHVyZXMsCi0JCQkJCWFub3RoZXJGZWF0dXJlLAotCQkJCQlmZWF0dXJlKTsKLQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogaGFuZGxlIGluc3RhbGwgYW5kIHVwZGF0ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVJbnN0YWxsKAotCQlJRmVhdHVyZSBvbGRGZWF0dXJlLAotCQlJRmVhdHVyZSBuZXdGZWF0dXJlLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCXRyeSB7Ci0JCQljaGVja1NpdGVSZWFkT25seShvbGRGZWF0dXJlLHN0YXR1cyk7Ci0JCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKLQkJCWNoZWNrRm9yQ3ljbGVzKG5ld0ZlYXR1cmUsIG51bGwsIGZlYXR1cmVzKTsKLQkJCWZlYXR1cmVzID0KLQkJCQljb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbihmZWF0dXJlcywgbmV3RmVhdHVyZSwgb2xkRmVhdHVyZSk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCQkJY2hlY2tMaWNlbnNlKG5ld0ZlYXR1cmUsIHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogaGFuZGxlIHJldmVydCBhbmQgcmVzdG9yZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVSZXZlcnQoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLS8vCQkJLy8gY2hlY2sgdGhlIHRpbWVsaW5lIGFuZCBkb24ndCBib3RoZXIKLS8vCQkJLy8gdG8gY2hlY2sgYW55dGhpbmcgZWxzZSBpZiBuZWdhdGl2ZQotLy8JCQlpZiAoIWNoZWNrVGltZWxpbmUoY29uZmlnLCBzdGF0dXMpKQotLy8JCQkJcmV0dXJuOwotCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzQWZ0ZXJSZXZlcnQoY29uZmlnKTsKLQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCQljaGVja1JldmVydENvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCi0JLyoKLQkgKiBIYW5kbGUgb25lLWNsaWNrIGNoYW5nZXMgYXMgYSBiYXRjaAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVQZW5kaW5nQ2hhbmdlcygKLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icywKLQkJQXJyYXlMaXN0IHN0YXR1cywKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cykgewotCQl0cnkgewotCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7Ci0JCQlBcnJheUxpc3Qgc2F2ZWRGZWF0dXJlcyA9IGZlYXR1cmVzOwotCQkJaW50IG5leGNsdXNpdmVzID0gMDsKLQotCQkJLy8gcGFzcyAxOiBzZWUgaWYgd2UgY2FuIHByb2Nlc3MgdGhlIGVudGlyZSAiYmF0Y2giCi0JCQlBcnJheUxpc3QgdG1wU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IGpvYnNbaV07Ci0KLQkJCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gam9iLmdldE9sZEZlYXR1cmUoKTsKLQkJCQljaGVja0xpY2Vuc2UobmV3RmVhdHVyZSwgc3RhdHVzKTsKLQkJCQlpZiAoam9icy5sZW5ndGggPiAxICYmIG5ld0ZlYXR1cmUuaXNFeGNsdXNpdmUoKSkgewotCQkJCQluZXhjbHVzaXZlcysrOwotCQkJCQlzdGF0dXMuYWRkKAotCQkJCQkJY3JlYXRlU3RhdHVzKAotCQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQkJRmVhdHVyZVN0YXR1cy5DT0RFX0VYQ0xVU0lWRSwKLQkJCQkJCQlQb2xpY3kuYmluZChLRVlfRVhDTFVTSVZFKSkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY2hlY2tGb3JDeWNsZXMobmV3RmVhdHVyZSwgbnVsbCwgZmVhdHVyZXMpOwotCQkJCWZlYXR1cmVzID0KLQkJCQkJY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oCi0JCQkJCQlmZWF0dXJlcywKLQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQlvbGRGZWF0dXJlKTsKLQkJCX0KLQkJCWlmIChuZXhjbHVzaXZlcyA+IDApCi0JCQkJcmV0dXJuOwotCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgdG1wU3RhdHVzKTsKLQkJCWlmICh0bXBTdGF0dXMuc2l6ZSgpID09IDApIC8vIHRoZSB3aG9sZSAiYmF0Y2giIGlzIE9LCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBwYXNzIDI6IHdlIGhhdmUgY29uZmxpY3RzCi0JCQlmZWF0dXJlcyA9IHNhdmVkRmVhdHVyZXM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gam9ic1tpXTsKLQkJCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gam9iLmdldE9sZEZlYXR1cmUoKTsKLQotCQkJCWZlYXR1cmVzID0KLQkJCQkJY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oCi0JCQkJCQlmZWF0dXJlcywKLQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQlvbGRGZWF0dXJlKTsKLQotCQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCQkJaWYgKHN0YXR1cy5zaXplKCkgPiAwCi0JCQkJCSYmICFpc0JldHRlclN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cykpIHsKLQkJCQkJSVN0YXR1cyBjb25mbGljdCA9Ci0JCQkJCQljcmVhdGVTdGF0dXMoCi0JCQkJCQkJbmV3RmVhdHVyZSwKLQkJCQkJCQlGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsCi0JCQkJCQkJUG9saWN5LmJpbmQoS0VZX0NPTkZMSUNUKSk7Ci0JCQkJCXN0YXR1cy5hZGQoMCwgY29uZmxpY3QpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoQXJyYXlMaXN0IHN0YXR1cykgewotCQl0cnkgewotCQkJLy8gY2hlY2tzIGlmIHRoZSBwbGF0Zm9ybSBoYXMgYmVlbiBtb2RpZmllZCBvdXRzaWRlIHRoaXMgZWNsaXBzZSBpbnN0YW5jZQotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJCQotCQkJbG9uZyBjdXJyZW50VGltZVN0YW1wID0gcGxhdGZvcm1Db25maWcuZ2V0Q2hhbmdlU3RhbXAoKTsKLQkJCS8vIGdldCB0aGUgbGFzdCBtb2RpZmllZCB2YWx1ZSBmb3IgdGhpcyBjb25maWcsIGZyb20gdGhpcyBwcm9jZXNzIHBvaW50IG9mIHZpZXcKLQkJCWlmIChwbGF0Zm9ybUNvbmZpZyBpbnN0YW5jZW9mIFBsYXRmb3JtQ29uZmlndXJhdGlvbikgCi0JCQkJY3VycmVudFRpbWVTdGFtcCA9ICgoUGxhdGZvcm1Db25maWd1cmF0aW9uKXBsYXRmb3JtQ29uZmlnKS5nZXRDb25maWd1cmF0aW9uKCkubGFzdE1vZGlmaWVkKCk7Ci0JCQkJCi0JCQkvLyBnZXQgdGhlIHJlYWwgbGFzdCBtb2RpZmllZCB2YWx1ZQotCQkJVVJMIHBsYXRmb3JtWE1MID0gcGxhdGZvcm1Db25maWcuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCQlsb25nIGFjdHVhbFRpbWVTdGFtcCA9IGN1cnJlbnRUaW1lU3RhbXA7Ci0JCQlpZiAoImZpbGUiLmVxdWFscyhwbGF0Zm9ybVhNTC5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCWFjdHVhbFRpbWVTdGFtcCA9IG5ldyBGaWxlKHBsYXRmb3JtWE1MLmdldEZpbGUoKSkubGFzdE1vZGlmaWVkKCk7Ci0JCQllbHNlIHsKLQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBwbGF0Zm9ybVhNTC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCWFjdHVhbFRpbWVTdGFtcCA9IGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQl9Ci0JCQlpZiAoY3VycmVudFRpbWVTdGFtcCAhPSBhY3R1YWxUaW1lU3RhbXApCi0JCQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMoCi0JCQkJCQkJCW51bGwsCi0JCQkJCQkJCUZlYXR1cmVTdGF0dXMuQ09ERV9PVEhFUiwKLQkJCQkJCQkJUG9saWN5LmJpbmQoIkFjdGl2aXR5Q29uc3RyYWludHMucGxhdGZvcm1Nb2RpZmllZCIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1NpdGVSZWFkT25seShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCWlmKGZlYXR1cmUgPT0gbnVsbCl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gZmVhdHVyZS5nZXRTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCWlmIChjc2l0ZSAhPSBudWxsICYmICFjc2l0ZS5pc1VwZGF0YWJsZSgpKQotCQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLAotCQkJCQlQb2xpY3kKLQkJCQkJLmJpbmQoIkFjdGl2aXR5Q29uc3RyYWludHMucmVhZE9ubHkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJY3NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpKSk7Ci0JfQotCi0JLyoKLQkgKiBDb21wdXRlIGEgbGlzdCBvZiBjb25maWd1cmVkIGZlYXR1cmVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbXB1dGVGZWF0dXJlcyh0cnVlKTsKLQl9Ci0JLyoKLQkgKiBDb21wdXRlIGEgbGlzdCBvZiBjb25maWd1cmVkIGZlYXR1cmVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlcyhib29sZWFuIGNvbmZpZ3VyZWRPbmx5KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdCBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNzaXRlc1tpXTsKLQotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjcmVmczsKLQotCQkJaWYgKGNvbmZpZ3VyZWRPbmx5KQotCQkJCWNyZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCQllbHNlCi0JCQkJY3JlZnMgPSBjc2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3JlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBjcmVmID0gY3JlZnNbal07Ci0JCQkJSUZlYXR1cmUgY2ZlYXR1cmUgPSBjcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJZmVhdHVyZXMuYWRkKGNmZWF0dXJlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIENvbXB1dGUgdGhlIG5lc3RlZCBmZWF0dXJlIHN1YnRyZWUgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBiYXNlCi0JICogZmVhdHVyZQotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRmVhdHVyZVN1YnRyZWUoCi0JCQlJRmVhdHVyZSB0b3AsCi0JCQlJRmVhdHVyZSBmZWF0dXJlLAotCQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQkJYm9vbGVhbiB0b2xlcmF0ZU1pc3NpbmdDaGlsZHJlbiwKLQkJCUFycmF5TGlzdCBjb25maWd1cmVkRmVhdHVyZXMsCi0JCQlBcnJheUxpc3QgdmlzaXRlZEZlYXR1cmVzKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBjaGVjayBhcmd1bWVudHMKLQkJaWYgKHRvcCA9PSBudWxsKQotCQkJcmV0dXJuIGZlYXR1cmVzOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJZmVhdHVyZSA9IHRvcDsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHZpc2l0ZWRGZWF0dXJlcyA9PSBudWxsKQotCQkJdmlzaXRlZEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGNoZWNrIGZvciA8aW5jbHVkZXM+IGN5Y2xlCi0JCWlmICh2aXNpdGVkRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCWNyZWF0ZVN0YXR1cyh0b3AsIEZlYXR1cmVTdGF0dXMuQ09ERV9DWUNMRSwgUG9saWN5LmJpbmQoS0VZX0NZQ0xFKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJLy8ga2VlcCB0cmFjayBvZiB2aXNpdGVkIGZlYXR1cmVzIHNvIHdlIGNhbiBkZXRlY3QgY3ljbGVzCi0JCQl2aXNpdGVkRmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQl9Ci0KLQkJLy8gcmV0dXJuIHNwZWNpZmllZCBiYXNlIGZlYXR1cmUgYW5kIGFsbCBpdHMgY2hpbGRyZW4KLQkJaWYgKCFmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkKLQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgY2hpbGQgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWZlYXR1cmVzID0KLQkJCQljb21wdXRlRmVhdHVyZVN1YnRyZWUoCi0JCQkJCQl0b3AsCi0JCQkJCQljaGlsZCwKLQkJCQkJCWZlYXR1cmVzLAotCQkJCQkJdG9sZXJhdGVNaXNzaW5nQ2hpbGRyZW4sCi0JCQkJCQludWxsLAotCQkJCQkJdmlzaXRlZEZlYXR1cmVzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmICghY2hpbGRyZW5baV0uaXNPcHRpb25hbCgpICYmICF0b2xlcmF0ZU1pc3NpbmdDaGlsZHJlbikKLQkJCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCQkvLyBubyBjeWNsZXMgZm9yIHRoaXMgZmVhdHVyZSBkdXJpbmcgREZTCi0JCXZpc2l0ZWRGZWF0dXJlcy5yZW1vdmUoZmVhdHVyZSk7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTGljZW5zZShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCUlVUkxFbnRyeSBsaWNlbnNlRW50cnkgPSBmZWF0dXJlLmdldExpY2Vuc2UoKTsKLQkJaWYgKGxpY2Vuc2VFbnRyeSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbGljZW5zZSA9IGxpY2Vuc2VFbnRyeS5nZXRBbm5vdGF0aW9uKCk7Ci0JCQlpZiAobGljZW5zZSAhPSBudWxsICYmIGxpY2Vuc2UudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3RhdHVzLmFkZCgKLQkJCWNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsIFBvbGljeS5iaW5kKEtFWV9OT19MSUNFTlNFKSkpOwotCX0KLQotCS8qCi0JICogQ29tcHV0ZSBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbigKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlJRmVhdHVyZSBhZGQsCi0JCUlGZWF0dXJlIHJlbW92ZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUFycmF5TGlzdCBhZGRUcmVlID0gY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKGFkZCwgbnVsbCwgbnVsbCwgZmFsc2UsCi0JCS8qIGRvIG5vdCB0b2xlcmF0ZSBtaXNzaW5nIGNoaWxkcmVuICovCi0JCWZlYXR1cmVzLCBudWxsKTsKLQkJQXJyYXlMaXN0IHJlbW92ZVRyZWUgPQotCQkJY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKAotCQkJCXJlbW92ZSwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJdHJ1ZSAvKiB0b2xlcmF0ZSBtaXNzaW5nIGNoaWxkcmVuICovLAotCQkJCW51bGwsCi0JCQkJbnVsbAotCQkpOwotCQlpZiAocmVtb3ZlICE9IG51bGwpIHsKLQkJCS8vIFBhdGNoZXMgdG8gZmVhdHVyZXMgYXJlIHJlbW92ZWQgdG9nZXRoZXIgd2l0aAotCQkJLy8gdGhvc2UgZmVhdHVyZXMuIEluY2x1ZGUgdGhlbSBpbiB0aGUgbGlzdC4KLQkJCWNvbnRyaWJ1dGVQYXRjaGVzRm9yKHJlbW92ZVRyZWUsIGZlYXR1cmVzLCByZW1vdmVUcmVlKTsKLQkJfQotCi0JCWlmIChyZW1vdmUgIT0gbnVsbCkKLQkJCWZlYXR1cmVzLnJlbW92ZUFsbChyZW1vdmVUcmVlKTsKLQotCQlpZiAoYWRkICE9IG51bGwpCi0JCQlmZWF0dXJlcy5hZGRBbGwoYWRkVHJlZSk7Ci0KLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udHJpYnV0ZVBhdGNoZXNGb3IoCi0JCUFycmF5TGlzdCByZW1vdmVUcmVlLAotCQlBcnJheUxpc3QgZmVhdHVyZXMsCi0JCUFycmF5TGlzdCByZXN1bHQpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZVRyZWUuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIHJlbW92ZVRyZWUuZ2V0KGkpOwotCQkJY29udHJpYnV0ZVBhdGNoZXNGb3IoZmVhdHVyZSwgZmVhdHVyZXMsIHJlc3VsdCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnRyaWJ1dGVQYXRjaGVzRm9yKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlBcnJheUxpc3QgZmVhdHVyZXMsCi0JCUFycmF5TGlzdCByZXN1bHQpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgY2FuZGlkYXRlID0gKElGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQlpZiAoVXBkYXRlVXRpbHMuaXNQYXRjaChmZWF0dXJlLCBjYW5kaWRhdGUpKSB7Ci0JCQkJQXJyYXlMaXN0IHJlbW92ZVRyZWUgPQotCQkJCQljb21wdXRlRmVhdHVyZVN1YnRyZWUoY2FuZGlkYXRlLCBudWxsLCBudWxsLCB0cnVlLG51bGwsbnVsbCk7Ci0JCQkJcmVzdWx0LmFkZEFsbChyZW1vdmVUcmVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQ29tcHV0ZSBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYWZ0ZXIgcGVyZm9ybWluZyB0aGUKLQkgKiByZXZlcnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUZlYXR1cmVzQWZ0ZXJSZXZlcnQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGZlYXR1cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJbGlzdC5hZGQoZmVhdHVyZXNbal0uZ2V0RmVhdHVyZShudWxsKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQotCS8qCi0JICogQ29tcHV0ZSBhIGxpc3Qgb2YgcGx1Z2luIGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgZmVhdHVyZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVQbHVnaW5zRm9yRmVhdHVyZXMoQXJyYXlMaXN0IGZlYXR1cmVzKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQotCQlIYXNoTWFwIHBsdWdpbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlJUGx1Z2luRW50cnkgZW50cnkgPSBlbnRyaWVzW2pdOwotCQkJCXBsdWdpbnMucHV0KGVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKSwgZW50cnkpOwotCQkJfQotCQl9Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwocGx1Z2lucy52YWx1ZXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBDaGVjayBmb3IgZmVhdHVyZSBjeWNsZXM6Ci0JICogLSB2aXNpdCBmZWF0dXJlCi0JICogLSBpZiBmZWF0dXJlIGlzIGluIHRoZSBjeWNsZSBjYW5kaWRhdGVzIGxpc3QsIHRoZW4gY3ljbGUgZm91bmQsIGVsc2UgYWRkIGl0IHRvIGNhbmRpZGF0ZXMgbGlzdAotCSAqIC0gREZTIGNoaWxkcmVuIAotCSAqIC0gd2hlbiByZXR1cm4gZnJvbSBERlMgcmVtb3ZlIHRoZSBmZWF0dXJlIGZyb20gdGhlIGNhbmRpZGF0ZXMgbGlzdAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JDeWNsZXMoCi0JCQlJRmVhdHVyZSBmZWF0dXJlLAotCQkJQXJyYXlMaXN0IGNhbmRpZGF0ZXMsCi0JCQlBcnJheUxpc3QgY29uZmlndXJlZEZlYXR1cmVzKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBjaGVjayBhcmd1bWVudHMKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGNvbmZpZ3VyZWRGZWF0dXJlcyA9PSBudWxsKQotCQkJY29uZmlndXJlZEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoY2FuZGlkYXRlcyA9PSBudWxsKQotCQkJY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIGNoZWNrIGZvciA8aW5jbHVkZXM+IGN5Y2xlCi0JCWlmIChjYW5kaWRhdGVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoCi0JCQkJCUtFWV9DWUNMRSwgCi0JCQkJCW5ldyBTdHJpbmdbXSB7ZmVhdHVyZS5nZXRMYWJlbCgpLCAKLQkJCQkJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpfSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBGZWF0dXJlU3RhdHVzLkNPREVfQ1lDTEUsIG1zZyk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0KLQkJLy8gcG90ZW50aWFsIGNhbmRpZGF0ZQotCQljYW5kaWRhdGVzLmFkZChmZWF0dXJlKTsKLQkJCi0JCS8vIHJlY3Vyc2l2ZWx5LCBjaGVjayBjeWNsZXMgd2l0aCBjaGlsZHJlbgotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPQotCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJY2hlY2tGb3JDeWNsZXMoY2hpbGQsIGNhbmRpZGF0ZXMsIGNvbmZpZ3VyZWRGZWF0dXJlcyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoIWNoaWxkcmVuW2ldLmlzT3B0aW9uYWwoKSkKLQkJCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCQkvLyBubyBsb25nZXIgYSBjYW5kaWRhdGUsIGJlY2F1c2Ugbm8gY3ljbGVzIHdpdGggY2hpbGRyZW4KLQkJY2FuZGlkYXRlcy5yZW1vdmUoZmVhdHVyZSk7Ci0JfQotCQotCS8qCi0JICogdmFsaWRhdGUgY29uc3RyYWludHMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uc3RyYWludHMoQXJyYXlMaXN0IGZlYXR1cmVzLCBBcnJheUxpc3Qgc3RhdHVzKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUFycmF5TGlzdCBwbHVnaW5zID0gY29tcHV0ZVBsdWdpbnNGb3JGZWF0dXJlcyhmZWF0dXJlcyk7Ci0KLQkJY2hlY2tFbnZpcm9ubWVudChmZWF0dXJlcywgc3RhdHVzKTsKLQkJY2hlY2tQbGF0Zm9ybUZlYXR1cmUoZmVhdHVyZXMsIHBsdWdpbnMsIHN0YXR1cyk7Ci0JCWNoZWNrUHJpbWFyeUZlYXR1cmUoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCWNoZWNrUHJlcmVxcyhmZWF0dXJlcywgcGx1Z2lucywgc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSBhbGwgZmVhdHVyZXMgYXJlIGVpdGhlciBwb3J0YWJsZSwgb3IgbWF0Y2ggdGhlIGN1cnJlbnQKLQkgKiBlbnZpcm9ubWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tFbnZpcm9ubWVudCgKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0KLQkJU3RyaW5nIG9zID0gUGxhdGZvcm0uZ2V0T1MoKTsKLQkJU3RyaW5nIHdzID0gUGxhdGZvcm0uZ2V0V1MoKTsKLQkJU3RyaW5nIGFyY2ggPSBQbGF0Zm9ybS5nZXRPU0FyY2goKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQlBcnJheUxpc3QgZm9zID0gY3JlYXRlTGlzdChmZWF0dXJlLmdldE9TKCkpOwotCQkJQXJyYXlMaXN0IGZ3cyA9IGNyZWF0ZUxpc3QoZmVhdHVyZS5nZXRXUygpKTsKLQkJCUFycmF5TGlzdCBmYXJjaCA9IGNyZWF0ZUxpc3QoZmVhdHVyZS5nZXRPU0FyY2goKSk7Ci0KLQkJCWlmIChmb3Muc2l6ZSgpID4gMCkgewotCQkJCWlmICghZm9zLmNvbnRhaW5zKG9zKSkgewotCQkJCQlJU3RhdHVzIHMgPQotCQkJCQkJY3JlYXRlU3RhdHVzKGZlYXR1cmUsIEZlYXR1cmVTdGF0dXMuQ09ERV9FTlZJUk9OTUVOVCwgUG9saWN5LmJpbmQoS0VZX09TKSk7Ci0JCQkJCWlmICghc3RhdHVzLmNvbnRhaW5zKHMpKQotCQkJCQkJc3RhdHVzLmFkZChzKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZndzLnNpemUoKSA+IDApIHsKLQkJCQlpZiAoIWZ3cy5jb250YWlucyh3cykpIHsKLQkJCQkJSVN0YXR1cyBzID0KLQkJCQkJCWNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBGZWF0dXJlU3RhdHVzLkNPREVfRU5WSVJPTk1FTlQsIFBvbGljeS5iaW5kKEtFWV9XUykpOwotCQkJCQlpZiAoIXN0YXR1cy5jb250YWlucyhzKSkKLQkJCQkJCXN0YXR1cy5hZGQocyk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGZhcmNoLnNpemUoKSA+IDApIHsKLQkJCQlpZiAoIWZhcmNoLmNvbnRhaW5zKGFyY2gpKSB7Ci0JCQkJCUlTdGF0dXMgcyA9Ci0JCQkJCQljcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX0VOVklST05NRU5ULCBQb2xpY3kuYmluZChLRVlfQVJDSCkpOwotCQkJCQlpZiAoIXN0YXR1cy5jb250YWlucyhzKSkKLQkJCQkJCXN0YXR1cy5hZGQocyk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVmVyaWZ5IHdlIGVuZCB1cCB3aXRoIGEgdmVyc2lvbiBvZiBwbGF0Zm9ybSBjb25maWd1cmVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1BsYXRmb3JtRmVhdHVyZSgKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlBcnJheUxpc3QgcGx1Z2lucywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCi0JCVN0cmluZ1tdIGJvb3RzdHJhcFBsdWdpbnMgPQotCQkJQ29uZmlndXJhdG9yVXRpbHMKLQkJCQkuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpCi0JCQkJLmdldEJvb3RzdHJhcFBsdWdpbklkZW50aWZpZXJzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBib290c3RyYXBQbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBsdWdpbnMuc2l6ZSgpOyBqKyspIHsKLQkJCQlJUGx1Z2luRW50cnkgcGx1Z2luID0gKElQbHVnaW5FbnRyeSkgcGx1Z2lucy5nZXQoaik7Ci0JCQkJaWYgKGJvb3RzdHJhcFBsdWdpbnNbaV0KLQkJCQkJLmVxdWFscyhwbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJSVN0YXR1cyBzID0KLQkJCQkJY3JlYXRlU3RhdHVzKG51bGwsIEZlYXR1cmVTdGF0dXMuQ09ERV9PVEhFUiwgUG9saWN5LmJpbmQoS0VZX1BMQVRGT1JNKSk7Ci0JCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCi0JCQkJCXN0YXR1cy5hZGQocyk7Ci0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSB3ZSBlbmQgdXAgd2l0aCBhIHZlcnNpb24gb2YgcHJpbWFyeSBmZWF0dXJlIGNvbmZpZ3VyZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUHJpbWFyeUZlYXR1cmUoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCi0JCVN0cmluZyBmZWF0dXJlSWQgPQotCQkJQ29uZmlndXJhdG9yVXRpbHMKLQkJCQkuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpCi0JCQkJLmdldFByaW1hcnlGZWF0dXJlSWRlbnRpZmllcigpOwotCQkKLQkJaWYgKGZlYXR1cmVJZCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBubyBleGlzdGluZyBwcmltYXJ5IGZlYXR1cmUsIG5vdGhpbmcgdG8gd29ycnkgYWJvdXQKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQlpZiAoZmVhdHVyZUlkCi0JCQkJLmVxdWFscyhmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCUlTdGF0dXMgcyA9IGNyZWF0ZVN0YXR1cyhudWxsLCBGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsIFBvbGljeS5iaW5kKEtFWV9QUklNQVJZKSk7Ci0JCWlmICghc3RhdHVzLmNvbnRhaW5zKHMpKQotCQkJc3RhdHVzLmFkZChzKTsKLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSB3ZSBkbyBub3QgYnJlYWsgcHJlcmVxcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQcmVyZXFzKAotCQlBcnJheUxpc3QgZmVhdHVyZXMsCi0JCUFycmF5TGlzdCBwbHVnaW5zLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJSUltcG9ydFtdIGltcG9ydHMgPSBmZWF0dXJlLmdldEltcG9ydHMoKTsKLQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbXBvcnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUltcG9ydCBpaW1wb3J0ID0gaW1wb3J0c1tqXTsKLQkJCQkvLyBmb3IgZWFjaCBpbXBvcnQgZGV0ZXJtaW5lIHBsdWdpbiBvciBmZWF0dXJlLCB2ZXJzaW9uLCBtYXRjaAotCQkJCS8vIHdlIG5lZWQKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlpZCA9IGlpbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCVN0cmluZyBpZCA9IGlpZC5nZXRJZGVudGlmaWVyKCk7Ci0JCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbiA9IGlpZC5nZXRWZXJzaW9uKCk7Ci0JCQkJYm9vbGVhbiBmZWF0dXJlUHJlcmVxID0KLQkJCQkJaWltcG9ydC5nZXRLaW5kKCkgPT0gSUltcG9ydC5LSU5EX0ZFQVRVUkU7Ci0JCQkJYm9vbGVhbiBpZ25vcmVWZXJzaW9uID0KLQkJCQkJdmVyc2lvbi5nZXRNYWpvckNvbXBvbmVudCgpID09IDAKLQkJCQkJCSYmIHZlcnNpb24uZ2V0TWlub3JDb21wb25lbnQoKSA9PSAwCi0JCQkJCQkmJiB2ZXJzaW9uLmdldFNlcnZpY2VDb21wb25lbnQoKSA9PSAwOwotCQkJCWludCBydWxlID0gaWltcG9ydC5nZXRSdWxlKCk7Ci0JCQkJaWYgKHJ1bGUgPT0gSUltcG9ydC5SVUxFX05PTkUpCi0JCQkJCXJ1bGUgPSBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRTsKLQotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQotCQkJCUFycmF5TGlzdCBjYW5kaWRhdGVzOwotCi0JCQkJaWYgKGZlYXR1cmVQcmVyZXEpCi0JCQkJCWNhbmRpZGF0ZXMgPSBmZWF0dXJlczsKLQkJCQllbHNlCi0JCQkJCWNhbmRpZGF0ZXMgPSBwbHVnaW5zOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY2FuZGlkYXRlcy5zaXplKCk7IGsrKykgewotCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGNpZDsKLQkJCQkJaWYgKGZlYXR1cmVQcmVyZXEpIHsKLQkJCQkJCS8vIHRoZSBjYW5kaWRhdGUgaXMgYSBmZWF0dXJlCi0JCQkJCQlJRmVhdHVyZSBjYW5kaWRhdGUgPSAoSUZlYXR1cmUpIGNhbmRpZGF0ZXMuZ2V0KGspOwotCQkJCQkJLy8gc2tpcCBzZWxmCi0JCQkJCQlpZiAoZmVhdHVyZS5lcXVhbHMoY2FuZGlkYXRlKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWNpZCA9IGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyB0aGUgY2FuZGlkYXRlIGlzIGEgcGx1Zy1pbgotCQkJCQkJSVBsdWdpbkVudHJ5IHBsdWdpbiA9IChJUGx1Z2luRW50cnkpIGNhbmRpZGF0ZXMuZ2V0KGspOwotCQkJCQkJY2lkID0gcGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkJfQotCQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBjdmVyc2lvbiA9IGNpZC5nZXRWZXJzaW9uKCk7Ci0JCQkJCWlmIChpZC5lcXVhbHMoY2lkLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkJCS8vIGhhdmUgYSBjYW5kaWRhdGUKLQkJCQkJCWlmIChpZ25vcmVWZXJzaW9uKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWVsc2UgaWYgKAotCQkJCQkJCXJ1bGUgPT0gSUltcG9ydC5SVUxFX1BFUkZFQ1QKLQkJCQkJCQkJJiYgY3ZlcnNpb24uaXNQZXJmZWN0KHZlcnNpb24pKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWVsc2UgaWYgKAotCQkJCQkJCXJ1bGUgPT0gSUltcG9ydC5SVUxFX0VRVUlWQUxFTlQKLQkJCQkJCQkJJiYgY3ZlcnNpb24uaXNFcXVpdmFsZW50VG8odmVyc2lvbikpCi0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJZWxzZSBpZiAoCi0JCQkJCQkJcnVsZSA9PSBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRQotCQkJCQkJCQkmJiBjdmVyc2lvbi5pc0NvbXBhdGlibGVXaXRoKHZlcnNpb24pKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWVsc2UgaWYgKAotCQkJCQkJCXJ1bGUgPT0gSUltcG9ydC5SVUxFX0dSRUFURVJfT1JfRVFVQUwKLQkJCQkJCQkJJiYgY3ZlcnNpb24uaXNHcmVhdGVyT3JFcXVhbFRvKHZlcnNpb24pKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoZm91bmQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCS8vIHJlcG9ydCBzdGF0dXMKLQkJCQkJU3RyaW5nIHRhcmdldCA9Ci0JCQkJCQlmZWF0dXJlUHJlcmVxCi0JCQkJCQkJPyBQb2xpY3kuYmluZChLRVlfUFJFUkVRX0ZFQVRVUkUpCi0JCQkJCQkJOiBQb2xpY3kuYmluZChLRVlfUFJFUkVRX1BMVUdJTik7Ci0JCQkJCWludCBlcnJvckNvZGUgPSBmZWF0dXJlUHJlcmVxCi0JCQkJCQkJPyBGZWF0dXJlU3RhdHVzLkNPREVfUFJFUkVRX0ZFQVRVUkUKLQkJCQkJCQk6IEZlYXR1cmVTdGF0dXMuQ09ERV9QUkVSRVFfUExVR0lOOwotCQkJCQlTdHJpbmcgbXNnID0KLQkJCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJCUtFWV9QUkVSRVEsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgdGFyZ2V0LCBpZCB9KTsKLQotCQkJCQlpZiAoIWlnbm9yZVZlcnNpb24pIHsKLQkJCQkJCWlmIChydWxlID09IElJbXBvcnQuUlVMRV9QRVJGRUNUKQotCQkJCQkJCW1zZyA9Ci0JCQkJCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJCQkJS0VZX1BSRVJFUV9QRVJGRUNULAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJCQl0YXJnZXQsCi0JCQkJCQkJCQkJaWQsCi0JCQkJCQkJCQkJdmVyc2lvbi50b1N0cmluZygpfSk7Ci0JCQkJCQllbHNlIGlmIChydWxlID09IElJbXBvcnQuUlVMRV9FUVVJVkFMRU5UKQotCQkJCQkJCW1zZyA9Ci0JCQkJCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJCQkJS0VZX1BSRVJFUV9FUVVJVkFMRU5ULAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJCQl0YXJnZXQsCi0JCQkJCQkJCQkJaWQsCi0JCQkJCQkJCQkJdmVyc2lvbi50b1N0cmluZygpfSk7Ci0JCQkJCQllbHNlIGlmIChydWxlID09IElJbXBvcnQuUlVMRV9DT01QQVRJQkxFKQotCQkJCQkJCW1zZyA9Ci0JCQkJCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJCQkJS0VZX1BSRVJFUV9DT01QQVRJQkxFLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJCQl0YXJnZXQsCi0JCQkJCQkJCQkJaWQsCi0JCQkJCQkJCQkJdmVyc2lvbi50b1N0cmluZygpfSk7Ci0JCQkJCQllbHNlIGlmIChydWxlID09IElJbXBvcnQuUlVMRV9HUkVBVEVSX09SX0VRVUFMKQotCQkJCQkJCW1zZyA9Ci0JCQkJCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJCQkJS0VZX1BSRVJFUV9HUkVBVEVSLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJCQl0YXJnZXQsCi0JCQkJCQkJCQkJaWQsCi0JCQkJCQkJCQkJdmVyc2lvbi50b1N0cmluZygpfSk7Ci0JCQkJCX0KLQkJCQkJSVN0YXR1cyBzID0gY3JlYXRlU3RhdHVzKGZlYXR1cmUsIGVycm9yQ29kZSwgbXNnKTsKLQkJCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCi0JCQkJCQlzdGF0dXMuYWRkKHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVmVyaWZ5IHdlIGVuZCB1cCB3aXRoIHZhbGlkIG5lc3RlZCBmZWF0dXJlcyBhZnRlciByZXZlcnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUmV2ZXJ0Q29uc3RyYWludHMoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKAotCQkJCQlmZWF0dXJlLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlmYWxzZSAvKiBkbyBub3QgdG9sZXJhdGUgbWlzc2luZyBjaGlsZHJlbiAqLywKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbAotCQkJCSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBWZXJpZnkgdGhhdCBhIHBhcmVudCBvZiBhbiBvcHRpb25hbCBjaGlsZCBpcyBjb25maWd1cmVkIGJlZm9yZSB3ZSBhbGxvdwotCSAqIHRoZSBjaGlsZCB0byBiZSBjb25maWd1cmVkIGFzIHdlbGwKLQkgKi8KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tPcHRpb25hbENoaWxkQ29uZmlndXJpbmcoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUFycmF5TGlzdCBzdGF0dXMpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0KLQkJYm9vbGVhbiBpbmNsdWRlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOwotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gY3JlZnMgPQotCQkJCWNzaXRlLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcmVmcy5sZW5ndGg7IGorKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNyZWYgPSBjcmVmc1tqXTsKLQkJCQlJRmVhdHVyZSBjZmVhdHVyZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJY2ZlYXR1cmUgPSBjcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vRklYTUU6IGNhbm5vdCBhc2sgJ2lzT3B0aW9uYWwnIGhlcmUKLQkJCQkJLy8gSWdub3JlIG1pc3Npbmcgb3B0aW9uYWwgZmVhdHVyZS4KLQkJCQkJLyoKLQkJCQkJICogaWYgKGNyZWYuaXNPcHRpb25hbCgpKSBjb250aW51ZTsKLQkJCQkJICovCi0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJCWlmIChpc1BhcmVudChjZmVhdHVyZSwgZmVhdHVyZSwgdHJ1ZSkpIHsKLQkJCQkJLy8gSW5jbHVkZWQgaW4gYXQgbGVhc3Qgb25lIGZlYXR1cmUgYXMgb3B0aW9uYWwKLQkJCQkJaW5jbHVkZWQgPSB0cnVlOwotCQkJCQlpZiAoY3NpdGUuaXNDb25maWd1cmVkKGNmZWF0dXJlKSkgewotCQkJCQkJLy8gQXQgbGVhc3Qgb25lIGZlYXR1cmUgcGFyZW50Ci0JCQkJCQkvLyBpcyBlbmFibGVkIC0gaXQgaXMgT0sgdG8KLQkJCQkJCS8vIGNvbmZpZ3VyZSBvcHRpb25hbCBjaGlsZC4KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaW5jbHVkZWQpIHsKLQkJCS8vIGZlYXR1cmUgaXMgaW5jbHVkZWQgYXMgb3B0aW9uYWwgYnV0Ci0JCQkvLyBubyBwYXJlbnQgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQuCi0JCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoS0VZX09QVElPTkFMX0NISUxEKTsKLQkJCXN0YXR1cy5hZGQoY3JlYXRlU3RhdHVzKGZlYXR1cmUsIEZlYXR1cmVTdGF0dXMuQ09ERV9PUFRJT05BTF9DSElMRCwgbXNnKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvL2ZlYXR1cmUgaXMgcm9vdCAtIGNhbiBiZSBjb25maWd1cmVkCi0JCX0KLQl9Ci0vLwotLy8JLyoqCi0vLwkgKiBDaGVja3MgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGJ5IG90aGVyIGluc3RhbmNlcwotLy8JICogCi0vLwkgKiBAcGFyYW0gc3RhdHVzCi0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uTG9jayhBcnJheUxpc3Qgc3RhdHVzKSB7Ci0vLwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjb25maWcgPQotLy8JCQlCb290TG9hZGVyLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLS8vCQlVUkwgY29uZmlnVVJMID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotLy8JCWlmICghImZpbGUiLmVxdWFscyhjb25maWdVUkwuZ2V0UHJvdG9jb2woKSkpIHsKLS8vCQkJc3RhdHVzLmFkZCgKLS8vCQkJCWNyZWF0ZVN0YXR1cygKLS8vCQkJCQludWxsLAotLy8JCQkJCSJDb25maWd1cmF0aW9uIGxvY2F0aW9uIGlzIG5vdCB3cml0YWJsZToiICsgY29uZmlnVVJMKSk7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwkJU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gY29uZmlnVVJMLmdldEZpbGUoKTsKLS8vCQlGaWxlIGNvbmZpZ0RpciA9IG5ldyBGaWxlKGxvY2F0aW9uU3RyaW5nKTsKLS8vCQlpZiAoIWNvbmZpZ0Rpci5pc0RpcmVjdG9yeSgpKQotLy8JCQljb25maWdEaXIgPSBjb25maWdEaXIuZ2V0UGFyZW50RmlsZSgpOwotLy8JCWlmICghY29uZmlnRGlyLmV4aXN0cygpKSB7Ci0vLwkJCXN0YXR1cy5hZGQoCi0vLwkJCQljcmVhdGVTdGF0dXMobnVsbCwgIkNvbmZpZ3VyYXRpb24gbG9jYXRpb24gZG9lcyBub3QgZXhpc3QiKSk7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwkJRmlsZSBsb2Nrc0RpciA9IG5ldyBGaWxlKGNvbmZpZ0RpciwgImxvY2tzIik7Ci0vLwkJLy8gY2hlY2sgYWxsIHRoZSBwb3NzaWJsZSBsb2NrIGZpbGVzCi0vLwkJRmlsZVtdIGxvY2tGaWxlcyA9IGxvY2tzRGlyLmxpc3RGaWxlcygpOwotLy8JCUZpbGUgY29uZmlnTG9jayA9IEJvb3RMb2FkZXIuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpLmdldExvY2tGaWxlKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NrRmlsZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJaWYgKGxvY2tGaWxlc1tpXS5lcXVhbHMoY29uZmlnTG9jaykpCi0vLwkJCQljb250aW51ZTsKLS8vCQkJdHJ5IHsKLS8vCQkJCVJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUobG9ja0ZpbGVzW2ldLCAicnciKTsKLS8vCQkJCUZpbGVDaGFubmVsIGNoYW5uZWwgPSByYWYuZ2V0Q2hhbm5lbCgpOwotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKGNoYW5uZWwuaXNPcGVuKCkpOwotLy8JCQkJRmlsZUxvY2sgbG9jayA9IGNoYW5uZWwudHJ5TG9jaygpOwotLy8JCQkJaWYgKGxvY2sgPT0gbnVsbCl7Ci0vLwkJCQkJLy8gdGhlcmUgaXMgYW5vdGhlciBlY2xpcHNlIGluc3RhbmNlIHJ1bm5pbmcKLS8vCQkJCQlyYWYuY2xvc2UoKTsKLS8vCQkJCQlzdGF0dXMuYWRkKAotLy8JCQkJCQljcmVhdGVTdGF0dXMoCi0vLwkJCQkJCQludWxsLAotLy8JCQkJCQkJIkFub3RoZXIgaW5zdGFuY2UgaXMgcnVubmluZywgcGxlYXNlIGNsb3NlIGl0IGJlZm9yZSBwZXJmb3JtaW5nIGFueSBjb25maWd1cmF0aW9uIG9wZXJhdGlvbnMiKSk7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotLy8KLS8vCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJCXN0YXR1cy5hZGQoY3JlYXRlU3RhdHVzKG51bGwsICJGYWlsZWQgdG8gY3JlYXRlIGxvY2s6Iitsb2NrRmlsZXNbaV0pKTsKLS8vCQkJCXJldHVybjsKLS8vCQkJfSAKLS8vCQl9Ci0vLwl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUGFyZW50KAotCQlJRmVhdHVyZSBjYW5kaWRhdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCWJvb2xlYW4gb3B0aW9uYWxPbmx5KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0KLQkJCWNhbmRpZGF0ZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBjaGlsZCA9IHJlZnNbaV07Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIGZ2aWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgY3ZpZCA9IGNoaWxkLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQotCQkJaWYgKGZ2aWQuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhjdmlkLmdldElkZW50aWZpZXIoKSkgPT0gZmFsc2UpCi0JCQkJY29udGludWU7Ci0JCQkvLyBzYW1lIElECi0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBmdmVyc2lvbiA9IGZ2aWQuZ2V0VmVyc2lvbigpOwotCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgY3ZlcnNpb24gPSBjdmlkLmdldFZlcnNpb24oKTsKLQotCQkJaWYgKGZ2ZXJzaW9uLmVxdWFscyhjdmVyc2lvbikpIHsKLQkJCQkvLyBpbmNsdWRlZCBhbmQgbWF0Y2hlZDsgcmV0dXJuIHRydWUgaWYgb3B0aW9uYWxpdHkgaXMgbm90Ci0JCQkJLy8gaW1wb3J0YW50IG9yIGl0IGlzIGFuZCB0aGUgaW5jbHVzaW9uIGlzIG9wdGlvbmFsCi0JCQkJcmV0dXJuIG9wdGlvbmFsT25seSA9PSBmYWxzZSB8fCBjaGlsZC5pc09wdGlvbmFsKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja1RpbWVsaW5lKAotLy8JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0vLwkJQXJyYXlMaXN0IHN0YXR1cykgewotLy8JCXRyeSB7Ci0vLwkJCUlMb2NhbFNpdGUgbHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLS8vCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNjb25maWcgPSBsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotLy8JCQlpZiAoY2NvbmZpZy5nZXRUaW1lbGluZSgpICE9IGNvbmZpZy5nZXRUaW1lbGluZSgpKSB7Ci0vLwkJCQkvLyBOb3QgdGhlIHNhbWUgdGltZWxpbmUgLSBjYW5ub3QgcmV2ZXJ0Ci0vLwkJCQlTdHJpbmcgbXNnID0KLS8vCQkJCQlVcGRhdGVVdGlscy5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotLy8JCQkJCQlLRVlfV1JPTkdfVElNRUxJTkUsCi0vLwkJCQkJCWNvbmZpZy5nZXRMYWJlbCgpKTsKLS8vCQkJCXN0YXR1cy5hZGQoY3JlYXRlU3RhdHVzKG51bGwsIEZlYXR1cmVTdGF0dXMuQ09ERV9PVEhFUiwgbXNnKSk7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHRydWU7Ci0vLwl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZU11bHRpU3RhdHVzKAotCQlTdHJpbmcgcm9vdEtleSwKLQkJQXJyYXlMaXN0IGNoaWxkcmVuLAotCQlpbnQgY29kZSkgewotCQlJU3RhdHVzW10gY2FycmF5ID0KLQkJCShJU3RhdHVzW10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IElTdGF0dXNbY2hpbGRyZW4uc2l6ZSgpXSk7Ci0JCVN0cmluZyBtZXNzYWdlID0gUG9saWN5LmJpbmQocm9vdEtleSk7Ci0JCXJldHVybiBuZXcgTXVsdGlTdGF0dXMoCi0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAotCQkJY29kZSwKLQkJCWNhcnJheSwKLQkJCW1lc3NhZ2UsCi0JCQludWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlLCBpbnQgZXJyb3JDb2RlLCBTdHJpbmcgbWVzc2FnZSkgewotCi0JCVN0cmluZyBmdWxsTWVzc2FnZTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCWZ1bGxNZXNzYWdlID0gbWVzc2FnZTsKLQkJZWxzZSB7Ci0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2ZXJzaW9uID0KLQkJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7Ci0JCQlmdWxsTWVzc2FnZSA9Ci0JCQkJUG9saWN5LmJpbmQoCi0JCQkJCUtFWV9DSElMRF9NRVNTQUdFLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJZmVhdHVyZS5nZXRMYWJlbCgpLAotCQkJCQkJdmVyc2lvbi50b1N0cmluZygpLAotCQkJCQkJbWVzc2FnZSB9KTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmVhdHVyZVN0YXR1cygKLQkJCWZlYXR1cmUsCi0JCQlJU3RhdHVzLkVSUk9SLAotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCWVycm9yQ29kZSwKLQkJCWZ1bGxNZXNzYWdlLAotCQkJbnVsbCk7Ci0JfQotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVSZXBvcnRTdGF0dXMoQXJyYXlMaXN0IGJlZm9yZVN0YXR1cywKLQkvLyBBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JLy8JCS8vIHJlcG9ydCBzdGF0dXMKLQkvLwkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKSB7Ci0JLy8JCQlpZiAoYmVmb3JlU3RhdHVzLnNpemUoKSA+IDApCi0JLy8JCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0VfSU5JVCwKLQkvLyBiZWZvcmVTdGF0dXMsSVN0YXR1cy5FUlJPUik7Ci0JLy8JCQllbHNlCi0JLy8JCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0UsIHN0YXR1cyxJU3RhdHVzLkVSUk9SKTsKLQkvLwkJfQotCS8vCQlyZXR1cm4gbnVsbDsKLQkvLwl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKAotCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCWlmIChiZWZvcmVTdGF0dXMuc2l6ZSgpID09IDApIHsgLy8gZ29vZCBpbml0aWFsIGNvbmZpZwotCQkJaWYgKHN0YXR1cy5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOyAvLyBhbGwgZmluZQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoCi0JCQkJCUtFWV9ST09UX01FU1NBR0UsCi0JCQkJCXN0YXR1cywKLQkJCQkJSVN0YXR1cy5FUlJPUik7Ci0JCQkJLy8gZXJyb3IgYWZ0ZXIgb3BlcmF0aW9uCi0JCQl9Ci0JCX0gZWxzZSB7IC8vIGJlZm9yZVN0YXR1cy5zaXplKCkgPiAwIDogaW5pdGlhbCBjb25maWcgZXJyb3JzCi0JCQlpZiAoc3RhdHVzLnNpemUoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7IC8vIGVycm9ycyB3aWxsIGJlIGZpeGVkCi0JCQl9IGVsc2UgewotCQkJCWlmIChpc0JldHRlclN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKAotCQkJCQkJIkFjdGl2aXR5Q29uc3RyYWludHMud2FybmluZyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJlZm9yZVN0YXR1cywKLQkJCQkJCUlTdGF0dXMuV0FSTklORyk7Ci0JCQkJCS8vIGVycm9ycyBtYXkgYmUgZml4ZWQKLQkJCQl9IGVsc2UgewotCQkJCQlBcnJheUxpc3QgY29tYmluZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWNvbWJpbmVkLmFkZCgKLQkJCQkJCWNyZWF0ZU11bHRpU3RhdHVzKAotCQkJCQkJCSJBY3Rpdml0eUNvbnN0cmFpbnRzLmJlZm9yZU1lc3NhZ2UiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJYmVmb3JlU3RhdHVzLAotCQkJCQkJCUlTdGF0dXMuRVJST1IpKTsKLQkJCQkJY29tYmluZWQuYWRkKAotCQkJCQkJY3JlYXRlTXVsdGlTdGF0dXMoCi0JCQkJCQkJIkFjdGl2aXR5Q29uc3RyYWludHMuYWZ0ZXJNZXNzYWdlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXN0YXR1cywKLQkJCQkJCQlJU3RhdHVzLkVSUk9SKSk7Ci0JCQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cygKLQkJCQkJCUtFWV9ST09UX01FU1NBR0VfSU5JVCwKLQkJCQkJCWNvbWJpbmVkLAotCQkJCQkJSVN0YXR1cy5FUlJPUik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNyZWF0ZUxpc3QoU3RyaW5nIGNvbW1hU2VwYXJhdGVkTGlzdCkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGNvbW1hU2VwYXJhdGVkTGlzdCAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdCA9Ci0JCQkJbmV3IFN0cmluZ1Rva2VuaXplcihjb21tYVNlcGFyYXRlZExpc3QudHJpbSgpLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgdG9rZW4gPSB0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoIXRva2VuLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJbGlzdC5hZGQodG9rZW4pOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBzdGF0dXMgaXMgYSBzdWJzZXQgb2YgYmVmb3JlU3RhdHVzCi0JICogCi0JICogQHBhcmFtIGJlZm9yZVN0YXR1cwotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0JldHRlclN0YXR1cygKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCQkvLyBpZiBubyBzdGF0dXMgYXQgYWxsLCB0aGVuIGl0J3MgYSBzdWJzZXQKLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQkvLyB0aGVyZSBpcyBzb21lIHN0YXR1cywgc28gaWYgdGhlcmUgaXMgbm8gaW5pdGlhbCBzdGF0dXMsIHRoZW4gaXQncwotCQkvLyBub3QgYSBzdWJzZXQKLQkJaWYgKGJlZm9yZVN0YXR1cyA9PSBudWxsIHx8IGJlZm9yZVN0YXR1cy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gcXVpY2sgY2hlY2sKLQkJaWYgKGJlZm9yZVN0YXR1cy5zaXplKCkgPCBzdGF0dXMuc2l6ZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGNoZWNrIGlmIGFsbCB0aGUgc3RhdHVzIGVsZW1lbnRzIGFwcGVhciBpbiB0aGUgb3JpZ2luYWwgc3RhdHVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJU3RhdHVzIHMgPSAoSVN0YXR1cykgc3RhdHVzLmdldChpKTsKLQkJCS8vIGlmIHRoaXMgaXMgbm90IGEgZmVhdHVyZSBzdGF0dXMsIHNvbWV0aGluZyBpcyB3cm9uZywgc28gcmV0dXJuCi0JCQkvLyBmYWxzZQotCQkJaWYgKCEocyBpbnN0YW5jZW9mIEZlYXR1cmVTdGF0dXMpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCUZlYXR1cmVTdGF0dXMgZnMgPSAoRmVhdHVyZVN0YXR1cykgczsKLQkJCS8vIGNoZWNrIGFnYWluc3QgYWxsIHN0YXR1cyBlbGVtZW50cwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7ICFmb3VuZCAmJiBqIDwgYmVmb3JlU3RhdHVzLnNpemUoKTsgaisrKSB7Ci0JCQkJaWYgKGZzLmVxdWFscyhiZWZvcmVTdGF0dXMuZ2V0KGopKSkKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCQkJaWYgKCFmb3VuZCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QYXRjaENsZWFuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUGF0Y2hDbGVhbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YzdiOGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QYXRjaENsZWFuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogVGhpcyB1dGlsaXR5IGNsYXNzIGF0dGFjaGVzIGFzIGEgbGlzdGVuZWQgdG8gdGhlIHByb3ZpZGVkCi0gKiBjb25maWd1cmVkIHNpdGUsIGFuZCBmb3IgZXZlcnkgdW5jb25maWd1cmVkIGZlYXR1cmUgCi0gKiBpdCB0ZXN0cyBpZiBpdCBpcyBhIHBhdGNoIGFuZCBjbGVhbnMgdXAgaXRzIGJhY2t1cCBjb25maWd1cmF0aW9uLgotICovCi0KLXB1YmxpYyBjbGFzcyBQYXRjaENsZWFuZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGNzaXRlOwotCXByaXZhdGUgU2l0ZUxpc3RlbmVyIGxpc3RlbmVyOwotCWNsYXNzIFNpdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGZlYXR1cmVJbnN0YWxsZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGZlYXR1cmVSZW1vdmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCWNsZWFuU2F2ZWRDb25maWdzKGZlYXR1cmUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZlYXR1cmVDb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlVW5jb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCWNsZWFuU2F2ZWRDb25maWdzKGZlYXR1cmUpOwotCQl9Ci0JfQotCXB1YmxpYyBQYXRjaENsZWFuZXIoSUNvbmZpZ3VyZWRTaXRlIGNzaXRlLCBJRmVhdHVyZSByb290KSB7Ci0JCXRoaXMuY3NpdGUgPSBjc2l0ZTsKLQkJbGlzdGVuZXIgPSBuZXcgU2l0ZUxpc3RlbmVyKCk7Ci0JCWNzaXRlLmFkZENvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljc2l0ZS5yZW1vdmVDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCXByaXZhdGUgdm9pZCBjbGVhblNhdmVkQ29uZmlncyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlLmlzUGF0Y2goKSkgewotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGJhY2t1cENvbmZpZyA9IFVwZGF0ZVV0aWxzLmdldEJhY2t1cENvbmZpZ3VyYXRpb25Gb3IoZmVhdHVyZSk7Ci0JCQlpZiAoYmFja3VwQ29uZmlnIT1udWxsKSB7Ci0JCQkJLy8gY2xlYW4gaXQKLQkJCQlyZW1vdmUoYmFja3VwQ29uZmlnKTsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlsb2NhbFNpdGUucmVtb3ZlRnJvbVByZXNlcnZlZENvbmZpZ3VyYXRpb25zKGNvbmZpZyk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4N2I4ZTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIFN3YXBzIGEgZmVhdHVyZS4KLSAqIFJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uCi0JZXh0ZW5kcyBGZWF0dXJlT3BlcmF0aW9uCi0JaW1wbGVtZW50cyBJQ29uZmlnRmVhdHVyZU9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIElGZWF0dXJlIGFub3RoZXJGZWF0dXJlOwotCQotCXB1YmxpYyBSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24oCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlKSB7Ci0JCXN1cGVyKGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpLCBmZWF0dXJlKTsKLQkJdGhpcy5hbm90aGVyRmVhdHVyZSA9IGFub3RoZXJGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmVwbGFjZVZlcnNpb24oZmVhdHVyZSwgYW5vdGhlckZlYXR1cmUpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQotCQkvLyB1bmNvbmZpZ3VyZSBjdXJyZW50IGZlYXR1cmUgZmlyc3QsIHRoZW4gY29uZmlndXJlIHRoZSBvdGhlciBvbmUKLQkJCi0JCVBhdGNoQ2xlYW5lciBjbGVhbmVyID0gbmV3IFBhdGNoQ2xlYW5lcih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKLQkJdGFyZ2V0U2l0ZS51bmNvbmZpZ3VyZShmZWF0dXJlKTsKLQkJY2xlYW5lci5kaXNwb3NlKCk7Ci0JCQotCQl0YXJnZXRTaXRlLmNvbmZpZ3VyZShhbm90aGVyRmVhdHVyZSk7Ci0vLwkJZW5zdXJlVW5pcXVlKCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIFJlc3RhcnQgbm90IG5lZWRlZAotCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gZmFsc2U7Ci0KLQkJCS8vIENoZWNrIGlmIHRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxpbmcgb25lIHRoYXQncyBhbHJlYWR5IHBlbmRpbmcKLQkJCUlPcGVyYXRpb24gcGVuZGluZ09wZXJhdGlvbiA9Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oZmVhdHVyZSk7Ci0KLQkJCWlmIChwZW5kaW5nT3BlcmF0aW9uIGluc3RhbmNlb2YgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24pIHsKLQkJCQkvLyBubyBuZWVkIHRvIGRvIGVpdGhlciBwZW5kaW5nIGNoYW5nZQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLnJlbW92ZVBlbmRpbmdPcGVyYXRpb24ocGVuZGluZ09wZXJhdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmFkZFBlbmRpbmdPcGVyYXRpb24odGhpcyk7Ci0JCQkJcmVzdGFydE5lZWRlZCA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCXBlbmRpbmdPcGVyYXRpb24gPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGFub3RoZXJGZWF0dXJlKTsKLQkJCQkKLQkJCWlmIChwZW5kaW5nT3BlcmF0aW9uIGluc3RhbmNlb2YgSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbikgewotCQkJCS8vIG5vIG5lZWQgdG8gZG8gZWl0aGVyIHBlbmRpbmcgY2hhbmdlCi0JCQkJT3BlcmF0aW9uc01hbmFnZXIucmVtb3ZlUGVuZGluZ09wZXJhdGlvbihwZW5kaW5nT3BlcmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuYWRkUGVuZGluZ09wZXJhdGlvbih0aGlzKTsKLQkJCQlyZXN0YXJ0TmVlZGVkID0gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJbWFya1Byb2Nlc3NlZCgpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJbGlzdGVuZXIuYWZ0ZXJFeGVjdXRlKHRoaXMsIG51bGwpOwotCi0JCQlyZXN0YXJ0TmVlZGVkID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpICYmIHJlc3RhcnROZWVkZWQ7Ci0KLQkJCS8vIG5vdGlmeSB0aGUgbW9kZWwKLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpcmVPYmplY3RDaGFuZ2VkKGZlYXR1cmUsIG51bGwpOwotCi0JCQlyZXR1cm4gcmVzdGFydE5lZWRlZDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl1bmRvKCk7Ci0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGFyZ2V0U2l0ZS51bmNvbmZpZ3VyZShhbm90aGVyRmVhdHVyZSk7Ci0JCXRhcmdldFNpdGUuY29uZmlndXJlKGZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiN2ZlNWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbiBleHRlbmRzIE9wZXJhdGlvbiBpbXBsZW1lbnRzIElSZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uIHsKLQotCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIElQcm9ibGVtSGFuZGxlciBwcm9ibGVtSGFuZGxlcjsKLQotCXB1YmxpYyBSZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJUHJvYmxlbUhhbmRsZXIgcHJvYmxlbUhhbmRsZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMucHJvYmxlbUhhbmRsZXIgPSBwcm9ibGVtSGFuZGxlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdSZXZlcnQoY29uZmlnKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJbG9jYWxTaXRlLnJldmVydFRvKGNvbmZpZywgbW9uaXRvciwgcHJvYmxlbUhhbmRsZXIpOwotCQkJbG9jYWxTaXRlLnNhdmUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1RvZ2dsZVNpdGVPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVG9nZ2xlU2l0ZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE1OGQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVG9nZ2xlU2l0ZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgVG9nZ2xlU2l0ZU9wZXJhdGlvbgotCWV4dGVuZHMgT3BlcmF0aW9uCi0JaW1wbGVtZW50cyBJVG9nZ2xlU2l0ZU9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBzaXRlOwotCi0JcHVibGljIFRvZ2dsZVNpdGVPcGVyYXRpb24oSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQlJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHNpdGUuaXNFbmFibGVkKCk7Ci0JCXNpdGUuc2V0RW5hYmxlZCghb2xkVmFsdWUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlQ3VycmVudFN0YXRlKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJLy8gcmV2ZXJ0Ci0JCQlzaXRlLnNldEVuYWJsZWQob2xkVmFsdWUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpOwotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpcmVPYmplY3RDaGFuZ2VkKHNpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiByZXN0YXJ0TmVlZGVkOyAvLyB3aWxsIHJlc3RhcnQgb25seSBpZiBjaGFuZ2VzIGNvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIGN1cnJlbnQgY29uZmlnCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvL3JldmVydAotCQkJCXNpdGUuc2V0RW5hYmxlZChvbGRWYWx1ZSk7Ci0JCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUpOwotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuY29uZmlnT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuY29uZmlnT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYmFjOTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VbmNvbmZpZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIFVuY29uZmlndXJlIGEgZmVhdHVyZS4KLSAqIFVuY29uZmlnT3BlcmF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmNvbmZpZ09wZXJhdGlvbgotCWV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgotCWltcGxlbWVudHMgSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgVW5jb25maWdPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKHNpdGUsIGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nVW5jb25maWcoZmVhdHVyZSk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQotCQlQYXRjaENsZWFuZXIgY2xlYW5lciA9IG5ldyBQYXRjaENsZWFuZXIodGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JCXRhcmdldFNpdGUudW5jb25maWd1cmUoZmVhdHVyZSk7Ci0JCWNsZWFuZXIuZGlzcG9zZSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBSZXN0YXJ0IG5vdCBuZWVkZWQKLQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IGZhbHNlOwotCi0JCQkvLyBDaGVjayBpZiB0aGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsaW5nIG9uZSB0aGF0J3MgYWxyZWFkeSBwZW5kaW5nCi0JCQlJT3BlcmF0aW9uIHBlbmRpbmdPcGVyYXRpb24gPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGZlYXR1cmUpOwotCi0JCQlpZiAocGVuZGluZ09wZXJhdGlvbiBpbnN0YW5jZW9mIElDb25maWdGZWF0dXJlT3BlcmF0aW9uKSB7Ci0JCQkJLy8gbm8gbmVlZCB0byBkbyBlaXRoZXIgcGVuZGluZyBjaGFuZ2UKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5yZW1vdmVQZW5kaW5nT3BlcmF0aW9uKHBlbmRpbmdPcGVyYXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5hZGRQZW5kaW5nT3BlcmF0aW9uKHRoaXMpOwotCQkJCXJlc3RhcnROZWVkZWQgPSB0cnVlOwotCQkJfQotCi0JCQltYXJrUHJvY2Vzc2VkKCk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlsaXN0ZW5lci5hZnRlckV4ZWN1dGUodGhpcywgbnVsbCk7Ci0KLQkJCXJlc3RhcnROZWVkZWQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCkgJiYgcmVzdGFydE5lZWRlZDsKLQotCQkJLy8gbm90aWZ5IHRoZSBtb2RlbAotCQkJT3BlcmF0aW9uc01hbmFnZXIuZmlyZU9iamVjdENoYW5nZWQoZmVhdHVyZSwgbnVsbCk7Ci0KLQkJCXJldHVybiByZXN0YXJ0TmVlZGVkOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXVuZG8oKTsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0YXJnZXRTaXRlLmNvbmZpZ3VyZShmZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5pbnN0YWxsT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuaW5zdGFsbE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDAyM2NlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5pbnN0YWxsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBDb25maWd1cmUgYSBmZWF0dXJlLgotICogQ29uZmlnT3BlcmF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmluc3RhbGxPcGVyYXRpb24gZXh0ZW5kcyBGZWF0dXJlT3BlcmF0aW9uIGltcGxlbWVudHMgSVVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb257Ci0KLQlwdWJsaWMgVW5pbnN0YWxsT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZSBzaXRlLCBJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKHNpdGUsIGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUpIHsKLQkJdGhpcy50YXJnZXRTaXRlID0gdGFyZ2V0U2l0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKQotCQkJdGFyZ2V0U2l0ZSA9IFVwZGF0ZVV0aWxzLmdldENvbmZpZ1NpdGUoZmVhdHVyZSwgU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJLy8gUmVzdGFydCBub3QgbmVlZGVkCi0JCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IGZhbHNlOwotCi0JCWlmICh0YXJnZXRTaXRlICE9IG51bGwpIHsKLQkJCS8vIGlmIG5lZWRlZCwgdW5jb25maWd1cmUgdGhlIGZlYXR1cmUgZmlyc3QKLQkJCWlmICh0YXJnZXRTaXRlLmlzQ29uZmlndXJlZChmZWF0dXJlKSkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nVW5jb25maWcoZmVhdHVyZSk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCQlpZiAodW5jb25maWd1cmUoZmVhdHVyZSwgdGFyZ2V0U2l0ZSkpCi0JCQkJCXJlc3RhcnROZWVkZWQgPSB0cnVlOwotCQkJCWVsc2UKLQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIk9wZXJhdGlvbnNNYW5hZ2VyLmVycm9yLnVuaW5zdGFsbCIsIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGFyZ2V0U2l0ZS5yZW1vdmUoZmVhdHVyZSwgcG0pOwotCQl9IGVsc2UgewotCQkJLy8gd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBoZXJlCi0JCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkJUG9saWN5LmJpbmQoCi0JCQkJCSJPcGVyYXRpb25zTWFuYWdlci5lcnJvci51bmluc3RhbGwiLCAvLyROT04tTkxTLTEkCi0JCQkJCWZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJVXBkYXRlVXRpbHMuZ2V0UGx1Z2luSWQoKSwKLQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJbWVzc2FnZSwKLQkJCQkJbnVsbCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0KLQkJbWFya1Byb2Nlc3NlZCgpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCWxpc3RlbmVyLmFmdGVyRXhlY3V0ZSh0aGlzLCBudWxsKTsKLQotCQlyZXN0YXJ0TmVlZGVkID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpICYmIHJlc3RhcnROZWVkZWQ7Ci0KLQkJLy8gbm90aWZ5IHRoZSBtb2RlbAotCQlPcGVyYXRpb25zTWFuYWdlci5maXJlT2JqZWN0Q2hhbmdlZChmZWF0dXJlLCBVTklOU1RBTEwpOwotCQkKLQkJcmV0dXJuIHJlc3RhcnROZWVkZWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZVV0aWxzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDRhZmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgcGVyZm9ybWluZyB1cGRhdGUgcmVsYXRlZCB0YXNrcywgcXVlcmllcywgZXRjLgotICogQWxsIHRoZSBtZXRob2RzIGFyZSBzdGF0aWMgYW5kIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGEgc2luZ2xldG9uLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlVXRpbHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfVVBEQVRFX1BPTElDWV9VUkwgPSAidXBkYXRlUG9saWN5VVJMIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgVXBkYXRlVXRpbHMoKSB7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQkKLQkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQllID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQkJbWVzc2FnZSA9IGUudG9TdHJpbmcoKTsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZSk7Ci0JCX0KLQkJbG9nKHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5JTkZPKSB7Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl9IAotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVbXSBzZWFyY2hTaXRlKFN0cmluZyBmZWF0dXJlSWQsIElDb25maWd1cmVkU2l0ZSBzaXRlLCBib29sZWFuIG9ubHlDb25maWd1cmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQkJaWYgKG9ubHlDb25maWd1cmVkKQotCQkJcmVmZXJlbmNlcyA9IHNpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWVsc2UKLQkJCXJlZmVyZW5jZXMgPSBzaXRlLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZmVyZW5jZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCVN0cmluZyBpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJCWlmIChmZWF0dXJlSWQuZXF1YWxzKGlkKSkgewotCQkJCXJlc3VsdC5hZGQoZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJRmVhdHVyZVtdKSByZXN1bHQudG9BcnJheShuZXcgSUZlYXR1cmVbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVbXSBnZXRJbnN0YWxsZWRGZWF0dXJlcyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBnZXRJbnN0YWxsZWRGZWF0dXJlcyhmZWF0dXJlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBvbmx5Q29uZmlndXJlZAotCSAqIEByZXR1cm4gSUZlYXR1cmVbXSB3aXRoIGZlYXR1cmVzIG1hdGNoaW5nIGZlYXR1cmUgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoSUZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBvbmx5Q29uZmlndXJlZCkgewotCQlyZXR1cm4gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIG9ubHlDb25maWd1cmVkKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHZpZAotCSAqIEBwYXJhbSBvbmx5Q29uZmlndXJlZAotCSAqIEByZXR1cm4gSUZlYXR1cmVbXSB3aXRoIGZlYXR1cmVzIG1hdGNoaW5nIGZlYXR1cmUgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQsIGJvb2xlYW4gb25seUNvbmZpZ3VyZWQpIHsKLQkJVmVjdG9yIGZlYXR1cmVzID0gbmV3IFZlY3RvcigpOwotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGlzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCVN0cmluZyBpZCA9IHZpZC5nZXRJZGVudGlmaWVyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGlzaXRlID0gaXNpdGVzW2ldOwotCQkJCUlGZWF0dXJlW10gcmVzdWx0ID0gVXBkYXRlVXRpbHMuc2VhcmNoU2l0ZShpZCwgaXNpdGUsIG9ubHlDb25maWd1cmVkKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgewotCQkJCQlJRmVhdHVyZSBpbnN0YWxsZWRGZWF0dXJlID0gcmVzdWx0W2pdOwotCQkJCQlmZWF0dXJlcy5hZGQoaW5zdGFsbGVkRmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gKElGZWF0dXJlW10pIGZlYXR1cmVzLnRvQXJyYXkobmV3IElGZWF0dXJlW2ZlYXR1cmVzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcGF0Y2gKLQkgKiBAcmV0dXJuIElGZWF0dXJlIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlIGdldFBhdGNoZWRGZWF0dXJlKElGZWF0dXJlIHBhdGNoKSB7Ci0JCUlJbXBvcnRbXSBpbXBvcnRzID0gcGF0Y2guZ2V0SW1wb3J0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07Ci0JCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpIHsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHBhdGNoZWRWaWQgPSBpaW1wb3J0Ci0JCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCS8vIGZlYXR1cmVzIHdpdGggbWF0Y2hpbmcgaWQKLQkJCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gZ2V0SW5zdGFsbGVkRmVhdHVyZXMocGF0Y2hlZFZpZCwgZmFsc2UpOwotCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdHVyZXMubGVuZ3RoOyBmKyspIHsKLQkJCQkJLy8gY2hlY2sgaWYgdmVyc2lvbiBtYXRjaAotCQkJCQlpZiAocGF0Y2hlZFZpZC5lcXVhbHMoZmVhdHVyZXNbZl0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgewotCQkJCQkJcmV0dXJuIGZlYXR1cmVzW2ZdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhdGNoKElGZWF0dXJlIGNhbmRpZGF0ZSkgewotCQlJSW1wb3J0W10gaW1wb3J0cyA9IGNhbmRpZGF0ZS5nZXRJbXBvcnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOwotCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSByZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0Y2goSUZlYXR1cmUgdGFyZ2V0LCBJRmVhdHVyZSBjYW5kaWRhdGUpIHsKLQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSB0YXJnZXQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQlJSW1wb3J0W10gaW1wb3J0cyA9IGNhbmRpZGF0ZS5nZXRJbXBvcnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOwotCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSB7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpdmlkID0gaWltcG9ydC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJaWYgKHZpZC5lcXVhbHMoaXZpZCkpIHsKLQkJCQkJLy8gQmluZ28uCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0QmFja3VwQ29uZmlndXJhdGlvbkZvcihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCVN0cmluZyBrZXkgPSAiQCIgKyB2aWQuZ2V0SWRlbnRpZmllcigpICsgIl8iICsgdmlkLmdldFZlcnNpb24oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gbHNpdGUuZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2ldOwotCQkJCWlmIChjb25maWcuZ2V0TGFiZWwoKS5zdGFydHNXaXRoKGtleSkpCi0JCQkJCXJldHVybiBjb25maWc7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTGljZW5zZShJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlVUkxFbnRyeSBpbmZvID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBsaWNlbnNlVHh0ID0gaW5mby5nZXRBbm5vdGF0aW9uKCk7Ci0JCWlmIChsaWNlbnNlVHh0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBsaWNlbnNlVHh0LnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPcHRpb25hbEZlYXR1cmVzKElGZWF0dXJlUmVmZXJlbmNlIGZyZWYpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBoYXNPcHRpb25hbEZlYXR1cmVzKGZyZWYuZ2V0RmVhdHVyZShudWxsKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPcHRpb25hbEZlYXR1cmVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdHJ5IHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJLy8gc2VlIGlmIGl0IGhhcyBvcHRpb25hbCBjaGlsZHJlbgotCQkJCUlGZWF0dXJlIGNoaWxkID0gaXJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWlmIChoYXNPcHRpb25hbEZlYXR1cmVzKGNoaWxkKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlIGdldExvY2FsRmVhdHVyZSgKLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHJlZlZpZCA9IHJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlpZiAoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKHJlZlZpZCkpCi0JCQkJcmV0dXJuIHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmVkU2l0ZSBnZXRDb25maWdTaXRlKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDb25maWd1cmVkU2l0ZVtdIGNvbmZpZ1NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ1NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IGNvbmZpZ1NpdGVzW2ldOwotCQkJaWYgKHNpdGUuZ2V0U2l0ZSgpLmVxdWFscyhmZWF0dXJlLmdldFNpdGUoKSkpIHsKLQkJCQlyZXR1cm4gc2l0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0RGVmYXVsdFRhcmdldFNpdGUoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nQ2hhbmdlKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0VGFyZ2V0U2l0ZShjb25maWcsIHBlbmRpbmdDaGFuZ2UsIHRydWUpOwotCX0KLQotCXB1YmxpYyAgc3RhdGljIElDb25maWd1cmVkU2l0ZSBnZXREZWZhdWx0VGFyZ2V0U2l0ZSgKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHBlbmRpbmdDaGFuZ2UsCi0JCWJvb2xlYW4gY2hlY2tBZmZpbml0eUZlYXR1cmUpIHsKLQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IHBlbmRpbmdDaGFuZ2UuZ2V0T2xkRmVhdHVyZSgpOwotCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gcGVuZGluZ0NoYW5nZS5nZXRGZWF0dXJlKCk7Ci0JCWlmIChvbGRGZWF0dXJlICE9IG51bGwpIHsKLQkJCS8vIFdlIHNob3VsZCBpbnN0YWxsIGludG8gdGhlIHNhbWUgc2l0ZSBhcwotCQkJLy8gdGhlIG9sZCBmZWF0dXJlCi0JCQl0cnkgewotCQkJCXJldHVybiBnZXRDb25maWdTaXRlKG9sZEZlYXR1cmUsIGNvbmZpZyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2dFeGNlcHRpb24oZSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvLyBUaGlzIGlzIGEgbmV3IGluc3RhbGwuIENoZWNrIGlmIHRoZXJlIGlzIAotCQkvLyBhIGRpc2FibGVkIGZlYXR1cmUgd2l0aCB0aGUgc2FtZSBJRAotCQlTdHJpbmcgbmV3RmVhdHVyZUlEID0KLQkJCW5ld0ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIHNhbWVTaXRlID0gZ2V0U2l0ZVdpdGhGZWF0dXJlKGNvbmZpZywgbmV3RmVhdHVyZUlEKTsKLQkJaWYgKHNhbWVTaXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBzYW1lU2l0ZTsKLQkJfQotCi0JCWlmIChjaGVja0FmZmluaXR5RmVhdHVyZSkgewotCQkJcmV0dXJuIGdldEFmZmluaXR5U2l0ZShjb25maWcsIG5ld0ZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElDb25maWd1cmVkU2l0ZSBnZXRBZmZpbml0eVNpdGUoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlGZWF0dXJlIG5ld0ZlYXR1cmUpIHsKLQkJLy8gY2hlY2sgaWYgdGhlIGFmZmluaXR5IGZlYXR1cmUgaXMgaW5zdGFsbGVkCi0JCVN0cmluZyBhZmZpbml0eUlEID0gbmV3RmVhdHVyZS5nZXRBZmZpbml0eUZlYXR1cmUoKTsKLQkJaWYgKGFmZmluaXR5SUQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGFmZmluaXR5U2l0ZSA9Ci0JCQkJZ2V0U2l0ZVdpdGhGZWF0dXJlKGNvbmZpZywgYWZmaW5pdHlJRCk7Ci0JCQlpZiAoYWZmaW5pdHlTaXRlICE9IG51bGwpCi0JCQkJcmV0dXJuIGFmZmluaXR5U2l0ZTsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHRoaXMgaXMgYSBwYXRjaCwgY29sbG9jYXRlIHdpdGggdGhlIGZlYXR1cmUKLQkJCUlGZWF0dXJlIHBhdGNoZWRGZWF0dXJlID0gZ2V0UGF0Y2hlZEZlYXR1cmUobmV3RmVhdHVyZSk7Ci0JCQlpZiAocGF0Y2hlZEZlYXR1cmUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZ2V0U2l0ZVdpdGhGZWF0dXJlKGNvbmZpZywgcGF0Y2hlZEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0U2l0ZVdpdGhGZWF0dXJlKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlTdHJpbmcgZmVhdHVyZUlEKSB7Ci0JCWlmIChmZWF0dXJlSUQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBzaXRlc1tpXTsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbal07Ci0JCQkJdHJ5IHsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQlpZiAoZmVhdHVyZUlECi0JCQkJCQkuZXF1YWxzKAotCQkJCQkJCWZlYXR1cmUKLQkJCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJCQkuZ2V0SWRlbnRpZmllcigpKSkgewotCQkJCQkJLy8gZm91bmQgaXQKLQkJCQkJCXJldHVybiBzaXRlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0T2xkRmVhdHVyZXMoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlBcnJheUxpc3QgcmVzdWx0KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9Ci0JCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgewotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaW5jbHVkZWRbaV07Ci0KLQkJCUlGZWF0dXJlIGlmZWF0dXJlOwotCi0JCQl0cnkgewotCQkJCWlmZWF0dXJlID0gaXJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGlyZWYuaXNPcHRpb25hbCgpKQotCQkJCQljb250aW51ZTsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJLy8gZmluZCBvdGhlciBmZWF0dXJlcyBhbmQgdW5jb25maWd1cmUKLQkJCVN0cmluZyBpZCA9IGlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJCUlGZWF0dXJlW10gc2FtZUlkcyA9IFVwZGF0ZVV0aWxzLnNlYXJjaFNpdGUoaWQsIHRhcmdldFNpdGUsIHRydWUpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzYW1lSWRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUZlYXR1cmUgc2FtZUlkID0gc2FtZUlkc1tqXTsKLQkJCQkvLyBJZ25vcmUgc2VsZi4KLQkJCQlpZiAoc2FtZUlkLmVxdWFscyhpZmVhdHVyZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXJlc3VsdC5hZGQoc2FtZUlkKTsKLQkJCX0KLQkJCWNvbGxlY3RPbGRGZWF0dXJlcyhpZmVhdHVyZSwgdGFyZ2V0U2l0ZSwgcmVzdWx0KTsKLQkJfQotCX0KLQotLy8KLS8vCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGNyZWF0ZUluc3RhbGxDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0vLwkJdHJ5IHsKLS8vCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLS8vCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9Ci0vLwkJCQlsb2NhbFNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOwotLy8JCQljb25maWcuc2V0TGFiZWwoVXRpbGl0aWVzLmZvcm1hdChjb25maWcuZ2V0Q3JlYXRpb25EYXRlKCkpKTsKLS8vCQkJcmV0dXJuIGNvbmZpZzsKLS8vCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJLy8gTGV0IGNhbGxlcnMgaGFuZGxlIGxvZ2dpbmcKLS8vCQkJLy9sb2dFeGNlcHRpb24oZSk7Ci0vLwkJCXRocm93IGU7Ci0vLwkJfQotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgVXBkYXRlU2VhcmNoUmVxdWVzdCBjcmVhdGVOZXdVcGRhdGVzUmVxdWVzdChJRmVhdHVyZSBbXSBmZWF0dXJlcykgewotCQlVcGRhdGVTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBVcGRhdGVTZWFyY2hTY29wZSgpOwotCQlzY29wZS5zZXRVcGRhdGVNYXBVUkwoVXBkYXRlVXRpbHMuZ2V0VXBkYXRlTWFwVVJMKCkpOwotCQlVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXcgVXBkYXRlc1NlYXJjaENhdGVnb3J5KCk7Ci0JCWlmIChmZWF0dXJlcyE9bnVsbCkKLQkJCWNhdGVnb3J5LnNldEZlYXR1cmVzKGZlYXR1cmVzKTsKLQkJVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0ID0gbmV3IFVwZGF0ZVNlYXJjaFJlcXVlc3QoY2F0ZWdvcnksIHNjb3BlKTsKLQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEVudmlyb25tZW50RmlsdGVyKCkpOwotCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOZXN0ZWRDaGlsZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLCBJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBjc2l0ZXMgIT0gbnVsbCAmJiBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY3NpdGVzW2ldLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyByZWZzICE9IG51bGwgJiYgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUZlYXR1cmUgcGFyZW50ID0gcmVmc1tqXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJCQkJCXBhcmVudC5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOwotCQkJCQkJY2hpbGRyZW4gIT0gbnVsbCAmJiBrIDwgY2hpbGRyZW4ubGVuZ3RoOwotCQkJCQkJaysrKSB7Ci0JCQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNoaWxkcmVuW2tdLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQlpZiAoZmVhdHVyZS5lcXVhbHMoY2hpbGQpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdpbGwgcmV0dXJuIGZhbHNlCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT2Jzb2xldGVQYXRjaGVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJLy8gQ2hlY2sgYWxsIHRoZSBpbmNsdWRlZCBmZWF0dXJlcyB0aGF0Ci0JCS8vIGFyZSB1bmNvbmZpZ3VyZWQsIGFuZCBzZWUgaWYgdGhlaXIgcGF0Y2ggCi0JCS8vIHJlZmVyZW5jZXMgYXJlIGJldHRlciB0aGFuIHRoZSBvcmlnaW5hbC4KLQkJdHJ5IHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07Ci0JCQkJSUZlYXR1cmUgaWZlYXR1cmUgPSBpcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gaWZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQkJCWlmICghY3NpdGUuaXNDb25maWd1cmVkKGlmZWF0dXJlKSkgewotCQkJCQlpZiAoIWlzUGF0Y2hIYXBweShpZmVhdHVyZSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBBbGwgY2hlY2tzIHdlbnQgd2VsbAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0Y2hIYXBweShJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIElmIHRoaXMgaXMgYSBwYXRjaCBhbmQgaXQgaW5jbHVkZXMgCi0JCS8vIGFub3RoZXIgcGF0Y2ggYW5kIHRoZSBpbmNsdWRlZCBwYXRjaAotCQkvLyBpcyBkaXNhYmxlZCBidXQgdGhlIGZlYXR1cmUgaXQgd2FzIGRlY2xhcmVkCi0JCS8vIHRvIHBhdGNoIGlzIG5vdyBuZXdlciAoYW5kIGlzIHByZXN1bWVkIHRvCi0JCS8vIGNvbnRhaW4gdGhlIG5vdyBkaXNhYmxlZCBwYXRjaCksIGFuZAotCQkvLyB0aGUgbmV3ZXIgcGF0Y2hlZCBmZWF0dXJlIGlzIGVuYWJsZWQsCi0JCS8vIGEgJ2xlYXAgb2YgZmFpdGgnIGFzc3VtcHRpb24gY2FuIGJlCi0JCS8vIG1hZGU6Ci0KLQkJLy8gQWx0aG91Z2ggdGhlIGluY2x1ZGVkIHBhdGNoIGlzIGRpc2FibGVkLAotCQkvLyB0aGUgZmVhdHVyZSBpdCB3YXMgZGVzaWduZWQgdG8gcGF0Y2gKLQkJLy8gaXMgbm93IG5ld2VyIGFuZCBtb3N0IGxpa2VseSBjb250YWlucwotCQkvLyB0aGUgZXF1aXZhbGVudCBmaXggYW5kIG1vcmUuIENvbnNlcXVlbnRseSwKLQkJLy8gd2UgY2FuIGNsYWltIHRoYXQgdGhlIHN0YXR1cyBhbmQgdGhlIGVycm9yCi0JCS8vIGljb24gb3ZlcmxheSBhcmUgbWlzbGVhZGluZyBiZWNhdXNlCi0JCS8vIGFsbCB0aGUgcmlnaHQgcGx1Zy1pbnMgYXJlIGNvbmZpZ3VyZWQuCi0JCUlJbXBvcnRbXSBpbXBvcnRzID0gZmVhdHVyZS5nZXRJbXBvcnRzKCk7Ci0JCUlJbXBvcnQgcGF0Y2hSZWZlcmVuY2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07Ci0JCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpIHsKLQkJCQlwYXRjaFJlZmVyZW5jZSA9IGlpbXBvcnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhdGNoUmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgcmVmVmlkID0gcGF0Y2hSZWZlcmVuY2UuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCi0JCS8vIEZpbmQgdGhlIHBhdGNoZWQgZmVhdHVyZSBhbmQgCi0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQlpZiAoY3NpdGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNyZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3JlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNyZWYgPSBjcmVmc1tpXTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgY3ZpZCA9IGNyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJaWYgKGN2aWQuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhyZWZWaWQuZ2V0SWRlbnRpZmllcigpKSkgewotCQkJCS8vIFRoaXMgaXMgdGhlIG9uZS4KLQkJCQlpZiAoY3ZpZC5nZXRWZXJzaW9uKCkuaXNHcmVhdGVyVGhhbihyZWZWaWQuZ2V0VmVyc2lvbigpKSkgewotCQkJCQkvLyBCaW5nbzogd2UgZm91bmQgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZQotCQkJCQkvLyBhbmQgaXRzIHZlcnNpb24gaXMgZ3JlYXRlciAtIAotCQkJCQkvLyB3ZSBjYW4gYXNzdW1lIHRoYXQgaXQgY29udGFpbnMgYmV0dGVyIGNvZGUKLQkJCQkJLy8gdGhhbiB0aGUgcGF0Y2ggdGhhdCByZWZlcmVuY2VkIHRoZQotCQkJCQkvLyBvbGRlciB2ZXJzaW9uLgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldFVwZGF0ZU1hcFVSTCgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIG1hcEZpbGUgPSBwcmVmLmdldFN0cmluZyhVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMKTsKLQkJaWYgKG1hcEZpbGUhPW51bGwgJiYgbWFwRmlsZS5sZW5ndGgoKT4wKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBkZWNvZGVkRmlsZSA9IFVSTERlY29kZXIuZGVjb2RlKG1hcEZpbGUsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBVUkwoZGVjb2RlZEZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQljYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZG93bmxvYWRGZWF0dXJlQ29udGVudCgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykKLQkJdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBvbmx5IGRvd25sb2FkcyBvdXIga25vd24gZmVhdHVyZSB0eXBlcwotCQlpZiAoIShmZWF0dXJlIGluc3RhbmNlb2YgRmVhdHVyZSkpCi0JCQlyZXR1cm47Ci0JCQkKLQkJLy9ERUJVRwotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygKLQkJCQkiRG93bmxvYWRpbmcuLi46IiArIGZlYXR1cmUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlQcm9ncmVzc01vbml0b3IgcG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCQkJcmV0dXJuIHByb2dyZXNzLmlzQ2FuY2VsZWQoKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBJbnN0YWxsTW9uaXRvcgkJCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IgPSBuZXcgSW5zdGFsbE1vbml0b3IocG0pOwotCi0JCS8vIEdldCBzb3VyY2UgZmVhdHVyZSBwcm92aWRlciBhbmQgdmVyaWZpZXIuCi0JCS8vIEluaXRpYWxpemUgdGFyZ2V0IHZhcmlhYmxlcy4KLQkJZmluYWwgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPQotCQkJZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIHRhcmdldFNpdGVQbHVnaW5FbnRyaWVzID0gbnVsbDsKLQotCQkvLyBkZXRlcm1pbmUgbGlzdCBvZiBwbHVnaW5zIHRvIGluc3RhbGwKLQkJLy8gZmluZCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHBsdWdpbiBlbnRyaWVzIGFscmVhZHkgY29udGFpbmVkCi0JCS8vIG9uIHRoZSB0YXJnZXQgc2l0ZSwgYW5kIHBsdWdpbiBlbnRyaWVzIHBhY2thZ2VkIGluIHNvdXJjZSBmZWF0dXJlCi0JCUlQbHVnaW5FbnRyeVtdIHNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0KLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUgPQotCQkJZ2V0U2l0ZVdpdGhGZWF0dXJlKAotCQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCksCi0JCQkJKChGZWF0dXJlKWZlYXR1cmUpLmdldEZlYXR1cmVJZGVudGlmaWVyKCkpOwotCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkgewotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlRoZSBzaXRlIHRvIGluc3RhbGwgaW4gaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXRhcmdldFNpdGVQbHVnaW5FbnRyaWVzID0gbmV3IElQbHVnaW5FbnRyeVswXTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldFNpdGVQbHVnaW5FbnRyaWVzID0gdGFyZ2V0U2l0ZS5nZXRTaXRlKCkuZ2V0UGx1Z2luRW50cmllcygpOwotCQl9Ci0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbnNUb0luc3RhbGwgPQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmRpZmYoCi0JCQkJc291cmNlRmVhdHVyZVBsdWdpbkVudHJpZXMsCi0JCQkJdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMpOwotCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5zVG9JbnN0YWxsID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyaWVzKCk7Ci0KLQkJLy8gRG93bmxvYWQgZmVhdHVyZSBhcmNoaXZlKHMpCi0JCXByb3ZpZGVyLmdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpOwotCQkvLyBEb3dubG9hZCBwbHVnaW4gYXJjaGl2ZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm92aWRlci5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKHBsdWdpbnNUb0luc3RhbGxbaV0sIG1vbml0b3IpOwotCQl9Ci0KLQkJLy8gRG93bmxvYWQgbm9uLXBsdWdpbiBhcmNoaXZlcy4gVmVyaWZpY2F0aW9uIGhhbmRsZWQgYnkgb3B0aW9uYWwgaW5zdGFsbCBoYW5kbGVyCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uUGx1Z2luc1RvSW5zdGFsbC5sZW5ndGg7IGkrKykgewotCQkJcHJvdmlkZXIuZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhub25QbHVnaW5zVG9JbnN0YWxsW2ldLCBtb25pdG9yKTsKLQkJfQotCi0JCS8vIERvd25sb2FkIGNoaWxkIGZlYXR1cmVzCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQotCQkvLyBUT0RPOiBjaGVjayBpZiB0aGV5IGFyZSBvcHRpb25hbCwgYW5kIGlmIHRoZXkgc2hvdWxkIGJlIGluc3RhbGxlZCBbMi4wLjFdCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNoaWxkRmVhdHVyZSA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRGZWF0dXJlICE9IG51bGwpIHsKLQkJCQlkb3dubG9hZEZlYXR1cmVDb250ZW50KGNoaWxkRmVhdHVyZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvQmFzZVNlYXJjaENhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvQmFzZVNlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDM0ZjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL0Jhc2VTZWFyY2hDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVNlYXJjaENhdGVnb3J5IGltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaENhdGVnb3J5IHsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQkKLQlwcm90ZWN0ZWQgQmFzZVNlYXJjaENhdGVnb3J5KFN0cmluZyBpZCkgewotCQlzZXRJZChpZCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCWlmICh0aGlzLmlkPT1udWxsKQotCQkJdGhpcy5pZCA9IGlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9PcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL09wdGlvbmFsRmVhdHVyZVNlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTkyODYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL09wdGlvbmFsRmVhdHVyZVNlYXJjaENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICogU2VhcmNoZXMgZm9yIG9wdGlvbmFsIGZlYXR1cmVzCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeSBleHRlbmRzIEJhc2VTZWFyY2hDYXRlZ29yeSB7Ci0JcHJpdmF0ZSBJVXBkYXRlU2VhcmNoUXVlcnlbXSBxdWVyaWVzOwotCXByaXZhdGUgQXJyYXlMaXN0IHZpZHM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0lEID0KLQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnVuaWZpZWQtc2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBPcHRpb25hbFF1ZXJ5IGltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaFF1ZXJ5IHsKLQkJcHVibGljIHZvaWQgcnVuKAotCQkJSVNpdGUgc2l0ZSwKLQkJCVN0cmluZ1tdIGNhdGVnb3JpZXNUb1NraXAsCi0JCQlJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlciwKLQkJCUlVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCB2aWRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlkcy5zaXplKCk7IGkrKykgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gKFZlcnNpb25lZElkZW50aWZpZXIpIHZpZHMuZ2V0KGkpOwotCQkJCW1vbml0b3Iuc3ViVGFzayh2aWQudG9TdHJpbmcoKSk7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9Ci0JCQkJCWNyZWF0ZUZlYXR1cmUoCi0JCQkJCQlzaXRlLAotCQkJCQkJdmlkLAotCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJaWYgKGZlYXR1cmUhPW51bGwgJiYgZmlsdGVyLmFjY2VwdChmZWF0dXJlKSkKLQkJCQkJY29sbGVjdG9yLmFjY2VwdChmZWF0dXJlKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZSgKLQkJCUlTaXRlIHNpdGUsCi0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdHJ5IHsKLQkJCQlVUkwgc2l0ZVVSTCA9IHNpdGUuZ2V0VVJMKCk7Ci0JCQkJLy9UT0RPIFRoaXMgYXNzdW1wdGlvbiBzdGFuZHMgb25seSBpbiB0aGUgZGVmYXVsdCBjYXNlCi0JCQkJLy8gSW4gZ2VuZXJhbCwgZmVhdHVyZSBhcmNoaXZlIFVSTCBtYXkgYmUgbWFwcGVkIG9uIHNpdGUuCi0JCQkJLy8gQWxzbywgZmVhdHVyZSB0eXBlIG1heSBiZSBzb21ldGhpbmcgZWxzZSAobm90IHBhY2thZ2VkKS4KLQkJCQkvLyBXZSBtYXkgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIChub3Qgb25seSBpZCBhbmQgdmVyc2lvbikKLQkJCQkvLyBpbiBvcmRlciB0byBjcmVhdGUgYSBmZWF0dXJlIG9uIGEgc2l0ZS4KLQkJCQlTdHJpbmcgcmVsYXRpdmUgPSB2aWQudG9TdHJpbmcoKTsKLQkJCQlVUkwgZmVhdHVyZVVSTCA9IG5ldyBVUkwoc2l0ZVVSTCwgImZlYXR1cmVzLyIgKyByZWxhdGl2ZSsiLmphciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gc2l0ZS5jcmVhdGVGZWF0dXJlKAotCQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWZlYXR1cmVVUkwsCi0JCQkJCW1vbml0b3IpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hTaXRlKCkKLQkJICovCi0JCXB1YmxpYyBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBnZXRRdWVyeVNlYXJjaFNpdGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZlcnNpb25lZElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQpIHsKLQkJdmlkcy5hZGQodmlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdmlkcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBPcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeSgpIHsKLQkJc3VwZXIoQ0FURUdPUllfSUQpOwotCQl2aWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlxdWVyaWVzID0gbmV3IElVcGRhdGVTZWFyY2hRdWVyeVtdIHsgbmV3IE9wdGlvbmFsUXVlcnkoKX07Ci0JfQotCi0JcHVibGljIElVcGRhdGVTZWFyY2hRdWVyeVtdIGdldFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBxdWVyaWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9RdWVyeVVwZGF0ZVNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvUXVlcnlVcGRhdGVTaXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjUxYTQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9RdWVyeVVwZGF0ZVNpdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBleHRlbmRzIFVwZGF0ZVNpdGVBZGFwdGVyIGltcGxlbWVudHMgSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgewotCXByaXZhdGUgU3RyaW5nIG1hcHBpbmdJZDsKLQotCXB1YmxpYyBRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyKFN0cmluZyBsYWJlbCwgVVJMIHVybCwgU3RyaW5nIG1hcHBpbmdJZCkgewotCQlzdXBlcihsYWJlbCwgdXJsKTsKLQkJdGhpcy5tYXBwaW5nSWQgPSBtYXBwaW5nSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0lkKCkgewotCQlyZXR1cm4gbWFwcGluZ0lkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvU2l0ZVNlYXJjaENhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvU2l0ZVNlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDg4YzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1NpdGVTZWFyY2hDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotLyoqCi0gKiBTZWFyY2hlcyBhbiB1cGRhdGUgc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2l0ZVNlYXJjaENhdGVnb3J5IGV4dGVuZHMgQmFzZVNlYXJjaENhdGVnb3J5IHsKLQlwcml2YXRlIElVcGRhdGVTZWFyY2hRdWVyeVtdIHF1ZXJpZXM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0lEID0KLQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnVuaWZpZWQtc2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUXVlcnkgaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoUXVlcnkgewotCQlwdWJsaWMgdm9pZCBydW4oCi0JCQlJU2l0ZSBzaXRlLAotCQkJU3RyaW5nW10gY2F0ZWdvcmllc1RvU2tpcCwKLQkJCUlVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyLAotCQkJSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlIYXNoU2V0IGlnbm9yZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJaWYgKGNhdGVnb3JpZXNUb1NraXAgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllc1RvU2tpcC5sZW5ndGg7IGkrKykgewotCQkJCQlpZ25vcmVzLmFkZChjYXRlZ29yaWVzVG9Ta2lwW2ldKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCByZWZzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQkJYm9vbGVhbiBza2lwRmVhdHVyZSA9IGZhbHNlOwotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGlnbm9yZXMuc2l6ZSgpID4gMCkgewotCQkJCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVmLmdldENhdGVnb3JpZXMoKTsKLQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNhdGVnb3JpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IGNhdGVnb3JpZXNbal07Ci0JCQkJCQlpZiAoaWdub3Jlcy5jb250YWlucyhjYXRlZ29yeS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJc2tpcEZlYXR1cmUgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCWlmICghc2tpcEZlYXR1cmUpIHsKLQkJCQkJCWlmIChmaWx0ZXIuYWNjZXB0KHJlZikpIHsKLQkJCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQkJaWYgKGZpbHRlci5hY2NlcHQoZmVhdHVyZSkpCi0JCQkJCQkJCWNvbGxlY3Rvci5hY2NlcHQoZmVhdHVyZSk7Ci0JCQkJCQkJbW9uaXRvci5zdWJUYXNrKGZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hTaXRlKCkKLQkJICovCi0JCXB1YmxpYyBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBnZXRRdWVyeVNlYXJjaFNpdGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTaXRlU2VhcmNoQ2F0ZWdvcnkoKSB7Ci0JCXN1cGVyKENBVEVHT1JZX0lEKTsKLQkJcXVlcmllcyA9IG5ldyBJVXBkYXRlU2VhcmNoUXVlcnlbXSB7IG5ldyBRdWVyeSgpfTsKLQl9Ci0KLQlwdWJsaWMgSVVwZGF0ZVNlYXJjaFF1ZXJ5W10gZ2V0UXVlcmllcygpIHsKLQkJcmV0dXJuIHF1ZXJpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZVBvbGljeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZVBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTJkNjVlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3Mgb3BlbnMgY29ubmVjdGlvbiB0byB0aGUgdXBkYXRlIG1hcCByZXNvdXJjZQotICogYW5kIHBhcnNlcyB0aGUgZmlsZSB0byBsb2FkIHVwZGF0ZSBVUkwgbWFwcGluZ3MuCi0gKiBUaGVzZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZWRpcmVjdCBuZXcgdXBkYXRlcyBzZWFyY2gKLSAqIHdoZW4gdGhlIHJlZGlyZWN0aW9uIHBhdHRlcm4gbWF0Y2hlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlUG9saWN5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BPTElDWSA9ICJ1cGRhdGUtcG9saWN5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVVJMX01BUCA9ICJ1cmwtbWFwIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVVJMID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BBVFRFUk4gPSAicGF0dGVybiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcFNpdGUgaW1wbGVtZW50cyBJVXBkYXRlU2l0ZUFkYXB0ZXIgewotCQlwcml2YXRlIFVSTCB1cmw7Ci0JCXB1YmxpYyBNYXBTaXRlKFVSTCB1cmwpIHsKLQkJCXRoaXMudXJsID0gdXJsOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXBkYXRlTWFwRW50cnkgewotCQlwcml2YXRlIElVcGRhdGVTaXRlQWRhcHRlciBzaXRlOwotCQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuOwotCi0JCXB1YmxpYyBVcGRhdGVNYXBFbnRyeShTdHJpbmcgcGF0dGVybiwgVVJMIHVybCkgewotCQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJCXRoaXMuc2l0ZSA9IG5ldyBNYXBTaXRlKHVybCk7Ci0JCX0KLQkJcHVibGljIElVcGRhdGVTaXRlQWRhcHRlciBnZXRTaXRlKCkgewotCQkJcmV0dXJuIHNpdGU7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgaWQpIHsKLQkJCXJldHVybiBpZC5zdGFydHNXaXRoKHBhdHRlcm4pOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKLQkJCXJldHVybiBwYXR0ZXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZW50cmllczsKLQlwcml2YXRlIElVcGRhdGVTaXRlQWRhcHRlciBkZWZhdWx0U2l0ZTsKLQlwcml2YXRlIGJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZhbGxiYWNrQWxsb3dlZCA9IHRydWU7Ci0KLQlwdWJsaWMgVXBkYXRlUG9saWN5KCkgewotCQllbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoVVJMIG1hcEZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBwb2xpY3lTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJUmVzcG9uc2UgcmVzcG9uc2UgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChtYXBGaWxlKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja0Nvbm5lY3Rpb25SZXN1bHQocmVzcG9uc2UsIG1hcEZpbGUpOwotCQkJcG9saWN5U3RyZWFtID0gcmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0obW9uaXRvcik7Ci0JCQkvLyB0aGUgc3RyZWFtIGNhbiBiZSBudWxsIGlmIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGNvbm5lY3Rpb24KLQkJCWlmIChwb2xpY3lTdHJlYW0gPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCURvY3VtZW50IGRvYyA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UocG9saWN5U3RyZWFtKSk7Ci0KLQkJCXByb2Nlc3NVcGRhdGVQb2xpY3koZG9jKTsKLQkJCWxvYWRlZCA9IHRydWU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCVBvbGljeS5iaW5kKAotCQkJCQkiU2l0ZVVSTEZhY3RvcnkuVW5hYmxlVG9BY2Nlc3NTaXRlU3RyZWFtIiwgLy8kTk9OLU5MUy0xJAotCQkJCQltYXBGaWxlID09IG51bGwgPyAiIiA6IG1hcEZpbGUudG9FeHRlcm5hbEZvcm0oKSksIC8vJE5PTi1OTFMtMSQKLQkJCQlJU2l0ZS5TSVRFX0FDQ0VTU19FWENFUFRJT04sCi0JCQkJZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlQb2xpY3kuYmluZCgiVXBkYXRlUG9saWN5LnBhcnNlUG9saWN5IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkwLAotCQkJCWUpOwotCi0JCX0gY2F0Y2goUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlQb2xpY3kuYmluZCgiVXBkYXRlUG9saWN5LnBhcnNlUG9saWN5IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkwLAotCQkJCWUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHBvbGljeVN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcG9saWN5U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTG9hZGVkKCkgewotCQlyZXR1cm4gbG9hZGVkOwotCX0KLQkKLQkvKgotCSAqIEdpdmVuIHRoZSBmZWF0dXJlIElELCByZXR1cm5zIHRoZSBtYXBwZWQgdXBkYXRlIFVSTCBpZgotCSAqIGZvdW5kIGluIHRoZSBtYXBwaW5ncy4gVGhpcyBVUkwgd2lsbCBiZSB1c2VkIElOU1RFQUQgb2YKLQkgKiB0aGUgdXBkYXRlIFVSTCBlbmNvZGVkIGluIHRoZSBmZWF0dXJlIGl0c2VsZiBkdXJpbmcgdGhlCi0JICogbmV3IHVwZGF0ZSBzZWFyY2guCi0JICogPHA+SW4gY2FzZSBvZiBtdWx0aXBsZSBtYXRjaGVzIChlLmcuIG9yZy5lY2xpcHNlIGFuZCBvcmcuZWNsaXBzZS5wbGF0Zm9ybSkKLQkgKiB0aGUgVVJMIGZvciB0aGUgbG9uZ2VyIHBhdHRlcm4gd2lsbCBiZSBwaWNrZWQgKGkuZS4gb3JnLmVjbGlwc2UucGxhdGZvcm0pLgotCSAqLwotCXB1YmxpYyBJVXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0TWFwcGVkU2l0ZShTdHJpbmcgaWQpIHsKLQkJVXBkYXRlTWFwRW50cnkgbGFzdEVudHJ5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlVcGRhdGVNYXBFbnRyeSBlbnRyeSA9IChVcGRhdGVNYXBFbnRyeSkgZW50cmllcy5nZXQoaSk7Ci0JCQlpZiAoZW50cnkubWF0Y2hlcyhpZCkpIHsKLQkJCQlpZiAobGFzdEVudHJ5ID09IG51bGwpCi0JCQkJCWxhc3RFbnRyeSA9IGVudHJ5OwotCQkJCWVsc2UgewotCQkJCQkvLyBDaG9vc2UgdGhlIG1hdGNoIHdpdGggbG9uZ2VyIHBhdHRlcm4uCi0JCQkJCS8vIEZvciBleGFtcGxlLCBpZiB0d28gbWF0Y2hlcyBhcmUgZm91bmQ6Ci0JCQkJCS8vICdvcmcuZWNsaXBzZScgYW5kICdvcmcuZWNsaXBzZS5wbGF0Zm9ybScsCi0JCQkJCS8vIHBpY2sgJ29yZy5lY2xpcHNlLnBsYXRmb3JtJy4KLQkJCQkJU3RyaW5nIHBhdHRlcm4gPSBlbnRyeS5nZXRQYXR0ZXJuKCk7Ci0JCQkJCVN0cmluZyBsYXN0UGF0dGVybiA9IGxhc3RFbnRyeS5nZXRQYXR0ZXJuKCk7Ci0JCQkJCWlmIChwYXR0ZXJuLmxlbmd0aCgpID4gbGFzdFBhdHRlcm4ubGVuZ3RoKCkpCi0JCQkJCQlsYXN0RW50cnkgPSBlbnRyeTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGxhc3RFbnRyeSAhPSBudWxsKQotCQkJcmV0dXJuIGxhc3RFbnRyeS5nZXRTaXRlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBkZWZhdWx0U2l0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhbGxiYWNrQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbGxiYWNrQWxsb3dlZDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotCQlpZiAoZW50cmllcy5pc0VtcHR5KCkgPT0gZmFsc2UpCi0JCQllbnRyaWVzLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NVcGRhdGVQb2xpY3koRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTm9kZSByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCXJlc2V0KCk7Ci0JCQotCQlpZiAocm9vdC5nZXROb2RlTmFtZSgpLmVxdWFscyhUQUdfUE9MSUNZKT09ZmFsc2UpCi0JCQl0aHJvd0NvcmVFeGNlcHRpb24oIiciK1RBR19QT0xJQ1krUG9saWN5LmJpbmQoIlVwZGF0ZVBvbGljeS5wb2xpY3lFeHBlY3RlZCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCi0JCU5vZGVMaXN0IG5vZGVzID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8bm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyB0YWcgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJaWYgKHRhZy5lcXVhbHMoVEFHX1VSTF9NQVApKQotCQkJCXByb2Nlc3NNYXBOb2RlKGNoaWxkKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc01hcE5vZGUoTm9kZSBub2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwYXR0ZXJuID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVF9QQVRURVJOKTsKLQkJU3RyaW5nIHVybE5hbWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUX1VSTCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKEFUVF9QQVRURVJOLCBwYXR0ZXJuKTsKLQkJYXNzZXJ0Tm90TnVsbChBVFRfVVJMLCB1cmxOYW1lKTsKLQkJCi0JCS8vIGVtcHR5IHVybCBtZWFucyBmZWF0dXJlIGlzIG5vdCB1cGRhdGVhYmxlCi0JCWlmICh1cmxOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlhZGRFbnRyeShwYXR0ZXJuLCBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgZGVjb2RlZFZhbHVlID0gVVJMRGVjb2Rlci5kZWNvZGUodXJsTmFtZSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGRlY29kZWRWYWx1ZSk7Ci0JCQlhZGRFbnRyeShwYXR0ZXJuLCB1cmwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3dDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJVcGRhdGVQb2xpY3kuaW52YWxpZFVSTCIpK3VybE5hbWUsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhc3NlcnROb3ROdWxsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHZhbHVlPT1udWxsKQotCQkJdGhyb3dDb3JlRXhjZXB0aW9uKG5hbWUrUG9saWN5LmJpbmQoIlVwZGF0ZVBvbGljeS5uYW1lTm9OdWxsIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJpYnV0ZShOb2RlIG5vZGUsIFN0cmluZyBuYW1lKSB7Ci0JCU5hbWVkTm9kZU1hcCBhdHRNYXAgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJTm9kZSBhdHQgPSBhdHRNYXAuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQlpZiAoYXR0PT1udWxsKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGF0dC5nZXROb2RlVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRW50cnkoU3RyaW5nIHBhdHRlcm4sIFVSTCB1cmwpIHsKLQkJaWYgKHBhdHRlcm4uZXF1YWxzSWdub3JlQ2FzZSgiKiIpKSAvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0U2l0ZSA9IG5ldyBNYXBTaXRlKHVybCk7Ci0JCWVsc2UKLQkJCWVudHJpZXMuYWRkKG5ldyBVcGRhdGVNYXBFbnRyeShwYXR0ZXJuLCB1cmwpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRocm93Q29yZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZ1bGxNZXNzYWdlID0gUG9saWN5LmJpbmQoIlVwZGF0ZVBvbGljeS5VcGRhdGVQb2xpY3kiKSttZXNzYWdlOyAvLyROT04tTkxTLTEkCi0JCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKGZ1bGxNZXNzYWdlLCAwLCBlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZVNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlU2l0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiNThjMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlU2l0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2l0ZUFkYXB0ZXIgaW1wbGVtZW50cyBJVXBkYXRlU2l0ZUFkYXB0ZXIgewotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgVVJMIHVybDsKLQkKLQlwdWJsaWMgVXBkYXRlU2l0ZUFkYXB0ZXIoU3RyaW5nIGxhYmVsLCBVUkwgdXJsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotLyoKLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTaXRlTWFuYWdlci5nZXRTaXRlKGdldFVSTCgpLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLSovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQlyZXR1cm4gIiIgKyBnZXRVUkwoKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlc1NlYXJjaENhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlc1NlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTdjYmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZXNTZWFyY2hDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZXNTZWFyY2hDYXRlZ29yeSBleHRlbmRzIEJhc2VTZWFyY2hDYXRlZ29yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0lEID0KLQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm5ldy11cGRhdGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUZlYXR1cmUgW10gZmVhdHVyZXM7Ci0KLQljbGFzcyBDYW5kaWRhdGUgewotCQlBcnJheUxpc3QgY2hpbGRyZW47Ci0JCUNhbmRpZGF0ZSBwYXJlbnQ7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZjsKLQkJcHVibGljIENhbmRpZGF0ZShJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJCXRoaXMucmVmID0gcmVmOwotCQl9Ci0JCXB1YmxpYyBDYW5kaWRhdGUoSUZlYXR1cmVSZWZlcmVuY2UgcmVmLCBDYW5kaWRhdGUgcGFyZW50KSB7Ci0JCQl0aGlzKHJlZik7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGQoQ2FuZGlkYXRlIGNoaWxkKSB7Ci0JCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0KLQkJdm9pZCBzZXRQYXJlbnQoQ2FuZGlkYXRlIHBhcmVudCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpIHsKLQkJCXJldHVybiByZWY7Ci0JCX0KLQkJdm9pZCBzZXRSZWZlcmVuY2UoSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlZi5nZXRGZWF0dXJlKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIENhbmRpZGF0ZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCXB1YmxpYyBDYW5kaWRhdGUgZ2V0Um9vdCgpIHsKLQkJCUNhbmRpZGF0ZSByb290ID0gdGhpczsKLQotCQkJd2hpbGUgKHJvb3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJCXJvb3QgPSByb290LmdldFBhcmVudCgpOwotCQkJfQotCQkJcmV0dXJuIHJvb3Q7Ci0JCX0KLQkJcHVibGljIElVUkxFbnRyeSBnZXRVcGRhdGVFbnRyeSgpIHsKLQkJCWludCBsb2NhdGlvbiA9IElVcGRhdGVDb25zdGFudHMuU0VBUkNIX1JPT1Q7Ci0KLQkJCWlmIChyZWYgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKQotCQkJCWxvY2F0aW9uID0KLQkJCQkJKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSByZWYpLmdldFNlYXJjaExvY2F0aW9uKCk7Ci0JCQlpZiAocGFyZW50ID09IG51bGwgfHwgbG9jYXRpb24gPT0gSVVwZGF0ZUNvbnN0YW50cy5TRUFSQ0hfU0VMRikgewotCQkJCXJldHVybiBnZXRGZWF0dXJlKG51bGwpLmdldFVwZGF0ZVNpdGVFbnRyeSgpOwotCQkJfQotCQkJcmV0dXJuIGdldFJvb3QoKS5nZXRVcGRhdGVFbnRyeSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gcmVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBzb3VyY2UpIHsKLQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBDYW5kaWRhdGUpIHsKLQkJCQlyZXR1cm4gdGhpcy5yZWYuZXF1YWxzKCgoQ2FuZGlkYXRlKSBzb3VyY2UpLmdldFJlZmVyZW5jZSgpKTsKLQkJCX0KLQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBJRmVhdHVyZVJlZmVyZW5jZSkgewotCQkJCXJldHVybiB0aGlzLnJlZi5lcXVhbHMoc291cmNlKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUb0ZsYXRMaXN0KEFycmF5TGlzdCBsaXN0LCBib29sZWFuIHVwZGF0YWJsZU9ubHkpIHsKLQkJCS8vIGFkZCBpdHNlbGYKLQkJCWlmICghdXBkYXRhYmxlT25seSB8fCBpc1VwZGF0YWJsZSgpKQotCQkJCWxpc3QuYWRkKHRoaXMpOwotCQkJLy8gYWRkIGNoaWxkcmVuCi0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQkJQ2FuZGlkYXRlIGNoaWxkID0gKENhbmRpZGF0ZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJCQljaGlsZC5hZGRUb0ZsYXRMaXN0KGxpc3QsIHVwZGF0YWJsZU9ubHkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZSgpIHsKLQkJCXJldHVybiAocGFyZW50ID09IG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGl0IHsKLQkJSUZlYXR1cmUgY2FuZGlkYXRlOwotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWY7Ci0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBwYXRjaEZvcjsKLQkJYm9vbGVhbiBwYXRjaDsKLQkJcHVibGljIEhpdChJRmVhdHVyZSBjYW5kaWRhdGUsIElGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQkJdGhpcy5jYW5kaWRhdGUgPSBjYW5kaWRhdGU7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCQlwdWJsaWMgSGl0KElGZWF0dXJlIGNhbmRpZGF0ZSwgSUZlYXR1cmVSZWZlcmVuY2UgcmVmLCBib29sZWFuIHBhdGNoKSB7Ci0JCQl0aGlzKGNhbmRpZGF0ZSwgcmVmKTsKLQkJCXRoaXMucGF0Y2ggPSBwYXRjaDsKLQkJfQotCi0JCXB1YmxpYyBIaXQoSUZlYXR1cmUgY2FuZGlkYXRlLCBJRmVhdHVyZVJlZmVyZW5jZSByZWYsIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBwYXRjaEZvcikgewotCQkJdGhpcyhjYW5kaWRhdGUsIHJlZiwgdHJ1ZSk7Ci0JCQl0aGlzLnBhdGNoRm9yID0gcGF0Y2hGb3I7Ci0JCX0KLQotCQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGdldEpvYigpIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCXJldHVybiBPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkuY3JlYXRlSW5zdGFsbE9wZXJhdGlvbihudWxsLCBmZWF0dXJlLCBudWxsLCBudWxsLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpIHsKLQkJCXJldHVybiBwYXRjaDsKLQkJfQotCQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGdldFBhdGNoZWRKb2IoKSB7Ci0JCQlyZXR1cm4gcGF0Y2hGb3I7Ci0JCX0KLQl9Ci0KLQljbGFzcyBVcGRhdGVRdWVyeSBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hRdWVyeSB7Ci0JCUlGZWF0dXJlIGNhbmRpZGF0ZTsKLQkJSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgYWRhcHRlcjsKLQotCQlwdWJsaWMgVXBkYXRlUXVlcnkoCi0JCQlJRmVhdHVyZSBjYW5kaWRhdGUsCi0JCQlJVVJMRW50cnkgdXBkYXRlRW50cnkpIHsKLQkJCXRoaXMuY2FuZGlkYXRlID0gY2FuZGlkYXRlOwotCQkJaWYgKHVwZGF0ZUVudHJ5ICE9IG51bGwgJiYgdXBkYXRlRW50cnkuZ2V0VVJMKCkgIT0gbnVsbCkKLQkJCQlhZGFwdGVyID0KLQkJCQkJbmV3IFF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIoCi0JCQkJCQlnZXRMYWJlbEZvckVudHJ5KHVwZGF0ZUVudHJ5KSwKLQkJCQkJCXVwZGF0ZUVudHJ5LmdldFVSTCgpLAotCQkJCQkJY2FuZGlkYXRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOwotCQl9Ci0JCXByaXZhdGUgU3RyaW5nIGdldExhYmVsRm9yRW50cnkoSVVSTEVudHJ5IGVudHJ5KSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSBlbnRyeS5nZXRBbm5vdGF0aW9uKCk7Ci0JCQlpZiAobGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwKQotCQkJCWxhYmVsID0gZW50cnkuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCi0JCXB1YmxpYyBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBnZXRRdWVyeVNlYXJjaFNpdGUoKSB7Ci0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gaXNCcm9rZW4oKSB7Ci0JCQl0cnkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0RmVhdHVyZVN0YXR1cyhjYW5kaWRhdGUpOwotCQkJCXJldHVybiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXByaXZhdGUgYm9vbGVhbiBpc01pc3NpbmdPcHRpb25hbENoaWxkcmVuKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCXRyeSB7Ci0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGNoaWxkcmVuW2ldOwotCQkJCQl0cnkgewotCQkJCQkJSUZlYXR1cmUgY2hpbGQgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJCS8vIElmIHdlIGFyZSBoZXJlLCB0aGUgY2hpbGQgaXMgbm90IG1pc3NpbmcuCi0JCQkJCQkvLyBDaGVjayBpdCdzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LgotCQkJCQkJaWYgKGlzTWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4oY2hpbGQpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIE1pc3NpbmcgY2hpbGQuIFJldHVybiB0cnVlIGlmIG9wdGlvbmFsLAotCQkJCQkJLy8gb3RoZXJ3aXNlIGl0IGlzIGEgYnJva2VuIGZlYXR1cmUgdGhhdCB3ZSAKLQkJCQkJCS8vIGRvIG5vdCBjYXJlIGFib3V0LgotCQkJCQkJaWYgKHJlZi5pc09wdGlvbmFsKCkpIHsKLQkJCQkJCQlyZXR1cm4gRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuaGFzT2xkZXJWZXJzaW9uKHJlZik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oCi0JCQlJU2l0ZSBzaXRlLAotCQkJU3RyaW5nW10gY2F0ZWdvcmllc1RvU2tpcCwKLQkJCUlVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyLAotCQkJSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUFycmF5TGlzdCBoaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYm9vbGVhbiBicm9rZW4gPSBpc0Jyb2tlbigpOwotCQkJYm9vbGVhbiBtaXNzaW5nT3B0aW9uYWxDaGlsZHJlbiA9IGZhbHNlOwotCi0JCQkvLyBEb24ndCBib3RoZXIgdG8gY29tcHV0ZSBtaXNzaW5nIG9wdGlvbmFsIGNoaWxkcmVuCi0JCQkvLyBpZiB0aGUgZmVhdHVyZSBpcyBicm9rZW4gLSBhbGwgd2Ugd2FudCBpcyB0byAKLQkJCS8vIHNlZSBpZiB3ZSBzaG91bGQgYWxsb3cgc2FtZS12ZXJzaW9uIHJlLWluc3RhbGwuCi0JCQlpZiAoIWJyb2tlbikKLQkJCQltaXNzaW5nT3B0aW9uYWxDaGlsZHJlbiA9IGlzTWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4oY2FuZGlkYXRlKTsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcmVmcy5sZW5ndGggKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJQXJyYXlMaXN0IHVwZGF0ZUpvYnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKLQkJCQl0cnkgewotCQkJCQlpZiAoaXNOZXdlclZlcnNpb24oY2FuZGlkYXRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSxyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgewotCQkJCQkJSGl0IGggPSBuZXcgSGl0KGNhbmRpZGF0ZSwgcmVmKTsKLQkJCQkJCWhpdHMuYWRkKGgpOwotCQkJCQkJdXBkYXRlSm9icy5hZGQoaC5nZXRKb2IoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBhY2NlcHQgdGhlIHNhbWUgZmVhdHVyZSBpZiB0aGUgaW5zdGFsbGVkCi0JCQkJCQkvLyBmZWF0dXJlIGlzIGJyb2tlbgotCQkJCQkJaWYgKChicm9rZW4gfHwgbWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4pCi0JCQkJCQkJJiYgY2FuZGlkYXRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoCi0JCQkJCQkJCXJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKXsKLQkJCQkJCQloaXRzLmFkZChuZXcgSGl0KGNhbmRpZGF0ZSwgcmVmKSk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBjaGVjayBmb3IgcGF0Y2hlcwotCQkJCQkJCWlmIChpc1BhdGNoKGNhbmRpZGF0ZSwgcmVmKSl7Ci0JCQkJCQkJCWhpdHMuYWRkKG5ldyBIaXQoY2FuZGlkYXRlLCByZWYsIHRydWUpKTsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSl7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkvLyBhY2NlcHQgcGF0Y2hlcyBmb3IgdXBkYXRlZCBmZWF0dXJlcwotCQkJZm9yIChpbnQgbiA9IDA7IG4gPCB1cGRhdGVKb2JzLnNpemUoKTsgbisrKSB7Ci0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHVwZGF0ZUpvYnMKLQkJCQkJCS5nZXQobik7Ci0JCQkJCUlGZWF0dXJlIG5ld0NhbmRpZGF0ZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQkJCQlpZiAoaXNQYXRjaChuZXdDYW5kaWRhdGUsIHJlZikpIHsKLQkJCQkJCQlIaXQgaCA9IG5ldyBIaXQobmV3Q2FuZGlkYXRlLCByZWYsIGpvYik7Ci0JCQkJCQkJaGl0cy5hZGQoaCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQkvL21vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaGl0cy5zaXplKCkgPiAwKSB7Ci0JCQkJY29sbGVjdFZhbGlkSGl0cyhoaXRzLCBmaWx0ZXIsIGNvbGxlY3Rvcik7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY2FuZGlkYXRlczsKLQotCXB1YmxpYyBVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkoKSB7Ci0JCXN1cGVyKENBVEVHT1JZX0lEKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29sbGVjdFZhbGlkSGl0cygKLQkJQXJyYXlMaXN0IGhpdHMsCi0JCUlVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyLAotCQlJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvcikgewotCQlPYmplY3RbXSBhcnJheSA9IGhpdHMudG9BcnJheSgpOwotCQlJRmVhdHVyZSB0b3BIaXQgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGhpdHMuc2l6ZSgpOyBpKyspIHsKLQkJCUhpdCBoaXQgPSAoSGl0KSBoaXRzLmdldChpKTsKLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBoaXQuZ2V0Sm9iKCk7Ci0JCQlpZiAoam9iID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvLyBkbyBub3QgYWNjZXB0IHVwZGF0ZXMgd2l0aG91dCBhIGxpY2Vuc2UKLQkJCWlmICghVXBkYXRlVXRpbHMuaGFzTGljZW5zZShqb2IuZ2V0RmVhdHVyZSgpKSkgewotCQkJCVVwZGF0ZUNvcmUubG9nKGpvYi5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpICsgIjogIiArIFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Ob0xpY2Vuc2VUZXh0IiksIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlTdGF0dXMgc3RhdHVzOwotCQkJaWYoIGhpdC5nZXRQYXRjaGVkSm9iKCk9PW51bGwpewotCQkJCXN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ0luc3RhbGwoam9iLmdldE9sZEZlYXR1cmUoKSwgam9iLmdldEZlYXR1cmUoKSk7Ci0JCQl9ZWxzZXsKLQkJCQlzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdDaGFuZ2VzKG5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXXtoaXQuZ2V0UGF0Y2hlZEpvYigpLCBqb2J9KTsKLQkJCQkJCQotCQkJfQotCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQkJaWYgKGhpdC5pc1BhdGNoKCkpIHsKLQkJCQkJSUZlYXR1cmUgcGF0Y2ggPSBqb2IuZ2V0RmVhdHVyZSgpOwotCQkJCQkvLyBEbyBub3QgYWRkIHRoZSBwYXRjaCBpZiBhbHJlYWR5IGluc3RhbGxlZAotCQkJCQlJRmVhdHVyZVtdIHNhbWVJZCA9IFVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKHBhdGNoLCBmYWxzZSk7Ci0JCQkJCWlmIChzYW1lSWQubGVuZ3RoPT0wKSB7Ci0JCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChwYXRjaCkpCi0JCQkJCQkJY29sbGVjdG9yLmFjY2VwdChwYXRjaCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodG9wSGl0ID09IG51bGwpIHsKLQkJCQkJdG9wSGl0ID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCQkJaWYgKGZpbHRlci5hY2NlcHQodG9wSGl0KSkKLQkJCQkJCWNvbGxlY3Rvci5hY2NlcHQodG9wSGl0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBpc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCWNvbnRyaWJ1dGVDYW5kaWRhdGVzKGlzaXRlc1tpXSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coCi0JCQkJUG9saWN5LmJpbmQoIlVwZGF0ZXNTZWFyY2hDYXRlZ29yeS5lcnJvclNlYXJjaGluZ0ZvclVwZGF0ZXMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVDYW5kaWRhdGVzKElDb25maWd1cmVkU2l0ZSBpc2l0ZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBpc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJQXJyYXlMaXN0IGNhbmRpZGF0ZXNQZXJTaXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQkvLyBEb24ndCB3YXN0ZSB0aW1lIHNlYXJjaGluZyBmb3IgdXBkYXRlcyB0byAKLQkJCS8vIHBhdGNoZXMuCi0JCQl0cnkgewotCQkJCWlmIChVcGRhdGVVdGlscy5pc1BhdGNoKHJlZi5nZXRGZWF0dXJlKG51bGwpKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDYW5kaWRhdGUgYyA9IG5ldyBDYW5kaWRhdGUocmVmKTsKLQkJCWNhbmRpZGF0ZXNQZXJTaXRlLmFkZChjKTsKLQkJfQotCQkvLyBDcmVhdGUgYSB0cmVlIGZyb20gYSBmbGF0IGxpc3QKLQkJYnVpbGRIaWVyYXJjaHkoY2FuZGlkYXRlc1BlclNpdGUpOwotCQkvLyBBZGQgdGhlIHJlbWFpbmluZyByb290IGNhbmRpZGF0ZXMgdG8gCi0JCS8vIHRoZSBnbG9iYWwgbGlzdCBvZiBjYW5kaWRhdGVzLgotCQljYW5kaWRhdGVzLmFkZEFsbChjYW5kaWRhdGVzUGVyU2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSGllcmFyY2h5KEFycmF5TGlzdCBjYW5kaWRhdGVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNhbmRpZGF0ZVtdIGFycmF5ID0KLQkJCShDYW5kaWRhdGVbXSkgY2FuZGlkYXRlcy50b0FycmF5KG5ldyBDYW5kaWRhdGVbY2FuZGlkYXRlcy5zaXplKCldKTsKLQkJLy8gZmlsdGVyIG91dCBpbmNsdWRlZCBmZWF0dXJlcyBzbyB0aGF0IG9ubHkgdG9wLWxldmVsIGZlYXR1cmVzIHJlbWFpbiBvbiB0aGUgbGlzdAotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlDYW5kaWRhdGUgcGFyZW50ID0gYXJyYXlbaV07Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gcGFyZW50LmdldEZlYXR1cmUobnVsbCk7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGluY2x1ZGVkID0KLQkJCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5jbHVkZWQubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBmcmVmID0gaW5jbHVkZWRbal07Ci0JCQkJQ2FuZGlkYXRlIGNoaWxkID0gZmluZENhbmRpZGF0ZShjYW5kaWRhdGVzLCBmcmVmKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQlwYXJlbnQuYWRkKGNoaWxkKTsKLQkJCQkJY2hpbGQuc2V0UmVmZXJlbmNlKGZyZWYpOwotCQkJCQljYW5kaWRhdGVzLnJlbW92ZShjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgQ2FuZGlkYXRlIGZpbmRDYW5kaWRhdGUoQXJyYXlMaXN0IGxpc3QsIElGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUNhbmRpZGF0ZSBjID0gKENhbmRpZGF0ZSkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoYy5yZWYuZXF1YWxzKHJlZikpCi0JCQkJcmV0dXJuIGM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElVcGRhdGVTZWFyY2hRdWVyeVtdIGdldFF1ZXJpZXMoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQkJQXJyYXlMaXN0IGFsbENhbmRpZGF0ZXMgPSBnZXRBbGxDYW5kaWRhdGVzKCk7Ci0KLQkJSVVwZGF0ZVNlYXJjaFF1ZXJ5W10gcXVlcmllcyA9Ci0JCQluZXcgSVVwZGF0ZVNlYXJjaFF1ZXJ5W2FsbENhbmRpZGF0ZXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBxdWVyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDYW5kaWRhdGUgY2FuZGlkYXRlID0gKENhbmRpZGF0ZSkgYWxsQ2FuZGlkYXRlcy5nZXQoaSk7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gY2FuZGlkYXRlLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlJVVJMRW50cnkgdXBkYXRlRW50cnkgPSBjYW5kaWRhdGUuZ2V0VXBkYXRlRW50cnkoKTsKLQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQlxdWVyaWVzW2ldID0gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJcXVlcmllc1tpXSA9IG5ldyBVcGRhdGVRdWVyeShmZWF0dXJlLCB1cGRhdGVFbnRyeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHF1ZXJpZXM7Ci0JfQotCQotLyoqCi0gKiBTZXRzIHRoZSBmZWF0dXJlcyBmb3Igd2hpY2ggbmV3IHVwZGF0ZXMgbmVlZCB0byBiZSBmb3VuZC4gSWYKLSAqIG5vdCBzZXQsIHVwZGF0ZXMgd2lsbCBiZSBzZWFyY2hlZCBmb3IgYWxsIHRoZSBpbnN0YWxsZWQKLSAqIGFuZCBjb25maWd1cmVkIGZlYXR1cmVzLgotICogQHBhcmFtIGZlYXR1cmVzIHRoZSBmZWF0dXJlcyB0byBzZWFyY2ggdXBkYXRlcyBmb3IKLSAqLwkKLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlcyhJRmVhdHVyZSBbXSBmZWF0dXJlcykgewotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCQotLyoqCi0gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZlYXR1cmVzIGZvciB3aGljaCB1cGRhdGVzIG5lZWQgdG8KLSAqIGJlIGZvdW5kLiAKLSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmVhdHVyZXMgb3IgPHNhbXA+bnVsbDwvc2FtcD4gaWYgbm90Ci0gKiBzZXQuCi0gKi8JCi0JcHVibGljIElGZWF0dXJlIFtdIGdldEZlYXR1cmVzKCkgewotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBmdmkKLQkgKiBAcGFyYW0gY3ZpCi0JICogQHJldHVybiBmdmkgPCBjdmkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdlclZlcnNpb24oCi0JCVZlcnNpb25lZElkZW50aWZpZXIgZnZpLAotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGN2aSkgewotCQlpZiAoIWZ2aS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGN2aS5nZXRJZGVudGlmaWVyKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBmdiA9IGZ2aS5nZXRWZXJzaW9uKCk7Ci0JCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGN2ID0gY3ZpLmdldFZlcnNpb24oKTsKLQkJU3RyaW5nIG1vZGUgPSBnZXRVcGRhdGVWZXJzaW9uc01vZGUoKTsKLQkJYm9vbGVhbiBncmVhdGVyID0gY3YuaXNHcmVhdGVyVGhhbihmdik7Ci0JCWlmICghZ3JlYXRlcikKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1vZGUuZXF1YWxzKFVwZGF0ZUNvcmUuRVFVSVZBTEVOVF9WQUxVRSkpCi0JCQlyZXR1cm4gY3YuaXNFcXVpdmFsZW50VG8oZnYpOwotCQllbHNlIGlmIChtb2RlLmVxdWFscyhVcGRhdGVDb3JlLkNPTVBBVElCTEVfVkFMVUUpKQotCQkJcmV0dXJuIGN2LmlzQ29tcGF0aWJsZVdpdGgoZnYpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGF0Y2goSUZlYXR1cmUgY2FuZGlkYXRlLCBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYuaXNQYXRjaCgpID09IGZhbHNlKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJaWYoIFVwZGF0ZVV0aWxzLmlzUGF0Y2goY2FuZGlkYXRlLCBmZWF0dXJlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vIENoZWNrIGlmIHBhdGNoIGlzIGZvciBjaGlsZHJlbgotCQkJdHJ5IHsKLQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPQotCQkJCQljYW5kaWRhdGUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBjcmVmID0gY2hpbGRyZW5baV07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJCWlmIChpc1BhdGNoKGNoaWxkLCByZWYpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRVcGRhdGVWZXJzaW9uc01vZGUoKSB7Ci0JCVByZWZlcmVuY2VzIHN0b3JlID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gc3RvcmUuZ2V0U3RyaW5nKFVwZGF0ZUNvcmUuUF9VUERBVEVfVkVSU0lPTlMpOwotCX0KLS8qCi0gKiBUaGlzIG1ldGhvZCByZWN1cnNpdmVseSB3YWxrcyB0aGUgbGlzdCBvZiBjYW5kaWRhdGVzCi0gKiBidWlsZGluZyB0aGUgZmxhdCB0aGF0IHN0YXJ0cyB3aXRoIHRoZSByb290cyBidXQKLSAqIGFsc28gaW5jbHVkZXMgYWxsIHRoZSBjaGlsZHJlbiB0aGF0IGFyZSB1cGRhdGFibGUKLSAqICh1c2UgJ2luY2x1ZGUnIGNsYXVzZSB3aXRoIGEgbWF0Y2ggdGhhdCBpcyBub3QgJ3BlcmZlY3QnKS4KLSAqLwotCXByaXZhdGUgQXJyYXlMaXN0IGdldEFsbENhbmRpZGF0ZXMoKSB7Ci0JCUFycmF5TGlzdCBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNhbmRpZGF0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUNhbmRpZGF0ZSBjID0gKENhbmRpZGF0ZSljYW5kaWRhdGVzLmdldChpKTsKLQkJCWlmIChpc09uVGhlTGlzdChjKSkKLQkJCQljLmFkZFRvRmxhdExpc3Qoc2VsZWN0ZWQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzT25UaGVMaXN0KENhbmRpZGF0ZSBjKSB7Ci0JCWlmIChmZWF0dXJlcz09bnVsbCkgcmV0dXJuIHRydWU7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkOwotCQl0cnkgewotCQkJdmlkID0gYy5nZXRSZWZlcmVuY2UoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciBmdmlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlpZiAoZnZpZC5lcXVhbHModmlkKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0NlcnRpZmljYXRlUGFpci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvQ2VydGlmaWNhdGVQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZTRlMDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvQ2VydGlmaWNhdGVQYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5OwotIAotIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuKjsKLSAKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENlcnRpZmljYXRlUGFpciB7Ci0JcHJpdmF0ZSBDZXJ0aWZpY2F0ZSByb290OwotCXByaXZhdGUgQ2VydGlmaWNhdGUgaXNzdWVyOwotCQotCQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9vdC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBDZXJ0aWZpY2F0ZQotCSAqLwotCXB1YmxpYyBDZXJ0aWZpY2F0ZSBnZXRSb290KCkgewotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByb290LgotCSAqIEBwYXJhbSByb290IFRoZSByb290IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvb3QoQ2VydGlmaWNhdGUgcm9vdCkgewotCQl0aGlzLnJvb3QgPSByb290OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGlzc3Vlci4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBDZXJ0aWZpY2F0ZQotCSAqLwotCXB1YmxpYyBDZXJ0aWZpY2F0ZSBnZXRJc3N1ZXIoKSB7Ci0JCXJldHVybiBpc3N1ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaXNzdWVyLgotCSAqIEBwYXJhbSBpc3N1ZXIgVGhlIGlzc3VlciB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc3N1ZXIoQ2VydGlmaWNhdGUgaXNzdWVyKSB7Ci0JCXRoaXMuaXNzdWVyID0gaXNzdWVyOwotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkKLQkJaWYgKG9iaj09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgQ2VydGlmaWNhdGVQYWlyKSkgcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHJvb3Q9PW51bGwgfHwgaXNzdWVyPT1udWxsKSByZXR1cm4gZmFsc2U7Ci0JCQotCQlDZXJ0aWZpY2F0ZVBhaXIgcGFpciA9IChDZXJ0aWZpY2F0ZVBhaXIpb2JqOwotCQkKLQkJcmV0dXJuIChyb290LmVxdWFscyhwYWlyLmdldFJvb3QoKSkgJiYgaXNzdWVyLmVxdWFscyhwYWlyLmdldElzc3VlcigpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25SZXN1bHQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjc5OTNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5OwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS4qOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC4qOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuUG9saWN5OwotCi0vKioKLSAqIFJlc3VsdCBvZiB0aGUgc2VydmljZQotICovCi1wdWJsaWMgY2xhc3MgSmFyVmVyaWZpY2F0aW9uUmVzdWx0IGltcGxlbWVudHMgSVZlcmlmaWNhdGlvblJlc3VsdCB7Ci0KLQotCXByaXZhdGUgaW50IHJlc3VsdENvZGU7Ci0JcHJpdmF0ZSBpbnQgdmVyaWZpY2F0aW9uQ29kZTsKLQlwcml2YXRlIEV4Y2VwdGlvbiByZXN1bHRFeGNlcHRpb247Ci0JcHJpdmF0ZSBMaXN0IC8qb2YgQ2VydGlmaWNhdGVzW10gKi8KLQljZXJ0aWZpY2F0ZXM7Ci0JcHJpdmF0ZSBDZXJ0aWZpY2F0ZVBhaXJbXSByb290Q2VydGlmaWNhdGVzOwotCXByaXZhdGUgQ2VydGlmaWNhdGVQYWlyIGZvdW5kQ2VydGlmaWNhdGU7IC8vIGNlcnRpZmljYXRlIGZvdW5kIGluIG9uZSBrZXlzdG9yZQotCQotCXByaXZhdGUgU3RyaW5nIHNpZ25lckluZm87Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyaWZpZXJJbmZvOwotCXByaXZhdGUgQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlOwotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZTsKLQlwcml2YXRlIGJvb2xlYW4gZmVhdHVyZVZlcmlmaWNhdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gYWxyZWFkeVNlZW47Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVzdWx0Q29kZSgpIHsKLQkJcmV0dXJuIHJlc3VsdENvZGU7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRWZXJpZmljYXRpb25FeGNlcHRpb24oKSB7Ci0JCXJldHVybiByZXN1bHRFeGNlcHRpb247Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0Q29kZShpbnQgbmV3UmVzdWx0Q29kZSkgewotCQlyZXN1bHRDb2RlID0gbmV3UmVzdWx0Q29kZTsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRFeGNlcHRpb24oRXhjZXB0aW9uIG5ld1Jlc3VsdEV4Y2VwdGlvbikgewotCQlyZXN1bHRFeGNlcHRpb24gPSBuZXdSZXN1bHRFeGNlcHRpb247Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRWZXJpZmljYXRpb25Db2RlKCkgewotCQlyZXR1cm4gdmVyaWZpY2F0aW9uQ29kZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcmlmaWNhdGlvbkNvZGUoaW50IHZlcmlmaWNhdGlvbkNvZGUpIHsKLQkJdGhpcy52ZXJpZmljYXRpb25Db2RlID0gdmVyaWZpY2F0aW9uQ29kZTsKLQl9Ci0KLQkvKgotCSAqIGFkZHMgYW4gYXJyYXkgb2YgQ2VydGlmaWNhdGVzIHRvIHRoZSBsaXN0Ci0JICogZm9yY2UgcmVjb21wdXRhdGlvbiBvZiByb290IGNlcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDZXJ0aWZpY2F0ZXMoQ2VydGlmaWNhdGVbXSBjZXJ0cykgewotCQlpZiAoY2VydGlmaWNhdGVzID09IG51bGwpCi0JCQljZXJ0aWZpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNlcnRpZmljYXRlcy5hZGQoY2VydHMpOwotCQlyb290Q2VydGlmaWNhdGVzID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygcm9vdCBjZXJ0aWZpY2F0ZXMKLQkgKiBUaGUgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMgd2UgcmVjZWl2ZWQgaXMgYW4gYXJyYXkgb2YgY2VydGlmaWNhdGVzCi0JICogd2UgaGF2ZSB0byBkZXRlcm1pbmUgCi0JICogMSkgaG93IG1hbnkgY2hhaW4gZG8gd2UgaGF2ZSAoYSBjaGFpbiBzdG9wcyB3aGVuIHZlcmlmaWVyIG9mIGEgY2VydCBpcyAKLQkgKiBub3QgdGhlIHNpZ25lciBvZiB0aGUgbmV4dCBjZXJ0IGluIHRoZSBsaXN0IAotCSAqIDIpIGJ1aWxkIGEgY2VydCB3aXRoIHRoZSBsZWFmIHNpZ25lciBhbmQgdGhlIHJvb3QgdmVyaWZpZXIgZm9yIGVhY2ggY2hhaW4KLQkgKi8KLQlwdWJsaWMgQ2VydGlmaWNhdGVQYWlyW10gZ2V0Um9vdENlcnRpZmljYXRlcygpIHsKLQkJaWYgKHJvb3RDZXJ0aWZpY2F0ZXMgPT0gbnVsbCkgewotCQkJcm9vdENlcnRpZmljYXRlcyA9IG5ldyBDZXJ0aWZpY2F0ZVBhaXJbMF07CQkJCi0JCQlMaXN0IHJvb3RDZXJ0aWZpY2F0ZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGNlcnRpZmljYXRlcyAhPSBudWxsICYmIGNlcnRpZmljYXRlcy5zaXplKCkgPiAwKSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGNlcnRpZmljYXRlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCi0JCQkJCUNlcnRpZmljYXRlW10gY2VydHMgPSAoQ2VydGlmaWNhdGVbXSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjZXJ0cyAhPSBudWxsICYmIGNlcnRzLmxlbmd0aCA+IDApIHsKLQotCQkJCQkJQ2VydGlmaWNhdGVQYWlyIHBhaXIgPSBuZXcgQ2VydGlmaWNhdGVQYWlyKCk7Ci0JCQkJCQlwYWlyLnNldElzc3VlcihjZXJ0c1swXSk7Ci0KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2VydHMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQkJCQkJWDUwOUNlcnRpZmljYXRlIHg1MDljZXJ0Um9vdCA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRzW2ldOwotCQkJCQkJCVg1MDlDZXJ0aWZpY2F0ZSB4NTA5Y2VydElzc3VlciA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRzW2krMV07Ci0JCQkJCQkJaWYgKCF4NTA5Y2VydFJvb3QuZ2V0SXNzdWVyRE4oKS5lcXVhbHMoeDUwOWNlcnRJc3N1ZXIuZ2V0U3ViamVjdEROKCkpKSB7Ci0JCQkJCQkJCXBhaXIuc2V0Um9vdCh4NTA5Y2VydFJvb3QpOwotCQkJCQkJCQlpZiAoIXJvb3RDZXJ0aWZpY2F0ZXNMaXN0LmNvbnRhaW5zKHBhaXIpKSB7Ci0JCQkJCQkJCQlyb290Q2VydGlmaWNhdGVzTGlzdC5hZGQocGFpcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcGFpciA9IG5ldyBDZXJ0aWZpY2F0ZVBhaXIoKTsKLQkJCQkJCQkJcGFpci5zZXRJc3N1ZXIoeDUwOWNlcnRJc3N1ZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gYWRkIHRoZSBsYXRlc3Qgb25lCi0JCQkJCQlpZiAocGFpciAhPSBudWxsKSB7Ci0JCQkJCQkJcGFpci5zZXRSb290KGNlcnRzW2NlcnRzLmxlbmd0aCAtIDFdKTsKLQkJCQkJCQlpZiAoIXJvb3RDZXJ0aWZpY2F0ZXNMaXN0LmNvbnRhaW5zKHBhaXIpKSB7Ci0JCQkJCQkJCXJvb3RDZXJ0aWZpY2F0ZXNMaXN0LmFkZChwYWlyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCQotCQkJaWYgKHJvb3RDZXJ0aWZpY2F0ZXNMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlyb290Q2VydGlmaWNhdGVzID0gbmV3IENlcnRpZmljYXRlUGFpcltyb290Q2VydGlmaWNhdGVzTGlzdC5zaXplKCldOwkJCQkKLQkJCQlyb290Q2VydGlmaWNhdGVzTGlzdC50b0FycmF5KHJvb3RDZXJ0aWZpY2F0ZXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290Q2VydGlmaWNhdGVzOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBDZXJ0aWZpY2F0ZVBhaXIgZ2V0Rm91bmRDZXJ0aWZpY2F0ZSgpIHsKLQkJcmV0dXJuIGZvdW5kQ2VydGlmaWNhdGU7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3VuZENlcnRpZmljYXRlKENlcnRpZmljYXRlUGFpciBmb3VuZENlcnRpZmljYXRlKSB7Ci0JCXRoaXMuZm91bmRDZXJ0aWZpY2F0ZSA9IGZvdW5kQ2VydGlmaWNhdGU7Ci0JfQotCi0KLQkvKgotCSAqIEluaXRpYWxpemVzIHRoZSBzaWduZXJJbmZvIGFuZCB0aGUgVmVyaWZpZXJJbmZvIGZyb20gdGhlIENlcnRpZmljYXRlIFBhaXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNlcnRpZmljYXRlcygpewotCQlYNTA5Q2VydGlmaWNhdGUgY2VydFJvb3QgPSBudWxsOwotCQlYNTA5Q2VydGlmaWNhdGUgY2VydElzc3VlciA9IG51bGw7Ci0JCUNlcnRpZmljYXRlUGFpciB0cnVzdGVkQ2VydGlmaWNhdGU7Ci0JCWlmIChnZXRGb3VuZENlcnRpZmljYXRlKCkgPT0gbnVsbCkgewotCQkJQ2VydGlmaWNhdGVQYWlyW10gY2VydHMgPSBnZXRSb290Q2VydGlmaWNhdGVzKCk7Ci0JCQlpZiAoY2VydHMubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuOwotCQkJdHJ1c3RlZENlcnRpZmljYXRlID0gY2VydHNbMF07Ci0JCX0gZWxzZSB7Ci0JCQl0cnVzdGVkQ2VydGlmaWNhdGUgPSBnZXRGb3VuZENlcnRpZmljYXRlKCk7Ci0JCX0KLQkJY2VydFJvb3QgPSAoWDUwOUNlcnRpZmljYXRlKSB0cnVzdGVkQ2VydGlmaWNhdGUuZ2V0Um9vdCgpOwotCQljZXJ0SXNzdWVyID0gKFg1MDlDZXJ0aWZpY2F0ZSkgdHJ1c3RlZENlcnRpZmljYXRlLmdldElzc3VlcigpOwotCi0JCVN0cmluZ0J1ZmZlciBzdHJiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzdHJiLmFwcGVuZChpc3N1ZXJTdHJpbmcoY2VydElzc3Vlci5nZXRTdWJqZWN0RE4oKSkpOwotCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCXN0cmIuYXBwZW5kKFBvbGljeS5iaW5kKCJKYXJWZXJpZmljYXRpb25SZXN1bHQuVmFsaWRCZXR3ZWVuIiwgZGF0ZVN0cmluZyhjZXJ0SXNzdWVyLmdldE5vdEJlZm9yZSgpKSwgZGF0ZVN0cmluZyhjZXJ0SXNzdWVyLmdldE5vdEFmdGVyKCkpKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3RyYi5hcHBlbmQoY2hlY2tWYWxpZGl0eShjZXJ0SXNzdWVyKSk7Ci0JCXNpZ25lckluZm8gPSBzdHJiLnRvU3RyaW5nKCk7Ci0JCWlmIChjZXJ0SXNzdWVyICE9IG51bGwgJiYgIWNlcnRJc3N1ZXIuZXF1YWxzKGNlcnRSb290KSkgewotCQkJc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsJCi0JCQlzdHJiLmFwcGVuZChpc3N1ZXJTdHJpbmcoY2VydElzc3Vlci5nZXRJc3N1ZXJETigpKSk7Ci0JCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlzdHJiLmFwcGVuZChQb2xpY3kuYmluZCgiSmFyVmVyaWZpY2F0aW9uUmVzdWx0LlZhbGlkQmV0d2VlbiIsIGRhdGVTdHJpbmcoY2VydFJvb3QuZ2V0Tm90QmVmb3JlKCkpLCBkYXRlU3RyaW5nKGNlcnRSb290LmdldE5vdEFmdGVyKCkpKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlzdHJiLmFwcGVuZChjaGVja1ZhbGlkaXR5KGNlcnRSb290KSk7Ci0JCQl2ZXJpZmllckluZm8gPSBzdHJiLnRvU3RyaW5nKCk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogUmV0dXJucyBhIFN0cmluZyB0byBzaG93IGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyB2YWxpZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNoZWNrVmFsaWRpdHkoWDUwOUNlcnRpZmljYXRlIGNlcnQpIHsKLQotCQl0cnkgewotCQkJY2VydC5jaGVja1ZhbGlkaXR5KCk7Ci0JCX0gY2F0Y2ggKENlcnRpZmljYXRlRXhwaXJlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gKCJcclxuIiArIFBvbGljeS5iaW5kKCJKYXJWZXJpZmljYXRpb25SZXN1bHQuRXhwaXJlZENlcnRpZmljYXRlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCX0gY2F0Y2ggKENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICgiXHJcbiIgKyBQb2xpY3kuYmluZCgiSmFyVmVyaWZpY2F0aW9uUmVzdWx0LkNlcnRpZmljYXRlTm90WWV0VmFsaWQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJfQotCQlyZXR1cm4gKCJcclxuIiArIFBvbGljeS5iaW5kKCJKYXJWZXJpZmljYXRpb25SZXN1bHQuQ2VydGlmaWNhdGVWYWxpZCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBTdHJpbmcgZnJvbSBhIFg1MG5hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBpc3N1ZXJTdHJpbmcoUHJpbmNpcGFsIHByaW5jaXBhbCkgewotLy8gMTk5MDIKLS8vCQl0cnkgewotLy8JCQlpZiAocHJpbmNpcGFsIGluc3RhbmNlb2YgWDUwME5hbWUpIHsKLS8vCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCQlYNTAwTmFtZSBuYW1lID0gKFg1MDBOYW1lKSBwcmluY2lwYWw7Ci0vLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldEROUXVhbGlmaWVyKCkgIT0gbnVsbCkgPyBuYW1lLmdldEROUXVhbGlmaWVyKCkgKyAiLCAiIDogIiIpOwotLy8JCQkJYnVmLmFwcGVuZChuYW1lLmdldENvbW1vbk5hbWUoKSk7Ci0vLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldE9yZ2FuaXphdGlvbmFsVW5pdCgpICE9IG51bGwpID8gIiwgIiArIG5hbWUuZ2V0T3JnYW5pemF0aW9uYWxVbml0KCkgOiAiIik7Ci0vLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldE9yZ2FuaXphdGlvbigpICE9IG51bGwpID8gIiwgIiArIG5hbWUuZ2V0T3JnYW5pemF0aW9uKCkgOiAiIik7Ci0vLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldExvY2FsaXR5KCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRMb2NhbGl0eSgpIDogIiIpOwotLy8JCQkJYnVmLmFwcGVuZCgobmFtZS5nZXRDb3VudHJ5KCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRDb3VudHJ5KCkgOiAiIik7Ci0vLwkJCQlyZXR1cm4gbmV3IFN0cmluZyhidWYpOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciBwYXJzaW5nIFg1MDAgQ2VydGlmaWNhdGUiLGUpOwotLy8JCX0KLQkJcmV0dXJuIHByaW5jaXBhbC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGF0ZVN0cmluZyhEYXRlIGRhdGUpIHsKLQkJcmV0dXJuIERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KGRhdGUpOwotCX0KLQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25lckluZm8oKSB7Ci0JCWlmIChzaWduZXJJbmZvPT1udWxsKSBpbml0aWFsaXplQ2VydGlmaWNhdGVzKCk7Ci0JCXJldHVybiBzaWduZXJJbmZvOwotCX0KLQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcmlmaWVySW5mbygpIHsKLQkJaWYgKHNpZ25lckluZm89PW51bGwpIGluaXRpYWxpemVDZXJ0aWZpY2F0ZXMoKTsJCQotCQlyZXR1cm4gdmVyaWZpZXJJbmZvOwotCX0KLQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRDb250ZW50UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gY29udGVudFJlZmVyZW5jZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRSZWZlcmVuY2UoQ29udGVudFJlZmVyZW5jZSByZWYpIHsKLQkJdGhpcy5jb250ZW50UmVmZXJlbmNlID0gcmVmOwotCX0KLQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gZmVhdHVyZVZlcmlmaWNhdGlvbjsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpc0ZlYXR1cmVWZXJpZmljYXRpb24oYm9vbGVhbiBmZWF0dXJlVmVyaWZpY2F0aW9uKSB7Ci0JCXRoaXMuZmVhdHVyZVZlcmlmaWNhdGlvbiA9IGZlYXR1cmVWZXJpZmljYXRpb247Ci0JfQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFscmVhZHlTZWVuKCkgewotCQlyZXR1cm4gYWxyZWFkeVNlZW47Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbHJlYWR5U2Vlbihib29sZWFuIHNlZW4pIHsKLQkJcmV0dXJuIHRoaXMuYWxyZWFkeVNlZW4gPSBzZWVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0phclZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3N2RhN2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lio7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Lio7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuUG9saWN5OwotCi0vKioKLSAqIFRoZSBKYXJWZXJpZmllciB3aWxsIGNoZWNrIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIEpBUi4KLSAqIElmIHRoZSBKYXIgaXMgc2lnbmVkIGFuZCB0aGUgaW50ZWdyaXR5IGlzIHZhbGlkYXRlZCwKLSAqIGl0IHdpbGwgY2hlY2sgaWYgb25lIG9mIHRoZSBjZXJ0aWZpY2F0ZSBvZiBlYWNoIGZpbGUKLSAqIGlzIGluIG9uZSBvZiB0aGUga2V5c3RvcmUuCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBKYXJWZXJpZmllciBleHRlbmRzIFZlcmlmaWVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVCA9ICJNRVRBLUlORiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSmFyVmVyaWZpY2F0aW9uUmVzdWx0IHJlc3VsdDsKLQlwcml2YXRlIExpc3QgLypvZiBDZXJ0aWZpY2F0ZVBhaXIqLwotCXRydXN0ZWRDZXJ0aWZpY2F0ZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGFjY2VwdFVuc2lnbmVkRmlsZXM7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIEtleVN0b3JlICovCi0JbGlzdE9mS2V5c3RvcmVzOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByaXZhdGUgRmlsZSBqYXJGaWxlOwotCi0JLyoKLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEphclZlcmlmaWVyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHRoZSBrZXlzdG9yZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEtleVN0b3JlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGxpc3RPZktleXN0b3JlcyA9PSBudWxsKSB7Ci0JCQlsaXN0T2ZLZXlzdG9yZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQkJS2V5U3RvcmVzIGxpc3RPZktleXN0b3JlSGFuZGxlcyA9IG5ldyBLZXlTdG9yZXMoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCUtleVN0b3JlIGtleXN0b3JlID0gbnVsbDsKLQkJCUtleXN0b3JlSGFuZGxlIGhhbmRsZSA9IG51bGw7Ci0JCQl3aGlsZSAobGlzdE9mS2V5c3RvcmVIYW5kbGVzLmhhc05leHQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWhhbmRsZSA9IGxpc3RPZktleXN0b3JlSGFuZGxlcy5uZXh0KCk7Ci0JCQkJCWluID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQoaGFuZGxlLmdldExvY2F0aW9uKCkpLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlrZXlzdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKGhhbmRsZS5nZXRUeXBlKCkpOwotCQkJCQkJa2V5c3RvcmUubG9hZChpbiwgbnVsbCk7IC8vIG5vIHBhc3N3b3JkCi0JCQkJCX0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSmFyVmVyaWZpZXIuVW5hYmxlVG9GaW5kRW5jcnlwdGlvbiIsIGhhbmRsZS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCkpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSmFyVmVyaWZpZXIuVW5hYmxlVG9Mb2FkQ2VydGlmaWNhdGUiLCBoYW5kbGUuZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoS2V5U3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkphclZlcmlmaWVyLlVuYWJsZVRvRmluZFByb3ZpZGVyRm9yS2V5c3RvcmUiLCBoYW5kbGUuZ2V0VHlwZSgpKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfSAvLyBub3RoaW5nCi0JCQkJCQl9Ci0JCQkJCX0gLy8gdHJ5IGxvYWRpbmcgYSBrZXlTdG9yZQotCi0JCQkJCS8vIGtleXN0b3JlIHdhcyBsb2FkZWQKLQkJCQkJbGlzdE9mS2V5c3RvcmVzLmFkZChrZXlzdG9yZSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3RoaW5nLi4uIGlmIHRoZSBrZXlzdG9yZSBkb2Vzbid0IGV4aXN0LCBjb250aW51ZQkKLQkJCQl9Ci0KLQkJCX0gLy8gd2hpbGUgYWxsIGtleSBzdG9yZXMKLQotCQl9Ci0KLQkJcmV0dXJuIGxpc3RPZktleXN0b3JlczsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlyZXN1bHQgPSBudWxsOwotCQl0cnVzdGVkQ2VydGlmaWNhdGVzID0gbnVsbDsKLQkJYWNjZXB0VW5zaWduZWRGaWxlcyA9IGZhbHNlOwotCQlsaXN0T2ZLZXlzdG9yZXMgPSBudWxsOwotCX0KLQotCS8qCi0JICogaW5pdAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KElGZWF0dXJlIGZlYXR1cmUsIENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlqYXJGaWxlID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRSZWYgaW5zdGFuY2VvZiBKYXJDb250ZW50UmVmZXJlbmNlKSB7Ci0JCQlKYXJDb250ZW50UmVmZXJlbmNlIGphclJlZmVyZW5jZSA9IChKYXJDb250ZW50UmVmZXJlbmNlKSBjb250ZW50UmVmOwotCQkJdHJ5IHsKLQkJCQlqYXJGaWxlID0gamFyUmVmZXJlbmNlLmFzRmlsZSgpOwotCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKQotCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJBdHRlbXB0aW5nIHRvIHJlYWQgSkFSIGZpbGU6IitqYXJGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkJLy8gIyBvZiBlbnRyaWVzCi0JCQkJaWYgKCFqYXJGaWxlLmV4aXN0cygpKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLQkJCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGphckZpbGUpOwotCQkJCWlmIChqYXIgIT1udWxsKXsKLQkJCQkJdHJ5IHsKLQkJCQkJCWphci5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gdW5jaGVja2VkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSl7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkphclZlcmlmaWVyLkludmFsaWRKYXIiLCBqYXJSZWZlcmVuY2UudG9TdHJpbmcoKSksIGUpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJKYXJWZXJpZmllci5VbmFibGVUb0FjY2Vzc0phciIsIGphclJlZmVyZW5jZS50b1N0cmluZygpKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJlc3VsdCA9IG5ldyBKYXJWZXJpZmljYXRpb25SZXN1bHQoKTsKLQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SKTsKLQkJcmVzdWx0LnNldFJlc3VsdEV4Y2VwdGlvbihudWxsKTsKLQkJcmVzdWx0LnNldEZlYXR1cmUoZmVhdHVyZSk7Ci0JCXJlc3VsdC5zZXRDb250ZW50UmVmZXJlbmNlKGNvbnRlbnRSZWYpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIG9uZSBvZiB0aGUgY2VydGlmaWNhdGUgZXhpc3RzIGluIHRoZSBrZXlzdG9yZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleGlzdHNJbktleXN0b3JlKENlcnRpZmljYXRlIGNlcnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUxpc3Qga2V5U3RvcmVzID0gZ2V0S2V5U3RvcmVzKCk7Ci0JCQlpZiAoIWtleVN0b3Jlcy5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvciBsaXN0T2ZLZXlzdG9yZXMgPSBrZXlTdG9yZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAobGlzdE9mS2V5c3RvcmVzLmhhc05leHQoKSkgewotCQkJCQlLZXlTdG9yZSBrZXlzdG9yZSA9IChLZXlTdG9yZSkgbGlzdE9mS2V5c3RvcmVzLm5leHQoKTsKLQotCQkJCQlpZiAoa2V5c3RvcmUuZ2V0Q2VydGlmaWNhdGVBbGlhcyhjZXJ0KSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoS2V5U3RvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkphclZlcmlmaWVyLktleVN0b3JlTm90TG9hZGVkIiksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBMaXN0IHJlYWRKYXJGaWxlKEphckZpbGUgamFyRmlsZSwgU3RyaW5nIGlkZW50aWZpZXIpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKLQkJRW51bWVyYXRpb24gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOwotCQlKYXJFbnRyeSBjdXJyZW50RW50cnkgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnNldFRhc2tOYW1lKFBvbGljeS5iaW5kKCJKYXJWZXJpZmllci5WZXJpZnkiLCBpZGVudGlmaWVyID09IG51bGwgPyBqYXJGaWxlLmdldE5hbWUoKTogaWRlbnRpZmllcikpOyAvLyROT04tTkxTLTEkIAotCi0JCXRyeSB7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCWN1cnJlbnRFbnRyeSA9IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCWxpc3QuYWRkKGN1cnJlbnRFbnRyeSk7Ci0JCQkJaW4gPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKGN1cnJlbnRFbnRyeSk7Ci0JCQkJd2hpbGUgKChpbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCkpICE9IC0xKSB7Ci0JCQkJCS8vIFNlY3VyaXR5IGVycm9yIHRocm93biBpZiB0ZW1wZXJlZAotCQkJCX0KLQkJCQlpZiAoaW4hPW51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVU5LTk9XTl9FUlJPUik7Ci0JCQlyZXN1bHQuc2V0UmVzdWx0RXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gbmV3TW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBuZXdNb25pdG9yKSB7Ci0JCW1vbml0b3IgPSBuZXdNb25pdG9yOwotCX0KLQotCS8qCi0JICogQHNlZSBJVmVyaWZpZXIjdmVyaWZ5KElGZWF0dXJlLENvbnRlbnRSZWZlcmVuY2UsYm9vbGVhbiwgSW5zdGFsbE1vbml0b3IpCi0JICovCi0JcHVibGljIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZ5KAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlDb250ZW50UmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJYm9vbGVhbiBpc0ZlYXR1cmVWZXJpZmljYXRpb24sCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCS8vIGlmIHBhcmVudCBrbm93cyBob3cgdG8gdmVyaWZ5LCBhc2sgdGhlIHBhcmVudCBmaXJzdAotCQlpZiAoZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJSVZlcmlmaWNhdGlvblJlc3VsdCB2ciA9Ci0JCQkJZ2V0UGFyZW50KCkudmVyaWZ5KGZlYXR1cmUsIHJlZmVyZW5jZSwgaXNGZWF0dXJlVmVyaWZpY2F0aW9uLCBtb25pdG9yKTsKLQkJCWlmICh2ci5nZXRWZXJpZmljYXRpb25Db2RlKCkgIT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1VOUkVDT0dOSVpFRCkKLQkJCQlyZXR1cm4gdnI7Ci0JCX0KLQotCQkvLyB0aGUgcGFyZW50IGNvdWxkbid0IHZlcmlmeQotCQlzZXRNb25pdG9yKG1vbml0b3IpOwotCQlpbml0KGZlYXR1cmUsIHJlZmVyZW5jZSk7Ci0JCXJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oaXNGZWF0dXJlVmVyaWZpY2F0aW9uKTsKLQotCQlpZiAoamFyRmlsZSE9bnVsbCkgewotCQkJCXJlc3VsdCA9IHZlcmlmeShqYXJGaWxlLmdldEFic29sdXRlUGF0aCgpLCByZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9VTlJFQ09HTklaRUQpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgSmFyVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmeShTdHJpbmcgZmlsZSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQotCQl0cnkgewotCi0JCQkvLyB2ZXJpZnkgaW50ZWdyaXR5Ci0JCQl2ZXJpZnlJbnRlZ3JpdHkoZmlsZSwgaWRlbnRpZmllcik7Ci0KLQkJCS8vIGRvIG5vdCBjbG9zZSBpbnB1dCBzdHJlYW0KLQkJCS8vIGFzIHZlcmlmeUludGVncml0eSBhbHJlYWR5IGRpZCBpdAotCi0JCQkvL2lmIHVzZXIgYWxyZWFkeSBzYWlkIHllcwotCQkJcmVzdWx0LmFscmVhZHlTZWVuKGFscmVhZHlWYWxpZGF0ZWQoKSk7Ci0KLQkJCS8vIHZlcmlmeSBzb3VyY2UgY2VydGlmaWNhdGUKLQkJCWlmIChyZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCi0JCQkJPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1NJR05FRF9VTlJFQ09HTklaRUQpIHsKLQkJCQl2ZXJpZnlBdXRoZW50aWNhdGlvbigpOwotCQkJfQotCi0JCQkvLyBzYXZlIHRoZSBmYWN0IHRoZSBmaWxlIGlzIG5vdCBzaWduZWQsIHNvIHRoZSB1c2VyIHdpbGwgbm90IGJlIHByb21wdGVkIGFnYWluIAotCQkJaWYgKHJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkKLQkJCQk9PSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfTk9UX1NJR05FRCkgewotCQkJCWFjY2VwdFVuc2lnbmVkRmlsZXMgPSB0cnVlOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IpOwotCQkJcmVzdWx0LnNldFJlc3VsdEV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5WRVJJRklDQVRJT05fQ0FOQ0VMTEVEKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBWZXJpZmllcyB0aGF0IGVhY2ggZmlsZSBoYXMgYXQgbGVhc3Qgb25lIGNlcnRpZmljYXRlCi0JICogdmFsaWQgaW4gdGhlIGtleXN0b3JlCi0JICoKLQkgKiBBdCBsZWFzdCBvbmUgY2VydGlmaWNhdGUgZnJvbSBlYWNoIENlcnRpZmljYXRlIEFycmF5Ci0JICogb2YgdGhlIEphciBmaWxlIG11c3QgYmUgZm91bmQgaW4gdGhlIGtub3duIENlcnRpZmljYXRlcwotCSAqLwotCXByaXZhdGUgdm9pZCB2ZXJpZnlBdXRoZW50aWNhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlDZXJ0aWZpY2F0ZVBhaXJbXSBlbnRyaWVzID0gcmVzdWx0LmdldFJvb3RDZXJ0aWZpY2F0ZXMoKTsKLQkJYm9vbGVhbiBjZXJ0aWZpY2F0ZUZvdW5kID0gZmFsc2U7Ci0KLQkJLy8gSWYgYWxsIHRoZSBjZXJ0aWZpY2F0ZSBvZiBhbiBlbnRyeSBhcmUKLQkJLy8gbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIGtub3duIGNlcnRpZmNhdGUKLQkJLy8gdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB0cnVzdGVkIGJ5IGFueSBrZXlzdG9yZS4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZXJ0aWZpY2F0ZUZvdW5kID0gZXhpc3RzSW5LZXlzdG9yZShlbnRyaWVzW2ldLmdldFJvb3QoKSk7Ci0JCQlpZiAoY2VydGlmaWNhdGVGb3VuZCkgewotCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfUkVDT0dOSVpFRCk7Ci0JCQkJcmVzdWx0LnNldEZvdW5kQ2VydGlmaWNhdGUoZW50cmllc1tpXSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBWZXJpZmllcyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBKQVIKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SW50ZWdyaXR5KFN0cmluZyBmaWxlLCBTdHJpbmcgaWRlbnRpZmllcikgewotCi0JCUphckZpbGUgamFyRmlsZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCS8vIElmIHRoZSBKQVIgaXMgc2lnbmVkIGFuZCBub3QgdmFsaWQKLQkJCS8vIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCi0JCQkvLyB3aGlsZSByZWFkaW5nIGl0Ci0JCQlqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSwgdHJ1ZSk7Ci0JCQlMaXN0IGZpbGVzSW5KYXIgPSByZWFkSmFyRmlsZShqYXJGaWxlLCBpZGVudGlmaWVyKTsKLQotCQkJLy8geW91IGhhdmUgdG8gcmVhZCBhbGwgdGhlIGZpbGVzIG9uY2UKLQkJCS8vIGJlZm9yZSBnZXR0aW5nIHRoZSBjZXJ0aWZpY2F0ZXMgCi0JCQlpZiAoamFyRmlsZS5nZXRNYW5pZmVzdCgpICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gZmlsZXNJbkphci5pdGVyYXRvcigpOwotCQkJCWJvb2xlYW4gY2VydGlmaWNhdGVGb3VuZCA9IGZhbHNlOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlKYXJFbnRyeSBjdXJyZW50SmFyRW50cnkgPSAoSmFyRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlDZXJ0aWZpY2F0ZVtdIGNlcnRzID0gY3VycmVudEphckVudHJ5LmdldENlcnRpZmljYXRlcygpOwotCQkJCQlpZiAoKGNlcnRzICE9IG51bGwpICYmIChjZXJ0cy5sZW5ndGggIT0gMCkpIHsKLQkJCQkJCWNlcnRpZmljYXRlRm91bmQgPSB0cnVlOwotCQkJCQkJcmVzdWx0LmFkZENlcnRpZmljYXRlcyhjZXJ0cyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgamFyRW50cnlOYW1lID0gY3VycmVudEphckVudHJ5LmdldE5hbWUoKTsKLQkJCQkJCWlmICghamFyRW50cnlOYW1lLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChNQU5JRkVTVCkKLQkJCQkJCQkmJiAhY3VycmVudEphckVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCQkvLyBpZiB0aGUgamFyRW50cnkgaXMgbm90IGluIE1BTklGRVNULCBjb25zaWRlciB0aGUgd2hvbGUgZmlsZSB1bnNpZ25lZAkJCQkJCQkKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGNlcnRpZmljYXRlRm91bmQpCi0JCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfVU5SRUNPR05JWkVEKTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJKYXJWZXJpZmllci5JbnZhbGlkRmlsZSIsIGZpbGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24oZSk7Ci0JCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX05PVF9TSUdORUQpOwotCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLGUpOwotCQkJfQotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBKYXIgZmlsZSBpcyBzaWduZWQKLQkJCS8vIGJ1dCBjb250ZW50IGhhcyBjaGFuZ2VkIHNpbmNlIHNpZ25lZAotCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX0NPUlJVUFRFRCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVkVSSUZJQ0FUSU9OX0NBTkNFTExFRCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IpOwotCQkJcmVzdWx0LnNldFJlc3VsdEV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChqYXJGaWxlIT1udWxsKXsKLQkJCQl0cnkge2phckZpbGUuY2xvc2UoKTt9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXt9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlWYWxpZGF0ZWQoKSB7Ci0KLQkJaWYgKHJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkgPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX05PVF9TSUdORUQpCi0JCQlyZXR1cm4gKGFjY2VwdFVuc2lnbmVkRmlsZXMpOwotCi0JCWlmIChnZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlciA9IGdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKS5pdGVyYXRvcigpOwotCQkJQ2VydGlmaWNhdGVQYWlyW10gamFyUGFpcnMgPSByZXN1bHQuZ2V0Um9vdENlcnRpZmljYXRlcygpOwotCi0JCQkvLyBjaGVjayBpZiB0aGlzIGlzIG5vdCBhIHVzZXIgYWNjZXB0ZWQgY2VydGlmaWNhdGUgZm9yIHRoaXMgZmVhdHVyZQkKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNlcnRpZmljYXRlUGFpciB0cnVzdGVkQ2VydGlmaWNhdGUgPSAoQ2VydGlmaWNhdGVQYWlyKSBpdGVyLm5leHQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGphclBhaXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh0cnVzdGVkQ2VydGlmaWNhdGUuZXF1YWxzKGphclBhaXJzW2ldKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGlmIGNlcnRpZmljYXRlIHBhaXIgbm90IGZvdW5kIGluIHRydXN0ZWQgYWRkIGl0IGZvciBuZXh0IHRpbWUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamFyUGFpcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhZGRUcnVzdGVkQ2VydGlmaWNhdGUoamFyUGFpcnNbaV0pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRydXN0ZWRDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZVBhaXIgcGFpcikgewotCQlpZiAodHJ1c3RlZENlcnRpZmljYXRlcyA9PSBudWxsKQotCQkJdHJ1c3RlZENlcnRpZmljYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHBhaXIgIT0gbnVsbCkKLQkJCXRydXN0ZWRDZXJ0aWZpY2F0ZXMuYWRkKHBhaXIpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKSB7Ci0JCWlmICh0cnVzdGVkQ2VydGlmaWNhdGVzID09IG51bGwpCi0JCQl0cnVzdGVkQ2VydGlmaWNhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gdHJ1c3RlZENlcnRpZmljYXRlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWZXJpZmllciNzZXRQYXJlbnQoSVZlcmlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIpIHsKLQkJc3VwZXIuc2V0UGFyZW50KHBhcmVudFZlcmlmaWVyKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvS2V5U3RvcmVzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlTdG9yZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3Y2M2ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlTdG9yZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0vKioKLSAqIENsYXNzIHRvIG1hbmFnZSB0aGUgZGlmZmVyZW50IEtleVN0b3JlcyB3ZSBzaG91bGQKLSAqIGNoZWNrIGZvciBjZXJ0aWZpY2F0ZXMgb2YgU2lnbmVkIEpBUgotICovCi1wdWJsaWMgY2xhc3MgS2V5U3RvcmVzIHsKLQotCi0JLyoqCi0JICogamF2YS5wb2xpY3kgZmlsZXMgcHJvcGVydGllcyBvZiB0aGUgamF2YS5zZWN1cml0eSBmaWxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfUE9MSUNZX1VSTCA9ICJwb2xpY3kudXJsLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERlZmF1bHQga2V5c3RvcmUgdHlwZSBpbiBqYXZhLnNlY3VyaXR5IGZpbGUKLQkgKi8JCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfS0VZU1RPUkVfVFlQRSA9ICJrZXlzdG9yZS50eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTGlzdCBvZiBLZXlzdG9yZUhhbmRsZSBwb2ludGluZyBvZiB2YWxpZCBLZXlTdG9yZXMKLQkgKiB0aGUgVVJMIG9mIHRoZSBLZXlzdG9yZUhhbmRsZSBpcyBub3QgdGVzdGVkIHlldC4uLgotCSAqLwotCXByaXZhdGUgTGlzdCAvKiBvZiBLZXlzdG9yZUhhbmRsZSAqLyBsaXN0T2ZLZXlTdG9yZXM7Ci0KLQkvKioKLQkgKiBJdGVyYXRvcgotCSAqLwotCXByaXZhdGUgSXRlcmF0b3IgaXRlcmF0b3I7Ci0JLyoqCi0JICogS2V5U3RvcmVzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEtleVN0b3JlcygpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRLZXlTdG9yZXMoKTsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvciBnZXRJdGVyYXRvcigpIHsKLQkJaWYgKGl0ZXJhdG9yID09IG51bGwpCi0JCQlpdGVyYXRvciA9IGxpc3RPZktleVN0b3Jlcy5pdGVyYXRvcigpOwotCQlyZXR1cm4gaXRlcmF0b3I7Ci0JfQotCS8qKgotCSAqIHJldHVybnMgdHJ1cyBpZiB0aGVyZSBpcyBtb3JlIEtleXN0b3JlcyBpbiB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiBnZXRJdGVyYXRvcigpLmhhc05leHQoKTsKLQl9Ci0JLyoqCi0JICogcG9wdWxhdGUgdGhlIGxpc3Qgb2YgS2V5c3RvcmVzCi0JICogc2hvdWxkIGJlIGRvbmUgd2l0aCBEaWFsb2cgd2l0aCBDYW5jZWwvU2tpcCBidXR0b24gaWYKLQkgKiB0aGUgY29ubmVjdGlvbiB0byB0aGUgVVJMIGlzIGRvd24uLi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRLZXlTdG9yZXMoKSB7Ci0KLQkJbGlzdE9mS2V5U3RvcmVzID0gbmV3IEFycmF5TGlzdCg1KTsKLQotCQkvLyBnZXQgSlJFIGNhY2VydHMKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgbnVsbCwgMCwgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIgKyBGaWxlLnNlcGFyYXRvciArICJzZWN1cml0eSIgKyBGaWxlLnNlcGFyYXRvciArICJjYWNlcnRzIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCWxpc3RPZktleVN0b3Jlcy5hZGQobmV3IEtleXN0b3JlSGFuZGxlKHVybCxTZWN1cml0eS5nZXRQcm9wZXJ0eShERUZBVUxUX0tFWVNUT1JFX1RZUEUpKSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgbm90IGhhcHBlbiwgaGFyZGNvZGVkLi4uCi0JCX0KLQotCQkvLyBnZXQgamF2YS5ob21lIC5rZXlzdG9yZQotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCBudWxsLCAwLCBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgKyAiLmtleXN0b3JlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlsaXN0T2ZLZXlTdG9yZXMuYWRkKG5ldyBLZXlzdG9yZUhhbmRsZSh1cmwsU2VjdXJpdHkuZ2V0UHJvcGVydHkoREVGQVVMVF9LRVlTVE9SRV9UWVBFKSkpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4sIGhhcmRjb2RlZC4uLgotCQl9Ci0KLQkJLy8gZ2V0IEtleVN0b3JlcyBmcm9tIHBvbGljeSBmaWxlcy4uLgotCQlpbnQgaW5kZXggPSAxOwotCQlTdHJpbmcgamF2YV9wb2xpY3kgPSBTZWN1cml0eS5nZXRQcm9wZXJ0eShKQVZBX1BPTElDWV9VUkwraW5kZXgpOwotCQl3aGlsZSAoamF2YV9wb2xpY3khPW51bGwpewotCQkJLy8gcmV0cmlldmUga2V5c3RvcmUgdXJsIGZyb20gamF2YS5wb2xpY3kKLQkJCS8vIGFsc28gcmV0cmlldmUga2V5c3RvcmUgdHlwZQotCQkJS2V5c3RvcmVIYW5kbGUga2V5c3RvcmUgPSBnZXRLZXlzdG9yZUZyb21Mb2NhdGlvbihqYXZhX3BvbGljeSk7Ci0JCQlpZiAoa2V5c3RvcmUhPW51bGwpewotCQkJCWxpc3RPZktleVN0b3Jlcy5hZGQoa2V5c3RvcmUpOwotCQkJfQotCQkJaW5kZXgrKzsJCi0JCQlqYXZhX3BvbGljeSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KEpBVkFfUE9MSUNZX1VSTCtpbmRleCk7CQkJCi0JCX0KLQotCX0KLQkvKioKLQkgKiByZXR1cm5zIHRoZSBVUkwgZm9yIHRoZSBOZXh0IEtleXN0b3JlSGFuZGxlCi0JICovCi0JcHVibGljIEtleXN0b3JlSGFuZGxlIG5leHQoKSB7Ci0JCXJldHVybiAoS2V5c3RvcmVIYW5kbGUpIGdldEl0ZXJhdG9yKCkubmV4dCgpOwotCX0KLQkKLQkvKioKLQkgKiByZXRyaWV2ZSB0aGUga2V5c3RvcmUgZnJvbSBqYXZhLnBvbGljeSBmaWxlCi0JICovCi0JcHJpdmF0ZSBLZXlzdG9yZUhhbmRsZSBnZXRLZXlzdG9yZUZyb21Mb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pewotCQkKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQljaGFyW10gYnVmZiA9IG5ldyBjaGFyWzQwOTZdOwotCQkKLQkJCi0JCWludCBpbmRleE9mJCA9IGxvY2F0aW9uLmluZGV4T2YoIiR7Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGluZGV4T2ZDdXJseSA9IGxvY2F0aW9uLmluZGV4T2YoJ30nLGluZGV4T2YkKTsKLQkJaWYgKGluZGV4T2YkIT0tMSAmJiBpbmRleE9mQ3VybHkhPS0xKXsKLQkJCVN0cmluZyBwcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KGxvY2F0aW9uLnN1YnN0cmluZyhpbmRleE9mJCsyLGluZGV4T2ZDdXJseSkpOwotCQkJU3RyaW5nIGxvY2F0aW9uMiA9IGxvY2F0aW9uLnN1YnN0cmluZygwLGluZGV4T2YkKTsKLQkJCWxvY2F0aW9uMiArPSBwcm9wOwotCQkJbG9jYXRpb24yICs9IGxvY2F0aW9uLnN1YnN0cmluZyhpbmRleE9mQ3VybHkrMSk7Ci0JCQlsb2NhdGlvbiA9IGxvY2F0aW9uMjsKLQkJfQotCQkKLQkJCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0JCQlpbiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0KHVybCkuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOwotCQkJaW50IHJlc3VsdCA9IHJlYWRlci5yZWFkKGJ1ZmYpOwotCQkJU3RyaW5nQnVmZmVyIGNvbnRlbnRCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJd2hpbGUgKHJlc3VsdCE9LTEpewotCQkJCWNvbnRlbnRCdWZmLmFwcGVuZChidWZmLDAscmVzdWx0KTsKLQkJCQlyZXN1bHQgPSByZWFkZXIucmVhZChidWZmKTsJCQkJCi0JCQl9Ci0KLQkJCWlmIChjb250ZW50QnVmZi5sZW5ndGgoKT4wKXsJCQkKLQkJCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoY29udGVudEJ1ZmYpOwotCQkJCWludCBpbmRleE9mS2V5c3RvcmUgPSBjb250ZW50LmluZGV4T2YoImtleXN0b3JlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaW5kZXhPZktleXN0b3JlICE9IC0xKXsKLQkJCQkJaW50IGluZGV4T2ZTZW1pQ29sdW1uID0gY29udGVudC5pbmRleE9mKCc7JyxpbmRleE9mS2V5c3RvcmUpOwotCQkJCQlyZXR1cm4gZ2V0S2V5c3RvcmVGcm9tU3RyaW5nKGNvbnRlbnQuc3Vic3RyaW5nKGluZGV4T2ZLZXlzdG9yZSxpbmRleE9mU2VtaUNvbHVtbiksdXJsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsKLQkJCWxvZyhlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0JCQkvLyB1cmwub3BlblN0cmVhbSwgcmVhZGVyLnJlYWQgKHgyKQotCQkJLy8gb25seSBsb2csIHRoZSBrZXlzdG9yZSBtYXkgbm90IGV4aXN0Ci0JCQlsb2coZSk7CQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluIT1udWxsKXsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpe30KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogcmV0cmlldmUgdGhlIGtleXN0b3JlIGZyb20gamF2YS5wb2xpY3kgZmlsZQotCSAqLwotCXByaXZhdGUgS2V5c3RvcmVIYW5kbGUgZ2V0S2V5c3RvcmVGcm9tU3RyaW5nKFN0cmluZyBjb250ZW50LFVSTCByb290VVJMKXsKLQkJS2V5c3RvcmVIYW5kbGUgaGFuZGxlID0gbnVsbDsKLQkJU3RyaW5nIGtleVN0b3JlVHlwZSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KERFRkFVTFRfS0VZU1RPUkVfVFlQRSk7Ci0JCQotCQkKLQkJaW50IGluZGV4T2ZTcGFjZSA9IGNvbnRlbnQuaW5kZXhPZignICcpOwotCQlpZiAoaW5kZXhPZlNwYWNlPT0tMSkgcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgc2Vjb25kU3BhY2UgPSBjb250ZW50Lmxhc3RJbmRleE9mKCcsJyk7Ci0JCWlmIChzZWNvbmRTcGFjZT09LTEpIHsKLQkJCXNlY29uZFNwYWNlID0gY29udGVudC5sZW5ndGgoKTsKLQkJfSBlbHNlIHsKLQkJCWtleVN0b3JlVHlwZSA9IGNvbnRlbnQuc3Vic3RyaW5nKHNlY29uZFNwYWNlKzEsY29udGVudC5sZW5ndGgoKSkudHJpbSgpOwotCQl9Ci0JCQotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoY29udGVudC5zdWJzdHJpbmcoaW5kZXhPZlNwYWNlLHNlY29uZFNwYWNlKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsKLQkJCWxvZyhlKTsKLQkJCS8vIHRoZSB1cmwgbWF5YmUgcmVsYXRpdmUKLQkJCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKHJvb3RVUkwsY29udGVudC5zdWJzdHJpbmcoaW5kZXhPZlNwYWNlLHNlY29uZFNwYWNlKSk7CQkJCQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsKLQkJCQlsb2coZTEpOwkJCQotCQkJfQotCQl9Ci0KLQkJaWYgKHVybCE9bnVsbCkKLQkJCWhhbmRsZSA9IG5ldyBLZXlzdG9yZUhhbmRsZSh1cmwsa2V5U3RvcmVUeXBlKTsJCQkJCi0JCQkKLQkJcmV0dXJuIGhhbmRsZTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBsb2coRXhjZXB0aW9uIGUpewotCQlVcGRhdGVDb3JlLndhcm4oIkNhbm5vdCByZXRyaWV2ZSBhIEtleVN0b3JlIixlKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0tleXN0b3JlSGFuZGxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlzdG9yZUhhbmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTYwNWVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0tleXN0b3JlSGFuZGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLQotIAotLyoqCi0gKiBNYW5hZ2VzIGEgaGFuZGxlIHRvIGEga2V5c3RvcmUKLSAqLwotcHVibGljIGNsYXNzIEtleXN0b3JlSGFuZGxlIHsKLQkKLQlwcml2YXRlIFVSTCBsb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCQotCXB1YmxpYyBLZXlzdG9yZUhhbmRsZShVUkwgdXJsLCBTdHJpbmcgdHlwZSl7Ci0JCXRoaXMubG9jYXRpb24gPSB1cmw7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9jYXRpb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvY2F0aW9uLgotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oVVJMIGxvY2F0aW9uKSB7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0eXBlLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdHlwZS4KLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lCYXRjaE9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JQmF0Y2hPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1ZDdmNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lCYXRjaE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi0vKioKLSAqIEJhdGNoIG9mIG9wZXJhdGlvbnMgb24gZmVhdHVyZS4gRm9yIGV4YW1wbGUsIGEgYmF0Y2ggZmVhdHVyZXMgaW5zdGFsbGF0aW9uLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmF0Y2hPcGVyYXRpb24gIGV4dGVuZHMgSU9wZXJhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYmF0Y2ggb3BlcmF0aW9ucy4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IElGZWF0dXJlT3BlcmF0aW9uW10gZ2V0T3BlcmF0aW9ucygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkNzM1Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lDb25maWdGZWF0dXJlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi0vKioKLSAqIE9wZXJhdGlvbiB0aGF0IGVuYWJsZSBhIGZlYXR1cmUgaW4gYSBjb25maWd1cmF0aW9uLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlnRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzIElGZWF0dXJlT3BlcmF0aW9uIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lGZWF0dXJlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lGZWF0dXJlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTVkNGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JRmVhdHVyZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEFuIG9wZXJhdGlvbiB0aGF0IGFwcGxpZXMgdG8gYSBmZWF0dXJlLCBzdWNoIGFzIGluc3RhbGwsIHVuaW5zdGFsbCwgZXRjLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzIElPcGVyYXRpb24gewotCS8qKgotCSAqIFJldHVybiB0aGUgZmVhdHVyZSB0byB3aGljaCB0aGUgb3BlcmF0aW9uIGFwcGxpZXMuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRmVhdHVyZSBnZXRGZWF0dXJlKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l0ZSBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIGFwcGxpZWQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQ29uZmlndXJlZFNpdGUgZ2V0VGFyZ2V0U2l0ZSgpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgKGlmIGFueSkuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRmVhdHVyZSBnZXRPbGRGZWF0dXJlKCk7Ci0JLyoqCi0JICogU2V0cyB0aGUgc2l0ZSBpbiB3aGljaCB0aGUgZmVhdHVyZSBpcyBiZWluZyBvcGVyYXRlZCBvbi4KLQkgKiBAcGFyYW0gdGFyZ2V0U2l0ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhcmdldFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2FkNjA0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBBbiBpbnN0YWxsYXRpb24gb3BlcmF0aW9uLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZXh0ZW5kcyBJRmVhdHVyZU9wZXJhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBvcHRpb25hbCBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldE9wdGlvbmFsRmVhdHVyZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIyNDhjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIEJhc2UgdXBkYXRlIG1hbmFnZXIgb3BlcmF0aW9uLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIHByb2Nlc3NlZC4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNQcm9jZXNzZWQoKTsKLQkvKioKLQkgKiBNYXJrcyB0aGUgb3BlcmF0aW9uIGFzIHByb2Nlc3NlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtYXJrUHJvY2Vzc2VkKCk7Ci0JLyoqCi0JICogRXhlY3V0ZXMgb3BlcmF0aW9uLgotCSAqIEBwYXJhbSBwbSBQcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uCi0JICogQHBhcmFtIGxpc3RlbmVyIE9wZXJhdGlvbiBsaXN0ZW5lcgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYW5kIGEgcmVzdGFydCBpcyBuZWVkZWQuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHBtLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSU9wZXJhdGlvbkZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSU9wZXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyNmYzNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEEgZmFjdG9yeSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIG9wZXJhdGlvbnMuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRpb25GYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGEgImNvbmZpZ3VyZSBmZWF0dXJlIiBvcGVyYXRpb24uCi0JICogQHBhcmFtIHRhcmdldFNpdGUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gY3JlYXRlQ29uZmlnT3BlcmF0aW9uKAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSk7Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gInVuY29uZmlndXJlIGZlYXR1cmUiIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gdGFyZ2V0U2l0ZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJVW5jb25maWdGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZVVuY29uZmlnT3BlcmF0aW9uKAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhICJpbnRhbGwgZmVhdHVyZSIgb3BlcmF0aW9uLgotCSAqIEBwYXJhbSB0YXJnZXRTaXRlCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gb3B0aW9uYWxGZWF0dXJlcwotCSAqIEBwYXJhbSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzCi0JICogQHBhcmFtIHZlcmlmaWVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3JlYXRlSW5zdGFsbE9wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywKLQkJSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLAotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpZXIpOwotCQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuICJ1bmluc3RhbGwgZmVhdHVyZSIgb3BlcmF0aW9uLgotCSAqIEBwYXJhbSB0YXJnZXRTaXRlCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZVVuaW5zdGFsbE9wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUpOwotCQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgInJldmVydCBmZWF0dXJlIHZlcnNpb24iIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gZmVhdHVyZSBjdXJyZW50IGZlYXR1cmUKLQkgKiBAcGFyYW0gYW5vdGhlckZlYXR1cmUgdGhlIG5ldyBmZWF0dXJlIHRvIGJlIHN3YXBwZWQgaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElDb25maWdGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZVJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbigKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUpOwotCQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgImJhdGNoIGluc3RhbGwiIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gb3BlcmF0aW9ucwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUJhdGNoT3BlcmF0aW9uIGNyZWF0ZUJhdGNoSW5zdGFsbE9wZXJhdGlvbihJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcGVyYXRpb25zKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuICJlbmFibGUvZGlzYWJsZSBzaXRlIiBvcGVyYXRpb24uCi0JICogQHBhcmFtIHNpdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElUb2dnbGVTaXRlT3BlcmF0aW9uIGNyZWF0ZVRvZ2dsZVNpdGVPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlKTsKLQkJCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgInJldmVydCB0byBhIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24iIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHByb2JsZW1IYW5kbGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbiBjcmVhdGVSZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJUHJvYmxlbUhhbmRsZXIgcHJvYmxlbUhhbmRsZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSU9wZXJhdGlvbkxpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjNlOTBiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSU9wZXJhdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi0vKioKLSAqIExpc3RlbmVyIGZvciBvcGVyYXRpb24gbGlmZWN5Y2xlLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uTGlzdGVuZXIgewotCS8qKgotCSAqIE1heSBiZSBjYWxsZWQgYmVmb3JlIGFuIG9wZXJhdGlvbiBzdGFydHMgZXhlY3V0aW5nLgotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gZGF0YQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBiZWZvcmVFeGVjdXRlKElPcGVyYXRpb24gb3BlcmF0aW9uLCBPYmplY3QgZGF0YSk7Ci0JLyoqCi0JICogTWF5IGJlIGNhbGxlZCBhZnRlciBhbiBvcGVyYXRpb24gZmluaXNoZXMgZXhlY3V0aW5nLgotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gZGF0YQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZnRlckV4ZWN1dGUoSU9wZXJhdGlvbiBvcGVyYXRpb24sIE9iamVjdCBkYXRhKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb25WYWxpZGF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSU9wZXJhdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWRiZGIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSU9wZXJhdGlvblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBPcGVyYXRpb24gdmFsaWRhdG9yLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIENhbGxlZCBiZWZvcmUgcGVyZm9ybWluZyBpbnN0YWxsLgotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cywgb3IgbnVsbCBpZiBubyBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdJbnN0YWxsKElGZWF0dXJlIG9sZEZlYXR1cmUsIElGZWF0dXJlIG5ld0ZlYXR1cmUpOwotCi0JLyoqCi0JICogQ2FsbGVkIGJlZm9yZSBwZXJmb3JtaW5nIG9wZXJhdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBzdGF0dXMsIG9yIG51bGwgaWYgbm8gZXJyb3JzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nQ29uZmlnKElGZWF0dXJlIGZlYXR1cmUpOwotCQotCS8qKgotCSAqIENhbGxlZCBiZWZvcmUgcGVyZm9ybWluZyBvcGVyYXRpb24uCi0JICogQHJldHVybiB0aGUgZXJyb3Igc3RhdHVzLCBvciBudWxsIGlmIG5vIGVycm9ycwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ1VuY29uZmlnKElGZWF0dXJlIGZlYXR1cmUpOwotCQotCS8qKgotCSAqIENhbGxlZCBiZWZvcmUgcGVyZm9ybWluZyBvcGVyYXRpb24uCi0JICogQHJldHVybiB0aGUgZXJyb3Igc3RhdHVzLCBvciBudWxsIGlmIG5vIGVycm9ycwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ1JlcGxhY2VWZXJzaW9uKElGZWF0dXJlIGZlYXR1cmUsIElGZWF0dXJlIGFub3RoZXJGZWF0dXJlKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgYmVmb3JlIGRvaW5nIGEgcmV2ZXJ0LyByZXN0b3JlIG9wZXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cywgb3IgbnVsbCBpZiBubyBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdSZXZlcnQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgdGhlIFVJIGJlZm9yZSBkb2luZyBhIGJhdGNoZWQgcHJvY2Vzc2luZyBvZgotCSAqIHNldmVyYWwgcGVuZGluZyBjaGFuZ2VzLgotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cywgb3IgbnVsbCBpZiBubyBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdDaGFuZ2VzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpOwotCi0JLyoqCi0JICogQ2hlY2sgdGhlIGN1cnJlbnQgc3RhdGUuCi0JICogQHJldHVybiB0aGUgZXJyb3Igc3RhdHVzLCBvciBudWxsIGlmIG5vIGVycm9ycwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlQ3VycmVudFN0YXRlKCk7Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIG1vZGlmaWVkIG91dHNpZGUgdGhpcyBwcm9ncmFtLgotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cywgb3IgbnVsbCBpZiBubyBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmFjNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotLyoqCi0gKiBPcGVyYXRpb24gdGhhdCByZXZlcnRzIGEgZmVhdHVyZSB0byBhbm90aGVyIHZlcnNpb24uCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24gZXh0ZW5kcyBJRmVhdHVyZU9wZXJhdGlvbiB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZhZGYzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogQW4gb3BlcmF0aW9uIGluIHdoaWNoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaXMgcmVwbGFjZWQgYnkgYSBwcmV2aW91cyBvbmUuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgSU9wZXJhdGlvbiB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JVG9nZ2xlU2l0ZU9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JVG9nZ2xlU2l0ZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjE2NDBhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVRvZ2dsZVNpdGVPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogQW4gb3BlcmF0aW9uIGluIHdoaWNoIHRoZSB1bmNvbmZpZ3VyZWQvY29uZmlndXJlZCBzdGF0ZSBvZiBhIHNpdGUgaXMgdG9nZ2xlZC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvZ2dsZVNpdGVPcGVyYXRpb24gZXh0ZW5kcyBJT3BlcmF0aW9uIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDk2ZDMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi0vKioKLSAqIEFuIG9wZXJhdGlvbiB0aGF0IGRpc2FibGVzIGEgZmVhdHVyZSBpbiBhIHNpdGUuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gIGV4dGVuZHMgSUZlYXR1cmVPcGVyYXRpb24gewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExY2UxYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi0KLS8qKgotICogQSBmZWF0dXJlIHVuaW5zdGFsbCBvcGVyYXRpb24uCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGV4dGVuZHMgSUZlYXR1cmVPcGVyYXRpb24gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOSU5TVEFMTCA9ICJ1bmluc3RhbGwiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOGFjZWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogTGlzdGVuZXIgZm9yIHVwZGF0ZSBtb2RlbCBjaGFuZ2VzLiAKLSAqIFVzdWFsbHksIHdoZW4gZmVhdHVyZXMgYXJlIGluc3RhbGxlZCwgY29uZmlndXJlZCwgZXRjLgotICogYSBHVUkgbWF5IG5lZWQgdG8gdXBkYXRlIGl0cyBzdGF0ZSwgc28gaXQgd2lsbCBoYXZlIHRvIHJlZ2lzdGVyCi0gKiB3aXRoIHRoZSBPcGVyYXRpb25zTWFuYWdlciBmb3IgdXBkYXRlIGV2ZW50cy4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIHsKLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgYSBmZWF0dXJlL3NpdGUvZXRjLiBpcyBhZGRlZAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvYmplY3RzQWRkZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IFtdIGNoaWxkcmVuKTsKLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgYSBmZWF0dXJlL3NpdGUvZXRjLiBpcyByZW1vdmVkLgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gY2hpbGRyZW4pOwotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZXJlIGFyZSBjaGFuZ2VzIHRvIGEgc2l0ZS9mZWF0dXJlL2V0Yy4KLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9PcGVyYXRpb25zTWFuYWdlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9PcGVyYXRpb25zTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTc0MWE5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvT3BlcmF0aW9uc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBFbnRyeSBwb2ludCBmb3IgdXBkYXRlIG1hbmFnZXIgb3BlcmF0aW9ucy4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25zTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdGlvblZhbGlkYXRvciB2YWxpZGF0b3I7Ci0JcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdGlvbkZhY3Rvcnkgb3BlcmF0aW9uRmFjdG9yeTsKLQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgc3RhdGljIFZlY3RvciBwZW5kaW5nT3BlcmF0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluUHJvZ3Jlc3M7Ci0KLQlwcml2YXRlIE9wZXJhdGlvbnNNYW5hZ2VyKCkgewotCX0KLQkKLQkvKioKLQkgKiBFYWNoIHVwZGF0ZSBvcGVyYXRpb25zIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgb3BlcmF0aW9uIGZhY3RvcnkuIAotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byBvYnRhaW4gdGhlIGZhY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJT3BlcmF0aW9uRmFjdG9yeSBnZXRPcGVyYXRpb25GYWN0b3J5KCkgewotCQlpZiAob3BlcmF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJb3BlcmF0aW9uRmFjdG9yeSA9IG5ldyBPcGVyYXRpb25GYWN0b3J5KCk7Ci0JCXJldHVybiBvcGVyYXRpb25GYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBmZWF0dXJlIGlzIHRoZSBzdWJqZWN0IG9mIGFuIHVwZGF0ZSBvcGVyYXRpb24gc3VjaCBhcyBpbnN0YWxsLAotCSAqIGNvbmZpZ3VyZSwgZXRjLiBhbmQgcmV0dXJuIGl0LiBDdXJyZW50bHkgdGhlcmUgY2FuIG9ubHkgYmUgb25lIHBlbmRpbmcKLQkgKiBvcGVyYXRpb24gb24gYSBmZWF0dXJlLgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVPcGVyYXRpb24gZmluZFBlbmRpbmdPcGVyYXRpb24oSUZlYXR1cmUgZmVhdHVyZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHBlbmRpbmdPcGVyYXRpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZU9wZXJhdGlvbiBvcGVyYXRpb24gPQotCQkJCShJRmVhdHVyZU9wZXJhdGlvbikgcGVuZGluZ09wZXJhdGlvbnMuZWxlbWVudEF0KGkpOwotCQkJaWYgKG9wZXJhdGlvbi5nZXRGZWF0dXJlKCkuZXF1YWxzKGZlYXR1cmUpKQotCQkJCXJldHVybiBvcGVyYXRpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIGEgcGVuZGluZyBvcGVyYXRpb24uCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQZW5kaW5nT3BlcmF0aW9uKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXBlbmRpbmdPcGVyYXRpb25zLmFkZChvcGVyYXRpb24pOwotCQkvL2ZpcmVPYmplY3RzQWRkZWQodGhpcywgbmV3IE9iamVjdFtdIHsgY2hhbmdlIH0pOwotCX0KLQotCS8qKgotCSAqIFVucmVnaXN0ZXIgYSBwZW5kaW5nIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVBlbmRpbmdPcGVyYXRpb24oSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJcGVuZGluZ09wZXJhdGlvbnMucmVtb3ZlKG9wZXJhdGlvbik7Ci0JCS8vZmlyZU9iamVjdHNSZW1vdmVkKHRoaXMsIG5ldyBPYmplY3RbXSB7IGNoYW5nZSB9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbW9kZWwgY2hhbmdlZCBsaXN0ZW5lci4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gbW9kZWwgY2hhbmdlZCBsaXN0ZW5lci4KLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgbW9kZWwgY2hhbmdlZCBsaXN0ZW5lcnMgd2hlbiBmZWF0dXJlcy9zaXRlcy9ldGMuIGFyZSBhZGRlZC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpcmVPYmplY3RzQWRkZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0KLQkJCQkoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm9iamVjdHNBZGRlZChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIG1vZGVsIGNoYW5nZWQgbGlzdGVuZXJzIHdoZW4gZmVhdHVyZXMvc2l0ZXMvZXRjIGFyZSByZW1vdmVkLgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlyZU9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9Ci0JCQkJKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5vYmplY3RzUmVtb3ZlZChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIG1vZGVsIGNoYW5nZWQgbGlzdGVuZXJzIHdoZW4gZmVhdHVyZXMvc2l0ZXMvZXRjLiBoYXZlIGNoYW5nZWQuCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXJlT2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0KLQkJCQkoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm9iamVjdENoYW5nZWQob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgd2hlbiBhbnkgb2YgdGhlIGluc3RhbGwgb3BlcmF0aW9ucyByZXF1aXJlcyBhIGxpY2VuY2UgYWdyZWVtZW50LgotCSAqIEBwYXJhbSBqb2JzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNTZWxlY3RlZEpvYnNXaXRoTGljZW5zZXMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVVdGlscy5oYXNMaWNlbnNlKGpvYnNbaV0uZ2V0RmVhdHVyZSgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIHdoZW4gYW55IG9mIHRoZSBmZWF0dXJlcyB0byBpbnN0YWxsIGhhcyBvcHRpb25hbCBmZWF0dXJlcy4KLQkgKiBAcGFyYW0gam9icwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzU2VsZWN0ZWRKb2JzV2l0aE9wdGlvbmFsRmVhdHVyZXMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVVdGlscy5oYXNPcHRpb25hbEZlYXR1cmVzKGpvYnNbaV0uZ2V0RmVhdHVyZSgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBvcGVyYXRpb25zIHRoYXQgbmVlZCBhIGxpY2VuY2UgYWdyZWVtZW50LgotCSAqIEBwYXJhbSBqb2JzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gZ2V0U2VsZWN0ZWRKb2JzV2l0aExpY2Vuc2VzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFVwZGF0ZVV0aWxzLmhhc0xpY2Vuc2Uoam9ic1tpXS5nZXRGZWF0dXJlKCkpKQotCQkJCWxpc3QuYWRkKGpvYnNbaV0pOwotCQl9Ci0JCXJldHVybiAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10pIGxpc3QudG9BcnJheSgKLQkJCW5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bbGlzdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG9wZXJhdGlvbnMgdGhhdCBoYXZlIG9wdGlvbmFsIGZlYXR1cmVzIHRvIGluc3RhbGwuCi0JICogQHBhcmFtIGpvYnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBnZXRTZWxlY3RlZEpvYnNXaXRoT3B0aW9uYWxGZWF0dXJlcyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVVdGlscy5oYXNPcHRpb25hbEZlYXR1cmVzKGpvYnNbaV0uZ2V0RmVhdHVyZSgpKSkKLQkJCQlsaXN0LmFkZChqb2JzW2ldKTsKLQkJfQotCQlyZXR1cm4gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdKSBsaXN0LnRvQXJyYXkoCi0JCQluZXcgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgd2hldGhlciBhbnkgb3BlcmF0aW9ucyBpcyBpbiBwcm9ncmVzcy4KLQkgKiBAcGFyYW0gaW5Qcm9ncmVzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0SW5Qcm9ncmVzcyhib29sZWFuIGluUHJvZ3Jlc3MpIHsKLQkJT3BlcmF0aW9uc01hbmFnZXIuaW5Qcm9ncmVzcyA9IGluUHJvZ3Jlc3M7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSB3aGVuIHNvbWUgb3BlcmF0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLCBmYWxzZSBvdGhlcndpc2UuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNJblByb2dyZXNzKCkgewotCQlyZXR1cm4gaW5Qcm9ncmVzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcGVyYXRpb25zIHZhbGlkYXRvci4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJT3BlcmF0aW9uVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKQotCQkJdmFsaWRhdG9yID0gbmV3IE9wZXJhdGlvblZhbGlkYXRvcigpOwotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIGEgY3VzdG9tIG9wZXJhdGlvbiB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbGlkYXRvcihJT3BlcmF0aW9uVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlPcGVyYXRpb25zTWFuYWdlci52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAKLQkgKiBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiB1c2luZyB0aGlzIG1ldGhvZC4gTm9ybWFsbHksIGlmIHlvdSBpbnN0YWxsIGEgbmV3Ci0JICogcGx1Z2luIGl0IGlzIHNhZmUgdG8gZG8gaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5Q2hhbmdlc05vdygpIHsKLQkJSW5zdGFsbENvbmZpZ3VyYXRpb24uYXBwbHlDaGFuZ2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9wYWNrYWdlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3ZjYxNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MiBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydCBmb3IgcGVyZm9ybWluZyB2YXJpb3VzIGluc3RhbGwvdXBkYXRlIG9wZXJhdGlvbnMuCi08aDI+Ci1QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGludGVyZmFjZXMgZm9yIHBlcmZvcm1pbmcgdXBkYXRlL2luc3RhbGwgb3BlcmF0aW9ucyAKLXdpdGhvdXQgdXNpbmcgdGhlIFVwZGF0ZSBNYW5hZ2VyIHVzZXIgaW50ZXJmYWNlLiAKLTxwPgotPGI+Tm90ZTo8L2I+IFRoaXMgcGFja2FnZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi1jaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLWZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0ocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0JhY2tMZXZlbEZpbHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0JhY2tMZXZlbEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWMzZDA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9CYWNrTGV2ZWxGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSBhZGRlZCB0byB0aGUgdXBkYXRlIHNlYXJjaCByZXF1ZXN0Ci0gKiB0byBmaWx0ZXIgb3V0IGZlYXR1cmVzIHRoYXQgYXJlIGJhY2stbGV2ZWwgKGFyZQotICogb2xkZXIgb3IgdGhlIHNhbWUgYXMgdGhlIGZlYXR1cmVzIGFscmVhZHkgaW5zdGFsbGVkKS4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgVXBkYXRlU2VhcmNoUmVxdWVzdAotICogQHNlZSBJVXBkYXRlU2VhcmNoRmlsdGVyCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWNrTGV2ZWxGaWx0ZXIgZXh0ZW5kcyBCYXNlRmlsdGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSUZlYXR1cmVSZWZlcmVuY2UgbWF0Y2gpIHsKLQkJdHJ5IHsKLQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIG1hdGNoVmlkID0gbWF0Y2guZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJCUlGZWF0dXJlIFtdIGluc3RhbGxlZCA9IFVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKG1hdGNoLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSwgZmFsc2UpOwotCQkJaWYgKGluc3RhbGxlZC5sZW5ndGg9PTApIHJldHVybiB0cnVlOwotCQkJCi0JCQlmb3IgKGludCBpPTA7IGk8aW5zdGFsbGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgaXZpZCA9IGluc3RhbGxlZFtpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkJCWlmIChtYXRjaFZpZC5pc0dyZWF0ZXJUaGFuKGl2aWQpKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBpbnN0YWxsZWQgdmVyc2lvbiBpcyB0aGUgc2FtZSBvciBuZXdlciB0aGFuCi0JCQkJLy8gdGhlIG1hdGNoIC0gZmlsdGVyIG91dAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9CYXNlRmlsdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvQmFzZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc4YzIzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9CYXNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEJhc2UgZmlsdGVyIGNsYXNzCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIFVwZGF0ZVNlYXJjaFJlcXVlc3QKLSAqIEBzZWUgSVVwZGF0ZVNlYXJjaEZpbHRlcgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQmFzZUZpbHRlciBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hGaWx0ZXIgewotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJRmVhdHVyZSBtYXRjaCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElGZWF0dXJlUmVmZXJlbmNlIG1hdGNoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvRW52aXJvbm1lbnRGaWx0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9FbnZpcm9ubWVudEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTczZTk4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9FbnZpcm9ubWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIGFkZGVkIHRvIHRoZSB1cGRhdGUgc2VhcmNoIHJlcXVlc3QKLSAqIHRvIGZpbHRlciBvdXQgZmVhdHVyZXMgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQKLSAqIGVudmlyb25tZW50IHNldHRpbmdzLgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBVcGRhdGVTZWFyY2hSZXF1ZXN0Ci0gKiBAc2VlIElVcGRhdGVTZWFyY2hGaWx0ZXIKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEVudmlyb25tZW50RmlsdGVyIGV4dGVuZHMgQmFzZUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElGZWF0dXJlIG1hdGNoKSB7Ci0JCXJldHVybiBVcGRhdGVNYW5hZ2VyVXRpbHMuaXNWYWxpZEVudmlyb25tZW50KG1hdGNoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JUXVlcnlVcGRhdGVTaXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E3NTNiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JUXVlcnlVcGRhdGVTaXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIHVwZGF0ZSBzaXRlIGFkYXB0ZXIgdXNlZCAKLSAqIGZvciBzcGVjaWZpYyBxdWVyeSBzZXJjaGVzLiBJdCBhZGRzIGEgbWFwcGluZyBJRCAKLSAqIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBtYXBwaW5nIGZpbGUgaXMgc3BlY2lmaWVkLgotICogSWYgYSBtYXRjaGluZyBtYXBwaW5nIGlzIGZvdW5kIGZvciB0aGlzIElELCAKLSAqIHRoZSByZXBsYWNlbWVudCBVUkwgZm91bmQgaW4gdGhlIG1hcHBpbmcgZmlsZSB3aWxsIGJlCi0gKiB1c2VkIGluc3RlYWQgb2YgdGhpcyBhZGFwdGVyLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBleHRlbmRzIElVcGRhdGVTaXRlQWRhcHRlciB7Ci0vKioKLSAqIFJldHVybnMgYW4gSUQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGFkZHJlc3MgbWFwcGluZyBmaWxlLgotICogQHJldHVybiBhIG1hcHBpbmcgSWQgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBhZGRyZXNzIG1hcHBpbmcgZmlsZS4KLSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0lkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4ZmVlZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2g7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSBhIHBhcnRpY3VsYXIgVXBkYXRlCi0gKiBzZWFyY2ggcGF0dGVybi4gRWFjaCBzZWFyY2ggY2F0ZWdvcnkgaXMgZnJlZSB0byBzY2FuCi0gKiBzaXRlcyB1c2luZyBhIHNwZWNpZmljIGFsZ29yaXRobS4gU2VhcmNoIGNhdGVnb3J5IG11c3QKLSAqIGhhdmUgYSB1bmlxdWUgSUQuIFRoZSBhY3R1YWwgc2VhcmNoIGlzIHBlcmZvcm1lZCBpbgotICogc2VhcmNoIHF1ZXJpZXMuIEEgY2F0ZWdvcnkgY2FuIHByb3ZpZGUgb25lIG9yIG1vcmUKLSAqIHF1ZXJpZXMgdG8gcnVuIGR1cmluZyB0aGUgc2VhcmNoLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVTZWFyY2hDYXRlZ29yeSB7Ci0vKioKLSAqIFJldHVybnMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgc2VhcmNoIGNhdGVnb3J5LgotICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotLyoqCi0gKiBBY2NlcHRzIHRoZSBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHRoaXMgY2F0ZWdvcnkgZHVyaW5nCi0gKiB0aGUgcmVnaXN0cnkgcmVhZGluZy4KLSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCk7Ci0KLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiB1cGRhdGUgc2VhcmNoIHF1ZXJpZXMgdGhhdCBuZWVkIHRvIAotICogYmUgcnVuIGR1cmluZyB0aGUgc2VhcmNoLgotICogQHJldHVybiBhbiBhcnJ5IG9mIHVwZGF0ZSBzZWFyY2ggcXVlcmllcwotICovCQotCUlVcGRhdGVTZWFyY2hRdWVyeSBbXSBnZXRRdWVyaWVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTZWFyY2hGaWx0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTcwYWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTZWFyY2hGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogQ2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgdGhlCi0gKiByZXN1bHRzIG9mIHRoZSB1cGRhdGUgc2VhcmNoLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVXBkYXRlU2VhcmNoRmlsdGVyIHsKLQkvKioKLQkgKiBUZXN0cyBhIGZlYXR1cmUgYWNjb3JkaW5nIHRvIHRoaXMgZmlsdGVyJ3MgY3JpdGVyaWEuCi0JICogQHBhcmFtIG1hdGNoIHRoZSBmZWF0dXJlIHRvIHRlc3QKLQkgKiBAcmV0dXJuIDxzYW1wPnRydWU8L3NhbXA+IGlmIHRoZSBmZWF0dXJlIGhhcyBiZWVuIGFjY2VwdGVkLCA8c2FtcD5mYWxzZTwvc2FtcD4gb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gYWNjZXB0KElGZWF0dXJlIG1hdGNoKTsKLQotCS8qKgotCSAqIFRlc3RzIGEgZmVhdHVyZSByZWZlcmVuY2UgYWNjb3JkaW5nIHRvIHRoaXMgZmlsdGVyJ3MgY3JpdGVyaWEuIAotCSAqIFRoaXMgaXMgYSBwcmVmaWx0ZXIgdGhhdCBhbGxvd3MgcmVqZWN0aW5nIGEgZmVhdHVyZSBiZWZvcmUgYSBwb3RlbnRpYWxseSBsZW5ndGh5IGRvd25sb2FkLgotCSAqIEBwYXJhbSBtYXRjaCB0aGUgZmVhdHVyZSByZWZlcmVuY2UgdG8gdGVzdAotCSAqIEByZXR1cm4gPHNhbXA+dHJ1ZTwvc2FtcD4gaWYgdGhlIGZlYXR1cmUgcmVmZXJlbmNlIGhhcyBiZWVuIGFjY2VwdGVkLCA8c2FtcD5mYWxzZTwvc2FtcD4gb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gYWNjZXB0KElGZWF0dXJlUmVmZXJlbmNlIG1hdGNoKTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoUXVlcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5Y2E5NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEEgc2VhcmNoIHF1ZXJ5LgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVTZWFyY2hRdWVyeSB7Ci0vKioKLSAqIFJldHVybnMgYW4gdXBkYXRlIHNpdGUgYWRhcHRlciB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgc2NvcGUKLSAqIHdoaWxlIHJ1bm5pbmcgdGhpcyBxdWVyeS4gU29tZSBzZWFyY2ggY2F0ZWdvcnkgbWF5IG5lZWQgdG8gCi0gKiBzY2FuIHNwZWNpZmljIHNpdGUgYWRhcHRlciBpbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQgaW4gCi0gKiB0aGUgc2VhcmNoIHNjb3BlLgotICogCi0gKiBAcmV0dXJuIHRoZSBxdWVyeS1zcGVjaWZpYyBzaXRlIGFkYXB0ZXIgb3IgPHNhbXA+bnVsbDwvc2FtcD4gaWYKLSAqIG5vdCBzcGVjaWZpZWQuCi0gKiAKLSAqLwotCXB1YmxpYyBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBnZXRRdWVyeVNlYXJjaFNpdGUoKTsKLQotLyoqCi0gKiBFeGVjdXRlcyB0aGUgcXVlcnkuIFRoZSBpbXBsZW1lbnRvcnMgc2hvdWxkIHNjYW4gdGhlIHByb3ZpZGVkCi0gKiB1cGRhdGUgc2l0ZSAoc2NpcHBpbmcgY2VydGFpbiBjYXRlZ29yaWVzIGlmIHByb3ZpZGVkKSBhbmQKLSAqIHBhc3MgdGhlIG1hdGNoZXMgdG8gdGhlIHJlc3VsdCBjb2xsZWN0b3IuIFRoZSBxdWVyeSBpcyBhbHNvCi0gKiByZXNwb25zaWJsZSBvZiBzY29waW5nIGFuZCBtb3ZpbmcgdGhlIHByb3ZpZGVkIHByb2dyZXNzIG1vbml0b3IuCi0gKiAKLSAqIEBwYXJhbSBzaXRlIHRoZSB1cGRhdGUgc2l0ZSB0byBzY2FuCi0gKiBAcGFyYW0gY2F0ZWdvcmllc1RvU2tpcCBhbiBhcnJheSBvZiBjYXRlZ29yeSBuYW1lcyB0aGF0IG5lZWQgdG8gYmUgc2tpcHBlZCBvciA8c2FtcD5udWxsPC9zYW1wPiBpZiBjYXRlZ29yaWVzIHNob3VsZCBub3QgYmUgdGFrZW4gaW50byBhY2NvdW50LgotICogQHBhcmFtIGZpbHRlciBhIGZpbHRlciB0byBhcHBseSBiZWZvcmUgcGFzc2luZyB0aGUgbWF0Y2ggdG8gY29sbGVjdG9yCi0gKiBAcGFyYW0gY29sbGVjdG9yIGFuIG9iamVjdCB0aGF0IGlzIHVzZWQgZm9yIHJlcG9ydGluZyBzZWFyY2ggcmVzdWx0cwotICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIHRvIHJlcG9ydCBzZWFyY2ggcHJvZ3Jlc3Mgd2l0aGluIHRoZSBwcm92aWRlZCBzaXRlCi0gKi8KLQlwdWJsaWMgdm9pZCBydW4oSVNpdGUgc2l0ZSwgU3RyaW5nIFtdIGNhdGVnb3JpZXNUb1NraXAsIElVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyLCBJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwYjFkNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBTZWFyY2ggcmVzdWx0cyBhcmUgY29sbGVjdGVkIGJ5IGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZQotICogYW5kIHBhc3NpbmcgaXQgdG8gdGhlIHNlYXJjaCByZXF1ZXN0LiBJZiB0aGUgaW1wbGVtZW50YXRpb24gaXMKLSAqIHZpc3VhbCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgbWF0Y2ggaXMgc2hvd24gYXMgc29vbgotICogYXMgaXQgaXMgY29sbGVjdGVkIChyYXRoZXIgdGhhbiBrZXB0IGluIGEgbGlzdCBhbmQgcHJlc2VudGVkCi0gKiBhdCB0aGUgZW5kIG9mIHRoZSBzZWFyY2gpLgotICAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciB7Ci0vKioKLSAqIENhbGxlZCB3aGVuIGEgbWF0Y2hpbmcgZmVhdHVyZSBoYXMgYmVlbiBmb3VuZCBkdXJpbmcKLSAqIHRoZSBzZWFyY2guCi0gKiBAcGFyYW0gbWF0Y2ggdGhlIG1hdGNoaW5nIGZlYXR1cmUKLSAqLwotICAgdm9pZCBhY2NlcHQoSUZlYXR1cmUgbWF0Y2gpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTZWFyY2hTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzYzYzguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTZWFyY2hTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2g7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byByZXByZXNlbnQgc2l0ZXMgdGhhdCBuZWVkIHRvIGJlCi0gKiBzZWFyY2hlZCB3aXRoaW4gdGhlIHNlYXJjaCBzY29wZS4gSW4gYWRkaXRpb24gdG8gYmVpbmcgYW4KLSAqIHVwZGF0ZSBzaXRlIGFkYXB0ZXIsIGl0IGFsc28gcmV0dXJucyBhbiBhcnJheSBvZiBjYXRlZ29yaWVzCi0gKiB3aXRoaW4gdGhlIHNpdGUgdGhhdCBuZWVkIG5vdCBiZSBzZWFyY2hlZCAoc2tpcHBpbmcgY2F0ZWdvcmllcwotICogbWFrZXMgdGhlIHNlYXJjaCBmYXN0ZXIgYmVjYXVzZSBmZXdlciBmZWF0dXJlcyBuZWVkIHRvCi0gKiBiZSBjaGVja2VkIGFuZCBwb3RlbnRpYWxseSBkb3dubG9hZGVkIGZyb20gdGhlIHNlcnZlcikuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVTZWFyY2hTaXRlIGV4dGVuZHMgSVVwZGF0ZVNpdGVBZGFwdGVyIHsKLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRlZ29yaWVzIHRoYXQgbmVlZCBub3QgYmUgc2VhcmNoZWQKLSAqIHdoZW4gc2Nhbm5pbmcgdGhpcyBzaXRlIG9yIDxzYW1wPm51bGw8L3NhbXA+IGlmIGFsbCB0aGUKLSAqIGZlYXR1cmVzIG11c3QgYmUgdGVzdGVkLgotICogQHJldHVybiBhbiBhcnJheSBvZiBjYXRlZ29yeSBuYW1lcyBvciA8c2FtcD5udWxsPC9zYW1wPiBpZgotICogYWxsIHRoZSBmZWF0dXJlcyBtdXN0IGJlIHRlc3RlZC4KLSAqLwotCVN0cmluZ1tdIGdldENhdGVnb3JpZXNUb1NraXAoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNpdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYWQ0ZjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTaXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSB3cmFwcyBhbiB1cGRhdGUgc2l0ZSBVUkwgYW5kIGFkZHMgCi0gKiBhIHByZXNlbnRhdGlvbiBsYWJlbC4gSXQgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSBzaXRlcyB0aGF0IG5lZWQKLSAqIHRvIGJlIHZpc2l0ZWQgZHVyaW5nIHRoZSB1cGRhdGUgc2VhcmNoLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVTaXRlQWRhcHRlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlc2VudGF0aW9uIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkCi0JICogZm9yIHRoaXMgc2l0ZS4KLQkgKiBAcmV0dXJuIHRoZSB1cGRhdGUgc2l0ZSBsYWJlbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgb2YgdGhlIHVwZGF0ZSBzaXRlLgotCSAqIEByZXR1cm4gdGhlIFVSTCBvZiB0aGUgdXBkYXRlIHNpdGUuCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvVXBkYXRlU2VhcmNoUmVxdWVzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL1VwZGF0ZVNlYXJjaFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiMDVmYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvVXBkYXRlU2VhcmNoUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2guVXBkYXRlUG9saWN5OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgY2VudHJhbCB0byB1cGRhdGUgc2VhcmNoLiBUaGUgc2VhcmNoIHBhdHRlcm4KLSAqIGlzIGVuY2Fwc3VsYXRlZCBpbiB1cGRhdGUgc2VhcmNoIGNhdGVnb3J5LCB3aGlsZSB0aGUgc2VhcmNoCi0gKiBzY29wZSBpcyBkZWZpbmVkIGluIHRoZSBzY29wZSBvYmplY3QuIFdoZW4gdGhlc2UgdHdvIG9iamVjdHMKLSAqIGFyZSBkZWZpbmVkIGFuZCBzZXQsIHNlYXJjaCBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSAKLSAqIHByb3ZpZGVkIG1ldGhvZC4gU2VhcmNoIHJlc3VsdHMgYXJlIHJlcG9ydGVkIHRvIHRoZQotICogcmVzdWx0IGNvbGxlY3Rvciwgd2hpbGUgc2VhcmNoIHByb2dyZXNzIGlzIHRyYWNrZWQgdXNpbmcKLSAqIHRoZSBwcm9ncmVzcyBtb25pdG9yLgotICogPHA+Q2xhc3NlcyB0aGF0IGltcGxlbWVudCA8c2FtcD5JVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yPC9zYW1wPgotICogc2hvdWxkIGNhbGwgJ2ZpbHRlcicgdG8gdGVzdCBpZiB0aGUgbWF0Y2ggc2hvdWxkIGJlCi0gKiBhY2NlcHRlZCBhY2NvcmRpbmcgdG8gdGhlIGZpbHRlcnMgYWRkZWQgdG8gdGhlIHJlcXVlc3QuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIFVwZGF0ZVNlYXJjaFNjb3BlCi0gKiBAc2VlIElVcGRhdGVTZWFyY2hDYXRlZ29yeQotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2VhcmNoUmVxdWVzdCB7Ci0JcHJpdmF0ZSBJVXBkYXRlU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0JcHJpdmF0ZSBVcGRhdGVTZWFyY2hTY29wZSBzY29wZTsKLQlwcml2YXRlIGJvb2xlYW4gc2VhcmNoSW5Qcm9ncmVzcyA9IGZhbHNlOwotCXByaXZhdGUgQWdncmVnYXRlRmlsdGVyIGFnZ3JlZ2F0ZUZpbHRlciA9IG5ldyBBZ2dyZWdhdGVGaWx0ZXIoKTsKLQotCWNsYXNzIEFnZ3JlZ2F0ZUZpbHRlciBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hGaWx0ZXIgewotCQlwcml2YXRlIEFycmF5TGlzdCBmaWx0ZXJzOwotCQlwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIpIHsKLQkJCWlmIChmaWx0ZXJzID09IG51bGwpCi0JCQkJZmlsdGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChmaWx0ZXJzLmNvbnRhaW5zKGZpbHRlcikgPT0gZmFsc2UpCi0JCQkJZmlsdGVycy5hZGQoZmlsdGVyKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyKElVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyKSB7Ci0JCQlpZiAoZmlsdGVycyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWZpbHRlcnMucmVtb3ZlKGZpbHRlcik7Ci0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KElGZWF0dXJlIG1hdGNoKSB7Ci0JCQlpZiAoZmlsdGVycyA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIgPSAoSVVwZGF0ZVNlYXJjaEZpbHRlcikgZmlsdGVycy5nZXQoaSk7Ci0JCQkJaWYgKGZpbHRlci5hY2NlcHQobWF0Y2gpID09IGZhbHNlKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KElGZWF0dXJlUmVmZXJlbmNlIG1hdGNoKSB7Ci0JCQlpZiAoZmlsdGVycyA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIgPSAoSVVwZGF0ZVNlYXJjaEZpbHRlcikgZmlsdGVycy5nZXQoaSk7Ci0JCQkJaWYgKGZpbHRlci5hY2NlcHQobWF0Y2gpID09IGZhbHNlKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvciB0aGF0IGFjY2VwdHMgdGhlIHNlYXJjaCBjYXRlZ29yeSBhbmQgCi0JICogc2NvcGUgb2JqZWN0cy4KLQkgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIGFjdHVhbCBzZWFyY2ggcGF0dGVybiB0aGF0IHNob3VsZCBiZSBhcHBsaWVkCi0JICogQHBhcmFtIHNjb3BlIGEgbGlzdCBvZiBzaXRlcyB0aGF0IG5lZWQgdG8gYmUgc2Nhbm5lZCBkdXJpbmcgdGhlIHNlYXJjaAotCSAqLwotCXB1YmxpYyBVcGRhdGVTZWFyY2hSZXF1ZXN0KAotCQlJVXBkYXRlU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnksCi0JCVVwZGF0ZVNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0JCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWFyY2ggY2F0YWdvcnkgdXNlZCBpbiB0aGlzIHJlcXVlc3QuCi0JICogQHJldHVybiB0aGUgc2VhcmNoIGNhdGVnb3J5Ci0JICovCi0JCi0JcHVibGljIElVcGRhdGVTZWFyY2hDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzY29wZSBvZiB0aGlzIHNlYXJjaCByZXF1ZXN0LgotCSAqIEByZXR1cm4gc2VhcmNoIHNjb3BlCi0JICovCi0JCi0JcHVibGljIFVwZGF0ZVNlYXJjaFNjb3BlIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCS8qKgotCSAqIEFkZHMgYSBmaWx0ZXIgdG8gdGhpcyByZXF1ZXN0LiBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcKLQkgKiBpZiBzZWFyY2ggaXMgYWxyYWR5IGluIHByb2dyZXNzLiAKLQkgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgCi0JICogQHNlZSBVcGRhdGVTZWFyY2hSZXF1ZXN0I3JlbW92ZUZpbHRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZpbHRlcihJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlcikgewotCQlpZiAoc2VhcmNoSW5Qcm9ncmVzcykKLQkJCXJldHVybjsKLQkJYWdncmVnYXRlRmlsdGVyLmFkZEZpbHRlcihmaWx0ZXIpOwotCX0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBmaWx0ZXIgZnJvbSB0aGlzIHJlcXVlc3QuIFRoaXMgbWV0aG9kIGRvZXMKLQkgKiBub3RoaW5nIGlmIHNlYXJjaCBpcyBhbHJhZHkgaW4gcHJvZ3Jlc3MuCi0JICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIHRvIHJlbW92ZQotCSAqIEBzZWUgVXBkYXRlU2VhcmNoUmVxdWVzdCNhZGRGaWx0ZXIKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZpbHRlcihJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlcikgewotCQlpZiAoc2VhcmNoSW5Qcm9ncmVzcykKLQkJCXJldHVybjsKLQkJYWdncmVnYXRlRmlsdGVyLnJlbW92ZUZpbHRlcihmaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNjb3BlIG9iamVjdC4gSXQgaXMgcG9zc2libGUgdG8gcmV1c2UgdGhlIHNlYXJjaCByZXF1ZXN0Ci0JICogb2JqZWN0IGJ5IG1vZGlmeWluZyB0aGUgc2NvcGUgYW5kIHJlLXJ1bm5pbmcgdGhlIHNlYXJjaC4KLQkgKiBAcGFyYW0gc2NvcGUgdGhlIG5ldyBzZWFyY2ggc2NvcGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShVcGRhdGVTZWFyY2hTY29wZSBzY29wZSkgewotCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhpcyBzZWFyY2ggcmVxdWVzdCBpcyBjdXJyZW50IHJ1bm5pbmcuCi0JICogQHJldHVybiA8c2FtcD50cnVlPC9zYW1wPiBpZiB0aGUgc2VhcmNoIGlzIGN1cnJlbnRseSBydW5uaW5nLCA8c2FtcD5mYWxzZTwvc2FtcD4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VhcmNoSW5Qcm9ncmVzcygpIHsKLQkJcmV0dXJuIHNlYXJjaEluUHJvZ3Jlc3M7Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgc2VhcmNoIHVzaW5nIHRoZSBjYXRlZ29yeSBhbmQgc2NvcGUgY29uZmlndXJlZCBpbnRvCi0JICogdGhpcyByZXF1ZXN0LiBBcyByZXN1bHRzIGFycml2ZSwgdGhleSBhcmUgcGFzc2VkIHRvIHRoZQotCSAqIHNlYXJjaCByZXN1bHQgY29sbGVjdG9yIG9iamVjdC4KLQkgKiBAcGFyYW0gY29sbGVjdG9yIG1hdGNoZWQgZmVhdHVyZXMgYXJlIHBhc3NlZCB0byB0aGlzIG9iamVjdAotCSAqIEBwYXJhbSBtb25pdG9yIHVzZWQgdG8gdHJhY2sgdGhlIHNlYXJjaCBwcm9ncmVzcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1TZWFyY2goCi0JCUlVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IHN0YXR1c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJc2VhcmNoSW5Qcm9ncmVzcyA9IHRydWU7Ci0JCUlVcGRhdGVTZWFyY2hRdWVyeVtdIHF1ZXJpZXMgPSBjYXRlZ29yeS5nZXRRdWVyaWVzKCk7Ci0JCUlVcGRhdGVTZWFyY2hTaXRlW10gY2FuZGlkYXRlcyA9IHNjb3BlLmdldFNlYXJjaFNpdGVzKCk7Ci0JCVVSTCB1cGRhdGVNYXBVUkwgPSBzY29wZS5nZXRVcGRhdGVNYXBVUkwoKTsKLQkJYm9vbGVhbiBzZWFyY2hGZWF0dXJlUHJvdmlkZWRTaXRlcyA9IHNjb3BlLmlzRmVhdHVyZVByb3ZpZGVkU2l0ZXNFbmFibGVkKCk7Ci0KLQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJaW50IG5zZWFyY2hzaXRlcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHF1ZXJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocXVlcmllc1tpXS5nZXRRdWVyeVNlYXJjaFNpdGUoKSAhPSBudWxsKQotCQkJCQluc2VhcmNoc2l0ZXMrKzsKLQkJCX0KLQkJCWludCBudGFza3MgPSBuc2VhcmNoc2l0ZXMgKyBxdWVyaWVzLmxlbmd0aCAqIGNhbmRpZGF0ZXMubGVuZ3RoOwotCQkJaWYgKHVwZGF0ZU1hcFVSTCE9bnVsbCkgbnRhc2tzKys7Ci0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKFBvbGljeS5iaW5kKCJVcGRhdGVTZWFyY2hSZXF1ZXN0LnNlYXJjaGluZyIpLCBudGFza3MpOyAvLyROT04tTkxTLTEkCi0KLQkJCXRyeSB7Ci0JCQkJVXBkYXRlUG9saWN5IHVwZGF0ZVBvbGljeT1udWxsOwotCQkJCWlmICh1cGRhdGVNYXBVUkwhPW51bGwpIHsKLQkJCQkJdXBkYXRlUG9saWN5ID0gbmV3IFVwZGF0ZVBvbGljeSgpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9bG9hZFVwZGF0ZVBvbGljeSh1cGRhdGVQb2xpY3ksIHVwZGF0ZU1hcFVSTCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQkJCXN0YXR1c0xpc3QuYWRkKHN0YXR1cyk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcXVlcmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlJVXBkYXRlU2VhcmNoUXVlcnkgcXVlcnkgPSBxdWVyaWVzW2ldOwotCQkJCQlJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBxc2l0ZSA9IHF1ZXJ5LmdldFF1ZXJ5U2VhcmNoU2l0ZSgpOwotCQkJCQlpZiAocXNpdGUgIT0gbnVsbCAmJiBzZWFyY2hGZWF0dXJlUHJvdmlkZWRTaXRlcykgewotCQkJCQkJLy8gY2hlY2sgZm9yIG1hcHBpbmcKLQkJCQkJCUlVcGRhdGVTaXRlQWRhcHRlciBtYXBwZWRTaXRlID0gZ2V0TWFwcGVkU2l0ZSh1cGRhdGVQb2xpY3ksIHFzaXRlKTsKLQkJCQkJCS8vIHdoZW4gdGhlcmUgaXMgbm8gbWFwcGVkIHNpdGUgdGhlIGZlYXR1cmUgaXMgbm90IHVwZGF0YWJsZQotCQkJCQkJaWYgKG1hcHBlZFNpdGUgPT0gbnVsbCB8fCBtYXBwZWRTaXRlLmdldFVSTCgpID09IG51bGwpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9Ci0JCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKTsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQkJCQlzZWFyY2hPbmVTaXRlKAotCQkJCQkJCQltYXBwZWRTaXRlLAotCQkJCQkJCQludWxsLAotCQkJCQkJCQlxdWVyeSwKLQkJCQkJCQkJY29sbGVjdG9yLAotCQkJCQkJCQlzdWJNb25pdG9yKTsKLQkJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQkJCQlzdGF0dXNMaXN0LmFkZChzdGF0dXMpOwotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlJVXBkYXRlU2VhcmNoU2l0ZSBzb3VyY2UgPSBjYW5kaWRhdGVzW2pdOwotCQkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPQotCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJCQkJc2VhcmNoT25lU2l0ZSgKLQkJCQkJCQkJc291cmNlLAotCQkJCQkJCQlzb3VyY2UuZ2V0Q2F0ZWdvcmllc1RvU2tpcCgpLAotCQkJCQkJCQlxdWVyeSwKLQkJCQkJCQkJY29sbGVjdG9yLAotCQkJCQkJCQlzdWJNb25pdG9yKTsKLQkJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQkJCQlzdGF0dXNMaXN0LmFkZChzdGF0dXMpOwotCQkJCQl9Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXNlYXJjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQl9Ci0JCXNlYXJjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJbW9uaXRvci5kb25lKCk7Ci0KLQkJaWYgKHN0YXR1c0xpc3Quc2l6ZSgpID4gMCkgewotCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0KLQkJCQkoSVN0YXR1c1tdKSBzdGF0dXNMaXN0LnRvQXJyYXkobmV3IElTdGF0dXNbc3RhdHVzTGlzdC5zaXplKCldKTsKLQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0KLQkJCQluZXcgTXVsdGlTdGF0dXMoCi0JCQkJCSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OLAotCQkJCQljaGlsZHJlbiwKLQkJCQkJUG9saWN5LmJpbmQoIlNlYXJjaC5uZXR3b3JrUHJvYmxlbXMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG11bHRpU3RhdHVzKTsKLQkJfQotCX0KLQotLyoKLSAqIExvYWQgdGhlIHVwZGF0ZSBtYXAgdXNpbmcgdGhlIG1hcCBVUkwgZm91bmQgaW4gdGhlIHNjb3BlLgotICovCQotCXByaXZhdGUgSVN0YXR1cyBsb2FkVXBkYXRlUG9saWN5KFVwZGF0ZVBvbGljeSBtYXAsIFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yLnN1YlRhc2soUG9saWN5LmJpbmQoIlVwZGF0ZVNlYXJjaFJlcXVlc3QubG9hZGluZ1BvbGljeSIpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJbWFwLmxvYWQodXJsLCBtb25pdG9yKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbAotCQkJCXx8IHN0YXR1cy5nZXRDb2RlKCkgIT0gSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OKQotCQkJCXRocm93IGU7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotLyoKLSAqIFNlZSBpZiB0aGlzIHF1ZXJ5IHNpdGUgYWRhcHRlciBpcyBtYXBwZWQgaW4gdGhlIG1hcCBmaWxlCi0gKiB0byBhIGRpZmZlcmVudCBVUkwuCi0gKi8KLQlwcml2YXRlIElVcGRhdGVTaXRlQWRhcHRlciBnZXRNYXBwZWRTaXRlKFVwZGF0ZVBvbGljeSBwb2xpY3ksIElRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyIHFzaXRlKSB7Ci0JCWlmIChwb2xpY3khPW51bGwgJiYgcG9saWN5LmlzTG9hZGVkKCkpIHsKLQkJCUlVcGRhdGVTaXRlQWRhcHRlciBtYXBwZWRTaXRlID0gcG9saWN5LmdldE1hcHBlZFNpdGUocXNpdGUuZ2V0TWFwcGluZ0lkKCkpOwotCQkJaWYgKG1hcHBlZFNpdGUhPW51bGwpIHJldHVybiBtYXBwZWRTaXRlOwotCQkJLy8gbm8gbWF0Y2ggLSB1c2Ugb3JpZ2luYWwgc2l0ZSBpZiBmYWxsYmFjayBhbGxvd2VkLCBvciBub3RoaW5nLgotCQkJcmV0dXJuIHBvbGljeS5pc0ZhbGxiYWNrQWxsb3dlZCgpPyBxc2l0ZSA6IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHFzaXRlOwotCX0KLQotLyoKLSAqIFNlYXJjaCBvbmUgc2l0ZSB1c2luZyB0aGUgcHJvdmlkZWQgcXVlcnkuCi0gKi8KLQlwcml2YXRlIElTdGF0dXMgc2VhcmNoT25lU2l0ZSgKLQkJSVVwZGF0ZVNpdGVBZGFwdGVyIHNpdGVBZGFwdGVyLAotCQlTdHJpbmdbXSBjYXRlZ29yaWVzVG9Ta2lwLAotCQlJVXBkYXRlU2VhcmNoUXVlcnkgcXVlcnksCi0JCUlVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yLAotCQlTdWJQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdGV4dCA9IFBvbGljeS5iaW5kKCJVcGRhdGVTZWFyY2hSZXF1ZXN0LmNvbnRhY3RpbmciKSArIHNpdGVBZGFwdGVyLmdldExhYmVsKCkgKyAiLi4uIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1vbml0b3Iuc3ViVGFzayh0ZXh0KTsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwKTsgLy8kTk9OLU5MUy0xJAotCQlVUkwgc2l0ZVVSTCA9IHNpdGVBZGFwdGVyLmdldFVSTCgpOwotCi0JCUlTaXRlIHNpdGU7Ci0JCXRyeSB7Ci0JCQlzaXRlID0KLQkJCQlTaXRlTWFuYWdlci5nZXRTaXRlKAotCQkJCQlzaXRlVVJMLAotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUZXN0IHRoZSBleGNlcHRpb24uIElmIHRoZSBleGNlcHRpb24gaXMKLQkJCS8vIGR1ZSB0byB0aGUgc2l0ZSBjb25uZWN0aW9uIHByb2JsZW1zLAotCQkJLy8gYWxsb3cgdGhlIHNlYXJjaCB0byBtb3ZlIG9uIHRvIAotCQkJLy8gdGhlIG5leHQgc2l0ZS4gT3RoZXJ3aXNlLAotCQkJLy8gcmV0aHJvdyB0aGUgZXhjZXB0aW9uLCBjYXVzaW5nIHRoZSBzZWFyY2gKLQkJCS8vIHRvIHRlcm1pbmF0ZS4KLQkJCUlTdGF0dXMgc3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbCkKLS8vCQkJCXx8IHN0YXR1cy5nZXRDb2RlKCkgIT0gSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OKQotCQkJCXRocm93IGU7Ci0JCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCS8vIElmIGZyb3plbiBjb25uZWN0aW9uIHdhcyBjYW5jZWxlZCwgdGhlcmUgd2lsbCBiZSBubyBzaXRlLgotCQlpZiAoc2l0ZSA9PSBudWxsKSB7Ci0JCQltb25pdG9yLndvcmtlZCg5KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdGV4dCA9IFBvbGljeS5iaW5kKCJVcGRhdGVTZWFyY2hSZXF1ZXN0LmNoZWNraW5nIikgKyBzaXRlQWRhcHRlci5nZXRMYWJlbCgpICsgIi4uLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltb25pdG9yLmdldFdyYXBwZWRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKHRleHQpOwotCi0JCXF1ZXJ5LnJ1bigKLQkJCXNpdGUsCi0JCQljYXRlZ29yaWVzVG9Ta2lwLAotCQkJYWdncmVnYXRlRmlsdGVyLAotCQkJY29sbGVjdG9yLAotCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA5KSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvVXBkYXRlU2VhcmNoU2NvcGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9VcGRhdGVTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE5OGM1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9VcGRhdGVTZWFyY2hTY29wZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdXBkYXRlIHNjb3BlIG9mIHRoZSB1cGRhdGUgc2VhcmNoLgotICogU2l0ZXMgdGhhdCBuZWVkIHRvIGJlIHZpc2l0ZWQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBzY29wZS4KLSAqIElmIHNvbWUgY2F0ZWdvcmllcyBzaG91bGQgYmUgc2tpcHBlZCwgdGhlaXIgbmFtZXMgbXVzdCBiZQotICogcGFzc2VkIGFzIGFycmF5IG9mIHN0cmluZ3MgdG8gdGhlIG1ldGhvZC4KLSAqCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBVcGRhdGVTZWFyY2hSZXF1ZXN0Ci0gKiBAc2luY2UgMy4wCi0gKi8KLQotcHVibGljIGNsYXNzIFVwZGF0ZVNlYXJjaFNjb3BlIHsKLQlwcml2YXRlIFZlY3RvciBzaXRlczsKLQlwcml2YXRlIFVSTCB1cGRhdGVNYXBVUkw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRmVhdHVyZVByb3ZpZGVkU2l0ZXNFbmFibGVkID0gdHJ1ZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBVcGRhdGVTZWFyY2hTaXRlCi0JCWV4dGVuZHMgVXBkYXRlU2l0ZUFkYXB0ZXIKLQkJaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoU2l0ZSB7Ci0JCXByaXZhdGUgU3RyaW5nW10gY2F0ZWdvcmllc1RvU2tpcDsKLQotCQlwdWJsaWMgVXBkYXRlU2VhcmNoU2l0ZSgKLQkJCVN0cmluZyBsYWJlbCwKLQkJCVVSTCBzaXRlVVJMLAotCQkJU3RyaW5nW10gY2F0ZWdvcmllc1RvU2tpcCkgewotCQkJc3VwZXIobGFiZWwsIHNpdGVVUkwpOwotCQkJdGhpcy5jYXRlZ29yaWVzVG9Ta2lwID0gY2F0ZWdvcmllc1RvU2tpcDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2F0ZWdvcmllc1RvU2tpcCgpIHsKLQkJCXJldHVybiBjYXRlZ29yaWVzVG9Ta2lwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVwZGF0ZVNlYXJjaFNjb3BlKCkgewotCQlzaXRlcyA9IG5ldyBWZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcHRpb25hbCBVUkwgb2YgdGhlIHVwZGF0ZSBtYXAgZmlsZS4gVGhpcyBmaWxlCi0JICogaXMgdXNlZCB0byByZWRpcmVjdCBzZWFyY2ggZm9yIG5ldyB1cGRhdGVzIHRvIG90aGVyCi0JICogc2VydmVycyBhbmQgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBhIGxvY2FsCi0JICogdXBkYXRlIHNpdGUgcHJveHkgKHBvc3NpYmx5IGJlaGluZCB0aGUgZmlyZXdhbGwpIGlzCi0JICogc2V0IHVwLgotCSAqIEBwYXJhbSB1cmwgdGhlIHVybCBvZiB0aGUgSmF2YSBwcm9wZXJ0aWVzIGZpbGUgdGhhdAotCSAqIGNvbnRhaW5zIHRoZSByZWRpcmVjdGlvbiBpbmZvcm1hdGlvbi4KLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVNYXBVUkwoVVJMIHVybCkgewotCQl0aGlzLnVwZGF0ZU1hcFVSTCA9IHVybDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3B0aW9uYWwgVVJMIG9mIHRoZSB1cGRhdGUgbWFwIGZpbGUuIEJ5IAotCSAqIGRlZmF1bHQsIG5vIG1hcCBmaWxlIGlzIHNldC4KLQkgKiBAcmV0dXJuIHRoZSBVUkwgb2YgdGhlIG1hcCBmaWxlIG9yIDxzYW1wPm51bGw8L3NhbXA+Ci0JICogaWYgbm90IHNldC4KLQkgKi8KLQkKLQlwdWJsaWMgVVJMIGdldFVwZGF0ZU1hcFVSTCgpIHsKLQkJcmV0dXJuIHVwZGF0ZU1hcFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBzaXRlIHRvIHNjYW4gdG8gdGhlIHNlYXJjaCBzY29wZS4KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIHByZXNlbnRhdGlvbiBuYW1lIG9mIHRoZSBzaXRlIHRvIHZpc2l0LgotCSAqIEBwYXJhbSBzaXRlVVJMIHRoZSBVUkwgb2YgdGhlIHNpdGUgdG8gdmlzaXQuCi0JICogQHBhcmFtIGNhdGVnb3JpZXNUb1NraXAgYW4gYXJyYXkgb2YgY2F0ZWdvcnkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2tpcHBlZCBvciA8c2FtcD5udWxsPC9zYW1wPiBpZiBhbGwgZmVhdHVyZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VhcmNoU2l0ZSgKLQkJU3RyaW5nIGxhYmVsLAotCQlVUkwgc2l0ZVVSTCwKLQkJU3RyaW5nW10gY2F0ZWdvcmllc1RvU2tpcCkgewotCQlzaXRlcy5hZGQobmV3IFVwZGF0ZVNlYXJjaFNpdGUobGFiZWwsIHNpdGVVUkwsIGNhdGVnb3JpZXNUb1NraXApKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXRlcyB0aGF0IHNob3VsZCBiZSB2aXNpdGVkIGR1cmluZyB0aGUgc2VhcmNoLgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc2l0ZSBhZGFwdGVycwotCSAqLwotCXB1YmxpYyBJVXBkYXRlU2VhcmNoU2l0ZVtdIGdldFNlYXJjaFNpdGVzKCkgewotCQlyZXR1cm4gKFVwZGF0ZVNlYXJjaFNpdGVbXSkgc2l0ZXMudG9BcnJheSgKLQkJCW5ldyBVcGRhdGVTZWFyY2hTaXRlW3NpdGVzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBJbiBhZGRpdGlvbiB0byB0aGUgc2l0ZXMgYWRkZWQgYnkgYWRkU2VhcmNoU2l0ZSgpLCBmZWF0dXJlcyBjb250cmlidXRlIHRoZWlyIG93biB1cGRhdGUgdXJsJ3MuCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRob3NlIHNpdGVzIGFyZSBhbHNvIHNlYXJjaGVkLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB1cGRhdGUgc2l0ZSBwcm92aWRlZCBieSBmZWF0dXJlcyBhcmUgYWxzbyBzZWFyY2hlZC4gRGVmYXVsdCBpcyB0cnVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmVhdHVyZVByb3ZpZGVkU2l0ZXNFbmFibGVkKCl7Ci0JCXJldHVybiBpc0ZlYXR1cmVQcm92aWRlZFNpdGVzRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgb3IgZGlzYWJsZSBzZWFyY2hpbmcgb2YgZmVhdHVyZSBwcm92aWRlZCB1cGRhdGUgc2l0ZXMuIAotCSAqIElmIGRpc2FibGVkLCBvbmx5IHNpdGVzIGFkZGVkIGJ5IGFkZFNlYXJjaFNpdGUoKSBhcmUgc2VhcmNoZWQuCi0JICogQHBhcmFtIGVuYWJsZSBmYWxzZSB0byBkaXNhYmxlIHNlYXJjaGluZyBvZiBmZWF0dXJlIHByb3ZpZGVkIHNpdGVzLiBCeSBkZWZhdWx0LCB0aGVzZSBzaXRlcyBhcmUgc2VhcmNoZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVByb3ZpZGVkU2l0ZXNFbmFibGVkKGJvb2xlYW4gZW5hYmxlKXsKLQkJdGhpcy5pc0ZlYXR1cmVQcm92aWRlZFNpdGVzRW5hYmxlZCA9IGVuYWJsZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL1ZlcnNpb25lZElkZW50aWZpZXJzRmlsdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvVmVyc2lvbmVkSWRlbnRpZmllcnNGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1YWQwZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvVmVyc2lvbmVkSWRlbnRpZmllcnNGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIGFkZGVkIHRvIHRoZSB1cGRhdGUgc2VhcmNoIHJlcXVlc3QKLSAqIHRvIGZpbHRlciBvdXQgZmVhdHVyZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHNwZWNpZmllZCBzZXQuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIFVwZGF0ZVNlYXJjaFJlcXVlc3QKLSAqIEBzZWUgSVVwZGF0ZVNlYXJjaEZpbHRlcgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVmVyc2lvbmVkSWRlbnRpZmllcnNGaWx0ZXIgZXh0ZW5kcyBCYXNlRmlsdGVyIHsKLQlwcml2YXRlIEFycmF5TGlzdCB2aWRzOwotCQotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyc0ZpbHRlcigpIHsKLQkJdGhpcyhuZXcgVmVyc2lvbmVkSWRlbnRpZmllclswXSk7Ci0JfQotCQotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyc0ZpbHRlcihWZXJzaW9uZWRJZGVudGlmaWVyW10gdmlkcykgewotCQl0aGlzLnZpZHMgPSBuZXcgQXJyYXlMaXN0KHZpZHMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHZpZHMubGVuZ3RoOyBpKyspCi0JCQl0aGlzLnZpZHMuYWRkKHZpZHNbaV0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQpIHsKLQkJdmlkcy5hZGQodmlkKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElGZWF0dXJlUmVmZXJlbmNlIG1hdGNoKSB7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8dmlkcy5zaXplKCk7IGkrKykgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gKFZlcnNpb25lZElkZW50aWZpZXIpdmlkcy5nZXQoaSk7Ci0JCQkJLy8gaW5zdGFsbGVkIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIG1hdGNoIC0gYWNjZXB0Ci0JCQkJaWYgKHZpZC5lcXVhbHMobWF0Y2guZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL3BhY2thZ2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZThmMjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydCBmb3IgcGVyZm9ybWluZyBzZWFyY2hlcyBhbmQgZmlsdGVyaW5nIG9mIGZlYXR1cmVzLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLVRoaXMgcGFja2FnZSBjb250YWlucyBpbnRlcmZhY2VzIGFuZCBoZWxwZXIgY2xhc3NlcyBmb3IgY3JlYXRpbmcgYW5kIGV4ZWN1dGluZyBzZWFyY2ggb3BlcmF0aW9ucy4gCi0KLTxwPgotPGI+Tm90ZTo8L2I+IFRoaXMgcGFja2FnZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi1jaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLWZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0ocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9BZGRTaXRlQ29tbWFuZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9BZGRTaXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2VmNzU3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvQWRkU2l0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIEFkZHMgYSBuZXcgc2l0ZS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRTaXRlQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7Ci0JcHJpdmF0ZSBJU2l0ZSBzaXRlOwotCXByaXZhdGUgRmlsZSBzaXRlUGF0aDsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZnJvbVNpdGUgaWYgc3BlY2lmaWVkLCBsaXN0IG9ubHkgdGhlIGZlYXR1cmVzIGZyb20gdGhlIHNwZWNpZmllZCBsb2NhbCBpbnN0YWxsIHNpdGUKLQkgKi8KLQlwdWJsaWMgQWRkU2l0ZUNvbW1hbmQoU3RyaW5nIGZyb21TaXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChmcm9tU2l0ZSAhPSBudWxsKSB7Ci0JCQkJc2l0ZVBhdGggPSBuZXcgRmlsZShmcm9tU2l0ZSk7Ci0JCQkJaWYgKCFzaXRlUGF0aC5leGlzdHMoKSkKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub1NpdGUiKSArIGZyb21TaXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQlVUkwgZnJvbVNpdGVVUkwgPSBzaXRlUGF0aC50b1VSTCgpOwotCQkJCXNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKGZyb21TaXRlVVJMLCBudWxsKTsKLQkJCQlpZiAoc2l0ZSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9TaXRlIikgKyBmcm9tU2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpZiAoY3NpdGUgIT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5zaXRlQ29uZmlndXJlZCIpICsgZnJvbVNpdGUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9TaXRlMyIpICk7IC8vJE5PTi1OTFMtMSQKLQkJCX0JCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSAKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZSBjb25maWcgZmlsZSBoYXMgYmVlbiBtb2RpZmVkIHdoaWxlIHdlIHdlcmUgcnVubmluZwotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKHN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChzaXRlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJdHJ5IHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGdldENvbmZpZ3VyYXRpb24oKS5jcmVhdGVDb25maWd1cmVkU2l0ZShzaXRlUGF0aCk7Ci0JCQlnZXRDb25maWd1cmF0aW9uKCkuYWRkQ29uZmlndXJlZFNpdGUoY3NpdGUpOwotCQkJLy8gdXBkYXRlIHRoZSBzaXRlcyBhcnJheSB0byBwaWNrIHVwIG5ldyBzaXRlCi0JCQlnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvQ21kTGluZUFyZ3MuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvQ21kTGluZUFyZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3YmI5OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0NtZExpbmVBcmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZTsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5taXJyb3IuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdXBkYXRlIHN0YW5kYWxvbmUgY29tbWFuZHMKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDbWRMaW5lQXJncyB7Ci0JcHJpdmF0ZSBIYXNoTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCXB1YmxpYyBDbWRMaW5lQXJncyhTdHJpbmdbXSBhcmdzKSB7Ci0vLwkJLy8gZGVmYXVsdCBjb21tYW5kCi0vLwkJb3B0aW9ucy5wdXQoIi1jb21tYW5kIiwgImluc3RhbGwiKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlpZiAoIi1jb21tYW5kIi5lcXVhbHMoYXJnc1tpXSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpc1ZhbGlkQ29tbWFuZChhcmdzW2kgKyAxXSkpIHsKLQkJCQkJb3B0aW9ucy5wdXQoIi1jb21tYW5kIiwgYXJnc1tpICsgMV0pOyAvLyROT04tTkxTLTEkCi0JCQkJCWkrKzsKLQkJCQl9IGVsc2UgewotCQkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQkJCVVwZGF0ZUNvcmUubG9nKAotCQkJCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCQkJUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuaW52YWxpZENtZCIpICsgYXJnc1tpICsgMV0sIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQludWxsKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNWYWxpZFBhcmFtKGFyZ3NbaV0pKSB7Ci0JCQkJb3B0aW9ucy5wdXQoYXJnc1tpXSwgYXJnc1tpICsgMV0pOwotCQkJCWkrKzsKLQkJCX0KLQkJCS8vIC10byBzaG91bGQgc3BlY2lmeSBhIGRpcmVjdG9yeQotCQkJLy8gaWYgLXRvIHNwZWNpZmllcyBmaWxlIFVSTCwgY2hhbmdlIGl0IHRvIGEgZGlyZWN0b3J5Ci0JCQlTdHJpbmcgdG8gPSAoU3RyaW5nKSBvcHRpb25zLmdldCgiLXRvIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICh0byAhPSBudWxsICYmIHRvLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHRvKTsKLQkJCQkJb3B0aW9ucy5wdXQoIi10byIsIHVybC5nZXRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUGFyYW0oU3RyaW5nIHBhcmFtKSB7Ci0JCXJldHVybiBwYXJhbS5lcXVhbHMoIi1jb21tYW5kIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgcGFyYW0uZXF1YWxzKCItdmVyc2lvbiIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IHBhcmFtLmVxdWFscygiLXRvIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgcGFyYW0uZXF1YWxzKCItZnJvbSIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IHBhcmFtLmVxdWFscygiLWZlYXR1cmVJZCIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IHBhcmFtLmVxdWFscygiLXZlcmlmeU9ubHkiKSAvLyROT04tTkxTLTEkCi0JCQl8fCBwYXJhbS5lcXVhbHMoIi1taXJyb3JVUkwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkQ29tbWFuZChTdHJpbmcgY21kKSB7Ci0JCWlmIChjbWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIGNtZC5lcXVhbHMoImluc3RhbGwiKSAvLyROT04tTkxTLTEkCi0JCQl8fCBjbWQuZXF1YWxzKCJlbmFibGUiKSAvLyROT04tTkxTLTEkCi0JCQl8fCBjbWQuZXF1YWxzKCJkaXNhYmxlIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgY21kLmVxdWFscygic2VhcmNoIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgY21kLmVxdWFscygidXBkYXRlIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgY21kLmVxdWFscygibWlycm9yIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgY21kLmVxdWFscygidW5pbnN0YWxsIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgY21kLmVxdWFscygibGlzdEZlYXR1cmVzIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgY21kLmVxdWFscygiYWRkU2l0ZSIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IGNtZC5lcXVhbHMoInJlbW92ZVNpdGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTY3JpcHRlZENvbW1hbmQgZ2V0Q29tbWFuZCgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBjbWQgPSAoU3RyaW5nKSBvcHRpb25zLmdldCgiLWNvbW1hbmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNtZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGNtZC5lcXVhbHMoImluc3RhbGwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgSW5zdGFsbENvbW1hbmQoCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItZmVhdHVyZUlkIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi12ZXJzaW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi1mcm9tIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi10byIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdmVyaWZ5T25seSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoY21kLmVxdWFscygiZW5hYmxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IEVuYWJsZUNvbW1hbmQoCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItZmVhdHVyZUlkIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi12ZXJzaW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi10byIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdmVyaWZ5T25seSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoY21kLmVxdWFscygiZGlzYWJsZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBEaXNhYmxlQ29tbWFuZCgKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi1mZWF0dXJlSWQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLXZlcnNpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLXRvIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi12ZXJpZnlPbmx5IikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChjbWQuZXF1YWxzKCJzZWFyY2giKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgU2VhcmNoQ29tbWFuZCgoU3RyaW5nKSBvcHRpb25zLmdldCgiLWZyb20iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKGNtZC5lcXVhbHMoInVwZGF0ZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBVcGRhdGVDb21tYW5kKAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLWZlYXR1cmVJZCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdmVyc2lvbiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdmVyaWZ5T25seSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoY21kLmVxdWFscygibWlycm9yIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IE1pcnJvckNvbW1hbmQoCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItZmVhdHVyZUlkIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi12ZXJzaW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi1mcm9tIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi10byIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItbWlycm9yVVJMIikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChjbWQuZXF1YWxzKCJ1bmluc3RhbGwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgVW5pbnN0YWxsQ29tbWFuZCgKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi1mZWF0dXJlSWQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLXZlcnNpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLXRvIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi12ZXJpZnlPbmx5IikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChjbWQuZXF1YWxzKCJsaXN0RmVhdHVyZXMiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgTGlzdEZlYXR1cmVzQ29tbWFuZCgoU3RyaW5nKSBvcHRpb25zLmdldCgiLWZyb20iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKGNtZC5lcXVhbHMoImFkZFNpdGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgQWRkU2l0ZUNvbW1hbmQoKFN0cmluZykgb3B0aW9ucy5nZXQoIi1mcm9tIikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChjbWQuZXF1YWxzKCJyZW1vdmVTaXRlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IFJlbW92ZVNpdGVDb21tYW5kKChTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdG8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvRGlzYWJsZUNvbW1hbmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvRGlzYWJsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0Zjc4Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0Rpc2FibGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIENvbW1hbmQgdG8gZGlzYWJsZSAodW5jb25maWd1cmUpIGEgZmVhdHVyZQotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2FibGVDb21tYW5kIGV4dGVuZHMgU2NyaXB0ZWRDb21tYW5kIHsKLQotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGU7Ci0JcHJpdmF0ZSBJRmVhdHVyZSBmZWF0dXJlOwotCi0JcHVibGljIERpc2FibGVDb21tYW5kKAotCQlTdHJpbmcgZmVhdHVyZUlkLAotCQlTdHJpbmcgdmVyc2lvbiwKLQkJU3RyaW5nIHRvU2l0ZSwKLQkJU3RyaW5nIHZlcmlmeU9ubHkpCi0JCXRocm93cyBFeGNlcHRpb24gewotCi0JCXN1cGVyKHZlcmlmeU9ubHkpOwotCi0JCXRyeSB7Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQotCQkJLy8gR2V0IHNpdGUgY29udGFpbmluZyB0aGUgZmVhdHVyZSB0byBkaXNhYmxlCi0JCQlpZiAodG9TaXRlICE9IG51bGwpIHsKLQkJCQlVUkwgdG9TaXRlVVJMID0gbmV3IEZpbGUodG9TaXRlKS50b1VSTCgpOwotCQkJCWlmIChTaXRlTWFuYWdlci5nZXRTaXRlKHRvU2l0ZVVSTCwgbnVsbCkgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vU2l0ZSIpICsgdG9TaXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0YXJnZXRTaXRlID0KLQkJCQkJU2l0ZU1hbmFnZXIKLQkJCQkJCS5nZXRTaXRlKHRvU2l0ZVVSTCwgbnVsbCkKLQkJCQkJCS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJCX0KLQkJCWlmICh0YXJnZXRTaXRlID09IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzaXRlc1tpXS5pc1Byb2R1Y3RTaXRlKCkpIHsKLQkJCQkJCXRhcmdldFNpdGUgPSBzaXRlc1tpXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0KLQkJCQlVcGRhdGVVdGlscy5zZWFyY2hTaXRlKGZlYXR1cmVJZCwgdGFyZ2V0U2l0ZSwgdHJ1ZSk7Ci0JCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9GZWF0dXJlczMiLCBmZWF0dXJlSWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHZlcnNpb24gPT0gbnVsbCB8fCB2ZXJzaW9uLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCWZlYXR1cmUgPSBmZWF0dXJlc1swXTsgLy8gcGljayB0aGUgZmlyc3QgZmVhdHVyZQotCQkJZWxzZQotCQkJCWZvciAoaW50IGkgPSAwOyBmZWF0dXJlcyAhPSBudWxsICYmIGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZmVhdHVyZXNbaV0KLQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCS5nZXRWZXJzaW9uKCkKLQkJCQkJCS50b1N0cmluZygpCi0JCQkJCQkuZXF1YWxzKHZlcnNpb24pKSB7Ci0JCQkJCQlmZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vRmVhdHVyZXM0IiwgZmVhdHVyZUlkLCB2ZXJzaW9uKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBjaGVjayBpZiB0aGUgY29uZmlnIGZpbGUgaGFzIGJlZW4gbW9kaWZlZCB3aGlsZSB3ZSB3ZXJlIHJ1bm5pbmcKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhzdGF0dXMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpc1ZlcmlmeU9ubHkoKSkgewotCQkJc3RhdHVzID0KLQkJCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdVbmNvbmZpZygKLQkJCQkJZmVhdHVyZSk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQkJVXBkYXRlQ29yZS5sb2coc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuV0FSTklORzsKLQkJfQotCi0JCWZpbmFsIElVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gY29uZmlnT3BlcmF0aW9uID0KLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKS5jcmVhdGVVbmNvbmZpZ09wZXJhdGlvbigKLQkJCQl0YXJnZXRTaXRlLAotCQkJCWZlYXR1cmUpOwotCi0JCXRyeSB7Ci0JCQljb25maWdPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCB0aGlzKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0VuYWJsZUNvbW1hbmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvRW5hYmxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTg3YmViLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvRW5hYmxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGVuYWJsZSAoY29uZmlndXJlKSBhIGZlYXR1cmUuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRW5hYmxlQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlOwotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZTsKLQotCXB1YmxpYyBFbmFibGVDb21tYW5kKAotCQlTdHJpbmcgZmVhdHVyZUlkLAotCQlTdHJpbmcgdmVyc2lvbiwKLQkJU3RyaW5nIHRvU2l0ZSwKLQkJU3RyaW5nIHZlcmlmeU9ubHkpCi0JCXRocm93cyBFeGNlcHRpb24gewotCi0JCXN1cGVyKHZlcmlmeU9ubHkpOwotCi0JCXRyeSB7Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQotCQkJLy8gR2V0IHNpdGUgdG8gZW5hYmxlIHRvCi0JCQlpZiAodG9TaXRlICE9IG51bGwpIHsKLQkJCQlVUkwgdG9TaXRlVVJMID0gbmV3IEZpbGUodG9TaXRlKS50b1VSTCgpOwotCQkJCWlmIChTaXRlTWFuYWdlci5nZXRTaXRlKHRvU2l0ZVVSTCwgbnVsbCkgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vU2l0ZSIpICsgdG9TaXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0YXJnZXRTaXRlID0KLQkJCQkJU2l0ZU1hbmFnZXIKLQkJCQkJCS5nZXRTaXRlKHRvU2l0ZVVSTCwgbnVsbCkKLQkJCQkJCS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJCX0KLQkJCWlmICh0YXJnZXRTaXRlID09IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzaXRlc1tpXS5pc1Byb2R1Y3RTaXRlKCkpIHsKLQkJCQkJCXRhcmdldFNpdGUgPSBzaXRlc1tpXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0KLQkJCQlVcGRhdGVVdGlscy5zZWFyY2hTaXRlKGZlYXR1cmVJZCwgdGFyZ2V0U2l0ZSwgZmFsc2UpOwotCQkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vRmVhdHVyZXMxIiwgZmVhdHVyZUlkKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICh2ZXJzaW9uID09IG51bGwgfHwgdmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQlmZWF0dXJlID0gZmVhdHVyZXNbMF07IC8vIHBpY2sgdGhlIGZpcnN0IGZlYXR1cmUKLQkJCWVsc2UKLQkJCQlmb3IgKGludCBpID0gMDsgZmVhdHVyZXMgIT0gbnVsbCAmJiBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGZlYXR1cmVzW2ldCi0JCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCQkudG9TdHJpbmcoKQotCQkJCQkJLmVxdWFscyh2ZXJzaW9uKQotCQkJCQkJJiYgIXRhcmdldFNpdGUuaXNDb25maWd1cmVkKGZlYXR1cmVzW2ldKSkgewotCQkJCQkJZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub0ZlYXR1cmVzMiIsIGZlYXR1cmVJZCwgdmVyc2lvbikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gY2hlY2sgaWYgdGhlIGNvbmZpZyBmaWxlIGhhcyBiZWVuIG1vZGlmZWQgd2hpbGUgd2Ugd2VyZSBydW5uaW5nCi0JCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS5sb2coc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKGlzVmVyaWZ5T25seSgpKSB7Ci0JCQlzdGF0dXMgPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ0NvbmZpZyhmZWF0dXJlKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQlVcGRhdGVDb3JlLmxvZyhzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5XQVJOSU5HOwotCQl9Ci0KLQkJZmluYWwgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gY29uZmlnT3BlcmF0aW9uID0KLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKS5jcmVhdGVDb25maWdPcGVyYXRpb24oCi0JCQkJdGFyZ2V0U2l0ZSwKLQkJCQlmZWF0dXJlKTsKLQotCQl0cnkgewotCQkJY29uZmlnT3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgdGhpcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9JbnN0YWxsQ29tbWFuZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9JbnN0YWxsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzI5MGM4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvSW5zdGFsbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICogQ29tbWFuZCB0byBpbnN0YWxsIGEgZmVhdHVyZS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlOwotCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0OwotCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvcjsKLQlwcml2YXRlIFVSTCByZW1vdGVTaXRlVVJMOwotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOwotCi0JcHVibGljIEluc3RhbGxDb21tYW5kKAotCQlTdHJpbmcgZmVhdHVyZUlkLAotCQlTdHJpbmcgdmVyc2lvbiwKLQkJU3RyaW5nIGZyb21TaXRlLAotCQlTdHJpbmcgdG9TaXRlLAotCQlTdHJpbmcgdmVyaWZ5T25seSkKLQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3VwZXIodmVyaWZ5T25seSk7Ci0KLQkJdHJ5IHsKLQkJCXRoaXMuZmVhdHVyZUlkID0gZmVhdHVyZUlkOwotCQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQotCQkJdGhpcy5yZW1vdGVTaXRlVVJMID0gbmV3IFVSTChVUkxEZWNvZGVyLmRlY29kZShmcm9tU2l0ZSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIEdldCBzaXRlIHRvIGluc3RhbGwgdG8KLQkJCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJaWYgKHRvU2l0ZSAhPSBudWxsKSB7Ci0JCQkJRmlsZSBzaXRlUGF0aCA9IG5ldyBGaWxlKHRvU2l0ZSk7Ci0JCQkJaWYgKCFzaXRlUGF0aC5leGlzdHMoKSkKLQkJCQkJc2l0ZVBhdGgubWtkaXJzKCk7Ci0JCQkJVVJMIHRvU2l0ZVVSTCA9IHNpdGVQYXRoLnRvVVJMKCk7Ci0JCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUodG9TaXRlVVJMLCBudWxsKTsKLQkJCQlpZiAoc2l0ZSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9TaXRlIikgKyB0b1NpdGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRhcmdldFNpdGUgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQkJCWlmICh0YXJnZXRTaXRlID09IG51bGwpIHsKLQkJCQkJdGFyZ2V0U2l0ZSA9IGdldENvbmZpZ3VyYXRpb24oKS5jcmVhdGVDb25maWd1cmVkU2l0ZShzaXRlUGF0aCk7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gdGFyZ2V0U2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQkJCQkJaWYgKHN0YXR1cy5pc09LKCkpCi0JCQkJCQlnZXRDb25maWd1cmF0aW9uKCkuYWRkQ29uZmlndXJlZFNpdGUodGFyZ2V0U2l0ZSk7Ci0JCQkJCWVsc2UgCi0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCi0JCQkJCS8vIHVwZGF0ZSB0aGUgc2l0ZXMgYXJyYXkgdG8gcGljayB1cCBuZXcgc2l0ZQotCQkJCQlzaXRlcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2l0ZXNbaV0uaXNQcm9kdWN0U2l0ZSgpKSB7Ci0JCQkJCQl0YXJnZXRTaXRlID0gc2l0ZXNbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCVVwZGF0ZVNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlID0gbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCk7Ci0JCQlzZWFyY2hTY29wZS5hZGRTZWFyY2hTaXRlKAotCQkJCSJyZW1vdGVTaXRlIiwgLy8kTk9OLU5MUy0xJAotCQkJCXJlbW90ZVNpdGVVUkwsCi0JCQkJbmV3IFN0cmluZ1swXSk7Ci0KLQkJCXNlYXJjaFJlcXVlc3QgPQotCQkJCW5ldyBVcGRhdGVTZWFyY2hSZXF1ZXN0KG5ldyBTaXRlU2VhcmNoQ2F0ZWdvcnkoKSwgc2VhcmNoU2NvcGUpOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPQotCQkJCW5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGZlYXR1cmVJZCwgdmVyc2lvbik7Ci0JCQlzZWFyY2hSZXF1ZXN0LmFkZEZpbHRlcigKLQkJCQluZXcgVmVyc2lvbmVkSWRlbnRpZmllcnNGaWx0ZXIoCi0JCQkJCW5ldyBWZXJzaW9uZWRJZGVudGlmaWVyW10geyB2aWQgfSkpOwotCQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEVudmlyb25tZW50RmlsdGVyKCkpOwotCQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEJhY2tMZXZlbEZpbHRlcigpKTsKLQotCQkJY29sbGVjdG9yID0gbmV3IFVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5pbnN0YWxsaW5nIiksIDQpOyAvLyROT04tTkxTLTEkCi0JCQlzZWFyY2hSZXF1ZXN0LnBlcmZvcm1TZWFyY2goY29sbGVjdG9yLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsMSkpOwotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BlcmF0aW9ucyA9IGNvbGxlY3Rvci5nZXRPcGVyYXRpb25zKCk7Ci0JCQlpZiAob3BlcmF0aW9ucyA9PSBudWxsIHx8IG9wZXJhdGlvbnMubGVuZ3RoID09IDApIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuZmVhdHVyZSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgZmVhdHVyZUlkCi0JCQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIHZlcnNpb24KLQkJCQkJCSsgUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm90Rm91bmQiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkrIHJlbW90ZVNpdGVVUkwKLQkJCQkJCSsgUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubmV3ZXJJbnN0YWxsZWQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsKTsKLQkJCX0KLQotCQkJLy8gQ2hlY2sgZm9yIGR1cGxpY2F0aW9uIGNvbmZsaWN0cwotCQkJQXJyYXlMaXN0IGNvbmZsaWN0cyA9Ci0JCQkJRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoCi0JCQkJCW9wZXJhdGlvbnMsCi0JCQkJCWdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlpZiAoY29uZmxpY3RzICE9IG51bGwpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5kdXBsaWNhdGUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKGlzVmVyaWZ5T25seSgpKSB7Ci0JCQkJcmV0dXJuIChvcGVyYXRpb25zICE9IG51bGwgJiYgb3BlcmF0aW9ucy5sZW5ndGggPiAxKTsKLQkJCX0KLQotCQkJSUJhdGNoT3BlcmF0aW9uIGluc3RhbGxPcGVyYXRpb24gPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJLmNyZWF0ZUJhdGNoSW5zdGFsbE9wZXJhdGlvbigKLQkJCQkJb3BlcmF0aW9ucyk7Ci0JCQl0cnkgewotCQkJCWluc3RhbGxPcGVyYXRpb24uZXhlY3V0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsMyksIHRoaXMpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkJUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuZmVhdHVyZSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgZmVhdHVyZUlkCi0JCQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIHZlcnNpb24KLQkJCQkJCSsgUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuaW5zdGFsbGVkIikpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQlQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5jYW5ub3RJbnN0YWxsIikgKyBmZWF0dXJlSWQgKyAiICIgKyB2ZXJzaW9uLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGNlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0KLQljbGFzcyBVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHsKLQkJcHJpdmF0ZSBBcnJheUxpc3Qgb3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgdm9pZCBhY2NlcHQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkJaWYgKGZlYXR1cmUKLQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJLmdldElkZW50aWZpZXIoKQotCQkJCS5lcXVhbHMoZmVhdHVyZUlkKQotCQkJCSYmIGZlYXR1cmUKLQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCS50b1N0cmluZygpCi0JCQkJCS5lcXVhbHMoCi0JCQkJCXZlcnNpb24pKSB7Ci0JCQkJb3BlcmF0aW9ucy5hZGQoCi0JCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCi0JCQkJCQkuY3JlYXRlSW5zdGFsbE9wZXJhdGlvbigKLQkJCQkJCXRhcmdldFNpdGUsCi0JCQkJCQlmZWF0dXJlLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGdldE9wZXJhdGlvbnMoKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcHNBcnJheSA9Ci0JCQkJbmV3IElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltvcGVyYXRpb25zLnNpemUoKV07Ci0JCQlvcGVyYXRpb25zLnRvQXJyYXkob3BzQXJyYXkpOwotCQkJcmV0dXJuIG9wc0FycmF5OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9MaXN0RmVhdHVyZXNDb21tYW5kLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0xpc3RGZWF0dXJlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MjkxOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0xpc3RGZWF0dXJlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotCi0vKioKLSAqIExpc3RzIGluc3RhbGxlZCBmZWF0dXJlcy4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0RmVhdHVyZXNDb21tYW5kIGV4dGVuZHMgU2NyaXB0ZWRDb21tYW5kIHsKLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQotCS8qKgotCSAqIEBwYXJhbSBmcm9tU2l0ZSBpZiBzcGVjaWZpZWQsIGxpc3Qgb25seSB0aGUgZmVhdHVyZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGxvY2FsIGluc3RhbGwgc2l0ZQotCSAqLwotCXB1YmxpYyBMaXN0RmVhdHVyZXNDb21tYW5kKFN0cmluZyBmcm9tU2l0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoZnJvbVNpdGUgIT0gbnVsbCkgewotCQkJCUZpbGUgc2l0ZVBhdGggPSBuZXcgRmlsZShmcm9tU2l0ZSk7Ci0JCQkJaWYgKCFzaXRlUGF0aC5leGlzdHMoKSkKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub1NpdGUiKSArIGZyb21TaXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQlVUkwgZnJvbVNpdGVVUkwgPSBzaXRlUGF0aC50b1VSTCgpOwotCQkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKGZyb21TaXRlVVJMLCBudWxsKTsKLQkJCQlpZiAoc2l0ZSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9TaXRlIikgKyBmcm9tU2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpZiAoY3NpdGUgPT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub0NvbmZpZ3VyZWRTaXRlIikgKyBmcm9tU2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzaXRlcyA9IG5ldyBJQ29uZmlndXJlZFNpdGVbXSB7IGNzaXRlIH07Ci0JCQl9IAotCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKHNpdGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2l0ZTogIiArIHNpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHNpdGVzW2ldCi0JCQkJCQkJLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdHVyZXMubGVuZ3RoOyBmKyspIHsKLQkJCQkJCWJvb2xlYW4gY29uZmlndXJlZCA9IHNpdGVzW2ldLmlzQ29uZmlndXJlZChmZWF0dXJlc1tmXQotCQkJCQkJCQkuZ2V0RmVhdHVyZShudWxsKSk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgRmVhdHVyZTogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgZmVhdHVyZXNbZl0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkJCQkJLmdldElkZW50aWZpZXIoKQotCQkJCQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgZmVhdHVyZXNbZl0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkJCQkJLmdldFZlcnNpb24oKSArICIgICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIChjb25maWd1cmVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9SZW1vdmVTaXRlQ29tbWFuZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9SZW1vdmVTaXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODMzODZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvUmVtb3ZlU2l0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmU7Ci1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotCi0vKioKLSAqIFJlbW92ZXMgYSBjb25maWd1cmVkIHNpdGUuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlU2l0ZUNvbW1hbmQgZXh0ZW5kcyBTY3JpcHRlZENvbW1hbmQgewotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGNzaXRlOwotCXByaXZhdGUgRmlsZSBzaXRlUGF0aDsKLQkKLQkvKioKLQkgKiBAcGFyYW0gdG9TaXRlIGlmIHNwZWNpZmllZCwgbGlzdCBvbmx5IHRoZSBmZWF0dXJlcyBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYWwgaW5zdGFsbCBzaXRlCi0JICovCi0JcHVibGljIFJlbW92ZVNpdGVDb21tYW5kKFN0cmluZyB0b1NpdGUpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKHRvU2l0ZSAhPSBudWxsKSB7Ci0JCQkJc2l0ZVBhdGggPSBuZXcgRmlsZSh0b1NpdGUpOwotCQkJCWlmICghc2l0ZVBhdGguZ2V0TmFtZSgpLmVxdWFscygiZWNsaXBzZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXNpdGVQYXRoID0gbmV3IEZpbGUoc2l0ZVBhdGgsICJlY2xpcHNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIXNpdGVQYXRoLmV4aXN0cygpKQotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vU2l0ZSIpICsgdG9TaXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJCWZvciAoaW50IGk9MDsgaTxjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBmID0gbmV3IEZpbGUoY3NpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQkJCQlpZiAoZi5lcXVhbHMoc2l0ZVBhdGgpKSB7Ci0JCQkJCQljc2l0ZSA9IGNzaXRlc1tpXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjc2l0ZSA9PSBudWxsKQotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vQ29uZmlndXJlZFNpdGUiKSArIHRvU2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub1NpdGUzIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSAKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZSBjb25maWcgZmlsZSBoYXMgYmVlbiBtb2RpZmVkIHdoaWxlIHdlIHdlcmUgcnVubmluZwotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKHN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCi0JCXRyeSB7Ci0JCQlnZXRDb25maWd1cmF0aW9uKCkucmVtb3ZlQ29uZmlndXJlZFNpdGUoY3NpdGUpOwotCQkJLy8gdXBkYXRlIHRoZSBzaXRlcyBhcnJheQotCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1NjcmlwdGVkQ29tbWFuZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9TY3JpcHRlZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhYTA2Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1NjcmlwdGVkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBQYXJlbnQgY2xhc3MgZm9yIGFsbCB0aGUgdXBkYXRlIG1hbmFnZXIgc3RhbmRhbG9uZSBjb21tYW5kcy4KLSAqIFN1YmNsYXNzZXMgd2lsbCBwcm92aWRlIHNwZWNpZmljIG9wZXJhdGlvbnMgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcnVuKCkgbWV0aG9kLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNjcmlwdGVkQ29tbWFuZCBpbXBsZW1lbnRzIElPcGVyYXRpb25MaXN0ZW5lciB7Ci0KLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5T25seTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgU2NyaXB0ZWRDb21tYW5kKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSB2ZXJpZnlPbmx5IGlmIHRydWUsIHRoZSBjb21tYW5kIGlzIG5vdCBleGVjdXRlZCwgYnV0IHdpbGwgb25seSBhdHRlbXB0IHRvIHJ1biB0aGUgY29tbWFuZC4gCi0JICogVGhpcyBpcyBtb3N0bHkgdXNlZCB3aGVuIHdhbnRlZCB0byBrbm93IGlmIHRoZSBjb21tYW5kIHdvdWxkIGZhaWwuCi0JICovCi0JcHVibGljIFNjcmlwdGVkQ29tbWFuZChTdHJpbmcgdmVyaWZ5T25seSkgewotCQl0aGlzLnZlcmlmeU9ubHkgPSAidHJ1ZSIuZXF1YWxzKHZlcmlmeU9ubHkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY29tbWFuZCBzaG91bGQgb25seSBiZSBydW4gaW4gc2ltdWxhdGlvbiBtb2RlLAotCSAqIHRvIHZlcmlmeSBpZiBpdCBjYW4gZXhlY3V0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1ZlcmlmeU9ubHkoKSB7Ci0JCXJldHVybiB2ZXJpZnlPbmx5OwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGV4ZWN1dGVzIHRoZSBjb21tYW5kIHdpdGggYSBudWxsIHByb2dyZXNzIG1vbml0b3IuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkgewotCQlyZXR1cm4gcnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgY29tbWFuZC4gU3ViY2xhc3NlcyBhcmUgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZyB0aGlzIG1ldGhvZC4KLQkgKiBJZiB0aGUgY29tbWFuZCB3YXMgY29uc3RydWN0ZWQgd2l0aCB2ZXJpZnlPbmx5PXRydWUsIHRoZSBjb21tYW5kIHNob3VsZCBub3QgZXhlY3V0ZSwgYnV0IG9ubHkgdmVyaWZ5IGl0IGNhbiBleGVjdXRlLgotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IgZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlDaGFuZ2VzTm93KCkgewotCQlJbnN0YWxsQ29uZmlndXJhdGlvbi5hcHBseUNoYW5nZXMoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkxpc3RlbmVyI2FmdGVyRXhlY3V0ZShvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFmdGVyRXhlY3V0ZShJT3BlcmF0aW9uIG9wZXJhdGlvbiwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkxpc3RlbmVyI2JlZm9yZUV4ZWN1dGUob3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBiZWZvcmVFeGVjdXRlKElPcGVyYXRpb24gb3BlcmF0aW9uLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YWxsYXRpb24gY29uZmlndXJhdGlvbiBhZmZlY3RlZCBieSB0aGUgY29tbWFuZAotCSAqLwotCXB1YmxpYyBmaW5hbCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQljb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9TZWFyY2hDb21tYW5kLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1NlYXJjaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0M2Y5NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1NlYXJjaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotLyoqCi0gKiBDb21tYW5kIHRvIHNlYXJjaCBhbiB1cGRhdGUgc2l0ZSBhbmQgbGlzdCBpdHMgZmVhdHVyZXMuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIFVSTCByZW1vdGVTaXRlVVJMOwotCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0OwotCXByaXZhdGUgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3I7Ci0KLQlwdWJsaWMgU2VhcmNoQ29tbWFuZChTdHJpbmcgZnJvbVNpdGUpIHsKLQkJdHJ5IHsKLQkJCXRoaXMucmVtb3RlU2l0ZVVSTCA9IG5ldyBVUkwoVVJMRGVjb2Rlci5kZWNvZGUoZnJvbVNpdGUsICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2VhcmNoU2NvcGUgc2VhcmNoU2NvcGUgPSBuZXcgVXBkYXRlU2VhcmNoU2NvcGUoKTsKLQkJCXNlYXJjaFNjb3BlLmFkZFNlYXJjaFNpdGUoCi0JCQkJInJlbW90ZVNpdGUiLCAvLyROT04tTkxTLTEkCi0JCQkJcmVtb3RlU2l0ZVVSTCwKLQkJCQluZXcgU3RyaW5nWzBdKTsKLQkJCXNlYXJjaFJlcXVlc3QgPQotCQkJCW5ldyBVcGRhdGVTZWFyY2hSZXF1ZXN0KG5ldyBTaXRlU2VhcmNoQ2F0ZWdvcnkoKSwgc2VhcmNoU2NvcGUpOwotCQkJY29sbGVjdG9yID0gbmV3IFVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuc2VhcmNoaW5nIikgKyByZW1vdGVTaXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCksIDQpOyAvLyROT04tTkxTLTEkCi0JCQlzZWFyY2hSZXF1ZXN0LnBlcmZvcm1TZWFyY2goY29sbGVjdG9yLCBtb25pdG9yKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsCi0JCQkJJiYgc3RhdHVzLmdldENvZGUoKSA9PSBJU2l0ZS5TSVRFX0FDQ0VTU19FWENFUFRJT04pIHsKLQkJCQkvLyBKdXN0IHNob3cgdGhpcyBidXQgZG8gbm90IHRocm93IGV4Y2VwdGlvbgotCQkJCS8vIGJlY2F1c2UgdGhlcmUgbWF5IGJlIHJlc3VsdHMgYW55d2F5LgotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5jb25uZWN0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCQlVcGRhdGVDb3JlLmxvZyhjZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCi0JY2xhc3MgVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciB7Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIlwiIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZmVhdHVyZS5nZXRMYWJlbCgpCi0JCQkJCSsgIlwiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKQotCQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1N0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzBiMWQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBUaGUgYXBwbGljYXRpb24gY2xhc3MgdXNlZCB0byBsYXVuY2ggc3RhbmRhbG9uZSB1cGRhdGUgY29tbWFuZHMuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGltcGxlbWVudHMgSVBsYXRmb3JtUnVubmFibGUgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIEVYSVRfRVJST1IgPSBuZXcgSW50ZWdlcigxKTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGxvZ2dlZEV4Y2VwdGlvbiA9IGZhbHNlOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ib290LklQbGF0Zm9ybVJ1bm5hYmxlI3J1bihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgcnVuKE9iamVjdCBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCkKLQkJCXJldHVybiBFWElUX0VSUk9SOwotCQlpZiAoYXJncyBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7Ci0JCQlTdHJpbmdbXSBwYXJhbXMgPSAoU3RyaW5nW10pIGFyZ3M7Ci0JCQlDbWRMaW5lQXJncyBjbWRMaW5lQXJncyA9IG5ldyBDbWRMaW5lQXJncyhwYXJhbXMpOwotCQkJU2NyaXB0ZWRDb21tYW5kIGNtZCA9IGNtZExpbmVBcmdzLmdldENvbW1hbmQoKTsKLQkJCWlmIChjbWQgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5jbWRGYWlsZWQiLCBQbGF0Zm9ybS5nZXRMb2dGaWxlTG9jYXRpb24oKS50b09TU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBFWElUX0VSUk9SOwotCQkJfQotCQkJbG9nZ2VkRXhjZXB0aW9uID0gZmFsc2U7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGNtZC5ydW4oKTsKLQkJCWlmIChyZXN1bHQpIHsKLQkJCQlpZiAobG9nZ2VkRXhjZXB0aW9uKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5jbWRDb21wbGV0ZVdpdGhFcnJvcnMiLCBQbGF0Zm9ybS5nZXRMb2dGaWxlTG9jYXRpb24oKS50b09TU3RyaW5nKCkpKTsvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLmNtZE9LIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobG9nZ2VkRXhjZXB0aW9uKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5jbWRGYWlsZWQiLCBQbGF0Zm9ybS5nZXRMb2dGaWxlTG9jYXRpb24oKS50b09TU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5jbWRGYWlsZWROb0xvZyIpKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBFWElUX0VSUk9SOwotCQkJfQotCQl9Ci0JCXJldHVybiBFWElUX0VSUk9SOwotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXhjZXB0aW9uTG9nZ2VkKCkgewotCQlsb2dnZWRFeGNlcHRpb24gPSB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9Vbmluc3RhbGxDb21tYW5kLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1VuaW5zdGFsbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1NTAxYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1VuaW5zdGFsbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLS8qKgotICogQ29tbWFuZCB0byB1bmluc3RhbGwgYSBmZWF0dXJlLiBUaGUgZmVhdHVyZSBtdXN0IGJlIGRpc2FibGVkIGJlZm9yZSB1bmluc3RhbGxpbmcgaXQuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVW5pbnN0YWxsQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlOwotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZTsKLQotCXB1YmxpYyBVbmluc3RhbGxDb21tYW5kKAotCQlTdHJpbmcgZmVhdHVyZUlkLAotCQlTdHJpbmcgdmVyc2lvbiwKLQkJU3RyaW5nIHRvU2l0ZSwKLQkJU3RyaW5nIHZlcmlmeU9ubHkpCi0JCXRocm93cyBFeGNlcHRpb24gewotCi0JCXN1cGVyKHZlcmlmeU9ubHkpOwotCi0JCXRyeSB7Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQotCQkJLy8gR2V0IHNpdGUgdGhhdCBjb250YWlucyB0aGUgZmVhdHVyZSB0byB1bmluc3RhbGwKLQkJCWlmICh0b1NpdGUgIT0gbnVsbCkgewotCQkJCVVSTCB0b1NpdGVVUkwgPSBuZXcgRmlsZSh0b1NpdGUpLnRvVVJMKCk7Ci0JCQkJaWYgKFNpdGVNYW5hZ2VyLmdldFNpdGUodG9TaXRlVVJMLCBudWxsKSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9TaXRlIikgKyB0b1NpdGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRhcmdldFNpdGUgPQotCQkJCQlTaXRlTWFuYWdlcgotCQkJCQkJLmdldFNpdGUodG9TaXRlVVJMLCBudWxsKQotCQkJCQkJLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQkJfQotCQkJaWYgKHRhcmdldFNpdGUgPT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNpdGVzW2ldLmlzUHJvZHVjdFNpdGUoKSkgewotCQkJCQkJdGFyZ2V0U2l0ZSA9IHNpdGVzW2ldOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUlGZWF0dXJlW10gZmVhdHVyZXMgPQotCQkJCVVwZGF0ZVV0aWxzLnNlYXJjaFNpdGUoZmVhdHVyZUlkLCB0YXJnZXRTaXRlLCBmYWxzZSk7Ci0JCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9GZWF0dXJlczEiLCBmZWF0dXJlSWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHZlcnNpb24gPT0gbnVsbCB8fCB2ZXJzaW9uLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCWZlYXR1cmUgPSBmZWF0dXJlc1swXTsgLy8gcGljayB0aGUgZmlyc3QgZmVhdHVyZQotCQkJZWxzZQotCQkJCWZvciAoaW50IGkgPSAwOyBmZWF0dXJlcyAhPSBudWxsICYmIGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZmVhdHVyZXNbaV0KLQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCS5nZXRWZXJzaW9uKCkKLQkJCQkJCS50b1N0cmluZygpCi0JCQkJCQkuZXF1YWxzKHZlcnNpb24pCi0JCQkJCQkmJiAhdGFyZ2V0U2l0ZS5pc0NvbmZpZ3VyZWQoZmVhdHVyZXNbaV0pKSB7Ci0JCQkJCQlmZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vRmVhdHVyZXMyIiwgZmVhdHVyZUlkLCB2ZXJzaW9uKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBjaGVjayBpZiB0aGUgY29uZmlnIGZpbGUgaGFzIGJlZW4gbW9kaWZlZCB3aGlsZSB3ZSB3ZXJlIHJ1bm5pbmcKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhzdGF0dXMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoImZlYXR1cmVfIisgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlVuaW5zdGFsbENvbW1hbmQuZmVhdHVyZU5vdEluc3RhbGxlZEJ5VU0iLCBmZWF0dXJlLnRvU3RyaW5nKCkpLG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQkJCQkKLQkJaWYgKGlzVmVyaWZ5T25seSgpKSB7Ci0JCQkvLyBpZiByZWFjaGVkIHRoaXMgcG9pbnQsIGl0IGlzIHNhZmUgdG8gdW5pbnN0YWxsCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZpbmFsIElVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHVuaW5zdGFsbE9wZXJhdGlvbiA9Ci0JCQlPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkuY3JlYXRlVW5pbnN0YWxsT3BlcmF0aW9uKAotCQkJCXRhcmdldFNpdGUsCi0JCQkJZmVhdHVyZSk7Ci0KLQkJdHJ5IHsKLQkJCXVuaW5zdGFsbE9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIHRoaXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvVXBkYXRlQ29tbWFuZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9VcGRhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTBjNzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9VcGRhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZTsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotLyoqCi0gKiBDb21tYW5kIHRvIHVkcGF0ZSBhbmQgZXhpc3RpbmcgZmVhdHVyZS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVDb21tYW5kIGV4dGVuZHMgU2NyaXB0ZWRDb21tYW5kIHsKLQotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGU7Ci0JcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3Q7Ci0JcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yOwotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOwotCXByaXZhdGUgSUZlYXR1cmUgY3VycmVudEZlYXR1cmU7Ci0KLQkvKioKLQkgKiBVcGRhdGUgY29tbWFuZCBmb3IgdXBkYXRpbmcgYSBmZWF0dXJlIHRvIGEgbmV3ZXIgdmVyc2lvbi4KLQkgKiBAcGFyYW0gZmVhdHVyZUlkCi0JICogQHBhcmFtIHZlcmlmeU9ubHkKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBVcGRhdGVDb21tYW5kKFN0cmluZyBmZWF0dXJlSWQsIFN0cmluZyB2ZXJpZnlPbmx5KQotCXRocm93cyBFeGNlcHRpb24gewotCQl0aGlzKGZlYXR1cmVJZCwgbnVsbCwgdmVyaWZ5T25seSk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSBjb21tYW5kIGZvciB1cGRhdGluZyBhIGZlYXR1cmUgdG8gYSBzcGVjaWZpZWQgbmV3ZXIgdmVyc2lvbi4KLQkgKiBAcGFyYW0gZmVhdHVyZUlkCi0JICogQHBhcmFtIHZlcnNpb24KLQkgKiBAcGFyYW0gdmVyaWZ5T25seQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFVwZGF0ZUNvbW1hbmQoU3RyaW5nIGZlYXR1cmVJZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyB2ZXJpZnlPbmx5KQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdXBlcih2ZXJpZnlPbmx5KTsKLQotCQl0cnkgewotCQkJdGhpcy5mZWF0dXJlSWQgPSBmZWF0dXJlSWQ7Ci0JCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQkJaWYgKGZlYXR1cmVJZCAhPSBudWxsKSB7Ci0JCQkJdGhpcy50YXJnZXRTaXRlID0KLQkJCQkJVXBkYXRlVXRpbHMuZ2V0U2l0ZVdpdGhGZWF0dXJlKAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLAotCQkJCQkJZmVhdHVyZUlkKTsKLQkJCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9Db25maWdTaXRlRm9yRmVhdHVyZSIsIGZlYXR1cmVJZCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlGZWF0dXJlW10gY3VycmVudEZlYXR1cmVzID0KLQkJCQkJVXBkYXRlVXRpbHMuc2VhcmNoU2l0ZShmZWF0dXJlSWQsIHRhcmdldFNpdGUsIHRydWUpOwotCQkJCWlmIChjdXJyZW50RmVhdHVyZXMgPT0gbnVsbCB8fCBjdXJyZW50RmVhdHVyZXMubGVuZ3RoID09IDApIHsKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub0ZlYXR1cmVzMyIsIGZlYXR1cmVJZCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRoaXMuY3VycmVudEZlYXR1cmUgPSBjdXJyZW50RmVhdHVyZXNbMF07Ci0JCQl9IGVsc2UgewotCQkJCS8vIEdldCBzaXRlIHRvIGluc3RhbGwgdG8KLQkJCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9Ci0JCQkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzaXRlc1tpXS5pc1Byb2R1Y3RTaXRlKCkpIHsKLQkJCQkJCXRhcmdldFNpdGUgPSBzaXRlc1tpXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGN1cnJlbnRGZWF0dXJlID09IG51bGwpCi0JCQkJc2VhcmNoUmVxdWVzdCA9IFVwZGF0ZVV0aWxzLmNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KG51bGwpOwotCQkJZWxzZSB7Ci0JCQkJc2VhcmNoUmVxdWVzdCA9Ci0JCQkJCVVwZGF0ZVV0aWxzLmNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KAotCQkJCQkJbmV3IElGZWF0dXJlW10geyBjdXJyZW50RmVhdHVyZSB9KTsKLQkJCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJCQlzZWFyY2hSZXF1ZXN0LmFkZEZpbHRlcigKLQkJCQkJCW5ldyBWZXJzaW9uZWRJZGVudGlmaWVyc0ZpbHRlcigKLQkJCQkJCQluZXcgVmVyc2lvbmVkSWRlbnRpZmllcltdIHsgbmV3IFZlcnNpb25lZElkZW50aWZpZXIoZmVhdHVyZUlkLCB2ZXJzaW9uKSB9KSk7Ci0JCQl9Ci0KLQkJCWNvbGxlY3RvciA9IG5ldyBVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZSBjb25maWcgZmlsZSBoYXMgYmVlbiBtb2RpZmVkIHdoaWxlIHdlIHdlcmUgcnVubmluZwotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKHN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLnVwZGF0aW5nIiksIDQpOyAgLy8kTk9OLU5MUy0xJAotCQkJc2VhcmNoUmVxdWVzdC5wZXJmb3JtU2VhcmNoKGNvbGxlY3RvciwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLDEpKTsKLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIG9wZXJhdGlvbnMgPSBjb2xsZWN0b3IuZ2V0T3BlcmF0aW9ucygpOwotCQkJaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCB8fCBvcGVyYXRpb25zLmxlbmd0aCA9PSAwKSB7Ci0JCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vVXBkYXRlIiwgZmVhdHVyZUlkKSwJbnVsbCkpOyAgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gQ2hlY2sgZm9yIGR1cGxpY2F0aW9uIGNvbmZsaWN0cwotCQkJQXJyYXlMaXN0IGNvbmZsaWN0cyA9Ci0JCQkJRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoCi0JCQkJCW9wZXJhdGlvbnMsCi0JCQkJCWdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlpZiAoY29uZmxpY3RzICE9IG51bGwpIHsKLQkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQkJVXBkYXRlQ29yZS5sb2coVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuZHVwbGljYXRlIiksIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGlzVmVyaWZ5T25seSgpKQotCQkJCXJldHVybiB0cnVlOwotCi0JCQlJQmF0Y2hPcGVyYXRpb24gaW5zdGFsbE9wZXJhdGlvbiA9Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQotCQkJCQkuY3JlYXRlQmF0Y2hJbnN0YWxsT3BlcmF0aW9uKAotCQkJCQlvcGVyYXRpb25zKTsKLQkJCXRyeSB7Ci0JCQkJaW5zdGFsbE9wZXJhdGlvbi5leGVjdXRlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwzKSwgdGhpcyk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCQkJUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuZmVhdHVyZSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgZmVhdHVyZUlkCi0JCQkJCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLnVwZGF0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKAotCQkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJCQlQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub1VwZGF0ZSIsIGZlYXR1cmVJZCksICAvLyROT04tTkxTLTEkCi0JCQkJCQllKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbAotCQkJCSYmIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OKSB7Ci0JCQkJLy8gSnVzdCBzaG93IHRoaXMgYnV0IGRvIG5vdCB0aHJvdyBleGNlcHRpb24KLQkJCQkvLyBiZWNhdXNlIHRoZXJlIG1heSBiZSByZXN1bHRzIGFueXdheS4KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuY29ubmVjdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQkJVXBkYXRlQ29yZS5sb2coY2UpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQotCWNsYXNzIFVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgewotCQlwcml2YXRlIEFycmF5TGlzdCBvcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyB2b2lkIGFjY2VwdChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0KLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBvcCA9Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZUluc3RhbGxPcGVyYXRpb24oCi0JCQkJCW51bGwsCi0JCQkJCWZlYXR1cmUsCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCW51bGwpOwotCi0JCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9Ci0JCQkJVXBkYXRlVXRpbHMuZ2V0RGVmYXVsdFRhcmdldFNpdGUoZ2V0Q29uZmlndXJhdGlvbigpLCBvcCk7Ci0JCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJCXNpdGUgPSBVcGRhdGVVdGlscy5nZXRBZmZpbml0eVNpdGUoZ2V0Q29uZmlndXJhdGlvbigpLCBmZWF0dXJlKTsKLQkJCWlmIChzaXRlID09IG51bGwpCi0JCQkJc2l0ZSA9IHRhcmdldFNpdGU7Ci0KLQkJCW9wLnNldFRhcmdldFNpdGUoc2l0ZSk7Ci0JCQlvcGVyYXRpb25zLmFkZChvcCk7Ci0JCX0KLQkJcHVibGljIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGdldE9wZXJhdGlvbnMoKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcHNBcnJheSA9Ci0JCQkJbmV3IElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltvcGVyYXRpb25zLnNpemUoKV07Ci0JCQlvcGVyYXRpb25zLnRvQXJyYXkob3BzQXJyYXkpOwotCQkJcmV0dXJuIG9wc0FycmF5OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9wYWNrYWdlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhOGRiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MiBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydCBmb3IgcGVyZm9ybWluZyB2YXJpb3VzIGluc3RhbGwvdXBkYXRlIG9wZXJhdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLVRoaXMgcGFja2FnZSBjb250YWlucyBpbnRlcmZhY2VzIGZvciBwZXJmb3JtaW5nIHVwZGF0ZS9pbnN0YWxsIG9wZXJhdGlvbnMgCi13aXRob3V0IHVzaW5nIHRoZSBVcGRhdGUgTWFuYWdlciB1c2VyIGludGVyZmFjZS4gSW4gZ2VuZXJhbCwgaXQgaXMgYmVzdCB0byB1c2UgdGhlc2UKLWNsYXNzZXMgZm9yIGNvbW1hbmQgbGluZSBpbnZvY2F0aW9uLCBidXQgaXQgaXMgcG9zc2libGUgdG8gYWxzbyB1c2UgdGhlbSBwcm9ncmFtbWF0aWNhbGx5LgotPHA+Ci08Yj5Ob3RlOjwvYj4gVGhpcyBwYWNrYWdlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLWNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLShyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OGZlMmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmFwYWNoZS54ZXJjZXMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ib290Ii8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIgcm9vdHBhdGg9IkpSRV9TUkNST09UIiBzb3VyY2VwYXRoPSJKUkVfU1JDIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljYjU0YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXM8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQkJPHByb2plY3Q+b3JnLmFwYWNoZS54ZXJjZXM8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvcHJvamVjdD4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUudWkuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLnVpLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLnVpLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlLmN2c25hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9TY3JhcGJvb2syLmpwYWdlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9TY3JhcGJvb2syLmpwYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRhOTlhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvU2NyYXBib29rMi5qcGFnZQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi1TaXRlTWFuYWdlci5nZXRTaXRlKFVSTCl0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLSAgU3RyaW5nIHR5cGUgPSBnZXRUeXBlRm9ycHJvdG9jb2woVVJMLmdldHByb3RvY29sKTsNCi0gIHRyeSB7DQotICAgIGlmICh0eXBlICE9IG51bGwpew0KLQlhdHRlbXB0Q3JlYXRpb25TaXRlKHR5cGUsVVJMKTsNCi0gICAgfSBlbHNlIHsNCi0JYXR0ZW1wdENyZWF0aW9uU2l0ZSgiaHR0cCIsVVJMKTsNCi0gICAgfQ0KLSAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsNCi0gICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgc2l0ZSIsZS5nZXRNZXNzYWdlKCkpOw0KLSAgfQ0KLQ0KLVNpdGVNYW5hZ2VyLmF0dGVtcHRDcmVhdGlvblNpdGUodHlwZSxVUkwpdGhyb3dzIENvcmVFeGNlcHRpb24NCi0gIHRyeSB7DQotICAgIGNyZWF0ZVNpdGUodHlwZSxVUkwpOw0KLSAgfSBjYXRjaCAoSW52YWxpZFR5cGVFeGNlcHRpb24gZSl7DQotICAgIHRyeSB7DQotICAgICAgY3JlYXRlU2l0ZShlLmdldFJlYWxUeXBlKCksVVJMKTsNCi0gICAgfSBjYXRjaCAoSW52YWxpZFNpdGVFeGVwdGlvbiBlKXsNCi0gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigiV3Jvbmcgc2l0ZSB0eXBlIik7DQotICAgIH0NCi0gIH0NCi0NCi1TaXRlTWFuYWdlci5jcmVhdGVTaXRlKHR5cGUsVVJMKSB0aHJvd3MgQ29yZUV4ZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24NCi0NCi0NCi10cnkgew0KLQkJCQ0KLQlmYWN0b3J5LmNyZWF0ZVNpdGUodXJsLCBmb3JjZUNyZWF0aW9uKTsNCi0JDQotfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkvLyBpZiB0aGUgVVJMIGlzIHBvaW50aW5nIHRvIGVpdGhlciBhIGZpbGUgDQotLy8gb3IgYSBkaXJlY3RvcnksIHdpdGhvdXQgcmVmZXJlbmNlCQkJDQotaWYgKHVybC5nZXRSZWYoKSAhPSBudWxsKSB7DQotCS8vIDQgbm90aGluZyB3ZSBjYW4gZG8NCi0JdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlLmdldE1lc3NhZ2UoKSxlKTsNCi19IGVsc2UgaWYgKHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSkgew0KLQkvLyAxIHRyeSB0byBhZGQgc2l0ZS54bWwNCi0JdHJ5IHsNCi0JCXVybCA9IG5ldyBVUkwodXJsLFNpdGUuU0lURV9YTUwpOw0KLQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiKyIrU2l0ZS5TSVRFX1hNTCxlMSk7DQotCX0NCi0JdHJ5IHsNCi0JCXNpdGUgPSBmYWN0b3J5LmNyZWF0ZVNpdGUodXJsLCBmb3JjZUNyZWF0aW9uKTsNCi0JfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCksZTEpOwkJCQkJDQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIGFjY2Vzc2luZyB1cmw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KLQl9DQotfSBlbHNlIGlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKFNpdGUuU0lURV9YTUwpKSB7DQotCS8vIDMgbm90aGluZyB3ZSBjYW4gZG8NCi0JdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlLmdldE1lc3NhZ2UoKSxlKTsNCi19IGVsc2Ugew0KLQkvLyAyIHRyeSB0byBhZGQgL3NpdGUueG1sDQotCXRyeSB7DQotCQl1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksIHVybC5nZXRGaWxlKCkrIi8iK1NpdGUuU0lURV9YTUwpOw0KLQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiKyIrU2l0ZS5TSVRFX1hNTCxlMSk7DQotCX0NCi0JDQotCXRyeSB7DQotCQlzaXRlID0gZmFjdG9yeS5jcmVhdGVTaXRlKHVybCwgZm9yY2VDcmVhdGlvbik7DQotCX0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpKyJcclxuUHJldmlvdXMgSW5wdXQvT3V0cHV0IEVycm9yOiIrZS5nZXRNZXNzYWdlKCksZTEpOwkJCQkJDQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIGFjY2Vzc2luZyB1cmw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpKyJcclxuUHJldmlvdXMgSW5wdXQvT3V0cHV0IEVycm9yOiIrZS5nZXRNZXNzYWdlKCksZTEpOwkJCQkJDQotCQkJCX0JCQkJDQotCQkJfQ0KLQ0KLQkJfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiBlKSB7DQotCQkJDQotCQkJLy8gaWYgdGhlIFVSTCBpcyBwb2ludGluZyB0byBlaXRoZXIgYSBmaWxlIA0KLS8vIG9yIGEgZGlyZWN0b3J5LCB3aXRob3V0IHJlZmVyZW5jZQkJCQ0KLWlmICh1cmwuZ2V0UmVmKCkgIT0gbnVsbCkgew0KLQkvLyA0IG5vdGhpbmcgd2UgY2FuIGRvDQotCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UuZ2V0TWVzc2FnZSgpLGUpOw0KLX0gZWxzZSBpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKSB7DQotCS8vIDEgdHJ5IHRvIGFkZCBzaXRlLnhtbA0KLQl0cnkgew0KLQkJdXJsID0gbmV3IFVSTCh1cmwsU2l0ZS5TSVRFX1hNTCk7DQotCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyIrIitTaXRlLlNJVEVfWE1MLGUxKTsNCi0JfQ0KLQl0cnkgew0KLQkJc2l0ZSA9IGZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwsIGZvcmNlQ3JlYXRpb24pOw0KLQl9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCi0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCksZTEpOw0KLQkJCQl9CQkJCQ0KLQ0KLQkJCX0gZWxzZSBpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aChTaXRlLlNJVEVfWE1MKSkgew0KLQkJCQkvLyAzIG5vdGhpbmcgd2UgY2FuIGRvDQotCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UuZ2V0TWVzc2FnZSgpLGUpOwkJCQkJDQotfSBlbHNlIHsNCi0JLy8gMiB0cnkgdG8gYWRkIC9zaXRlLnhtbA0KLQkNCi0JdHJ5IHsNCi0JCXVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgdXJsLmdldEZpbGUoKSsiLyIrU2l0ZS5TSVRFX1hNTCk7DQotCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyIrIitTaXRlLlNJVEVfWE1MLGUxKTsNCi0JfQ0KLQl0cnkgew0KLQkJc2l0ZSA9IGZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwsIGZvcmNlQ3JlYXRpb24pOw0KLQl9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSsiXHJcblByZXZpb3VzIFBhcnNpbmcgZXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCi0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCkrIlxyXG5QcmV2aW91cyBQYXJzaW5nIGVycm9yOiIrZS5nZXRNZXNzYWdlKCksZTEpOw0KLQkNCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODMyNGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPGh0bWw+DQotPGhlYWQ+DQotPHRpdGxlPkFib3V0PC90aXRsZT4NCi08c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLXAsIHRhYmxlLCB0ZCwgdGggeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHR9DQotcHJlIHsgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm87IGZvbnQtc2l6ZTogMTBwdH0NCi1oMiB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMThwdDsgZm9udC13ZWlnaHQ6IGJvbGQgOyBsaW5lLWhlaWdodDogMTRweH0NCi1jb2RlIHsgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm87IGZvbnQtc2l6ZTogMTBwdH0NCi1zdXAgeyBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLGdlbmV2YTsgZm9udC1zaXplOiAxMHB4fQ0KLWgzIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZH0NCi1saSB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0NCi1oMSB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMjhweDsgZm9udC13ZWlnaHQ6IGJvbGR9DQotYm9keSB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdDsgY2xpcDogcmVjdCggICApOyBtYXJnaW4tdG9wOiA1bW07IG1hcmdpbi1sZWZ0OiAzbW19DQotPC9zdHlsZT4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9ImJsdWUiIHZsaW5rPSJwdXJwbGUiPg0KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSI1IiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiID4NCi0gIDx0cj4gDQotICAgIDx0ZCBhbGlnbj0iTEVGVCIgdmFsaWduPSJUT1AiIGNvbHNwYW49IjIiIGJnY29sb3I9IiMwMDgwQzAiPjxiPjxmb250IGNvbG9yPSIjRkZGRkZGIj5BYm91dCBUaGlzIENvbnRlbnQ8L2ZvbnQ+PC9iPjwvdGQ+DQotICA8L3RyPg0KLSAgPHRyPiANCi0gICAgPHRkPiANCi08cD4xMXRoIERlY2VtYmVyLCAyMDAxPC9wPgkNCi08aDM+TGljZW5zZTwvaDM+DQotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAmcXVvdDtDb250ZW50JnF1b3Q7LiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlDQotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwiPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDAuNTwvYT4gJnF1b3Q7Q1BMJnF1b3Q7LiAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4NCi0NCi08aDM+Q29udHJpYnV0aW9uczwvaDM+DQotDQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlDQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaA0KLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4NCi0NCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICZxdW90O090aGVyIExpY2Vuc2UmcXVvdDssIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yDQotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7IHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlDQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQ0KLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvDQotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YNCi10aGUgQ1BMLjwvcD4NCi08L3RkPjwvdHI+PC90YWJsZT4NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhMjFhNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXNvdXJjZS51cGRhdGVleGFtcGxlc2NvcmUuamFyID0gc3JjLw0KLXNyYy5pbmNsdWRlcz1hYm91dC5odG1sDQotYmluLmluY2x1ZGVzPXBsdWdpbi54bWwscGx1Z2luLnByb3BlcnRpZXMsKi5qYXIsYWJvdXQuaHRtbA0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTMxZjhjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQ0KLW5hbWUgPSBJbnN0YWxsL1VwZGF0ZSBCdWlsZFppcCBFeGFtcGxlDQotcHJvdmlkZXItbmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGI0MDkyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBsdWdpbg0KLSAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMiDQotICAgbmFtZT0iJW5hbWUiDQotICAgdmVyc2lvbj0iMi4wLjAiDQotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyLW5hbWUiPg0KLQ0KLSAgIDxydW50aW1lPg0KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InVwZGF0ZWV4YW1wbGVzLmphciI+DQotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgICAgPC9saWJyYXJ5Pg0KLSAgIDwvcnVudGltZT4NCi0gICA8cmVxdWlyZXM+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLnhlcmNlcyIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLz4NCi0gICA8L3JlcXVpcmVzPg0KLQ0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iemlwIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXMiPg0KLSAgICAgIDxmZWF0dXJlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwLkJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkiPg0KLSAgICAgIDwvZmVhdHVyZS1mYWN0b3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0ic2l0ZS56aXAiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnNpdGVUeXBlcyI+DQotICAgICAgPHNpdGUtZmFjdG9yeQ0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXAuQnVpbGRaaXBTaXRlRmFjdG9yeSI+DQotICAgICAgPC9zaXRlLWZhY3Rvcnk+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJzaXRlLmZyZWVmb3JtIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zaXRlVHlwZXMiPg0KLSAgICAgIDxzaXRlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmZyZWVmb3JtLkZyZWVGb3JtU2l0ZUZhY3RvcnkiPg0KLSAgICAgIDwvc2l0ZS1mYWN0b3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjUwN2E3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2ZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNjgxNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2luZm8vaW1hZ2VzL3JlZERvdC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvaW5mby9pbWFnZXMvcmVkRG90LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmYjVjMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvaW5mby9pbWFnZXMvcmVkRG90LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWNhOTdkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9pbmZvL3NpdGVJbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0MClodHRwOi8vZGVqYW4vdGVzdFNpdGUvaW5mby9zaXRlSW5mby5odG1sIC0tPgotPEhUTUw+PEhFQUQ+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA1LjUwLjQ4MDcuMjMwMCIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFk+Ci08SDEgYWxpZ249bGVmdD48SU1HIGhlaWdodD01NSBzcmM9ImltYWdlcy9yZWREb3QuanBnIiB3aWR0aD01NiAKLWFsaWduPWNlbnRlciBib3JkZXI9MD4gPEZPTlQgY29sb3I9I2MwYzBjMD5Gb2xsb3cgdGhlIFJlZCBEb3QmbmJzcDs8L0ZPTlQ+PC9IMT4KLTxQPldlbGNvbWUgdG8gdGhlIDxCPjxGT05UIGNvbG9yPSM4MDAwMDA+UmVkIERvdDwvRk9OVD4gPC9CPnVwZGF0ZSBzaXRlLiBVc2UgCi15b3VyIEVjbGlwc2UgPEI+VXBkYXRlIFNpdGVzPC9CPiB2aWV3IHRvIGxvY2F0ZSB0aGUgZmVhdHVyZSB2ZXJzaW9uIHlvdSB3YW50IHRvIAotaW5zdGFsbCBvciB1cGRhdGUgdG8uPC9QPgotPEgyPkFib3V0IFJlZCBEb3QgRmVhdHVyZTwvSDI+Ci08UD5PdXIgcmV2b2x1dGlvbmFyeSBSZWQgRG90IEVjbGlwc2UgZmVhdHVyZSBjaGFuZ2VkIGFsbCBwcmVjb25jZXB0aW9ucyBhYm91dCAKLXdoYXQgRWNsaXBzZSBmZWF0dXJlcyBjYW4gYW5kIGNhbm5vdCBkby4gVXNpbmcgb3VyIHN0cmlraW5nbHkgc2ltcGxlIGNvbmNlcHQgb2YgCi1hZGRpbmcgYnV0dG9ucyB0byB0aGUgRWNsaXBzZSB0b29sIGJhciwgd2UgYWxsb3cgeW91IHRvIG9wZW4gZGlhbG9ncyB0aGF0IHNob3cgCi15b3UgdGhlIHZlcnNpb24gb2YgdGhlIFJlZCBEb3QgZmVhdHVyZS4gVGhlIGJlYXV0eSBvZiB0aGUgY29uY2VwdCBzdGVtcyBmcm9tIGl0cyAKLXNpbXBsaWNpdHksIGVhc2Ugb2YgdXNlLCBoaWdoIHBlcmZvcm1hbmNlIGFuZCBzbWFsbCBmb290cHJpbnQuIE5ldmVyIGJlZm9yZSB3YXMgCi1pdCBzbyBlYXN5IHRvIHByZXNzIGEgYnV0dG9uIG9uIHRoZSB0b29sIGJhciB0byBnZXQgc29tZSB0ZXh0IHNob3duIGluIHRoZSAKLWRpYWxvZy48L1A+Ci08SDI+TmV3czwvSDI+Ci08VUw+Ci0gIDxMST48Qj5Ob3ZlbWJlciAyMDAxPC9CPiAtIHZlcnNpb24gMi4wLjAgb2YgdGhlIFJlZCBEb3QgZmVhdHVyZSBpcyBhdmFpbGFibGUgCi0gIGZvciBkb3dubG9hZC4gVGhpcyB2ZXJzaW9uIGJyaW5ncyBpbXByb3ZlbWVudHMgYWNyb3NzIHRoZSBib2FyZCwgZnVydGhlciAKLSAgc3RyZW5ndGhlbmluZyBhbiBhbHJlYWR5IGVzdGFibGlzaGVkIEVjbGlwc2UgZmVhdHVyZSBjbGFzc2ljLiBJbXByb3ZlbWVudHMgCi0gIHdpbGwgYmUgdmlzaWJsZSB0aGUgbW9tZW50IHlvdSB1cGRhdGUgeW91ciBmZWF0dXJlIC0gb3VyIGZhbW91cyByZWQgZG90IHRvb2wgCi0gIGJhciBidXR0b24gaXMgbm93IDxCPjI1JSBtb3JlIHJlZDwvQj4sIG1ha2luZyBpdCBldmVuIGVhc2llciB0byBzcG90IGFtb25nIAotICBvdGhlciBidXR0b25zLiAKLSAgPExJPjxCPk9jdG9iZXIgMjAwMTwvQj4gLSB2ZXJzaW9uIDEuMC4wIG9mIHRoZSBSZWQgRG90IGZlYXR1cmUgaXMgYXZhaWxhYmxlIAotICBmb3IgZG93bmxvYWQuIFNlbGVjdCBpdCBpbiB0aGUgJ1NpdGVzJyB2aWV3IG9mIHRoZSBVcGRhdGUgTWFuYWdlciBhbmQgcHJlc3MgCi0gICdJbnN0YWxsJyBidXR0b24uIDwvTEk+PC9VTD4KLTxIUj4KLTxJPkNvcHlyaWdodCAyMDAxIFJlZCBEb3QgQ29ycG9yYXRpb24gTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvST4gCi08L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODhiNzkzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9wbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9wbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9wbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzMWFkMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTEzMjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08c2l0ZT4KLSAgIDxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPgotCi0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4KLSAgIDwvZmVhdHVyZT4KLQotICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iUmVkIERvdCBWZXJzaW9ucyIgbmFtZT0icmVkZG90Ij4KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9ImluZm8vUmVkRG90VmVyc2lvbnMuaHRtbCI+Ci0gICAgICAgICBUaGlzIGNhdGVnb3J5IGNvbnRhaW5zIGFsbCBvZiB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSB2ZXJzaW9ucyBvZiBSZWQgRG90IGZlYXR1cmUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci0KLTwvc2l0ZT4gICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBDb252ZXJ0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTA0YzE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOwotCi0vKgotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMi4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8gCi0gCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbjsKLQ0KLS8qKg0KLSAqIENvbnZlcnRzIGVjbGlwc2UgYnVpbGQgLnppcCBmaWxlcyBpbnRvIHBhY2thZ2VkIGZlYXR1cmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQnVpbGRaaXBDb252ZXJ0ZXIgew0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA8PTApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6ICAgICBCdWlsZFppcENvbnZlcnRlciA8cGF0aCB0byB0aGUgemlwIGZpbGU+LlxyXG5FeGFtcGxlOiBCdWlsZFppcENvbnZlcnRlciBkOi9kb3dubG9hZC9pbnRlZ3JhdGlvbi1lY2xpcHNlLVNESy0yMDAyMDEwOS13aW4zMi56aXAiKTsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJVVJMIGJ1aWxkemlwID0gbmV3IFVSTCgoImZpbGU6IithcmdzWzBdKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSk7Ci0JCQlCdWlsZFppcEZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSgpOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShidWlsZHppcCwgbnVsbCk7Ci0JCQlJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpOwotCQkJCi0JCQlDb250ZW50UmVmZXJlbmNlW10gcmVmcyA9IHByb3ZpZGVyLmdldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKG51bGwpOwotCQkJCi0JCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSgoYXJnc1swXSsiLnBhY2thZ2VkLyIpLnJlcGxhY2UoJy8nLEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQkJc2l0ZS5ta2RpcnMoKTsKLQkJCUZpbGUgZmVhdHVyZXNEaXIgPSBuZXcgRmlsZShzaXRlLCJmZWF0dXJlcyIpOwotCQkJZmVhdHVyZXNEaXIubWtkaXJzKCk7Ci0JCQlGaWxlIHBsdWdpbnNEaXIgPSBuZXcgRmlsZShzaXRlLCAicGx1Z2lucyIpOwotCQkJcGx1Z2luc0Rpci5ta2RpcnMoKTsKLQkJCQotCQkJRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoZmVhdHVyZXNEaXIsZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkrIi5qYXIiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigid3JpdGluZyBmZWF0dXJlIGFyY2hpdmU6ICIrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkrIi5qYXIiKTsKLQkJCXdyaXRlSmFyKGphckZpbGUsIHJlZnMsIGZlYXR1cmUsIG51bGwsIG51bGwpOwotCQkJSmFyQ29udGVudFJlZmVyZW5jZSBqYXIgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiYnVpbGQuemlwIixidWlsZHppcCk7Ci0JCQlQcm9wZXJ0aWVzIG1hbmlmZXN0ID0gZ2V0QnVpbGRNYW5pZmVzdChqYXIpOwotCQkJCi0JCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8cGx1Z2lucy5sZW5ndGg7IGkrKykgewotCQkJCXJlZnMgPSBwcm92aWRlci5nZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKHBsdWdpbnNbaV0sIG51bGwpOwotCQkJCWphckZpbGUgPSBuZXcgRmlsZShwbHVnaW5zRGlyLHBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyIuamFyIik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3cml0aW5nIHBsdWdpbiBhcmNoaXZlOiAiK3BsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyIuamFyIik7Ci0JCQkJd3JpdGVKYXIoamFyRmlsZSwgcmVmcywgZmVhdHVyZSwgcGx1Z2luc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLCBtYW5pZmVzdCk7Ci0JCQl9Ci0JCQkKLQkJCXdyaXRlU2l0ZU1hbmlmZXN0KHNpdGUsIGZlYXR1cmUpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9DQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVKYXIoRmlsZSBqYXJGaWxlLENvbnRlbnRSZWZlcmVuY2VbXSByZWZzLCBJRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgcGx1Z2luSWQsIFByb3BlcnRpZXMgbWFuaWZlc3QpIHsKLQkJCQotCQlKYXJPdXRwdXRTdHJlYW0gam9zID0gbnVsbDsKLQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGphckZpbGUpOwotCQkJam9zID0gbmV3IEphck91dHB1dFN0cmVhbShvcyk7Ci0JCQlKYXJFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCQlTdHJpbmcgYnVmID0gbnVsbDsKLQkJCVN0cmluZ0J1ZmZlcklucHV0U3RyZWFtIHNiaXMgPSBudWxsOwotCQkJCi0JCQkvLyB3cml0ZSBqYXIgbWFuaWZlc3QgKGZpcnN0IGVudHJ5IGluIG91dHB1dCBzdHJlYW0pCi0JCQlidWYgPSAiTWFuaWZlc3QtVmVyc2lvbjogMS4wXG5DcmVhdGVkLUJ5OiAyLjAuMCAod3d3LmVjbGlwc2Uub3JnIEZlYXR1cmUgUGFja2FnZXIpXG4iOwotCQkJc2JpcyA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShidWYpOwotCQkJZW50cnkgPSBuZXcgSmFyRW50cnkoIk1FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCQlqb3MucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJCVV0aWxpdGllcy5jb3B5KHNiaXMsam9zLG51bGwpOwotCQkJc2Jpcy5jbG9zZSgpOwotCQkJCi0JCQkvLyBqYXIgdXAgdGhlIHJlZmVyZW5jZXMKLQkJCWZvciAoaW50IGk9MDsgaTxyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGlkID0gcmVmc1tpXS5nZXRJZGVudGlmaWVyKCk7Ci0JCQkJZW50cnkgPSBuZXcgSmFyRW50cnkoaWQpOwotCQkJCWpvcy5wdXROZXh0RW50cnkoZW50cnkpOwotCQkJCWlzID0gcmVmc1tpXS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCVV0aWxpdGllcy5jb3B5KGlzLGpvcyxudWxsKTsKLQkJCQlpcy5jbG9zZSgpOyBpcyA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIGZvciBwbHVnaW4gamFycywgd3JpdGUgYnVpbGQgbWFuaWZlc3QKLQkJCWlmIChwbHVnaW5JZCAhPSBudWxsICYmIG1hbmlmZXN0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcga2V5ID0gInBsdWdpbkAiK3BsdWdpbklkOwotCQkJCVN0cmluZyB2YWx1ZSA9IG1hbmlmZXN0LmdldFByb3BlcnR5KGtleSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJaWYgKHZhbHVlLmVxdWFscygiSEVBRCIpKSB7Ci0JCQkJCQl2YWx1ZSArPSAiLSIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkuZ2V0TWFqb3JDb21wb25lbnQoKTsKLQkJCQkJfQotCQkJCQlidWYgPSBrZXkgKyAiPSIgKyB2YWx1ZTsKLQkJCQkJc2JpcyA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShidWYpOwotCQkJCQllbnRyeSA9IG5ldyBKYXJFbnRyeSgiYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIik7Ci0JCQkJCWpvcy5wdXROZXh0RW50cnkoZW50cnkpOwotCQkJCQlVdGlsaXRpZXMuY29weShzYmlzLGpvcyxudWxsKTsKLQkJCQkJc2Jpcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gY2xvc2UgamFyCi0JCQlqb3MuY2xvc2UoKTsgam9zID0gbnVsbDsgb3MgPSBudWxsOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlzICE9IG51bGwpIAotCQkJCXRyeSB7aXMuY2xvc2UoKTt9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCi0JCQlpZiAoam9zICE9IG51bGwpIAotCQkJCXRyeSB7am9zLmNsb3NlKCk7fSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJZWxzZSBpZiAob3MgIT0gbnVsbCkKLQkJCQl0cnkge29zLmNsb3NlKCk7fSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlU2l0ZU1hbmlmZXN0KEZpbGUgc2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbWFuaWZlc3QgPSBuZXcgRmlsZShzaXRlLCAic2l0ZS54bWwiKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1hbmlmZXN0KTsKLQkJU3RyaW5nIHNpdGVYTUwgPSAiPHNpdGU+XG4gICA8ZmVhdHVyZSB1cmw9XCJmZWF0dXJlcy8iK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkrIi5qYXJcIi8+XG48L3NpdGU+IjsKLQkJU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0gc2JpcyA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShzaXRlWE1MKTsKLQkJVXRpbGl0aWVzLmNvcHkoc2JpcyxvcyxudWxsKTsKLQkJb3MuY2xvc2UoKTsKLQkJc2Jpcy5jbG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgZ2V0QnVpbGRNYW5pZmVzdChKYXJDb250ZW50UmVmZXJlbmNlIGphcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQ29udGVudFJlZmVyZW5jZSBtYW5pZmVzdEVudHJ5ID0gamFyLnBlZWsoImVjbGlwc2UvYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIixudWxsLypDb250ZW50U2VsZWN0b3IqLywgbnVsbC8qUHJvZ3Jlc3NNb25pdG9yKi8pOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBudWxsOwotCQl0cnkgewotCQkJcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJaXMgPSBtYW5pZmVzdEVudHJ5LmdldElucHV0U3RyZWFtKCk7Ci0JCQlwcm9wcy5sb2FkKGlzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKSB0cnl7IGlzLmNsb3NlKCk7IH0gY2F0Y2goSU9FeGNlcHRpb24gZSkge30KLQkJfQotCQlyZXR1cm4gcHJvcHM7Ci0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjFjMGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KLQ0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMi4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLyANCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSU5vblBsdWdpbkVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSW5zdGFsbE1vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2UuQ29udGVudFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFuIGV4YW1wbGUgZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyLiBJdCBoYW5kbGVzIGZlYXR1cmVzIHBhY2thZ2VkIGFzDQotICogYnVpbGQgemlwJ3MgdXNpbmcgdGhlIGZvcm1hdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiBhbmQgc3RhYmxlIGJ1aWxkcw0KLSAqIHBvc3RlZCBvbiB0aGUgZG93bmxvYWRzIHBhZ2VzIGF0IHd3dy5lY2xpcHNlLm9yZw0KLSAqIDwvcD4NCi0gKiBAc2luY2UgMi4wDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEZlYXR1cmVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciB7DQotDQotCXByaXZhdGUgSmFyQ29udGVudFJlZmVyZW5jZSBiYXNlUmVmZXJlbmNlOw0KLQlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgZ2VuZXJhdGVkRmVhdHVyZU1hbmlmZXN0OwkNCi0JcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlW10gZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXM7DQotCXByaXZhdGUgSVBsdWdpbkVudHJ5IGN1cnJlbnRQbHVnaW5FbnRyeTsNCi0JcHJpdmF0ZSBJTm9uUGx1Z2luRW50cnkgY3VycmVudE5vblBsdWdpbkVudHJ5Ow0KLQkNCi0JcHVibGljIEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlcihVUkwgYmFzZSkgew0KLQkJc3VwZXIoYmFzZSk7DQotCQl0aGlzLmJhc2VSZWZlcmVuY2UgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiYnVpbGQuemlwIixiYXNlKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlTWFuaWZlc3QoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChnZW5lcmF0ZWRGZWF0dXJlTWFuaWZlc3QgPT0gbnVsbCkgew0KLQkJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkZlYXR1cmUgbWFuaWZlc3QgaXMgbm90IGF2YWlsYWJsZSIsbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQkJcmV0dXJuIGdlbmVyYXRlZEZlYXR1cmVNYW5pZmVzdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEFyY2hpdmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgew0KLQkJLy8gdGhlIGZlYXR1cmUgYW5kIGFsbCBpdHMgcGx1Z2lucyBmaWxlcyBhcmUgcGFja2FnZWQgaW4gYSBzaW5nbGUgYXJjaGl2ZQ0KLQkJcmV0dXJuIG5ldyBDb250ZW50UmVmZXJlbmNlW10geyBiYXNlUmVmZXJlbmNlIH07DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHsNCi0JCS8vIHRoZSBmZWF0dXJlIGFuZCBhbGwgaXRzIHBsdWdpbnMgZmlsZXMgYXJlIHBhY2thZ2VkIGluIGEgc2luZ2xlIGFyY2hpdmUNCi0JCXJldHVybiBuZXcgQ29udGVudFJlZmVyZW5jZVtdIHsgYmFzZVJlZmVyZW5jZSB9Ow0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB7DQotCQkvLyB0aGUgZmVhdHVyZSBhbmQgYWxsIGl0cyBwbHVnaW5zIGZpbGVzIGFyZSBwYWNrYWdlZCBpbiBhIHNpbmdsZSBhcmNoaXZlDQotCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbXSB7IGJhc2VSZWZlcmVuY2UgfTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSU5vblBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXJldHVybiBwZWVrTm9uUGx1Z2luRW50cnlDb250ZW50KG5vblBsdWdpbkVudHJ5LG1vbml0b3IpOw0KLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHVybiBjb250ZW50IGZvciBub24gcGx1Z2luIGVudHJ5ICIrbm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpLGUpOw0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB7DQotCQlpZiAoZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07DQotCQllbHNlDQotCQkJcmV0dXJuICBmZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJcmV0dXJuIHBlZWtQbHVnaW5FbnRyeUNvbnRlbnQocGx1Z2luRW50cnksIG1vbml0b3IpOw0KLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHVybiBjb250ZW50IGZvciBwbHVnaW4gZW50cnkgIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksZSk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyBVUkwgZ2V0RmVhdHVyZUJhc2VVUkwoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJcmV0dXJuIGdldFdvcmtpbmdEaXJlY3RvcnkoKS50b1VSTCgpOw0KLQkJCQ0KLQl9DQotDQotCUNvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZUJ1aWxkTWFuaWZlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXJldHVybiBiYXNlUmVmZXJlbmNlLnBlZWsoImVjbGlwc2UvYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIixudWxsLypDb250ZW50U2VsZWN0b3IqLywgbnVsbC8qUHJvZ3Jlc3NNb25pdG9yKi8pOw0KLQl9DQotDQotCUNvbnRlbnRSZWZlcmVuY2UgZ2V0UGx1Z2luTWFuaWZlc3QoU3RyaW5nIHBsdWdpbklkLCBib29sZWFuIGlzRnJhZ21lbnQpIHRocm93cyBFeGNlcHRpb24gewkJCQ0KLQkJU3RyaW5nIG1hbmlmZXN0TmFtZSA9ICJlY2xpcHNlL3BsdWdpbnMvIiArIHBsdWdpbklkICsgIi8iICsgKGlzRnJhZ21lbnQgPyAiZnJhZ21lbnQueG1sIiA6ICJwbHVnaW4ueG1sIik7DQotCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5wZWVrKG1hbmlmZXN0TmFtZSwgbnVsbC8qQ29udGVudFNlbGVjdG9yKi8sIG51bGwvKlByb2dyZXNzTW9uaXRvciovKTsNCi0JfQ0KLQkNCi0Jdm9pZCB1bnBhY2tGZWF0dXJlRW50cnlDb250ZW50KEZlYXR1cmVNb2RlbCBmZWF0dXJlLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHsNCi0JCQkNCi0JCS8vIGRlZmluZSBzZWxlY3RvciBmb3IgZmVhdHVyZSBlbnRyeSBmaWxlcw0KLQkJQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEphckVudHJ5IGphckVudHJ5KSB7DQotCQkJCWlmIChqYXJFbnRyeS5pc0RpcmVjdG9yeSgpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOwkJCQkJDQotCQkJCVN0cmluZyBlbnRyeSA9IGphckVudHJ5LmdldE5hbWUoKTsNCi0JCQkJaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvcmVhZG1lLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2Uvc3BsYXNoLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvIikgJiYgZW50cnkuaW5kZXhPZigiLyIsOCk9PS0xICYmIGVudHJ5LmVuZHNXaXRoKCIuaHRtbCIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UNCi0JCQkJCXJldHVybiBmYWxzZTsJDQotCQkJfQ0KLQkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCWlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlLyIpKQ0KLQkJCQkJcmV0dXJuIGVudHJ5LnN1YnN0cmluZyg4KTsNCi0JCQkJZWxzZQ0KLQkJCQkJcmV0dXJuIGVudHJ5Ow0KLQkJCX0NCi0JCX07DQotCQkNCi0JCS8vIHVucGFjayBmZWF0dXJlIGVudHJ5IGZpbGVzDQotCQlGaWxlIHRtcERpciA9IGdldFdvcmtpbmdEaXJlY3RvcnkoKTsNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZzID0gYmFzZVJlZmVyZW5jZS51bnBhY2sodG1wRGlyLCBzZWxlY3RvciwgbW9uaXRvcik7DQotCQkNCi0JCS8vIHdyaXRlIG91dCBmZWF0dXJlIG1hbmlmZXN0IChmZWF0dXJlLnhtbCk7DQotCQlGaWxlIG1hbmlmZXN0ID0gVXRpbGl0aWVzLmNyZWF0ZUxvY2FsRmlsZSh0bXBEaXIsImZlYXR1cmUueG1sIik7DQotCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0UmVmZXJlbmNlID0gbmV3IENvbnRlbnRSZWZlcmVuY2UoImZlYXR1cmUueG1sIiwgbWFuaWZlc3QpOw0KLQkJRGVmYXVsdE1vZGVsV3JpdGVyIHcgPSBuZXcgRGVmYXVsdE1vZGVsV3JpdGVyKGZlYXR1cmUpOw0KLQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG51bGw7DQotCQl0cnkgew0KLQkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obWFuaWZlc3QpOw0KLQkJCXcud3JpdGVGZWF0dXJlTWFuaWZlc3Qob3MpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAob3MgIT0gbnVsbCkgdHJ5IHsgb3MuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KLQkJfQ0KLQkJdGhpcy5nZW5lcmF0ZWRGZWF0dXJlTWFuaWZlc3QgPSBtYW5pZmVzdFJlZmVyZW5jZTsNCi0JCQ0KLQkJLy8gc2F2ZSByZWZlcmVuY2VzIChuZXdseS13cml0dGVuIGZlYXR1cmUueG1sIHBsdXMgcmVzdCBvZiBzZWxlY3RlZCBmZWF0dXJlIGZpbGVzKQ0KLQkJQ29udGVudFJlZmVyZW5jZVtdIGFsbFJlZnMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVtyZWZzLmxlbmd0aCsxXTsNCi0JCWFsbFJlZnNbMF0gPSBtYW5pZmVzdFJlZmVyZW5jZTsNCi0JCVN5c3RlbS5hcnJheWNvcHkocmVmcywwLGFsbFJlZnMsMSxyZWZzLmxlbmd0aCk7DQotCQlmZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyA9IGFsbFJlZnM7DQotCX0NCi0JCQ0KLQlDb250ZW50UmVmZXJlbmNlW10gcGVla1BsdWdpbkVudHJ5Q29udGVudChJUGx1Z2luRW50cnkgcGx1Z2luLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJDQotCQkvLyBkZWZpbmUgc2VsZWN0b3IgZm9yIHBsdWdpbiBlbnRyeSBmaWxlcw0KLQkJQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEphckVudHJ5IGphckVudHJ5KSB7DQotCQkJCWlmIChqYXJFbnRyeS5pc0RpcmVjdG9yeSgpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCVN0cmluZyBpZCA9IGN1cnJlbnRQbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOw0KLQkJCQlpZiAoaWQ9PW51bGwpDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvcGx1Z2lucy8iK2lkKyIvIikpDQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJZWxzZQ0KLQkJCQkJcmV0dXJuIGZhbHNlOwkNCi0JCQl9DQotCQkJcHVibGljIFN0cmluZyBkZWZpbmVJZGVudGlmaWVyKEphckVudHJ5IGphckVudHJ5KSB7DQotCQkJCVN0cmluZyBlbnRyeSA9IGphckVudHJ5LmdldE5hbWUoKTsNCi0JCQkJaW50IGl4ID0gZW50cnkuaW5kZXhPZigiLyIsMTYpOw0KLQkJCQlpZiAoaXggIT0gLTEpIHsNCi0JCQkJCXJldHVybiBlbnRyeS5zdWJzdHJpbmcoaXgrMSk7DQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXR1cm4gZW50cnk7DQotCQkJCX0NCi0JCQl9DQotCQl9Ow0KLQkJDQotCQkvLyB1bnBhY2sgcGx1Z2luIGVudHJ5IGZpbGVzDQotCQljdXJyZW50UGx1Z2luRW50cnkgPSBwbHVnaW47DQotCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5wZWVrKHNlbGVjdG9yLCBtb25pdG9yKTsNCi0JfQ0KLQkJDQotCUNvbnRlbnRSZWZlcmVuY2VbXSBwZWVrTm9uUGx1Z2luRW50cnlDb250ZW50KElOb25QbHVnaW5FbnRyeSBkYXRhLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJDQotCQkvLyBkZWZpbmUgc2VsZWN0b3IgZm9yIG5vbiBwbHVnaW4gZW50cnkgZmlsZXMNCi0JCUNvbnRlbnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlpZiAoamFyRW50cnkuaXNEaXJlY3RvcnkoKSkNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJU3RyaW5nIGVudHJ5ID0gamFyRW50cnkuZ2V0TmFtZSgpOw0KLQkJCQlTdHJpbmcgaWQgPSBjdXJyZW50Tm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpOw0KLQkJCQlpZiAoIWlkLmVxdWFscygicm9vdCIpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQllbHNlIGlmICghZW50cnkuc3RhcnRzV2l0aCgiZWNsaXBzZS9wbHVnaW5zLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UNCi0JCQkJCXJldHVybiBmYWxzZTsJDQotCQkJfQ0KLQkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCWlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlLyIpKQ0KLQkJCQkJcmV0dXJuIGVudHJ5LnN1YnN0cmluZyg4KTsNCi0JCQkJZWxzZQ0KLQkJCQkJcmV0dXJuIGVudHJ5Ow0KLQkJCX0NCi0JCX07DQotCQkNCi0JCS8vIHVucGFjayBub24gcGx1Z2luIGVudHJ5IGZpbGVzDQotCQljdXJyZW50Tm9uUGx1Z2luRW50cnkgPSBkYXRhOw0KLQkJcmV0dXJuIGJhc2VSZWZlcmVuY2UucGVlayhzZWxlY3RvciwgbW9uaXRvcik7DQotCX0NCi0JDQotCXByaXZhdGUgQ29yZUV4Y2VwdGlvbiBuZXdDb3JlRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzIiwwLHMsZSkpOw0KLQl9DQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0VmVyaWZpZXIoKQ0KLQkgKi8NCi0JcHVibGljIElWZXJpZmllciBnZXRWZXJpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjE1MGI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8gDQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZUZlYXR1cmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsOw0KLQ0KLS8qKg0KLSAqIEFuIGV4YW1wbGUgZmVhdHVyZSBmYWN0b3J5IGJhc2VkIG9uIHRoZSBwYWNrYWdpbmcgDQotICogZm9ybWF0IHVzZWQgZm9yIGludGVncmF0aW9uIGFuZCBzdGFibGUgYnVpbGRzDQotICogcG9zdGVkIG9uIHRoZSBkb3dubG9hZHMgcGFnZXMgYXQgd3d3LmVjbGlwc2Uub3JnDQotICogPC9wPg0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgQnVpbGRaaXBGZWF0dXJlRmFjdG9yeQ0KLQlleHRlbmRzIEJhc2VGZWF0dXJlRmFjdG9yeQ0KLQlpbXBsZW1lbnRzIElGZWF0dXJlRmFjdG9yeSB7DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVGYWN0b3J5I2NyZWF0ZUZlYXR1cmUoVVJMLCBJU2l0ZSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsIElTaXRlIHNpdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJdHJ5IHsNCi0JCQkvLyBjcmVhdGUgY29udGVudCBwcm92aWRlciBmb3IgZmVhdHVyZQ0KLQkJCUJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCA9IG5ldyBCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIodXJsKTsNCi0JCQlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOw0KLQkJCQ0KLQkJCS8vIHBhcnNlIHRoZSBmZWF0dXJlDQotCQkJZmVhdHVyZSA9IChGZWF0dXJlKSBwYXJzZUZlYXR1cmUoY3ApOw0KLQkJCQ0KLQkJCS8vIGluaXRpYWxpemUgZmVhdHVyZQ0KLQkJCWZlYXR1cmUuc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihjcCk7DQotCQkJZmVhdHVyZS5zZXRTaXRlKHNpdGUpOw0KLQkJCWZlYXR1cmUucmVzb2x2ZShjcC5nZXRGZWF0dXJlQmFzZVVSTCgpLCBudWxsKTsgDQotCQkJZmVhdHVyZS5tYXJrUmVhZE9ubHkoKTsNCi0JCQlyZXR1cm4gZmVhdHVyZTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXAiLDAsIlVuYWJsZSB0byBjcmVhdGUgZmVhdHVyZSIsZSkpOw0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIHBhcnNlIHRoZSBidWlsZCB6aXAgdG8gcmVjb25zdHJ1Y3QgYSBmZWF0dXJlIG1vZGVsDQotCSAqLw0KLQlwdWJsaWMgRmVhdHVyZU1vZGVsIHBhcnNlRmVhdHVyZShCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3ApIHRocm93cyBFeGNlcHRpb24gew0KLQkJcmV0dXJuIChuZXcgQnVpbGRaaXBGZWF0dXJlUGFyc2VyKHRoaXMpKS5wYXJzZShjcCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZVBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQ4ZGVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8gDQotIA0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuUGx1Z2luRW50cnlNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbDsNCi0NCi0vKioNCi0gKiBBbiBleGFtcGxlIGZlYXR1cmUgcGFyc2VyLiBJdCBoYW5kbGVzIGZlYXR1cmVzIHBhY2thZ2VkIGFzDQotICogYnVpbGQgemlwJ3MgdXNpbmcgdGhlIGZvcm1hdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiBhbmQgc3RhYmxlIGJ1aWxkcw0KLSAqIHBvc3RlZCBvbiB0aGUgZG93bmxvYWRzIHBhZ2VzIGF0IHd3dy5lY2xpcHNlLm9yZw0KLSAqIDwvcD4NCi0gKiBAc2luY2UgMi4wDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwRmVhdHVyZVBhcnNlciB7CQ0KLQkNCi0JcHJpdmF0ZSBCdWlsZFppcEZlYXR1cmVGYWN0b3J5IGZhY3Rvcnk7DQotCXByaXZhdGUgQnVpbGRaaXBQbHVnaW5QYXJzZXIgcGx1Z2luUGFyc2VyOw0KLQkNCi0JcHVibGljIEJ1aWxkWmlwRmVhdHVyZVBhcnNlcihCdWlsZFppcEZlYXR1cmVGYWN0b3J5IGZhY3RvcnkpIHsNCi0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7DQotCX0NCi0JDQotCXB1YmxpYyBGZWF0dXJlTW9kZWwgcGFyc2UoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQkJDQotCQlyZXR1cm4gcGFyc2VGZWF0dXJlKGNwKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBGZWF0dXJlTW9kZWwgcGFyc2VGZWF0dXJlKEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkNCi0JCQ0KLQkJLy8gZ2V0IHJlZmVyZW5jZSB0byB0aGUgYnVpbGQgbWFuaWZlc3QNCi0JCUNvbnRlbnRSZWZlcmVuY2UgbWFuaWZlc3RSZWYgPSBjcC5nZXRGZWF0dXJlQnVpbGRNYW5pZmVzdCgpOw0KLQkJSW5wdXRTdHJlYW0gaXMgPSBtYW5pZmVzdFJlZi5nZXRJbnB1dFN0cmVhbSgpOwkJDQotCQkNCi0JCS8vIGxvYWQgYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzDQotCQlQcm9wZXJ0aWVzIG1hbmlmZXN0ID0gbmV3IFByb3BlcnRpZXMoKTsNCi0JCXRyeSB7DQotCQkJbWFuaWZlc3QubG9hZChpcyk7DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpcyE9bnVsbCkgdHJ5IHsgaXMuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KLQkJfQ0KLQkJDQotCQkvLyBwb3B1bGF0ZSBmZWF0dXJlIG1vZGVsDQotCQlGZWF0dXJlTW9kZWwgZmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZU1vZGVsKCk7DQotCQlwYXJzZUZlYXR1cmVFbnRyeShjcCwgZmVhdHVyZSwgbWFuaWZlc3QpOw0KLQkJDQotCQkvLyBwYXJzZSBwbHVnaW4gZW50cmllcw0KLQkJcGFyc2VQbHVnaW5FbnRyaWVzKGNwLCBmZWF0dXJlLCBtYW5pZmVzdCk7IA0KLQkJDQotCQkvLyBwYXJzZSBub24tcGx1Z2luIGVudHJpZXMNCi0JCXBhcnNlTm9uUGx1Z2luRW50cmllcyhjcCwgZmVhdHVyZSwgbWFuaWZlc3QpOw0KLQkJDQotCQkvLyB1bnBhY2sgZmVhdHVyZSBlbnRyeSBjb250ZW50DQotCQljcC51bnBhY2tGZWF0dXJlRW50cnlDb250ZW50KGZlYXR1cmUsIG51bGwvKklQcm9ncmVzc01vbml0b3IqLyk7DQotCQkNCi0JCXJldHVybiBmZWF0dXJlOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcGFyc2VGZWF0dXJlRW50cnkoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSwgUHJvcGVydGllcyBtYW5pZmVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkNCi0JCS8vIHBhcnNlIG91dCBidWlsZCB6aXAgZmlsZSBuYW1lLiBJdCBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZQ0KLQkJLy8gZm9ybSA8cGFja2FnZSBpZGVudGlmaWVyPi08YnVpbGQgZGF0ZT4tPHRhcmdldCBwbGF0Zm9ybT4uemlwLA0KLQkJLy8gd2hlcmUNCi0JCS8vCQk8cGFja2FnZSBpZGVudGlmaWVyPiBpcyBoeXBoZW4gKC0pIHNlcGFyYXRlcmQgdG9rZW4gbGlzdA0KLQkJLy8JCTxidWlsZCBkYXRlPiBpcyBzaW5nbGUgYWxsLW51bWVyaWMgdG9rZW4NCi0JCS8vCQk8dGFyZ2V0IHBsYXRmb3JtPiBpcyBoeXBoZW4gKC0pIHNlcGFyYXRlcmQgdG9rZW4gbGlzdA0KLQkJDQotCQlTdHJpbmcgcGtnSWQgPSAiIjsNCi0JCVN0cmluZyB0YXJnZXQgPSAiIjsNCi0JCVN0cmluZyBidWlsZCA9ICIiOw0KLQkJU3RyaW5nIHN0YXRlID0gIklEIjsNCi0JCWJvb2xlYW4gZmlyc3RUb2tlbiA9IHRydWU7DQotCQlTdHJpbmcgemlwTmFtZSA9IFVSTERlY29kZXIuZGVjb2RlKGNwLmdldFVSTCgpLmdldEZpbGUoKSk7DQotCQlpbnQgaXggPSB6aXBOYW1lLmxhc3RJbmRleE9mKCIvIik7DQotCQlpZiAoaXggIT0gLTEpDQotCQkJemlwTmFtZSA9IHppcE5hbWUuc3Vic3RyaW5nKGl4KzEpOw0KLQkJaWYgKHppcE5hbWUuZW5kc1dpdGgoIi56aXAiKSkgew0KLQkJCXppcE5hbWUgPSB6aXBOYW1lLnN1YnN0cmluZygwLHppcE5hbWUubGVuZ3RoKCktNCk7DQotCQl9DQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih6aXBOYW1lLCItIixmYWxzZSk7DQotCQlTdHJpbmcgdG9rZW47DQotCQl3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7DQotCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQotCQkJdHJ5IHsNCi0JCQkJTG9uZy5wYXJzZUxvbmcodG9rZW4pOw0KLQkJCQlzdGF0ZSA9ICJUQVJHRVQiOw0KLQkJCQl0YXJnZXQgPSAiIjsNCi0JCQkJZmlyc3RUb2tlbiA9IHRydWU7DQotCQkJCWJ1aWxkID0gdG9rZW4rIi4wLjAiOw0KLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotCQkJCWlmIChzdGF0ZS5lcXVhbHMoIklEIikpIHsNCi0JCQkJCXBrZ0lkICs9IChmaXJzdFRva2VuID8gIiIgOiAiICIpICsgdG9rZW47DQotCQkJCX0gZWxzZSB7DQotCQkJCQl0YXJnZXQgKz0gKGZpcnN0VG9rZW4gPyAiIiA6ICIgIikgKyB0b2tlbjsNCi0JCQkJfQ0KLQkJCQlmaXJzdFRva2VuID0gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQkvLyBnZW5lcmF0ZSBiYXNlIGZlYXR1cmUgYXR0cmlidXRlcw0KLQkJZmVhdHVyZS5zZXRGZWF0dXJlSWRlbnRpZmllcihwa2dJZC5yZXBsYWNlKCcgJywnLicpKTsNCi0JCWZlYXR1cmUuc2V0RmVhdHVyZVZlcnNpb24oYnVpbGQpOw0KLQkJZmVhdHVyZS5zZXRMYWJlbChwa2dJZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcGtnSWQuc3Vic3RyaW5nKDEpICsgIiBmb3IgIiArIHRhcmdldCk7DQotCQlmZWF0dXJlLnNldFByb3ZpZGVyKCJ3d3cuZWNsaXBzZS5vcmciKTsNCi0JCWZlYXR1cmUuc2V0SW1hZ2VVUkxTdHJpbmcoInNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiKTsNCi0JCWZlYXR1cmUuc2V0T1ModGFyZ2V0LnJlcGxhY2UoJyAnLCctJykpOwkNCi0JCQ0KLQkJLy8gYWRkIGRlc2NyaXB0aW9uDQotCQlVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uID0gZmFjdG9yeS5jcmVhdGVVUkxFbnRyeU1vZGVsKCk7DQotCQlkZXNjcmlwdGlvbi5zZXRVUkxTdHJpbmcoInJlYWRtZS9yZWFkbWUuaHRtbCIpOw0KLQkJZGVzY3JpcHRpb24uc2V0QW5ub3RhdGlvbigieCIpOw0KLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbk1vZGVsKGRlc2NyaXB0aW9uKTsNCi0JCQ0KLQkJLy8gYWRkIGxpY2Vuc2UNCi0JCVVSTEVudHJ5TW9kZWwgbGljZW5zZSA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KLQkJbGljZW5zZS5zZXRVUkxTdHJpbmcoImFib3V0Lmh0bWwiKTsNCi0JCWxpY2Vuc2Uuc2V0QW5ub3RhdGlvbigiWW91IG11c3QgdmlldyB0aGUgZnVsbCBsaWNlbnNlIGJ5IGZvbGxvd2luZyB0aGUgXCJMaWNlbnNlXCIgbGluayBpbiB0aGUgZmVhdHVyZSBwcmV2aWV3LlxuU2VsZWN0aW5nIFwiQWNjZXB0XCIgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgdmlld2VkIGFuZCBhY2NlcHRlZCB0aGUgZmVhdHVyZSBsaWNlbnNlLiIpOw0KLQkJZmVhdHVyZS5zZXRMaWNlbnNlTW9kZWwobGljZW5zZSk7DQotCQkNCi0JCS8vIGFkZCBjb3B5cmlnaHQNCi0JCVVSTEVudHJ5TW9kZWwgY29weXJpZ2h0ID0gZmFjdG9yeS5jcmVhdGVVUkxFbnRyeU1vZGVsKCk7DQotCQljb3B5cmlnaHQuc2V0VVJMU3RyaW5nKCJub3RpY2UuaHRtbCIpOw0KLQkJY29weXJpZ2h0LnNldEFubm90YXRpb24oIngiKTsNCi0JCWZlYXR1cmUuc2V0Q29weXJpZ2h0TW9kZWwoY29weXJpZ2h0KTsNCi0JfQkNCi0JDQotCXByaXZhdGUgdm9pZCBwYXJzZVBsdWdpbkVudHJpZXMoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSwgUHJvcGVydGllcyBtYW5pZmVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkNCi0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBtYW5pZmVzdC5rZXlzKCk7DQotCQlTdHJpbmcgcGx1Z2luOw0KLQkJU3RyaW5nIHBsdWdpbklkOw0KLQkJU3RyaW5nIHBsdWdpblZlcnNpb247DQotCQlTdHJpbmcgcGx1Z2luQnVpbGRWZXJzaW9uOw0KLQkJUGx1Z2luRW50cnlNb2RlbCBwbHVnaW5FbnRyeTsNCi0JCXdoaWxlKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0JCQlwbHVnaW4gPSAoU3RyaW5nKSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotCQkJaWYgKHBsdWdpbi5zdGFydHNXaXRoKCJwbHVnaW5AIikpIHsNCi0JCQkJcGx1Z2luSWQgPSBwbHVnaW4uc3Vic3RyaW5nKDcpOw0KLQkJCQlwbHVnaW5CdWlsZFZlcnNpb24gPSBtYW5pZmVzdC5nZXRQcm9wZXJ0eShwbHVnaW4pOw0KLQkJCQlpZiAocGx1Z2luQnVpbGRWZXJzaW9uLmVxdWFscygiSEVBRCIpKSB7DQotCQkJCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24gPSBmZWF0dXJlLmdldEZlYXR1cmVWZXJzaW9uKCk7DQotCQkJCQlpbnQgaXggPSBmZWF0dXJlVmVyc2lvbi5pbmRleE9mKCIuIik7DQotCQkJCQlTdHJpbmcgZmVhdHVyZU1ham9yID0gaXg9PS0xID8gZmVhdHVyZVZlcnNpb24gOiBmZWF0dXJlVmVyc2lvbi5zdWJzdHJpbmcoMCxpeCk7DQotCQkJCQlwbHVnaW5CdWlsZFZlcnNpb24gKz0gIi0iICsgZmVhdHVyZU1ham9yOw0KLQkJCQl9DQotCQkJCXBsdWdpbkVudHJ5ID0gZmFjdG9yeS5jcmVhdGVQbHVnaW5FbnRyeU1vZGVsKCk7DQotCQkJCXBsdWdpblZlcnNpb24gPSBwYXJzZVBsdWdpblZlcnNpb25Jbk1hbmlmZXN0KGNwLCBwbHVnaW5JZCwgcGx1Z2luRW50cnkpOw0KLQkJCQlpZiAocGx1Z2luVmVyc2lvbiAhPSBudWxsKSB7DQotCQkJCQlwbHVnaW5FbnRyeS5zZXRQbHVnaW5JZGVudGlmaWVyKHBsdWdpbklkKTsNCi0JCQkJCXBsdWdpbkVudHJ5LnNldFBsdWdpblZlcnNpb24oKG5ldyBQbHVnaW5WZXJzaW9uSWRlbnRpZmllcihwbHVnaW5WZXJzaW9uKSkudG9TdHJpbmcoKSsiLiIrcGx1Z2luQnVpbGRWZXJzaW9uKTsNCi0JCQkJCWZlYXR1cmUuYWRkUGx1Z2luRW50cnlNb2RlbChwbHVnaW5FbnRyeSk7DQotCQkJCX0NCi0JCQl9DQotCQl9CQkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHBhcnNlTm9uUGx1Z2luRW50cmllcyhCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3AsIEZlYXR1cmVNb2RlbCBmZWF0dXJlLCBQcm9wZXJ0aWVzIG1hbmlmZXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JLy8JTm9uUGx1Z2luRW50cnlNb2RlbCBub25QbHVnaW5FbnRyeSA9IGZhY3RvcnkuY3JlYXRlTm9uUGx1Z2luRW50cnlNb2RlbCgpOw0KLQkvLwlub25QbHVnaW5FbnRyeS5zZXRJZGVudGlmaWVyKCJyb290Iik7DQotCS8vCWZlYXR1cmUuYWRkTm9uUGx1Z2luRW50cnlNb2RlbChub25QbHVnaW5FbnRyeSk7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIHBhcnNlUGx1Z2luVmVyc2lvbkluTWFuaWZlc3QoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBTdHJpbmcgcGx1Z2luSWQsIFBsdWdpbkVudHJ5TW9kZWwgcGx1Z2luRW50cnkpIHsNCi0NCi0JCWlmIChwbHVnaW5QYXJzZXIgPT0gbnVsbCkNCi0JCQlwbHVnaW5QYXJzZXIgPSBuZXcgQnVpbGRaaXBQbHVnaW5QYXJzZXIoKTsNCi0JCQkJDQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7CQkJCQ0KLQkJQ29udGVudFJlZmVyZW5jZSBwbHVnaW5NYW5pZmVzdDsNCi0JCXRyeSB7DQotCQkJLy8gdHJ5IHBsdWdpbi54bWwNCi0JCQlwbHVnaW5NYW5pZmVzdCAgPSBjcC5nZXRQbHVnaW5NYW5pZmVzdChwbHVnaW5JZCwgZmFsc2UpOw0KLQkJCWlzID0gcGx1Z2luTWFuaWZlc3QuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQlyZXR1cm4gcGx1Z2luUGFyc2VyLnBhcnNlKGlzKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJLy8gcmV0cnkgd2l0aCBmZWF0dXJlLnhtbA0KLQkJCQlwbHVnaW5NYW5pZmVzdCAgPSBjcC5nZXRQbHVnaW5NYW5pZmVzdChwbHVnaW5JZCwgdHJ1ZSk7DQotCQkJCWlzID0gcGx1Z2luTWFuaWZlc3QuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQkJU3RyaW5nIHJlc3VsdCA9IHBsdWdpblBhcnNlci5wYXJzZShpcyk7DQotCQkJCXBsdWdpbkVudHJ5LmlzRnJhZ21lbnQodHJ1ZSk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKGlzICE9IG51bGwpIHRyeSB7IGlzLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwUGx1Z2luUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBQbHVnaW5QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlMWQxZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBQbHVnaW5QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KLQ0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMi4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsNCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsNCi0NCi0vKioNCi0gKiBQYXJzZSBkZWZhdWx0IGZlYXR1cmUueG1sDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwUGx1Z2luUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgew0KLQ0KLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7DQotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOID0gInBsdWdpbiI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVCA9ICJmcmFnbWVudCI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOwkNCi0JDQotCXByaXZhdGUgY2xhc3MgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbiB7DQotCQlwdWJsaWMgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgew0KLQkJCXN1cGVyKGFyZzApOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdEZlYXR1cmVQYXJzZXINCi0JICovDQotCXB1YmxpYyBCdWlsZFppcFBsdWdpblBhcnNlcigpIHsNCi0JCXN1cGVyKCk7DQotCQl0aGlzLnBhcnNlciA9IG5ldyBTQVhQYXJzZXIoKTsNCi0JCXRoaXMucGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgcGFyc2UoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJdmVyc2lvbiA9IG51bGw7DQotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOw0KLQkJfSBjYXRjaChQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JCXJldHVybiB2ZXJzaW9uOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNzdGFydEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgQXR0cmlidXRlcykNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0JCQ0KLQkJU3RyaW5nIHRhZyA9IGxvY2FsTmFtZS50cmltKCk7DQotCQ0KLQkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKFBMVUdJTikpIHsNCi0JCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JDQotCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoRlJBR01FTlQpKSB7DQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCX0NCi0JDQotCS8qKiANCi0JICogcHJvY2VzcyBwbHVnaW4gZW50cnkgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQbHVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiB7DQotCQl2ZXJzaW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOw0KLQkJdGhyb3cgbmV3IFBhcnNlQ29tcGxldGVFeGNlcHRpb24oIiIpOw0KLQl9DQotfQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYzAzMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUNvbnRlbnRQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRQcm92aWRlciB7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2l0ZUNvbnRlbnRQcm92aWRlci4NCi0JICovDQotCXB1YmxpYyBCdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIoVVJMIHVybCkgew0KLQkJc3VwZXIodXJsKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRQcm92aWRlciNnZXRBcmNoaXZlUmVmZXJlbmNlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcgaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCS8vIGJ1aWxkIHppcCBmZWF0dXJlcyBkbyBub3QgaGF2ZSBhc3NvY2lhdGVkIGFyY2hpdmVzDQotCQkvLyB0aGUgemlwIGZpbGUgYWxzbyBjb250YWlucyB0aGUgYXJjaGl2ZXMgZmlsZXMNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjkxOTZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlU2l0ZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNhdGVnb3J5TW9kZWw7DQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwU2l0ZUZhY3RvcnkgZXh0ZW5kcyBCYXNlU2l0ZUZhY3Rvcnkgew0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCkNCi0JICovDQotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uLEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotDQotCQlTaXRlIHNpdGUgPSBudWxsOw0KLQ0KLQkJLy8gY3JlYXRlIHNpdGUgYW5kIGFkZCBjYXRlZ29yeQ0KLQkJc2l0ZSA9IChTaXRlKSBjcmVhdGVTaXRlTWFwTW9kZWwoKTsNCi0JCUNhdGVnb3J5TW9kZWwgY2F0ZWdvcnkgPSBjcmVhdGVTaXRlQ2F0ZWdvcnlNb2RlbCgpOw0KLQkJY2F0ZWdvcnkuc2V0TmFtZSgiZWNsaXBzZS1idWlsZHMiKTsNCi0JCWNhdGVnb3J5LnNldExhYmVsKCJFY2xpcHNlIEJ1aWxkcyIpOw0KLQkJc2l0ZS5hZGRDYXRlZ29yeU1vZGVsKGNhdGVnb3J5KTsNCi0NCi0JCS8vIHNldCBjb250ZW50IHByb3ZpZGVyDQotCQlCdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEJ1aWxkWmlwU2l0ZUNvbnRlbnRQcm92aWRlcih1cmwpOw0KLQkJc2l0ZS5zZXRTaXRlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7DQotDQotCQkvLyBnZXQgYWxsIG1hdGNoaW5nIHppcCBmaWxlcyBvbiB0aGUgc2l0ZQ0KLQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7DQotCQkJCWlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnppcCIpKSB7DQotCQkJCQl0cnkgew0KLQkJCQkJCVppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoZmlsZSk7DQotCQkJCQkJWmlwRW50cnkgZW50cnkgPSB6aXAuZ2V0RW50cnkoImVjbGlwc2UvYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIik7DQotCQkJCQkJaWYgKGVudHJ5ID09IG51bGwpDQotCQkJCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJCQllbHNlDQotCQkJCQkJCXJldHVybiB0cnVlOw0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfSBlbHNlDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfTsNCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKFVSTERlY29kZXIuZGVjb2RlKHVybC5nZXRGaWxlKCkpKTsNCi0JCUZpbGVbXSB6aXBzID0gZmlsZS5saXN0RmlsZXMoZmlsdGVyKTsNCi0NCi0JCS8vIGNyZWF0ZSBhIHJlZmVyZW5jZSBmb3IgZWFjaCBtYXRjaGluZyB6aXANCi0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgcmVmID0gbnVsbDsNCi0JCWZvciAoaW50IGkgPSAwOyB6aXBzICE9IG51bGwgJiYgaSA8IHppcHMubGVuZ3RoOyBpKyspIHsNCi0JCQlyZWYgPSBjcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsNCi0JCQlyZWYuc2V0VHlwZSgib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLnppcCIpOw0KLQkJCXJlZi5zZXRTaXRlTW9kZWwoc2l0ZSk7DQotCQkJcmVmLnNldFVSTFN0cmluZygiZmlsZToiICsgemlwc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQotCQkJcmVmLnNldENhdGVnb3J5TmFtZXMobmV3IFN0cmluZ1tdIHsgImVjbGlwc2UtYnVpbGRzIiB9KTsNCi0JCQlzaXRlLmFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChyZWYpOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlzaXRlLnJlc29sdmUodXJsLCBudWxsKTsgLy8gcmVzb2x2ZSBhbnkgVVJMcyByZWxhdGl2ZSB0byB0aGUgc2l0ZQ0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCIiLGUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0RlZmF1bHRNb2RlbFdyaXRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0RlZmF1bHRNb2RlbFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E4YmM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9EZWZhdWx0TW9kZWxXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsKLQotLyoKLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovIAotIAotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotCi0vKioKLSAqIFdyaXRlIHN0YW5kYXJkIGZlYXR1cmUgbWFuaWZlc3QgKGZlYXR1cmUueG1sKSBmcm9tIG1vZGVsLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxXcml0ZXIgewotCQotCXByaXZhdGUgRmVhdHVyZU1vZGVsIGZlYXR1cmU7Ci0JCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBEZWZhdWx0TW9kZWxXcml0ZXIoRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlRmVhdHVyZU1hbmlmZXN0KE91dHB1dFN0cmVhbSBvcykgewotCQlQcmludFdyaXRlciB3ID0gbmV3IFByaW50V3JpdGVyKG9zKTsKLQkJd3JpdGVGZWF0dXJlKHcsMCxmZWF0dXJlKTsKLQkJdy5mbHVzaCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVGZWF0dXJlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJdy5wcmludGxuKGluKyI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKLQkJCi0JCXcucHJpbnRsbihpbisiPGZlYXR1cmUiKTsKLQkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSE9bnVsbCkKLQkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2ZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSsiXCIiKTsKLQkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZVZlcnNpb24oKSE9bnVsbCkKLQkJCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrZmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRMYWJlbE5vbkxvY2FsaXplZCgpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJsYWJlbD1cIiIrZmVhdHVyZS5nZXRMYWJlbE5vbkxvY2FsaXplZCgpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRQcm92aWRlck5vbkxvY2FsaXplZCgpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJwcm92aWRlci1uYW1lPVwiIitmZWF0dXJlLmdldFByb3ZpZGVyTm9uTG9jYWxpemVkKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldEltYWdlVVJMU3RyaW5nKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrImltYWdlPVwiIitmZWF0dXJlLmdldEltYWdlVVJMU3RyaW5nKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldE9TKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitmZWF0dXJlLmdldE9TKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldFdTKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIndzPVwiIitmZWF0dXJlLmdldFdTKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldE5MKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIm5sPVwiIitmZWF0dXJlLmdldE5MKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrImFwcGxpY2F0aW9uPVwiIitmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCkrIlwiIik7Ci0JCXcucHJpbnRsbihpbisiICAgIisiPiIpOwotCQkKLQkJd3JpdGVEZXNjcmlwdGlvbih3LCBsZXZlbCsxLCBmZWF0dXJlLmdldERlc2NyaXB0aW9uTW9kZWwoKSk7Ci0JCXdyaXRlQ29weXJpZ2h0KHcsIGxldmVsKzEsIGZlYXR1cmUuZ2V0Q29weXJpZ2h0TW9kZWwoKSk7Ci0JCXdyaXRlTGljZW5zZSh3LCBsZXZlbCsxLCBmZWF0dXJlLmdldExpY2Vuc2VNb2RlbCgpKTsKLQkJd3JpdGVVUkxzKHcsIGxldmVsKzEsIGZlYXR1cmUpOwotCQl3cml0ZVByZXJlcXModywgbGV2ZWwrMSwgZmVhdHVyZSk7Ci0JCXdyaXRlUGx1Z2luRW50cmllcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsKLQkJd3JpdGVOb25QbHVnaW5FbnRyaWVzKHcsIGxldmVsKzEsIGZlYXR1cmUpOwotICAgICAgICAgCi0gICAgICAgIHcucHJpbnRsbigiIik7Ci0gICAgICAgIHcucHJpbnRsbihpbisiPC9mZWF0dXJlPiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVEZXNjcmlwdGlvbihQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKLQkJd3JpdGVEZXNjcmlwdGlvbkVudHJ5KHcsbGV2ZWwsIHVlLCAiZGVzY3JpcHRpb24iKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29weXJpZ2h0KFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgewotCQl3cml0ZURlc2NyaXB0aW9uRW50cnkodyxsZXZlbCwgdWUsICJjb3B5cmlnaHQiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTGljZW5zZShQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKLQkJd3JpdGVEZXNjcmlwdGlvbkVudHJ5KHcsbGV2ZWwsIHVlLCAibGljZW5zZSIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVEZXNjcmlwdGlvbkVudHJ5KFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSwgU3RyaW5nIHRhZykgewotCQlpZiAodWUgPT0gbnVsbCkgcmV0dXJuOwotCQlTdHJpbmcgdXJsID0gdWUuZ2V0VVJMU3RyaW5nKCk7Ci0JCVN0cmluZyB0eHQgPSB1ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCk7Ci0JCWlmICh1cmw9PW51bGwgJiYgdHh0PT1udWxsKSByZXR1cm47Ci0JCQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQl3LnByaW50bG4oIiIpOwotCQlpZiAodXJsPT1udWxsKQotCQkJdy5wcmludGxuKGluKyI8Iit0YWcrIj4iKTsKLQkJZWxzZSB7Ci0JCQl3LnByaW50KGluKyI8Iit0YWcrIiB1cmw9XCIiK3VlLmdldFVSTFN0cmluZygpKyJcIiIpOwotCQkJaWYgKHR4dD09bnVsbCkKLQkJCQl3LnByaW50bG4oIi8+Iik7Ci0JCQllbHNlCi0JCQkJdy5wcmludGxuKCI+Iik7Ci0JCX0KLQkJaWYgKHR4dCE9bnVsbCkgewotCQkJdy5wcmludGxuKGluICsgdHh0KTsKLQkJCXcucHJpbnRsbihpbisiPC8iK3RhZysiPiIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZVVSTHMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewkKLQkJVVJMRW50cnlNb2RlbCB1cGRhdGUgPSBmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKCk7Ci0JCVVSTEVudHJ5TW9kZWxbXSBkaXNjb3ZlcnkgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpOwkJCi0JCWlmICh1cGRhdGUgPT0gbnVsbCAmJiAoZGlzY292ZXJ5ID09IG51bGwgfHwgZGlzY292ZXJ5Lmxlbmd0aD09MCkpIHJldHVybjsKLQkJCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCVN0cmluZyBpbjIgPSBnZXRJbmRlbnQobGV2ZWwrMSk7CQkKLQkJdy5wcmludGxuKCIiKTsKLQkJdy5wcmludGxuKGluKyI8dXJsPiIpOwotCQkKLQkJaWYgKHVwZGF0ZSAhPSBudWxsKSB7Ci0JCQl3LnByaW50bG4oaW4yKyI8dXBkYXRlIik7Ci0JCQlpZiAodXBkYXRlLmdldFVSTFN0cmluZygpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrInVybD1cIiIrdXBkYXRlLmdldFVSTFN0cmluZygpKyJcIiIpOwotCQkJaWYgKHVwZGF0ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisibGFiZWw9XCIiK3VwZGF0ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkrIlwiIik7Ci0JCQl3LnByaW50bG4oaW4yKyIgICAiKyIvPiIpOwotCQl9Ci0JCQotCQlmb3IgKGludCBpPTA7IGRpc2NvdmVyeSE9bnVsbCAmJiBpPGRpc2NvdmVyeS5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluMisiPGRpc2NvdmVyeSIpOwotCQkJaWYgKGRpc2NvdmVyeVtpXS5nZXRVUkxTdHJpbmcoKSE9bnVsbCkJCi0JCQkJdy5wcmludGxuKGluMisiICAgIisidXJsPVwiIitkaXNjb3ZlcnlbaV0uZ2V0VVJMU3RyaW5nKCkrIlwiIik7Ci0JCQlpZiAoZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4yKyIgICAiKyJsYWJlbD1cIiIrZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbjIrIiAgICIrIi8+Iik7Ci0JCX0KLQkJCi0JCXcucHJpbnRsbihpbisiPC91cmw+Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZVByZXJlcXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewkKLQkJSW1wb3J0TW9kZWxbXSBpbXAgPSBmZWF0dXJlLmdldEltcG9ydE1vZGVscygpOwkKLQkJaWYgKGltcCA9PSBudWxsIHx8IGltcC5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJU3RyaW5nIGluMiA9IGdldEluZGVudChsZXZlbCsxKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJdy5wcmludGxuKGluKyI8cmVxdWlyZXM+Iik7Ci0JCQotCQlmb3IgKGludCBpPTA7IGltcCE9bnVsbCAmJiBpPGltcC5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluMisiPGltcG9ydCIpOwotCQkJaWYgKGltcFtpXS5nZXRJZGVudGlmaWVyKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisicGx1Z2luPVwiIitpbXBbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOwotCQkJaWYgKGltcFtpXS5nZXRWZXJzaW9uKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisidmVyc2lvbj1cIiIraW1wW2ldLmdldFZlcnNpb24oKSsiXCIiKTsKLQkJCWlmIChpbXBbaV0uZ2V0TWF0Y2hpbmdSdWxlTmFtZSgpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrIm1hdGNoPVwiIitpbXBbaV0uZ2V0TWF0Y2hpbmdSdWxlTmFtZSgpKyJcIiIpOwotCQkJdy5wcmludGxuKGluMisiICAgIisiLz4iKTsKLQkJfQotCQkKLQkJdy5wcmludGxuKGluKyI8L3JlcXVpcmVzPiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVQbHVnaW5FbnRyaWVzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKLQkJUGx1Z2luRW50cnlNb2RlbFtdIHBsdWdpbiA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cnlNb2RlbHMoKTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsIHx8IHBsdWdpbi5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJCi0JCWZvciAoaW50IGk9MDsgaTxwbHVnaW4ubGVuZ3RoOyBpKyspIHsKLQkJCXcucHJpbnRsbihpbisiPHBsdWdpbiIpOwotCQkJaWYgKHBsdWdpbltpXS5nZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJpZD1cIiIrcGx1Z2luW2ldLmdldFBsdWdpbklkZW50aWZpZXIoKSsiXCIiKTsKLQkJCWlmIChwbHVnaW5baV0uZ2V0UGx1Z2luVmVyc2lvbigpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrcGx1Z2luW2ldLmdldFBsdWdpblZlcnNpb24oKSsiXCIiKTsKLQkJCWlmIChwbHVnaW5baV0uaXNGcmFnbWVudCgpKQotCQkJCXcucHJpbnRsbihpbisiICAgIisiZnJhZ21lbnQ9XCIiK3BsdWdpbltpXS5pc0ZyYWdtZW50KCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldE9TKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJvcz1cIiIrcGx1Z2luW2ldLmdldE9TKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldFdTKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJ3cz1cIiIrcGx1Z2luW2ldLmdldFdTKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldE5MKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrcGx1Z2luW2ldLmdldE5MKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldERvd25sb2FkU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJkb3dubG9hZC1zaXplPVwiIitwbHVnaW5baV0uZ2V0RG93bmxvYWRTaXplKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldEluc3RhbGxTaXplKCkhPUNvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrImluc3RhbGwtc2l6ZT1cIiIrcGx1Z2luW2ldLmdldEluc3RhbGxTaXplKCkrIlwiIik7Ci0JCQl3LnByaW50bG4oaW4rIiAgICIrIi8+Iik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTm9uUGx1Z2luRW50cmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7Ci0JCU5vblBsdWdpbkVudHJ5TW9kZWxbXSBkYXRhID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyeU1vZGVscygpOwotCQlpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoID09IDApIHJldHVybjsKLQkJCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCXcucHJpbnRsbigiIik7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluKyI8ZGF0YSIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0SWRlbnRpZmllcigpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2RhdGFbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0T1MoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitkYXRhW2ldLmdldE9TKCkrIlwiIik7Ci0JCQlpZiAoZGF0YVtpXS5nZXRXUygpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisid3M9XCIiK2RhdGFbaV0uZ2V0V1MoKSsiXCIiKTsKLQkJCWlmIChkYXRhW2ldLmdldE5MKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrZGF0YVtpXS5nZXROTCgpKyJcIiIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0RG93bmxvYWRTaXplKCkhPUNvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrImRvd25sb2FkLXNpemU9XCIiK2RhdGFbaV0uZ2V0RG93bmxvYWRTaXplKCkrIlwiIik7Ci0JCQlpZiAoZGF0YVtpXS5nZXRJbnN0YWxsU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJpbnN0YWxsLXNpemU9XCIiK2RhdGFbaV0uZ2V0SW5zdGFsbFNpemUoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbisiICAgIisiLz4iKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnQoaW50IGxldmVsKSB7Ci0JCVN0cmluZyBpbmRlbnQgPSAiIjsKLQkJZm9yIChpbnQgaT0wOyBpPGxldmVsOyBpKyspIAotCQkJaW5kZW50ICs9ICIgICAiOwotCQlyZXR1cm4gaW5kZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9UZXN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTE4OWRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8gDQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0gDQotLyoqDQotICogdW5pdCB0ZXN0IGhhcm5lc3MNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdCB7DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZTpkOi9kb3dubG9hZHMvZWNsaXBzZSAyLjAvaW50ZWdyYXRpb24tZWNsaXBzZS1TREstMjAwMjAxMDktd2luMzIuemlwIik7DQotCQkJQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkoKTsNCi0JCQlGZWF0dXJlIGZlYXR1cmUgPSAoRmVhdHVyZSkgZmFjdG9yeS5jcmVhdGVGZWF0dXJlKHVybCxudWxsLypJU2l0ZSovKTsNCi0JCQlEZWZhdWx0TW9kZWxXcml0ZXIgdyA9IG5ldyBEZWZhdWx0TW9kZWxXcml0ZXIoZmVhdHVyZSk7DQotCQkJdy53cml0ZUZlYXR1cmVNYW5pZmVzdChTeXN0ZW0ub3V0KTsNCi0JCQkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmVhdHVyZSBlbnRyeSByZWZlcmVuY2VzIik7DQotCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZnMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhudWxsKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAiK3JlZnNbaV0uZ2V0SWRlbnRpZmllcigpKTsNCi0JCQl9DQotCQkJDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBsdWctaW4gZW50cnkgcmVmZXJlbmNlcyIpOw0KLQkJCUlQbHVnaW5FbnRyeVtdIGVudHJ5ID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQkJcmVmcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoZW50cnlbMF0sIG51bGwpOw0KLQkJCWZvciAoaW50IGk9MDsgaTwgcmVmcy5sZW5ndGg7IGkrKykgew0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICIrcmVmc1tpXS5nZXRJZGVudGlmaWVyKCkpOw0KLQkJCX0JCQkNCi0JCQkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm9uLXBsdWctaW4gZW50cnkgcmVmZXJlbmNlcyIpOw0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIGRhdGEgPSBmZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0JCQlyZWZzID0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhkYXRhWzBdLCBudWxsKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAiK3JlZnNbaV0uZ2V0SWRlbnRpZmllcigpKTsNCi0JCQl9CQkJDQotCQkJDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJEb25lIC4uLiIpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQkJDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL2phdmEucGFnZS5qcGFnZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9qYXZhLnBhZ2UuanBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiM2NhMzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL2phdmEucGFnZS5qcGFnZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiZWFiNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5mcmVlZm9ybTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUNvbnRlbnRQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRQcm92aWRlciB7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2l0ZUNvbnRlbnRQcm92aWRlci4NCi0JICovDQotCXB1YmxpYyBGcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIoVVJMIHVybCkgew0KLQkJc3VwZXIodXJsKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRQcm92aWRlciNnZXRBcmNoaXZlUmVmZXJlbmNlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcgaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJcmV0dXJuIG5ldyBVUkwoZ2V0VVJMKCksaWQpOw0KLQkJfSBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIlVuYWJsZSB0byByZXR1cm4gYXJjaGl2ZSBVUkwiLGUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIENvcmVFeGNlcHRpb24gbmV3Q29yZUV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIm9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcyIsMCxzLGUpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzYzdmYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuZnJlZWZvcm07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZVNpdGVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5VUkxFbnRyeU1vZGVsOw0KLQ0KLXB1YmxpYyBjbGFzcyBGcmVlRm9ybVNpdGVGYWN0b3J5IGV4dGVuZHMgQmFzZVNpdGVGYWN0b3J5IHsNCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwpDQotCSAqLw0KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotDQotCQkvLyBDcmVhdGUgc2l0ZQ0KLQkJU2l0ZSBzaXRlID0gbnVsbDsNCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJaXMgPSB1cmwub3BlblN0cmVhbSgpOw0KLQkJCXNpdGUgPSAoU2l0ZSkgcGFyc2VTaXRlKGlzKTsNCi0NCi0JCQlVUkxFbnRyeU1vZGVsIHJlYWxTaXRlUmVmID0gc2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCk7DQotCQkJaWYgKHJlYWxTaXRlUmVmID09IG51bGwpDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQkJIlVuYWJsZSB0byBvYnRhaW4gdXBkYXRlIHNpdGUgcmVmZXJlbmNlIiwNCi0JCQkJCW51bGwpOw0KLQkJCVN0cmluZyBzaXRlVVJMU3RyaW5nID0gcmVhbFNpdGVSZWYuZ2V0VVJMU3RyaW5nKCk7DQotCQkJaWYgKHNpdGVVUkxTdHJpbmcgPT0gbnVsbCkNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCQkiVW5hYmxlIHRvIG9idGFpbiB1cGRhdGUgc2l0ZSByZWZlcmVuY2UiLA0KLQkJCQkJbnVsbCk7DQotCQkJVVJMIHNpdGVVUkwgPSBuZXcgVVJMKHNpdGVVUkxTdHJpbmcpOw0KLQkJCUZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPQ0KLQkJCQluZXcgRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyKHNpdGVVUkwpOw0KLQkJCXNpdGUuc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOw0KLQkJCXNpdGUucmVzb2x2ZShzaXRlVVJMLCBudWxsKTsgLy8gcmVzb2x2ZSBhbnkgVVJMcyByZWxhdGl2ZSB0byB0aGUgc2l0ZQ0KLQ0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIFVSTCIsZSk7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGFjY2VzcyBVUkwiLGUpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAoaXMgIT0gbnVsbCkNCi0JCQkJdHJ5IHsNCi0JCQkJCWlzLmNsb3NlKCk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBTaXRlTW9kZWxGYWN0b3J5I2NhblBhcnNlU2l0ZVR5cGUoU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcgdHlwZSkgew0KLQkJcmV0dXJuIHR5cGUgIT0gbnVsbA0KLQkJCSYmIHR5cGUuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuc2l0ZS5mcmVlZm9ybSIpOw0KLQl9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzIxZDhjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamZhY2UudGV4dDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmVkaXRvcnM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmlkZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkudmlld3M8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXg8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY1MTI1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotc291cmNlLnNjaGVkdWxlci5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9wbHVnaW4ucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDY5ZmMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgVXBkYXRlIFNjaGVkdWxlciBwbHVnaW4ueG1sIHJlc291cmNlcwotIwotcGx1Z2luTmFtZSA9IEF1dG9tYXRpYyBVcGRhdGVzIFNjaGVkdWxlcgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLWF1dG9tYXRpY1VwZGF0ZXNQcmVmUGFnZSA9IEF1dG9tYXRpYyBVcGRhdGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZjlhZDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlciIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMy4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlU2NoZWR1bGVyIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJzY2hlZHVsZXIuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgICAgPHBhY2thZ2VzIHByZWZpeGVzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+Ci0gICAgICA8c3RhcnR1cCBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5TY2hlZHVsZXJTdGFydHVwIj4KLSAgICAgIDwvc3RhcnR1cD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJWF1dG9tYXRpY1VwZGF0ZXNQcmVmUGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuTWFpblByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIucHJlZmVyZW5jZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL0F1dG9tYXRpY1VwZGF0ZXNKb2IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL0F1dG9tYXRpY1VwZGF0ZXNKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjMTlkMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9BdXRvbWF0aWNVcGRhdGVzSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLXB1YmxpYyBjbGFzcyBBdXRvbWF0aWNVcGRhdGVzSm9iIGV4dGVuZHMgSm9iIHsKLQkKLQlwcml2YXRlIGNsYXNzIEF1dG9tYXRpY1NlYXJjaFJlc3VsdENvbGxlY3RvciBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgewotCQlwdWJsaWMgdm9pZCBhY2NlcHQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIG9wZXJhdGlvbiA9Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQotCQkJCQkuY3JlYXRlSW5zdGFsbE9wZXJhdGlvbihudWxsLCBmZWF0dXJlLCBudWxsLCBudWxsLCBudWxsKTsKLQkJCXVwZGF0ZXMuYWRkKG9wZXJhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLy8gam9iIGZhbWlseQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBmYW1pbHkgPSBuZXcgT2JqZWN0KCk7Ci0JcHJpdmF0ZSBJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIE9LX1NUQVRVUyA9Ci0JCW5ldyBTdGF0dXMoCi0JCQlJU3RhdHVzLk9LLAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFBsdWdpbklkKCksCi0JCQlJU3RhdHVzLk9LLAotCQkJIiIsIC8vJE5PTi1OTFMtMSQKLQkJCW51bGwpOwotCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0OwotCXByaXZhdGUgQXJyYXlMaXN0IHVwZGF0ZXM7Ci0KLQlwdWJsaWMgQXV0b21hdGljVXBkYXRlc0pvYigpIHsKLQkJc3VwZXIoVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiQXV0b21hdGljVXBkYXRlc0pvYi5BdXRvbWF0aWNVcGRhdGVTZWFyY2giKSk7IC8vJE5PTi1OTFMtMSQKLQkJdXBkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2V0UHJpb3JpdHkoSm9iLkRFQ09SQVRFKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmCi0JICogdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc2FwbHkuIElmIHNvLCB0aGlzCi0JICogZGlzcGxheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRTdGFuZGFyZERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheTsKLQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQlyZXR1cm4gQXV0b21hdGljVXBkYXRlc0pvYi5mYW1pbHkgPT0gZmFtaWx5OwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChVcGRhdGVDb3JlLkRFQlVHKSB7Ci0JCQlVcGRhdGVDb3JlLmRlYnVnKCJBdXRvbWF0aWMgdXBkYXRlIHNlYXJjaCBzdGFydGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2VhcmNoUmVxdWVzdCA9IFVwZGF0ZVV0aWxzLmNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KG51bGwpOwotCQl0cnkgewotCQkJaWYgKHJlc3VsdENvbGxlY3RvciA9PSBudWxsKQotCQkJCXJlc3VsdENvbGxlY3RvciA9IG5ldyBBdXRvbWF0aWNTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJCXNlYXJjaFJlcXVlc3QucGVyZm9ybVNlYXJjaChyZXN1bHRDb2xsZWN0b3IsIG1vbml0b3IpOwotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcpIHsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJBdXRvbWF0aWMgdXBkYXRlIHNlYXJjaCBmaW5pc2hlZCAtICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgdXBkYXRlcy5zaXplKCkKLQkJCQkrICIgcmVzdWx0cy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHVwZGF0ZXMuc2l6ZSgpID4gMCkgewotCQkJCWJvb2xlYW4gZG93bmxvYWQgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXIuUF9ET1dOTE9BRCk7Ci0JCQkJLy8gc2lsZW50bHkgZG93bmxvYWQgaWYgZG93bmxvYWQgZW5hYmxlZCAKLQkJCQlpZiAoZG93bmxvYWQpCi0JCQkJewotCQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRykgewotCQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQXV0b21hdGljIGRvd25sb2FkIG9mIHVwZGF0ZXMgc3RhcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGk9MDsgaTx1cGRhdGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gb3AgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKXVwZGF0ZXMuZ2V0KGkpOwotCQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IG9wLmdldEZlYXR1cmUoKTsKLQkJCQkJCVVwZGF0ZVV0aWxzLmRvd25sb2FkRmVhdHVyZUNvbnRlbnQoZmVhdHVyZSwgbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcpIHsKLQkJCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkF1dG9tYXRpYyBkb3dubG9hZCBvZiB1cGRhdGVzIGZpbmlzaGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gcHJvbXB0IHRoZSB1c2VyCi0JCQkJaWYgKCFJbnN0YWxsV2l6YXJkLmlzUnVubmluZygpKSB7Ci0JCQkJCWlmIChkb3dubG9hZCkgewotCQkJCQkJZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWFzeW5jTm90aWZ5RG93bmxvYWRVc2VyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlnZXRTdGFuZGFyZERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJYXN5bmNOb3RpZnlVc2VyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7CQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBKb2IuQVNZTkNfRklOSVNIOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQl9Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFzeW5jTm90aWZ5VXNlcigpIHsKLQkJLy8gYXNrIHRoZSB1c2VyIHRvIGluc3RhbGwgdXBkYXRlcwotCQlnZXRTdGFuZGFyZERpc3BsYXkoKS5iZWVwKCk7Ci0JCWlmIChNZXNzYWdlRGlhbG9nCi0JCQkub3BlblF1ZXN0aW9uKAotCQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNKb2IuRWNsaXBzZVVwZGF0ZXMxIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJBdXRvbWF0aWNVcGRhdGVzSm9iLlVwZGF0ZXNBdmFpbGFibGUiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U3RhbmRhcmREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCW9wZW5JbnN0YWxsV2l6YXJkKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJLy8gbm90aWZ5IHRoZSBtYW5hZ2VyIHRoYXQgdGhlIGpvYiBpcyBkb25lCi0JCWRvbmUoT0tfU1RBVFVTKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFzeW5jTm90aWZ5RG93bmxvYWRVc2VyKCkgewotCQkvLyBhc2sgdGhlIHVzZXIgdG8gaW5zdGFsbCB1cGRhdGVzCi0JCWdldFN0YW5kYXJkRGlzcGxheSgpLmJlZXAoKTsKLQkJaWYgKE1lc3NhZ2VEaWFsb2cKLQkJCS5vcGVuUXVlc3Rpb24oCi0JCQkJVXBkYXRlU2NoZWR1bGVyLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiQXV0b21hdGljVXBkYXRlc0pvYi5FY2xpcHNlVXBkYXRlczIiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNKb2IuVXBkYXRlc0Rvd25sb2FkZWQiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U3RhbmRhcmREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCW9wZW5JbnN0YWxsV2l6YXJkKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBEb24ndCBkaXNjYXJkIGRvd25sb2FkZWQgZGF0YSwgYXMgbmV4dCB0aW1lIHdlIGNvbXBhcmUgdGltZXN0YW1wcy4KLQkJCQotCQkJLy8gZGlzY2FyZCBhbGwgdGhlIGRvd25sb2FkZWQgZGF0YSBmcm9tIGNhY2hlIChtYXkgaW5jbHVkZSBvbGQgZGF0YSBhcyB3ZWxsKQotCQkJLy9VdGlsaXRpZXMuZmx1c2hMb2NhbEZpbGUoKTsKLQkJfQotCQkvLyBub3RpZnkgdGhlIG1hbmFnZXIgdGhhdCB0aGUgam9iIGlzIGRvbmUKLQkJZG9uZShPS19TVEFUVVMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuSW5zdGFsbFdpemFyZCgpIHsKLQkJaWYgKEluc3RhbGxXaXphcmQuaXNSdW5uaW5nKCkpCi0JCQkvLyBqb2IgZW5kcyBhbmQgYSBuZXcgb25lIGlzIHJlc2NoZWR1bGVkCi0JCQlyZXR1cm47Ci0JCQkKLQkJSW5zdGFsbFdpemFyZCB3aXphcmQgPSBuZXcgSW5zdGFsbFdpemFyZChzZWFyY2hSZXF1ZXN0LCB1cGRhdGVzKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZygKLQkJCQlVcGRhdGVTY2hlZHVsZXIuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQl3aXphcmQsCi0JCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiQXV0b21hdGljVXBkYXRlc0pvYi5VcGRhdGVzIikpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvU2NoZWR1bGVyU3RhcnR1cC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvU2NoZWR1bGVyU3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjY0N2ZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1NjaGVkdWxlclN0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLQotCi0vKioKLSAqIFRoaXMgcGx1Zy1pbiBpcyBsb2FkZWQgb24gc3RhcnR1cCB0byBmb3JrIGEgam9iIHRoYXQKLSAqIHNlYXJjaGVzIGZvciBuZXcgcGx1Zy1pbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlZHVsZXJTdGFydHVwIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCS8vIFByZWZlcmVuY2VzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1NDSEVEVUxFID0gInNjaGVkdWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09OX1NUQVJUVVAgPSAib24tc3RhcnR1cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PTl9TQ0hFRFVMRSA9ICJvbi1zY2hlZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RPV05MT0FEID0gImRvd25sb2FkIjsgLy8gdmFsdWUgaXMgdHJ1ZSBvciBmYWxzZSwgZGVmYXVsdCBpcyBmYWxzZSAvLyROT04tTkxTLTEkCi0KLQkvLyB2YWx1ZXMgYXJlIHRvIGJlIHBpY2tlZCB1cCBmcm9tIHRoZSBhcnJ5YXMgREFZUyBhbmQgSE9VUlMgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9EQVkgPSAiZGF5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSE9VUiA9ICJob3VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gS2VlcHMgdHJhY2sgb2YgcnVubmluZyBqb2IKLQlwcml2YXRlIEpvYiBqb2I7Ci0JLy8gTGlzdGVuZXIgZm9yIGpvYiBjaGFuZ2VzCi0JcHJpdmF0ZSBVcGRhdGVKb2JDaGFuZ2VBZGFwdGVyIGpvYkxpc3RlbmVyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBEQVlTID0KLQkJewotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC5kYXkiKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC5Nb25kYXkiKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC5UdWVzZGF5IiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuV2VkbmVzZGF5IiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuVGh1cnNkYXkiKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC5GcmlkYXkiKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC5TYXR1cmRheSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLlN1bmRheSIpIH07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSE9VUlMgPQotCQl7Ci0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjFBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjJBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjNBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjRBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjVBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjZBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjdBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjhBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjlBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjEwQU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4xMUFNIiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuMTJQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjFQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjJQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjNQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjRQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjVQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjZQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjdQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjhQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjlQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjEwUE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4xMVBNIiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuMTJBTSIpLCAvLyROT04tTkxTLTEkCi0JCQl9OwotCi0JcHJpdmF0ZSBjbGFzcyBVcGRhdGVKb2JDaGFuZ2VBZGFwdGVyIGV4dGVuZHMgSm9iQ2hhbmdlQWRhcHRlciB7Ci0JCXB1YmxpYyB2b2lkIGRvbmUoSm9iIGpvYiwgSVN0YXR1cyByZXN1bHQpIHsKLQkJCWlmIChqb2IgPT0gU2NoZWR1bGVyU3RhcnR1cC50aGlzLmpvYikgewotCQkJCXNjaGVkdWxlVXBkYXRlSm9iKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTY2hlZHVsZXJTdGFydHVwKCkgewotCQlVcGRhdGVTY2hlZHVsZXIuc2V0U2NoZWR1bGVyKHRoaXMpOwotCQlqb2JMaXN0ZW5lciA9IG5ldyBVcGRhdGVKb2JDaGFuZ2VBZGFwdGVyKCk7Ci0JCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkgewotCQlzY2hlZHVsZVVwZGF0ZUpvYigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNjaGVkdWxlVXBkYXRlSm9iKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlU2NoZWR1bGVyLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvLyBTZWUgaWYgYXV0b21hdGljIHNlYXJjaCBpcyBlbmFibGVkIGF0IGFsbAotCQlpZiAocHJlZi5nZXRCb29sZWFuKFBfRU5BQkxFRCkgPT0gZmFsc2UpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHNjaGVkdWxlID0gcHJlZi5nZXRTdHJpbmcoUF9TQ0hFRFVMRSk7Ci0JCWxvbmcgZGVsYXkgPSAtMUw7Ci0JCWlmIChzY2hlZHVsZS5lcXVhbHMoVkFMVUVfT05fU1RBUlRVUCkpCi0JCQkvLyBoYXZlIHdlIGFscmVhZHkgc3RhcnRlZCBhIGpvYiA/Ci0JCQlpZiAoam9iID09IG51bGwpCi0JCQkJZGVsYXkgPSAwTDsKLQkJCWVsc2UKLQkJCQlkZWxheSA9IC0xTDsKLQkJZWxzZQotCQkJZGVsYXkgPSBjb21wdXRlRGVsYXkocHJlZik7Ci0JCWlmIChkZWxheSA9PSAtMUwpCi0JCQlyZXR1cm47Ci0JCXN0YXJ0U2VhcmNoKGRlbGF5KTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXREYXkoUHJlZmVyZW5jZXMgcHJlZikgewotCQlTdHJpbmcgZGF5ID0gcHJlZi5nZXRTdHJpbmcoUF9EQVkpOwotCQlmb3IgKGludCBkID0gMDsgZCA8IERBWVMubGVuZ3RoOyBkKyspCi0JCQlpZiAoREFZU1tkXS5lcXVhbHMoZGF5KSkKLQkJCQlzd2l0Y2ggKGQpIHsKLQkJCQkJY2FzZSAwIDoKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJY2FzZSAxIDoKLQkJCQkJCXJldHVybiBDYWxlbmRhci5NT05EQVk7Ci0JCQkJCWNhc2UgMiA6Ci0JCQkJCQlyZXR1cm4gQ2FsZW5kYXIuVFVFU0RBWTsKLQkJCQkJY2FzZSAzIDoKLQkJCQkJCXJldHVybiBDYWxlbmRhci5XRURORVNEQVk7Ci0JCQkJCWNhc2UgNCA6Ci0JCQkJCQlyZXR1cm4gQ2FsZW5kYXIuVEhVUlNEQVk7Ci0JCQkJCWNhc2UgNSA6Ci0JCQkJCQlyZXR1cm4gQ2FsZW5kYXIuRlJJREFZOwotCQkJCQljYXNlIDYgOgotCQkJCQkJcmV0dXJuIENhbGVuZGFyLlNBVFVSREFZOwotCQkJCQljYXNlIDcgOgotCQkJCQkJcmV0dXJuIENhbGVuZGFyLlNVTkRBWTsKLQkJCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRIb3VyKFByZWZlcmVuY2VzIHByZWYpIHsKLQkJU3RyaW5nIGhvdXIgPSBwcmVmLmdldFN0cmluZyhQX0hPVVIpOwotCQlmb3IgKGludCBoID0gMDsgaCA8IEhPVVJTLmxlbmd0aDsgaCsrKQotCQkJaWYgKEhPVVJTW2hdLmVxdWFscyhob3VyKSkKLQkJCQlyZXR1cm4gaCArIDE7Ci0JCXJldHVybiAxOwotCX0KLQkvKgotCSAqIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20gdGhpcyBtb21lbnQKLQkgKiB0byB0aGUgbmV4dCBzY2hlZHVsZWQgc2VhcmNoLiBJZiB0aGF0IG1vbWVudCBoYXMKLQkgKiBhbHJlYWR5IHBhc3NlZCwgcmV0dXJucyAwTCAoc3RhcnQgaW1tZWRpYXRlbHkpLgotCSAqLwotCXByaXZhdGUgbG9uZyBjb21wdXRlRGVsYXkoUHJlZmVyZW5jZXMgcHJlZikgewotCi0JCWludCB0YXJnZXRfZCA9IGdldERheShwcmVmKTsKLQkJaW50IHRhcmdldF9oID0gZ2V0SG91cihwcmVmKTsKLQotCQlDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCS8vIG1heSBuZWVkIHRvIHVzZSB0aGUgQm9vdExvYWRlciBsb2NhbGUKLQkJaW50IGN1cnJlbnRfZCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyk7Ci0JCS8vIHN0YXJ0cyB3aXRoIFNVTkRBWQotCQlpbnQgY3VycmVudF9oID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKTsKLQkJaW50IGN1cnJlbnRfbSA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5NSU5VVEUpOwotCQlpbnQgY3VycmVudF9zID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlNFQ09ORCk7Ci0JCWludCBjdXJyZW50X21zID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKTsKLQotCQlsb25nIGRlbGF5ID0gMEw7IC8vIG1pbGxpc2Vjb25kcwotCi0JCWlmICh0YXJnZXRfZCA9PSAtMSkgewotCQkJLy8gQ29tcHV0ZSB0aGUgZGVsYXkgZm9yICJldmVyeSBkYXkgYXQgeCBvJ2Nsb2NrIgotCQkJLy8gSXMgaXQgbm93ID8KLQkJCWlmICh0YXJnZXRfaCA9PSBjdXJyZW50X2ggJiYgY3VycmVudF9tID09IDAgJiYgY3VycmVudF9zID09IDApCi0JCQkJcmV0dXJuIGRlbGF5OwotCi0JCQlpbnQgZGVsdGFfaCA9IHRhcmdldF9oIC0gY3VycmVudF9oOwotCQkJaWYgKHRhcmdldF9oIDw9IGN1cnJlbnRfaCkKLQkJCQlkZWx0YV9oICs9IDI0OwotCQkJZGVsYXkgPQotCQkJCSgoZGVsdGFfaCAqIDYwIC0gY3VycmVudF9tKSAqIDYwIC0gY3VycmVudF9zKSAqIDEwMDAgLSBjdXJyZW50X21zOwotCQkJcmV0dXJuIGRlbGF5OwotCQl9IGVsc2UgewotCQkJLy8gQ29tcHV0ZSB0aGUgZGVsYXkgZm9yICJldmVyeSBYZGF5IGF0IHggbydjbG9jayIKLQkJCS8vIElzIGl0IG5vdyA/Ci0JCQlpZiAodGFyZ2V0X2QgPT0gY3VycmVudF9kCi0JCQkJJiYgdGFyZ2V0X2ggPT0gY3VycmVudF9oCi0JCQkJJiYgY3VycmVudF9tID09IDAKLQkJCQkmJiBjdXJyZW50X3MgPT0gMCkKLQkJCQlyZXR1cm4gZGVsYXk7Ci0KLQkJCWludCBkZWx0YV9kID0gdGFyZ2V0X2QgLSBjdXJyZW50X2Q7Ci0JCQlpZiAodGFyZ2V0X2QgPCBjdXJyZW50X2QKLQkJCQl8fCB0YXJnZXRfZCA9PSBjdXJyZW50X2QKLQkJCQkmJiAodGFyZ2V0X2ggPCBjdXJyZW50X2gKLQkJCQkJfHwgdGFyZ2V0X2ggPT0gY3VycmVudF9oCi0JCQkJCSYmIGN1cnJlbnRfbSA+IDApKQotCQkJCWRlbHRhX2QgKz0gNzsKLQotCQkJZGVsYXkgPQotCQkJCSgoKGRlbHRhX2QgKiAyNCArIHRhcmdldF9oIC0gY3VycmVudF9oKSAqIDYwIC0gY3VycmVudF9tKSAqIDYwIC0gY3VycmVudF9zKSogMTAwMCAtIGN1cnJlbnRfbXM7Ci0KLQkJCXJldHVybiBkZWxheTsKLQkJfQotCQkvL3JldHVybiAtMUw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0U2VhcmNoKGxvbmcgZGVsYXkpIHsKLQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQkvLyBjYW5jZWwgb2xkIGpvYi4KLQkJCS8vIFdlIG5lZWQgdG8gZGVyZWdpc3RlciB0aGUgbGlzdGVuZXIgZmlyc3Qsc28gd2Ugd29uJ3QgYXV0b21hdGljYWxseSBzdGFydCBhbm90aGVyIGpvYgotCQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5jYW5jZWwoQXV0b21hdGljVXBkYXRlc0pvYi5mYW1pbHkpOwotCQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmFkZEpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKLQkJfQotCQlqb2IgPSBuZXcgQXV0b21hdGljVXBkYXRlc0pvYigpOwotCQlqb2Iuc2NoZWR1bGUoZGVsYXkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTc5M2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoaXMgcGx1Zy1pbiBpcyBsb2FkZWQgb24gc3RhcnR1cCB0byBmb3JrIGEgam9iIHRoYXQKLSAqIHNlYXJjaGVzIGZvciBuZXcgcGx1Zy1pbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVTY2hlZHVsZXIgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luewotCS8vIFByZWZlcmVuY2VzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TQ0hFRFVMRSA9ICJzY2hlZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PTl9TVEFSVFVQID0gIm9uLXN0YXJ0dXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfT05fU0NIRURVTEUgPSAib24tc2NoZWR1bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9ET1dOTE9BRCA9ICJkb3dubG9hZCI7IC8vIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UsIGRlZmF1bHQgaXMgZmFsc2UgLy8kTk9OLU5MUy0xJAotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFVwZGF0ZVNjaGVkdWxlciBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBTY2hlZHVsZXJTdGFydHVwIHNjaGVkdWxlcjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVXBkYXRlU2NoZWR1bGVyKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlU2NoZWR1bGVyUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVXBkYXRlU2NoZWR1bGVyIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0KLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkTWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RyaW5nKGtleSk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwgYXJncyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkTWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RyaW5nKGtleSk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwgbmV3IFN0cmluZ1tdIHsgYXJnIH0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJbG9nRXhjZXB0aW9uKGUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBlKS5nZXRTdGF0dXMoKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJCW1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQlzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCWdldFBsdWdpbklkKCksCi0JCQkJCUlTdGF0dXMuT0ssCi0JCQkJCW1lc3NhZ2UsCi0JCQkJCWUpOwotCQl9Ci0JCWxvZyhzdGF0dXMsIHNob3dFcnJvckRpYWxvZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cywgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuSU5GTykgewotCQkJaWYgKHNob3dFcnJvckRpYWxvZykKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCXN0YXR1cyk7Ci0vLwkJCSBTaG91bGQgbG9nIG9uIHRoZSB1cGRhdGUgcGx1Z2luJ3MgbG9nCi0vLwkJCVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIikuZ2V0TG9nKCkubG9nKHN0YXR1cyk7IC8vJE5PTi1OTFMtMSQKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oCi0JCQkJZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlVcGRhdGVTY2hlZHVsZXIgcGx1Z2luID0gZ2V0RGVmYXVsdCgpOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9Ci0JCQlwbHVnaW4uZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXJldHVybiB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlyZXR1cm4gd2luZG93ICE9IG51bGwgPyB3aW5kb3cuZ2V0U2hlbGwoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IGdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWYuc2V0RGVmYXVsdChQX0VOQUJMRUQsIGZhbHNlKTsKLQkJcHJlZi5zZXREZWZhdWx0KFBfU0NIRURVTEUsIFZBTFVFX09OX1NUQVJUVVApOwotCQlwcmVmLnNldERlZmF1bHQoUF9ET1dOTE9BRCwgZmFsc2UpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNjaGVkdWxlclN0YXJ0dXAgZ2V0U2NoZWR1bGVyKCkgewotCQkvLyBJZiB0aGUgc2NoZWR1bGVyIHdhcyBkaXNhYmxlZCwgaXQgZG9lcyBub3QgZ2V0IGluaXRpYWxpemVkCi0JCWlmIChzY2hlZHVsZXIgPT0gbnVsbCkKLQkJCXNjaGVkdWxlciA9IG5ldyBTY2hlZHVsZXJTdGFydHVwKCk7Ci0JCXJldHVybiBzY2hlZHVsZXI7Ci0JfQotCQotCXN0YXRpYyB2b2lkIHNldFNjaGVkdWxlcihTY2hlZHVsZXJTdGFydHVwIHNjaGVkdWxlcikgewotCQlVcGRhdGVTY2hlZHVsZXIuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJSZXNvdXJjZXMucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlclJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhmOTZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlclJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotI01lc3NhZ2VzIGZvciBVcGRhdGUgU2NoZWR1bGVyIHBsdWctaW4KLQotU2NoZWR1bGVyU3RhcnR1cC5kYXk9RXZlcnkgZGF5Ci1TY2hlZHVsZXJTdGFydHVwLk1vbmRheT1FdmVyeSBNb25kYXkKLVNjaGVkdWxlclN0YXJ0dXAuVHVlc2RheT1FdmVyeSBUdWVzZGF5Ci1TY2hlZHVsZXJTdGFydHVwLldlZG5lc2RheT1FdmVyeSBXZWRuZXNkYXkKLVNjaGVkdWxlclN0YXJ0dXAuVGh1cnNkYXk9RXZlcnkgVGh1cnNkYXkKLVNjaGVkdWxlclN0YXJ0dXAuRnJpZGF5PUV2ZXJ5IEZyaWRheQotU2NoZWR1bGVyU3RhcnR1cC5TYXR1cmRheT1FdmVyeSBTYXR1cmRheQotU2NoZWR1bGVyU3RhcnR1cC5TdW5kYXk9RXZlcnkgU3VuZGF5Ci1TY2hlZHVsZXJTdGFydHVwLjFBTT0xOjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjJBTT0yOjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjNBTT0zOjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjRBTT00OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjVBTT01OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjZBTT02OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjdBTT03OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjhBTT04OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjlBTT05OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjEwQU09MTA6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXAuMTFBTT0xMTowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC4xMlBNPTEyOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjFQTT0xOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjJQTT0yOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjNQTT0zOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjRQTT00OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjVQTT01OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjZQTT02OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjdQTT03OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjhQTT04OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjlQTT05OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjEwUE09MTA6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXAuMTFQTT0xMTowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC4xMkFNPTEyOjAwIEFNCi1BdXRvbWF0aWNVcGRhdGVzSm9iLkF1dG9tYXRpY1VwZGF0ZVNlYXJjaD1BdXRvbWF0aWMgVXBkYXRlIFNlYXJjaAotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmZpbmRVcGRhdGVzPUF1dG9tYXRpY2FsbHkgJmZpbmQgbmV3IHVwZGF0ZXMgYW5kIG5vdGlmeSBtZQotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLlVwZGF0ZVNjaGVkdWxlPVVwZGF0ZSAmU2NoZWR1bGUKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5maW5kT25TdGFydD1Mb29rIGZvciB1cGRhdGVzIGVhY2ggdGltZSBwbGF0Zm9ybSBpcyBzdGFydGVkCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuZmluZE9uU2NoZWR1bGU9TG9vayBmb3IgdXBkYXRlcyBvbiB0aGUgZm9sbG93aW5nIHNjaGVkdWxlOgotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmRvd25sb2FkT3B0aW9ucz0mRG93bmxvYWQgT3B0aW9ucwotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLnNlYXJjaEFuZE5vdGlmeT1TZWFyY2ggZm9yIHVwZGF0ZXMgYW5kIG5vdGlmeSBtZSB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZQotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmRvd25sb2FkQW5kTm90aWZ5PURvd25sb2FkIG5ldyB1cGRhdGVzIGF1dG9tYXRpY2FsbHkgYW5kIG5vdGlmeSBtZSB3aGVuIHJlYWR5IHRvIGluc3RhbGwgdGhlbQotQXV0b21hdGljVXBkYXRlc0pvYi5FY2xpcHNlVXBkYXRlczE9RWNsaXBzZSBVcGRhdGVzCi1BdXRvbWF0aWNVcGRhdGVzSm9iLlVwZGF0ZXNBdmFpbGFibGU9TmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gRG8geW91IHdhbnQgdG8gcmV2aWV3IGFuZCBpbnN0YWxsIHRoZW0gbm93PwotQXV0b21hdGljVXBkYXRlc0pvYi5FY2xpcHNlVXBkYXRlczI9RWNsaXBzZSBVcGRhdGVzCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuYXQ9YXQKLUF1dG9tYXRpY1VwZGF0ZXNKb2IuVXBkYXRlc0Rvd25sb2FkZWQ9TmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSBhbmQgZG93bmxvYWRlZC4gRG8geW91IHdhbnQgdG8gcmV2aWV3IGFuZCBpbnN0YWxsIHRoZW0gbm93PwotQXV0b21hdGljVXBkYXRlc0pvYi5VcGRhdGVzPVVwZGF0ZXMKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL3ByZWZlcmVuY2VzL0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvcHJlZmVyZW5jZXMvQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYWRiMTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvcHJlZmVyZW5jZXMvQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5VcGRhdGVTY2hlZHVsZXI7Ci0KLXB1YmxpYyBjbGFzcyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UKLQlleHRlbmRzIFByZWZlcmVuY2VQYWdlCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBCdXR0b24gZW5hYmxlZENoZWNrOwotCXByaXZhdGUgQnV0dG9uIG9uU3RhcnR1cFJhZGlvOwotCXByaXZhdGUgQnV0dG9uIG9uU2NoZWR1bGVSYWRpbzsKLQlwcml2YXRlIENvbWJvIGRheUNvbWJvOwotCXByaXZhdGUgQ29tYm8gaG91ckNvbWJvOwotCXByaXZhdGUgQnV0dG9uIHNlYXJjaE9ubHlSYWRpbzsKLQlwcml2YXRlIEJ1dHRvbiBzZWFyY2hBbmREb3dubG9hZFJhZGlvOwotCXByaXZhdGUgR3JvdXAgdXBkYXRlU2NoZWR1bGVHcm91cDsKLQlwcml2YXRlIEdyb3VwIGRvd25sb2FkR3JvdXA7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCWVuYWJsZWRDaGVjayA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spOwotCQllbmFibGVkQ2hlY2suc2V0VGV4dChVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuZmluZFVwZGF0ZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVTcGFjZXIoY29udGFpbmVyLCAxKTsKLQotCQl1cGRhdGVTY2hlZHVsZUdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQl1cGRhdGVTY2hlZHVsZUdyb3VwLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLlVwZGF0ZVNjaGVkdWxlIikpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlvblN0YXJ0dXBSYWRpbyA9IG5ldyBCdXR0b24odXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULlJBRElPKTsKLQkJb25TdGFydHVwUmFkaW8uc2V0VGV4dCgKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5maW5kT25TdGFydCIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCW9uU3RhcnR1cFJhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQlvblN0YXJ0dXBSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlvblNjaGVkdWxlUmFkaW8gPSBuZXcgQnV0dG9uKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW9uU2NoZWR1bGVSYWRpby5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5maW5kT25TY2hlZHVsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCW9uU2NoZWR1bGVSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJb25TY2hlZHVsZVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWRheUNvbWJvID0gbmV3IENvbWJvKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlkYXlDb21iby5zZXRJdGVtcyhTY2hlZHVsZXJTdGFydHVwLkRBWVMpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSAzMDsKLQkJZGF5Q29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh1cGRhdGVTY2hlZHVsZUdyb3VwLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmF0IikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlob3VyQ29tYm8gPSBuZXcgQ29tYm8odXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWhvdXJDb21iby5zZXRJdGVtcyhTY2hlZHVsZXJTdGFydHVwLkhPVVJTKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2Qud2lkdGhIaW50ID0gMTAwOwotCQlob3VyQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JCWNyZWF0ZVNwYWNlcihjb250YWluZXIsIDEpOwotCQkKLQkJZG93bmxvYWRHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJZG93bmxvYWRHcm91cC5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5kb3dubG9hZE9wdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlkb3dubG9hZEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkb3dubG9hZEdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCXNlYXJjaE9ubHlSYWRpbyA9IG5ldyBCdXR0b24oZG93bmxvYWRHcm91cCwgU1dULlJBRElPKTsKLQkJc2VhcmNoT25seVJhZGlvLnNldFRleHQoCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2Uuc2VhcmNoQW5kTm90aWZ5IikpOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VhcmNoT25seVJhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQlzZWFyY2hPbmx5UmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpbyA9IG5ldyBCdXR0b24oZG93bmxvYWRHcm91cCwgU1dULlJBRElPKTsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5kb3dubG9hZEFuZE5vdGlmeSIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCQkKLQkJaW5pdGlhbGl6ZSgpOwotCi0JCWVuYWJsZWRDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbnRhaW5lcik7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3BhY2VyKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5TcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtblNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlU2NoZWR1bGVyLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQllbmFibGVkQ2hlY2suc2V0U2VsZWN0aW9uKHByZWYuZ2V0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXIuUF9FTkFCTEVEKSk7Ci0JCXNldFNjaGVkdWxlKHByZWYuZ2V0U3RyaW5nKFVwZGF0ZVNjaGVkdWxlci5QX1NDSEVEVUxFKSk7Ci0KLQkJZGF5Q29tYm8uc2V0VGV4dChTY2hlZHVsZXJTdGFydHVwLkRBWVNbZ2V0RGF5KHByZWYpXSk7Ci0JCWhvdXJDb21iby5zZXRUZXh0KFNjaGVkdWxlclN0YXJ0dXAuSE9VUlNbZ2V0SG91cihwcmVmKV0pOwotCQkKLQkJc2VhcmNoT25seVJhZGlvLnNldFNlbGVjdGlvbighcHJlZi5nZXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlci5QX0RPV05MT0FEKSk7Ci0JCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uc2V0U2VsZWN0aW9uKHByZWYuZ2V0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXIuUF9ET1dOTE9BRCkpOwotCi0JCXBhZ2VDaGFuZ2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNjaGVkdWxlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUuZXF1YWxzKFVwZGF0ZVNjaGVkdWxlci5WQUxVRV9PTl9TVEFSVFVQKSkKLQkJCW9uU3RhcnR1cFJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZWxzZQotCQkJb25TY2hlZHVsZVJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFnZUNoYW5nZWQoKSB7Ci0JCWJvb2xlYW4gbWFzdGVyID0gZW5hYmxlZENoZWNrLmdldFNlbGVjdGlvbigpOwotCQl1cGRhdGVTY2hlZHVsZUdyb3VwLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJb25TdGFydHVwUmFkaW8uc2V0RW5hYmxlZChtYXN0ZXIpOwotCQlvblNjaGVkdWxlUmFkaW8uc2V0RW5hYmxlZChtYXN0ZXIpOwotCQlkYXlDb21iby5zZXRFbmFibGVkKG1hc3RlciAmJiBvblNjaGVkdWxlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCQlob3VyQ29tYm8uc2V0RW5hYmxlZChtYXN0ZXIgJiYgb25TY2hlZHVsZVJhZGlvLmdldFNlbGVjdGlvbigpKTsKLQkJZG93bmxvYWRHcm91cC5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCXNlYXJjaE9ubHlSYWRpby5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uc2V0RW5hYmxlZChtYXN0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVTY2hlZHVsZXIuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWVuYWJsZWRDaGVjay5zZXRTZWxlY3Rpb24oCi0JCQlwcmVmLmdldERlZmF1bHRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlci5QX0VOQUJMRUQpKTsKLQl9Ci0KLQkvKiogCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlUGFnZS4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZVNjaGVkdWxlci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZi5zZXRWYWx1ZShVcGRhdGVTY2hlZHVsZXIuUF9FTkFCTEVELCBlbmFibGVkQ2hlY2suZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAob25TdGFydHVwUmFkaW8uZ2V0U2VsZWN0aW9uKCkpCi0JCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVNjaGVkdWxlci5QX1NDSEVEVUxFLCBVcGRhdGVTY2hlZHVsZXIuVkFMVUVfT05fU1RBUlRVUCk7Ci0JCWVsc2UgCi0JCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVNjaGVkdWxlci5QX1NDSEVEVUxFLCBVcGRhdGVTY2hlZHVsZXIuVkFMVUVfT05fU0NIRURVTEUpOwotCQkJCi0JCXByZWYuc2V0VmFsdWUoU2NoZWR1bGVyU3RhcnR1cC5QX0RBWSwgZGF5Q29tYm8uZ2V0VGV4dCgpKTsKLQkJcHJlZi5zZXRWYWx1ZShTY2hlZHVsZXJTdGFydHVwLlBfSE9VUiwgaG91ckNvbWJvLmdldFRleHQoKSk7Ci0JCQotCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVNjaGVkdWxlci5QX0RPV05MT0FELCBzZWFyY2hBbmREb3dubG9hZFJhZGlvLmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCVVwZGF0ZVNjaGVkdWxlci5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U2NoZWR1bGVyKCkuc2NoZWR1bGVVcGRhdGVKb2IoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgaW50IGdldERheShQcmVmZXJlbmNlcyBwcmVmKSB7Ci0JCVN0cmluZyBkYXkgPSBwcmVmLmdldFN0cmluZyhTY2hlZHVsZXJTdGFydHVwLlBfREFZKTsKLQkJZm9yIChpbnQgaT0wOyBpPFNjaGVkdWxlclN0YXJ0dXAuREFZUy5sZW5ndGg7IGkrKykKLQkJCWlmIChTY2hlZHVsZXJTdGFydHVwLkRBWVNbaV0uZXF1YWxzKGRheSkpCi0JCQkJcmV0dXJuIGk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwcml2YXRlIGludCBnZXRIb3VyKFByZWZlcmVuY2VzIHByZWYpIHsKLQkJU3RyaW5nIGhvdXIgPSBwcmVmLmdldFN0cmluZyhTY2hlZHVsZXJTdGFydHVwLlBfSE9VUik7Ci0JCWZvciAoaW50IGk9MDsgaTxTY2hlZHVsZXJTdGFydHVwLkhPVVJTLmxlbmd0aDsgaSsrKQotCQkJaWYgKFNjaGVkdWxlclN0YXJ0dXAuSE9VUlNbaV0uZXF1YWxzKGhvdXIpKQotCQkJCXJldHVybiBpOwotCQlyZXR1cm4gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ4MjQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWNhN2YuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXI8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS50b21jYXQ8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUudWkuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLnVpLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLnVpLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNDExYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NjFkNjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSMgDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS51cGRhdGV0ZXN0cy5qYXI9c3JjLw0KLWJpbi5pbmNsdWRlcz0qLmphcixhYm91dC5odG1sLHRlc3QueG1sLHBsdWdpbi54bWwsZGF0YS8sd2Vic2VydmVyLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzgwZGViLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiID4KLSAgPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLSAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4KLSAgPGxpY2Vuc2U+bGljZW5zZTwvbGljZW5zZT4KLSAgPHVybD4KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGF0aC9mZWF0dXJlMS8iLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICA8L3VybD4KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJlbiIgb3M9IldJTjMyLExJTlVYIiB2ZXJzaW9uPSIzLjUuNiIgd3M9IldJTjMyLE1PVElGLEdUSyIvPgotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvUGRlX2NvcmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA3MjE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9QZGVfY29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvaGVscC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODRmNjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL2hlbHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvanVuaXRfMy43LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODdiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvanVuaXRfMy43LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDVkODIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIHZlcnNpb249IjMuNS42IiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCi0gIDxydW50aW1lPg0KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICA8L2xpYnJhcnk+DQotICA8L3J1bnRpbWU+DQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MDZkNjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiID4KLSAgPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLSAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4KLSAgPGxpY2Vuc2U+bGljZW5zZTwvbGljZW5zZT4KLSAgPHVybD4KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGF0aC9mZWF0dXJlMS8iLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICA8L3VybD4KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0iZW4sZnIiIG9zPSJXSU4zMixMSU5VWCIgdmVyc2lvbj0iMS4xLjEiIHdzPSJXSU4zMixHVEssTU9USUYiLz4KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMWVkNzcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTIzY2FiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL2ltZy93ZWxfbWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vc2l0ZUluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTwvaGVhZD4NCi0gIDxib2R5Pg0KLTxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCi08YnI+DQotPGJyPg0KLSAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCi0gICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KLSAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCi0gIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCi1tYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQotVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCi0gICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KLSAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KLSAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCi0gIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQotICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KLSAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQotICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KLSAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KLSAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCi0gICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCi0gIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCi0gIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KLSAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCi1ncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQotaW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQotc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KLXN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCi10aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCi10b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQotICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCi0gcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCi13YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQotPGJyPg0KLTxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9QZGVfY29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL2hlbHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvanVuaXRfMy43LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwNWQ4Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIHZlcnNpb249IjMuNS42IiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCi0gIDxydW50aW1lPg0KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICA8L2xpYnJhcnk+DQotICA8L3J1bnRpbWU+DQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjExYTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzLyIgb3M9IkxJTlVYIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UuaGVscF8xLjAuMC5qYXIiIHVybD0icGx1Z2lucy9oZWxwLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZV8xLjAuMC5qYXIiIHVybD0icGx1Z2lucy9QZGVfY29yZS5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmp1bml0XzMuNS4wLmphciIgdXJsPSJwbHVnaW5zL2p1bml0XzMuNy5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEuamFyIiB1cmw9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiLz4gIA0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPiAgDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZUUExpa2VTaXRlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRlRQTGlrZVNpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNjJlMmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRlRQTGlrZVNpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuZnRwIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOThmNDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiPg0KLSAgPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4NCi0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+DQotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPg0KLSAgPHVybD4NCi0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgPC91cmw+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG9zPSJXSU4zMixMSU5VWCIgdmVyc2lvbj0iMS4xLjEiIHdzPSJXSU4zMixNT1RJRixHVEsiLz4NCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NmQxMTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZlYXR1cmUxIi8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBhYjRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1ZmUwZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGFiNGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUzL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWYzNzJkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS51bmtub3dudHlwZS5qYXIiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWFiZGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczZmJmNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3dlbF9tbC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL3NpdGVJbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08L2hlYWQ+DQotICA8Ym9keT4NCi08aW1nIHNyYz0iaW1nL3RvcF90aXRsc20uZ2lmIiBhbHQ9IiIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI1MCI+DQotPGJyPg0KLTxicj4NCi0gICAgIEl0IHN0YXJ0ZWQgd2l0aCBTbWFsbHRhbGs8YnI+DQotICAgIE9USSBoYXMgYmVlbiBidWlsZGluZyB0b29scyBmb3IgcGxhdGZvcm0taW5kZXBlbmRlbnQgT08gZGV2ZWxvcG1lbnQgc2luY2UNCi0gIDE5ODguIE91ciBFTlZZJnJlZzsgdGVjaG5vbG9neSBmaXJzdCBicm91Z2h0IGNvbGxhYm9yYXRpdmUgc29mdHdhcmUgZGV2ZWxvcG1lbnQsDQotICB2ZXJzaW9uIG1hbmFnZW1lbnQgYW5kIHNoYXJlZCByZXBvc2l0b3JpZXMgdG8gU21hbGx0YWxrLiBJQk0gaXMgb25lIG9mDQotbWFueSAgIGNvbXBhbmllcyB0byBsaWNlbnNlIEVOVlksIHdoaWNoIGNvbnRpbnVlcyB0byBiZSB0aGUgZm91bmRhdGlvbiBvZg0KLVZpc3VhbEFnZSZyZWc7ICAgU21hbGx0YWxrLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOZXh0IGNhbWUgSmF2YSYjODQ4Mjs8YnI+DQotICAgIEJlY2F1c2Ugb2Ygb3VyIGV4cGVydGlzZSBpbiBPTyB0ZWNobm9sb2d5LCBJQk0gdHVybmVkIHRvIE9USSBmb3IgYSBuZXh0LWdlbmVyYXRpb24NCi0gIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBKYXZhLiBUaGUgcmVzdWx0IGlzIFZpc3VhbEFnZSBmb3IgSmF2YSwgd2hpY2gNCi0gIGNvbnRpbnVlcyB0byB3aW4gYXdhcmRzIGZvciBpdHMgaW5ub3ZhdGl2ZSBJREUgYW5kIHRlYW0gc3VwcG9ydC4gSW5mb1dvcmxkDQotICBoYXMgY2hvc2VuIFZpc3VhbEFnZSBmb3IgSmF2YSBhcyBkZXZlbG9wbWVudCB0b29sIG9mIHRoZSB5ZWFyIC0geWVhciBhZnRlcg0KLSAgeWVhciBhZnRlciB5ZWFyITxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBUaGVuIHBlcnZhc2l2ZSBjb21wdXRpbmc8YnI+DQotICAgIE9USSBjb250aW51ZXMgaXRzIGRldmVsb3BtZW50IG9mIElCTSdzIFZpc3VhbEFnZSBNaWNybyBFZGl0aW9uLCBhIHN0YXRlLW9mLXRoZS1hcnQNCi0gIHBsYXRmb3JtIGZvciBjb2xsYWJvcmF0aXZlIGRldmVsb3BtZW50IG9mIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQgc3lzdGVtcw0KLSAgdGhhdCBhcmUgdmVyeSBsZWFuLiBBcyB0aGUgc3RlYWR5IHN0cmVhbSBvZiBwcmVzcyByZWxlYXNlcyBhdHRlc3RzLCBWaXN1YWxBZ2UNCi0gIE1pY3JvIEVkaXRpb24gaXMgYWxyZWFkeSBsaWNlbnNlZCB0byB0aGUgbGVhZGluZyBtaWNyb2NoaXAgbWFudWZhY3R1cmVycywNCi0gIG1pY3Jva2VybmVsIGRldmVsb3BlcnMsIGFuZCBwcm9kdWNlcnMgb2YgaGFuZGhlbGQgYW5kIGNvbnN1bWVyIGRldmljZXMuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5vdyBpdCdzIEVjbGlwc2U8YnI+DQotICAgIE9USSBoYXMgYnVpbHQgdGhlIG5leHQgZ2VuZXJhdGlvbiBJQk0gYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgdG9vbHMgcGxhdGZvcm0uDQotICBFY2xpcHNlIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yDQotICBhbnl0aGluZyBhbmQgbm90aGluZyBpbiBwYXJ0aWN1bGFyLiBUaGUgcmVhbCB2YWx1ZSBjb21lcyBmcm9tIHRvb2wgcGx1Zy1pbnMNCi0gIHRoYXQgInRlYWNoIiBFY2xpcHNlIGhvdyB0byB3b3JrIHdpdGggdGhpbmdzIC0gamF2YSBmaWxlcywgd2ViIGNvbnRlbnQsDQotZ3JhcGhpY3MsICB2aWRlbyAtIGFsbW9zdCBhbnl0aGluZyB5b3UgY2FuIGltYWdpbmUuIEVjbGlwc2UgYWxsb3dzIHlvdSB0bw0KLWluZGVwZW5kZW50bHkgIGRldmVsb3AgdG9vbHMgdGhhdCBpbnRlZ3JhdGUgd2l0aCBvdGhlciBwZW9wbGUncyB0b29scyBzbw0KLXNlYW1sZXNzbHkgeW91IHdvbid0IGtub3cgd2hlcmUgb25lIHRvb2wgZW5kcyBhbmQgYW5vdGhlciBzdGFydHMuIFRoZSBJQk0NCi1zdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGlzIHRlY2hub2xvZ3ksIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoLCB3aWxsIGJlDQotdGhlIGNvcmUgb2YgdGhlIG5leHQgIGdlbmVyYXRpb24gb2YgSUJNIGFuZCBJQk0gQnVzaW5lc3MgUGFydG5lciBlLWJ1c2luZXNzDQotdG9vbHMgb3B0aW1pemVkIGZvciAgdGhlIFdlYlNwaGVyZSBzb2Z0d2FyZSBwbGF0Zm9ybS48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgU28gd2hhdCdzIG5leHQ/PGJyPg0KLSAgICBPVEkgY29udGludWVzIHRvIGRlbGl2ZXIgb2JqZWN0LW9yaWVudGVkIHRlY2hub2xvZ3kgdGhhdCBzY2FsZXMgYWNyb3NzDQotIHBsYXRmb3JtcywgIGFjcm9zcyB0ZWFtcyBhbmQgYWNyb3NzIHByb2plY3Qgc2l6ZS4gRnJvbSBhIG1haW5mcmFtZSB0byBhDQotd2F0Y2ggIC0gd2UncmUgIGNsb3NpbmcgaW4gb24gdGhhdCB2aXNpb24uPGJyPg0KLTxicj4NCi08aW1nIHNyYz0iaW1nL3dlbF9tbC5qcGciIHdpZHRoPSI0NjAiIGhlaWdodD0iNDYwIiBhbHQ9IiI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5zdGFsbC9mZWF0dXJlcyBzcGFjZS9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODJlYzMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgPC91cmw+Ci0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9ImVuLGZyIiBvcz0iV0lOMzIsTElOVVgiIHZlcnNpb249IjEuMS4xIiB3cz0iV0lOMzIsTU9USUYsR1RLIi8+Ci08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA3MjE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODRmNjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvanVuaXRfMy43LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODdiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTg0NmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+Ci0gIDxydW50aW1lPgotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICA8L2xpYnJhcnk+Ci0gIDwvcnVudGltZT4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTI4ZmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9Imluc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UuaGVscF8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9oZWxwLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZV8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmp1bml0XzMuNS4wLmphciIgdXJsPSJwbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEuamFyIiB1cmw9InBsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiLz4gIA0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPiAgDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBhYjRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3MTY1YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmh0dHAiPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDk3MTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTkyYzFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9QZGVfY29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2hlbHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvanVuaXRfMy43LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE3YmI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3dlbF9tbC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3dlbF9tbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTMzZGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL2ltZy93ZWxfbWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vc2l0ZUluZm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NWFhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vc2l0ZUluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTwvaGVhZD4NCi0gIDxib2R5Pg0KLTxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCi08YnI+DQotPGJyPg0KLSAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCi0gICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KLSAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCi0gIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCi1tYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQotVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCi0gICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KLSAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KLSAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCi0gIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQotICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KLSAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQotICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KLSAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KLSAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCi0gICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCi0gIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCi0gIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KLSAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCi1ncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQotaW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQotc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KLXN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCi10aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCi10b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQotICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCi0gcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCi13YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQotPGJyPg0KLTxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VhNjg0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgdXJsID0gImFydGlmYWN0cy8iPgotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+Ci0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvVU1MIi8+Ci0gIDwvZmVhdHVyZT4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+Ci0gIDwvZmVhdHVyZT4KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5oZWxwXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL2hlbHAuamFyIi8+Ci0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvUGRlX2NvcmUuamFyIi8+Ci0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmp1bml0XzMuNS4wLmphciIgdXJsPSJwbHVnaW5zL2p1bml0XzMuNy5qYXIiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPgotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICAKLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9maWxlMS56aXAgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9maWxlMS56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzBiN2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvZmlsZTEuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDU0ZWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCI+DQotCTxpbnN0YWxsLWhhbmRsZXIgaGFuZGxlcj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRGVmYXVsdEluc3RhbGxIYW5kbGVyIi8+DQotICAJPGRhdGEgZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9ImZpbGUuemlwIiBpbnN0YWxsLXNpemU9IjEwMDAiLz4NCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxZjIxZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4NCi0gIDxmZWF0dXJlIHVybD0iaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMyI+DQotICA8L2ZlYXR1cmU+DQotICA8YXJjaGl2ZSBwYXRoPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMC9maWxlLnppcCIgdXJsPSJmaWxlMS56aXAiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZXMzLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL2ZlYXR1cmVzL2ZlYXR1cmVzMy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YzZlY2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZXMzLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL25vbiBkYXRhL2Fub3RoZXIgZmlsZS56aXAgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9ub24gZGF0YS9hbm90aGVyIGZpbGUuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTcwYjdlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL25vbiBkYXRhL2Fub3RoZXIgZmlsZS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDA5NDNjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczMuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+DQotICA8L2ZlYXR1cmU+DQotICA8YXJjaGl2ZSBwYXRoPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMC9maWxlLnppcCIgdXJsPSJub24gZGF0YS9hbm90aGVyIGZpbGUuemlwIi8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9mZWF0dXJlczIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQwMDRkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwYTcwZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM5NDYzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhkZGM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDUyMDY5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dXBkYXRlLXNpdGUxPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9idWlsZC5sb2cgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL2J1aWxkLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjZTE5NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL2J1aWxkLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjMuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4zLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luNC5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjQuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTNfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1CdWlsZCBmaW5pc2hlZC4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzAwYjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlLWJ1aWxkCi0gICAgICBmZWF0dXJlLWxvY2F0aW9uPSJmZWF0dXJlcyIKLSAgICAgIHBsdWdpbi1sb2NhdGlvbj0icGx1Z2lucyIKLSAgICAgIGF1dG9idWlsZD0iZmFsc2UiCi0gICAgICBzY3J1Yi1vdXRwdXQ9ImZhbHNlIgotICAgICAgdXNlLWNvbnNvbGU9InRydWUiPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMSIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTIiIHZlcnNpb249IjEuMC4wIi8+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUzIiB2ZXJzaW9uPSIxLjAuMCIvPgotPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTJiMGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYxNzU0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTNfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUzXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4MmE2Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTNfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiYzdmMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDI1ODMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4zXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjNfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTk0ZTUyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjNfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luNF8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW40XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjY2EyOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW40XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2M2Y3YmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTEiIHZlcnNpb249IjEuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlMS1DYXRlZ29yeTEiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMiIgdmVyc2lvbj0iMS4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGUxLUNhdGVnb3J5MiIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTNfMS4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUzIiB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkzIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGUxLUNhdGVnb3J5MSIgbGFiZWw9IlNpdGUxLUNhdGVnb3J5MS1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlMS1DYXRlZ29yeTIiIGxhYmVsPSJTaXRlMS1DYXRlZ29yeTItTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkzIiBsYWJlbD0iU2l0ZTEtQ2F0ZWdvcnkzLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGI2ODdlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dXBkYXRlLXNpdGUyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9idWlsZC5sb2cgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8uc2l0ZWJ1aWxkL2J1aWxkLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3Nzg1MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8uc2l0ZWJ1aWxkL2J1aWxkLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotQnVpbGQgZmluaXNoZWQuDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU4ODIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZS1idWlsZAotICAgICAgZmVhdHVyZS1sb2NhdGlvbj0iZmVhdHVyZXMiCi0gICAgICBwbHVnaW4tbG9jYXRpb249InBsdWdpbnMiCi0gICAgICBhdXRvYnVpbGQ9ImZhbHNlIgotICAgICAgc2NydWItb3V0cHV0PSJmYWxzZSIKLSAgICAgIHVzZS1jb25zb2xlPSJ0cnVlIj4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTEiIHZlcnNpb249IjEuMC4xIi8+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUyIiB2ZXJzaW9uPSIxLjAuMSIvPgotPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzViNGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTY2MGI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODE1ZjIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjNWY0Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDRiNzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMSIgdmVyc2lvbj0iMS4wLjEiLz4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4xLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMiIgdmVyc2lvbj0iMS4wLjEiLz4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZGI2YjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT51cGRhdGUtc2l0ZTM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL2J1aWxkLmxvZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvYnVpbGQubG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTJlZTAxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvYnVpbGQubG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMmEuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yYS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyYl8yLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLUJ1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1MTBiMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUtYnVpbGQKLSAgICAgIGZlYXR1cmUtbG9jYXRpb249ImZlYXR1cmVzIgotICAgICAgcGx1Z2luLWxvY2F0aW9uPSJwbHVnaW5zIgotICAgICAgYXV0b2J1aWxkPSJmYWxzZSIKLSAgICAgIHNjcnViLW91dHB1dD0iZmFsc2UiCi0gICAgICB1c2UtY29uc29sZT0idHJ1ZSI+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUxYiIgdmVyc2lvbj0iMi4wLjAiLz4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTJiIiB2ZXJzaW9uPSIyLjAuMCIvPgotPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5YTg3Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmI3MGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJkNDFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE4M2M3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMWIyOGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2JhNWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4NTA2Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTFiIiB2ZXJzaW9uPSIyLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTMtQ2F0ZWdvcnkxIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUyYiIgdmVyc2lvbj0iMi4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGUzLUNhdGVnb3J5MiIvPgotICAgPC9mZWF0dXJlPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlMy1DYXRlZ29yeTEiIGxhYmVsPSJTaXRlMy1DYXRlZ29yeTEtTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTMtQ2F0ZWdvcnkyIiBsYWJlbD0iU2l0ZTMtQ2F0ZWdvcnkyLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTA3YWFmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dXBkYXRlLXNpdGU0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnNpdGVidWlsZC9idWlsZC5sb2cgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8uc2l0ZWJ1aWxkL2J1aWxkLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZThlMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8uc2l0ZWJ1aWxkL2J1aWxkLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDc5MSArMCwwIEBACi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjEuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4xLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4xLmphcg0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMS5qYXINCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjEuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4xYS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjFhLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTFjXzMuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTFfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUxXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLUJ1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjYjAxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZS1idWlsZAotICAgICAgZmVhdHVyZS1sb2NhdGlvbj0iZmVhdHVyZXMiCi0gICAgICBwbHVnaW4tbG9jYXRpb249InBsdWdpbnMiCi0gICAgICBhdXRvYnVpbGQ9ImZhbHNlIgotICAgICAgc2NydWItb3V0cHV0PSJmYWxzZSIKLSAgICAgIHVzZS1jb25zb2xlPSJ0cnVlIj4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTFjIiB2ZXJzaW9uPSIzLjAuMCIvPgotPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDJmMjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWIwYjZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI2YmNiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1MzMwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDc2MGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGViMDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3M2NiZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTFjIiB2ZXJzaW9uPSIzLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTQtQ2F0ZWdvcnkxIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGU0LUNhdGVnb3J5MSIgbGFiZWw9IlNpdGU0LUNhdGVnb3J5MS1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5MzMwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPnVwZGF0ZS1zaXRlNTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9idWlsZC5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDRmYWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9idWlsZC5sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw3OTEgKzAsMCBAQAotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMi5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMi5qYXINCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjIuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjJhLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMmEuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4yLmphcg0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMi5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyY18zLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMl8xLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTJiXzIuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1CdWlsZCBmaW5pc2hlZC4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjQzZDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlLWJ1aWxkCi0gICAgICBmZWF0dXJlLWxvY2F0aW9uPSJmZWF0dXJlcyIKLSAgICAgIHBsdWdpbi1sb2NhdGlvbj0icGx1Z2lucyIKLSAgICAgIGF1dG9idWlsZD0iZmFsc2UiCi0gICAgICBzY3J1Yi1vdXRwdXQ9ImZhbHNlIgotICAgICAgdXNlLWNvbnNvbGU9InRydWUiPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMWMiIHZlcnNpb249IjMuMC4wIi8+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUyYyIgdmVyc2lvbj0iMy4wLjAiLz4KLTwvc2l0ZS1idWlsZD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTJkOWUyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViMGI2Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDliMDc2NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjZmODYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3MGNjZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4YWMwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmNfMy4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyY18zLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDM3ZGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyY18zLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQzNzQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJjYzNmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYzhhODguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzY2QwZmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNmRiMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTFjIiB2ZXJzaW9uPSIzLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTUtQ2F0ZWdvcnkxIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmNfMy4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUyYyIgdmVyc2lvbj0iMy4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGU1LUNhdGVnb3J5MiIvPgotICAgPC9mZWF0dXJlPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlNS1DYXRlZ29yeTEiIGxhYmVsPSJTaXRlNS1DYXRlZ29yeTEtTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTUtQ2F0ZWdvcnkyIiBsYWJlbD0iU2l0ZTUtQ2F0ZWdvcnkyLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjU4MDM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTEwNTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWY1YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRiMDRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMDhmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzY2IxYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIiLz4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMDU3ZTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhMGEzYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5ZjViYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGIwNGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjIwOGZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzUyZGEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIiLz4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyIi8+ICAKLSAgCi0gIDxhcmNoaXZlIHBhdGg9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjEuMC5qYXIiIHVybD0iZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphciIvPiAgCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmVlNGJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OWJkZGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWY1YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRiMDRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMDhmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2OTZiYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIi8+Ci0gIAotICA8YXJjaGl2ZSBwYXRoPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4xLjAuamFyIiB1cmw9ImZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIiLz4gIAotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkNzA4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgIHZlcnNpb249IjIuMS4wIgotICAgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iCi0gICBwcm92aWRlci1uYW1lPSJ3d3cuZWNsaXBzZS5vcmciCi0gICBpbWFnZT0ic3BsYXNoL3NwbGFzaF9mdWxsLmJtcCIKLSAgID4KLQotCTxsaWNlbnNlPgotICAgIAkgbGljZW5zZQotCTwvbGljZW5zZT4KLQotICAgPGNvcHlyaWdodCB1cmw9Im5vdGljZS5odG1sIi8+Ci0gICB4Ci0JCi0gICA8bGljZW5zZSB1cmw9ImFib3V0Lmh0bWwiPgotICAgeAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSB1cmw9ImZpbGU6L0Q6LyIgbGFiZWw9IkVjbGlwc2UgVXBkYXRlIFNpdGUiLz4KLSAgIDwvdXJsPgotCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTFiaXMueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTFiaXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODU1Zjk3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxYmlzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgotICAgdmVyc2lvbj0iMi4xLjAiCi0gICBsYWJlbD0iRWNsaXBzZSBQbGF0Zm9ybSIKLSAgIHByb3ZpZGVyLW5hbWU9Ind3dy5lY2xpcHNlLm9yZyIKLSAgIGltYWdlPSJzcGxhc2gvc3BsYXNoX2Z1bGwuYm1wIgotICAgPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICBFY2xpcHNlIHBsYXRmb3JtIGZlYXR1cmUuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0ibm90aWNlLmh0bWwiLz4KLSAgIDxibGFoIC8+Ci0JCi0gICA8bGljZW5zZSB1cmw9ImFib3V0Lmh0bWwiPgotCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIvPgotICAgPC91cmw+Ci0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmRmOWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgotICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgotICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCi0gICBibGFoPSJibGFoIgotICAgPgotCi0gICA8ZGVzY3JpcHRpb24gYmxhaD0iYmxhaCI+Ci0gICBFY2xpcHNlIHBsYXRmb3JtIGZlYXR1cmUuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0ibm90aWNlLmh0bWwiIGJsYWg9ImJsYWgiLz4KLQkKLSAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCIgYmxhaD0iYmxhaCI+Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmwgYmxhaD0iYmxhaCI+Ci0gICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIgYmxhaD0iYmxhaCIvPgotICAgPC91cmw+Ci0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMy54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjYwYmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgotICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgotICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCi0gICA+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgIEVjbGlwc2UgcGxhdGZvcm0gZmVhdHVyZS4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSIkb3MkLyR3cyQvbm90aWNlLmh0bWwiLz4KLSAgIHgKLQkKLSAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCI+Ci0gICB4Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIvPgotICAgPC91cmw+Ci0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlNC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTg3YzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgotICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgotICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCi0gICA+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgIEVjbGlwc2UgcGxhdGZvcm0gZmVhdHVyZS4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSIkb3MkLyR3cyQvbm90aWNlLmh0bWwiLz4KLSAgIHgKLQkKLSAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCI+Ci0gICB4Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIvPgotICAgICAgPGRpc2NvdmVyeSB1cmw9ImZpbGU6L2M6LyIgbGFiZWwgPSAiRGlzY292ZXJ5IiB0eXBlPSJ3ZWIiLz4KLSAgIDwvdXJsPgotCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3JlZGRvdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjE3MDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTxzaXRlIHVybD0iaW5mby9zaXRlSW5mby5odG1sIj4NCi08ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3JlZGRvdF8xLjAuMC5qYXIiPiANCi08Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+DQotPC9mZWF0dXJlPg0KLTxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcmVkZG90XzIuMS4wLmphciI+DQotPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPg0KLTwvZmVhdHVyZT4NCi08YXJjaGl2ZSBwYXRoPSJjb20ucmVkZG90LnJlZG90XzEuMC4wIiB1cmw9InBsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyIi8+DQotPGFyY2hpdmUgcGF0aD0iY29tLnJlZGRvdC5yZWRvdF8yLjEuMCIgdXJsPSJwbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzIuMS4wLmphciIvPg0KLTxjYXRlZ29yeS1kZWYgbGFiZWw9IlJlZCBEb3QgVmVyc2lvbnMiIG5hbWU9InJlZGRvdCI+DQotPGRlc2NyaXB0aW9uIHVybD0iUmVkRG90VmVyc2lvbnMuaHRtbCI+DQotVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlICZsdDtjdXJyZW50bHkmZ3Q7IGF2YWlsYWJsZSB2ZXJzaW9ucyBvZiBSZWQgRG90IGZlYXR1cmUuDQotPCFbQ0RBVEFbPGdyZWV0aW5nPkhlbGxvLCB3b3JsZCE8L2dyZWV0aW5nPl1dPg0KLTwvZGVzY3JpcHRpb24+DQotPC9jYXRlZ29yeS1kZWY+DQotPC9zaXRlPg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3JlZGRvdDEueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90MS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDQ5MGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90MS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCi08c2l0ZSB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCI+DQotPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yZWRkb3RfMS4wLjAuamFyIj4gDQotPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPg0KLTwvZmVhdHVyZT4NCi08ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3JlZGRvdF8yLjEuMC5qYXIiPg0KLTxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4NCi08L2ZlYXR1cmU+DQotPGFyY2hpdmUgcGF0aD0iY29tLnJlZGRvdC5yZWRvdF8xLjAuMCIgdXJsPSJwbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciIvPg0KLTxhcmNoaXZlIHBhdGg9ImNvbS5yZWRkb3QucmVkb3RfMi4xLjAiIHVybD0icGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjEuMC5qYXIiLz4NCi08Y2F0ZWdvcnktZGVmIGxhYmVsPSJSZWQgRG90IFZlcnNpb25zIiBuYW1lPSJyZWRkb3QiPg0KLTxkZXNjcmlwdGlvbiB1cmw9IlJlZERvdFZlcnNpb25zLmh0bWwiPg0KLVRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSAmbHQ7Y3VycmVudGx5Jmd0OyBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLg0KLTwvZGVzY3JpcHRpb24+DQotPC9jYXRlZ29yeS1kZWY+DQotPC9zaXRlPg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxY2VkNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSMgDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLWRyaXZlcnM9UmVxdWlyZWQgRHJpdmVycw0KLXNlY3VyaXR5PVNlY3VyaXR5IEZpeGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwZDgzMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzIiBuYW1lPSJUZXN0cyIgdmVyc2lvbj0iMC4wLjEiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLSAgPGhhbmRsZXI+DQotICAJPGJvbyBjbGFzcyA9InVua25vd24iLz4NCi0gIDwvaGFuZGxlcj4NCi0gIA0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgDQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiLz4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgDQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KLSAgICA8YmxhaC8+DQotICA8L2ZlYXR1cmU+DQotICANCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPg0KLSAgDQotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIA0KLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPg0KLSAgPC9mZWF0dXJlPg0KLSAgDQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL2hlbGxvIiA+DQotICAJPGRlZmF1bHQvPg0KLSAgPC9hcmNoaXZlPg0KLQ0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTIiIGxhYmVsPSIlc2VjdXJpdHkiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPg0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPiAgDQotDQotDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUxMC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI2ODBkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUxMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzIiBuYW1lPSJUZXN0cyIgdmVyc2lvbj0iMC4wLjEiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiIGJsYWg9ImJsYWgiPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIiBibGFoPSJibGFoIiBpZD0ib3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIvPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczIuamFyIiBpZD0idW5rbndvbi5pZCIgdmVyc2lvbj0iYmFkIHZlcnNpb24iLz4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIiBpZD0ib25seS5pZCIvPgotICAgIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiIHZlcnNpb249IjEuMC4wIi8+Ci0gIAotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUyLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NTUwZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgaWQ9ImNvbS5pYm0uamR0IiB1cmw9Imh0dHA6Ly93d3cubm90LWVjbGlwc2Uub3JnL2ZlYXR1cmUzIiB2ZXJzaW9uPSIxLjAuMCIvPgotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUzLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiYjY4Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgaWQ9ImNvbS5pYm0uamR0IiB1cmw9ImZlYXR1cmUzL2ZlYXR1cmUuamFyIiB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1bmtub3duIi8+Ci0gIDwvZmVhdHVyZT4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjdkMTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08c2l0ZT4KLSAgIDxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPgotCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlJlZCBEb3QgVmVyc2lvbnMiIG5hbWU9InJlZGRvdCI+Ci0gICAgICA8ZGVzY3JpcHRpb24gdXJsPSJSZWREb3RWZXJzaW9ucy5odG1sIj4KLSAgICAgICAgIFRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIHZlcnNpb25zIG9mIFJlZCBEb3QgZmVhdHVyZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIAotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPgotICAgPC9mZWF0dXJlPgotCi0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzIuMS4wLmphciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0KLSAKLTwvc2l0ZT4gICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNy54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTBkNzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cyIgbmFtZT0iVGVzdHMiIHZlcnNpb249IjAuMC4xIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4KLSAgPGhhbmRsZXI+Ci0gIAk8Ym9vIGNsYXNzID0idW5rbm93biIvPgotICA8L2hhbmRsZXI+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczIuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiLz4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxibGFoLz4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgotICAgIDxibGFoLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIi8+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvaGVsbG8iID4KLSAgCTxkZWZhdWx0Lz4KLSAgPC9hcmNoaXZlPgotCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5Ii8+Ci0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPgotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MSIgbGFiZWw9IiVkcml2ZXJzIi8+ICAKLQotCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTgueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNiYWExLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+Ci0gIDxoYW5kbGVyPgotICAJPGJvbyBjbGFzcyA9InVua25vd24iLz4KLSAgPC9oYW5kbGVyPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIi8+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgotICA8L2ZlYXR1cmU+Ci0gIHhjeGdmc2RmZ3Nkc2QKLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgotICAgIDxibGFoLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIi8+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvaGVsbG8iID4KLSAgCTxkZWZhdWx0Lz4KLSAgPC9hcmNoaXZlPgotCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5Ii8+Ci0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPgotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MSIgbGFiZWw9IiVkcml2ZXJzIi8+ICAKLQotCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTkueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhjNWE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSIgYmxhaD0iYmxhaCI+Ci0gIDxoYW5kbGVyIGJsYWg9ImJsYWgiPgotICAJPGJvbyBjbGFzcyA9InVua25vd24iIGJsYWg9ImJsYWgiLz4KLSAgPC9oYW5kbGVyPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIiBibGFoPSJibGFoIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIiBibGFoPSJibGFoIiAvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIvPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+Ci0gICAgPGJsYWgvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiLz4KLSAgCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9oZWxsbyIgYmxhaD0iYmxhaCI+Ci0gIAk8ZGVmYXVsdCBibGFoPSJibGFoIi8+Ci0gIDwvYXJjaGl2ZT4KLQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MiIgbGFiZWw9IiVzZWN1cml0eSIgYmxhaD0iYmxhaCIvPgotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIiBsYWJlbD0iU3BlY2lhbCBGaXgiIGJsYWg9ImJsYWgiLz4KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPiAgCi0KLQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGVmdHAueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZWZ0cC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODNlYzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZWZ0cC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5mdHAiPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIi8+Ci08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTk1ZDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyLnBsdWdpbjJfMi4yLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk5NWQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGYxOTNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzVhZGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk1OGM3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDVkODIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+DQotICA8cnVudGltZT4NCi0gICAgPGxpYnJhcnkgbmFtZT0ianVuaXQuamFyIj4NCi0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4NCi0gICAgPC9saWJyYXJ5Pg0KLSAgPC9ydW50aW1lPg0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDFhZjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIxLjEuMSIgd3M9IldTX1dJTjMyIi8+Ci08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxODQ2Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+Ci0gIDxydW50aW1lPgotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICA8L2xpYnJhcnk+Ci0gIDwvcnVudGltZT4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQ2MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YTdkZTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIyLjEuMCIgd3M9IldTX1dJTjMyIi8+Ci08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxODQ2Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+Ci0gIDxydW50aW1lPgotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICA8L2xpYnJhcnk+Ci0gIDwvcnVudGltZT4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9zcmMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3NyYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQ2MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZXNvdXJjZXMucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNhYjkwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1IVFRQX1BBVEhfMT0vb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMvVXBkYXRlTWFuYWdlcjIvDQotSFRUUF9QQVRIXzI9L29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLnVwZGF0ZXRlc3RzL1VwZGF0ZU1hbmFnZXIvDQotSFRUUF9QQVRIXzM9L29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLnVwZGF0ZXRlc3RzL1NpdGUgd2l0aCBzcGFjZS8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmM2MGM3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4NCi0gIDxmZWF0dXJlIHVybD0idGVzdEFQSS9mZWF0dXJlcy9mZWF0dXJlMyI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUxIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS5qYXIiIHVybD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgICANCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRWNsaXBzZSBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWQxYzExLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHVybD0iSW5mby5odG1sIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTEiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiB1cmw9InBsdWdpbnMvcGx1Z2luMSIvPg0KLSAgPGFyY2hpdmUgcGF0aD0ib3JnLmVjbGlwc2UudXBkYXRlLmFyY2hpdmUyIiB1cmw9InBsdWdpbnMvcGx1Z2luMiIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjIzZTRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotR2VuZXJhdGVkLWZyb206IDEwNzcwNjI2MDM3MDgKLUJ1bmRsZS1OYW1lOiBUZXN0Ci1CdW5kbGUtVmVyc2lvbjogMS4wLjMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c0JVTkRMRVBBUlNFRAotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1DbGFzc1BhdGg6IHBsdWdpbi5qYXIKLUxlZ2FjeTogdHJ1ZQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTlkZGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHMiIHZlcnNpb249IjEuMC4zIiB2ZW5kb3ItbmFtZT0iRWNsaXBzZS5vcmciPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVNYW5pZmVzdF8xLjAuMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlTWFuaWZlc3RfMS4wLjEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NmU2ODAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVNYW5pZmVzdF8xLjAuMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyNjAzNzA4Ci1CdW5kbGUtTmFtZTogVGVzdAotQnVuZGxlLVZlcnNpb246IDEuMC4xCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVNYW5pZmVzdDsgc2luZ2xldG9uPXRydWUKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtQ2xhc3NQYXRoOiBwbHVnaW4uamFyCi1MZWdhY3k6IHRydWUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZU1hbmlmZXN0LkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4MWM0Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMiIgdmVyc2lvbj0iNS4wLjAiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPg0KLSAgPHJ1bnRpbWU+DQotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+DQotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgIDwvbGlicmFyeT4NCi0gIDwvcnVudGltZT4NCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMC9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMC9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiM2MyNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMiIgdmVyc2lvbj0iNS4wLjEiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPg0KLSAgPHJ1bnRpbWU+DQotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+DQotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgIDwvbGlicmFyeT4NCi0gIDwvcnVudGltZT4NCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9ub3RCdW5kbGVNYW5pZmVzdF8xLjAuMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvbm90QnVuZGxlTWFuaWZlc3RfMS4wLjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NmZiMGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9ub3RCdW5kbGVNYW5pZmVzdF8xLjAuMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotR2VuZXJhdGVkLWZyb206IDEwNzcwNjI2MDM3MDgKLUJ1bmRsZS1OYW1lOiBOb3QgVmFsaWQgQnVuZGxlIE1hbmlmZXN0Ci1CdW5kbGUtVmVyc2lvbjogMS4wLjIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtQ2xhc3NQYXRoOiBwbHVnaW4uamFyCi1SZXF1aXJlLUJ1bmRsZTogCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3OGQ2MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9IldJTjMyLExJTlVYIiB2ZXJzaW9uPSIxLjEuMSIvPgotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTg0NmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgotICA8cnVudGltZT4KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgPC9saWJyYXJ5PgotICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTVkNDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4KLSAgPC9mZWF0dXJlPgotICA8ZmVhdHVyZSB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPC9mZWF0dXJlPgotICA8ZmVhdHVyZSB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTEiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPC9mZWF0dXJlPgotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xLmphciIgdXJsPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIi8+ICAgIAotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRWNsaXBzZSBUb29scyIgbmFtZT0iZWNsaXBzZSIvPgotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTIvLmVjbGlwc2Vwcm9kdWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlMi8uZWNsaXBzZXByb2R1Y3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODI5YWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlMi8uZWNsaXBzZXByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWlkPWFub3RoZXIucHJvZHVjdC5pZA0KLW5hbWU9TmFtZSBvZiB0aGUgcHJvZHVjdA0KLXZlcj0xLjIuNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTMvLmVjbGlwc2VleHRlbnNpb24gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUzLy5lY2xpcHNlZXh0ZW5zaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDcyZGY3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTMvLmVjbGlwc2VleHRlbnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pZD1pZC5vZi5leHRlbmRlZC5wcm9kdWN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2M4NGU5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTQvZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWlkPWRpZmZlcmVudC5wcm9kdWN0LmlkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS8uZWNsaXBzZVVNIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS8uZWNsaXBzZVVNCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTZjNTIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTUvLmVjbGlwc2VVTQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotaWQ9b3JnLmVjbGlwc2UucGxhdGZvcm0NCi1uYW1lPWEgUHJvZHVjdCANCi12ZXJzaW9uPTMuNS42ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNi8uZWNsaXBzZVVNIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNi8uZWNsaXBzZVVNCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTdmOWY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvLmVjbGlwc2VVTQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWlkPW9yZy5lY2xpcHNlLnNkawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvY2hpbGRyZW4vY2hpbGRyZW4vZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvY2hpbGRyZW4vY2hpbGRyZW4vZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3ZjlmOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2L2NoaWxkcmVuL2NoaWxkcmVuL2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pZD1vcmcuZWNsaXBzZS5zZGsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTExODAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLnRlc3QxLmlkZW50MSIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW5fdXMsZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjAiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KLSAgPGRlc2NyaXB0aW9uPlRlc3QgZmVhdHVyZSBmb3IgdGVzdElkZW50aWZpZXIgdGVzdDwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0PkNvcHlyaWdodCAoYykgdGhlIGNvbXBhbnk8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPkRvIHlvdSBhY2NlcHQgdGhlIGxpY2Vuc2UgPzwvbGljZW5zZT4NCi0gIDx1cmw+DQotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGVoIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gIDwvdXJsPg0KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIzLjUuNiIgd3M9IldTX1dJTjMyIi8+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjEyMDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIiBpbnN0YWxsLXNpemU9Ijk3OCIgZnJhZ21lbnQ9ImZhbHNlIiB2ZXJzaW9uPSI1LjAuMCIvPg0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA1Y2RhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLnRlc3QxLmlkZW50MiIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW5fdXMsZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjAiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KLSAgPGRlc2NyaXB0aW9uPlRlc3QgZmVhdHVyZSBmb3IgdGVzdElkZW50aWZpZXIgdGVzdDwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0PkNvcHlyaWdodCAoYykgdGhlIGNvbXBhbnk8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPkRvIHlvdSBhY2NlcHQgdGhlIGxpY2Vuc2UgPzwvbGljZW5zZT4NCi0gIDx1cmw+DQotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGVoIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gIDwvdXJsPg0KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjMuNS42IiB3cz0iV1NfV0lOMzIiLz4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTIwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIGluc3RhbGwtc2l6ZT0iOTc4IiBmcmFnbWVudD0iZmFsc2UiIHZlcnNpb249IjUuMC4wIi8+DQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlZTEzOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMSIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW4sZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjQiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KLSAgPGRlc2NyaXB0aW9uPkkgYmVsaWV2ZSB0aGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBmZWF0dXJlIDEsIHdlbGwsIGZlYXR1cmUgMSBpcyBhbiBleGNlcHRpb25hbCBmZWF0dXJlIHRoYXQgeW91IHNob3VsZCBpbnN0YWxsIHJpZ2h0IE5PVyBvbiB5b3VyIG1hY2hpbmUuLi4gdHJ5IGl0LjwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0Pk9rLCBub3csIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgY29tcGxleCBDb3B5cmlnaHQgIG5vdCBwcmVwYXJlZCBieSBhIGxhd3llciBDb3B5cmlnaHQgKGMpIHRoZSBjb21wYW55PC9jb3B5cmlnaHQ+DQotICA8bGljZW5zZT4jMSBEbyB5b3UgYWNjZXB0IGl0ICMyIHlvdSBkbyBudG8gYWNjZXB0IGl0IC4uLkRvIHlvdSBhY2NwdCBpdCA/PC9saWNlbnNlPg0KLSAgPHVybD4NCi0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgPC91cmw+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjMuNS42IiB3cz0iV1NfV0lOMzIiLz4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTIwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIGluc3RhbGwtc2l6ZT0iOTc4IiBmcmFnbWVudD0iZmFsc2UiIHZlcnNpb249IjUuMC4wIi8+DQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlMS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2UzMGEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL3NpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9zaXRlMS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4MjNjMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL3NpdGUxL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB1cmw9ImluZm8iIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLSAgPGZlYXR1cmUgaWQ9Im9yZy5pc3YuZmVhdHVyZTMiIHVybD0id3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUzIiB2ZXJzaW9uPSIzLjQuNSI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUyIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9mZWF0dXJlMiIgdmVyc2lvbj0iMy40LjYiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmF0dXJlMSIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTEiIHZlcnNpb249IjIuMy41Ij4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWlnbjEiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5hcmNoaXZlMiIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvcGx1Z2luMiIvPg0KLSAgPGFyY2hpdmUgcGF0aD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjMiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWdpbjMiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVua25vd24ucGx1Z2luIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9wbHVnaW5zL3BsdWdpbjQiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLmZvbzEiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWdpbjEiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRWNsaXBzZSB0b29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYWE2NjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1uYW1lID0gSW5zdGFsbC9VcGRhdGUgQ29yZSBUZXN0cw0KLXByb3ZpZGVyLW5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZGU3MmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCi08cGx1Z2luDQotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlIg0KLSAgIG5hbWU9IiVuYW1lIg0KLSAgIHZlcnNpb249IjMuMC4wIg0KLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlci1uYW1lIg0KLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlVGVzdHNQbHVnaW4iPg0KLQ0KLSAgIDxydW50aW1lPg0KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InVwZGF0ZXRlc3RzLmphciI+DQotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgICAgPC9saWJyYXJ5Pg0KLSAgIDwvcnVudGltZT4NCi0gICA8cmVxdWlyZXM+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudG9tY2F0Ii8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiLz4NCi0gICA8L3JlcXVpcmVzPg0KLQ0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iZmVhdHVyZTEiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmVUeXBlcyI+DQotICAgICAgPGZlYXR1cmUtZmFjdG9yeQ0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkiPg0KLSAgICAgIDwvZmVhdHVyZS1mYWN0b3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iZnRwIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zaXRlVHlwZXMiPg0KLSAgICAgIDxzaXRlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uLlNpdGVGVFBGYWN0b3J5Ij4NCi0gICAgICA8L3NpdGUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9BbGxUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5NDVmOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaS5BbGxBUElUZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmJyYW5kaW5nLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb25maWd1cmF0aW9ucy5BbGxDb25maWd1cmF0aW9uc1Rlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290LkFsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5tb2RlbC5BbGxNb2RlbFRlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubmVzdGVkZmVhdHVyZXMuQWxsTmVzdGVkVGVzdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wYXJzZXIuQWxsUGFyc2VyVGVzdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWNvbmNpbGlhdGlvbi5BbGxSZWNvbmNpbGlhdGlvblRlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGwuQWxsUmVndWxhckluc3RhbGxUZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJSZW1vdmUuQWxsUmVndWxhclJlbW92ZVRlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc2l0ZXZhbGlkYXRpb24uQWxsU2l0ZVZhbGlkYXRpb25UZXN0czsNCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudHlwZXMuQWxsVHlwZXNUZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzLkFsbENvcmVVSVRlc3RzOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7DQotCXB1YmxpYyBBbGxUZXN0cyhTdHJpbmcgbmFtZSkgew0KLQkJc3VwZXIobmFtZSk7DQotCX0NCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotCQlzdWl0ZS5zZXROYW1lKCJBbGwgVXBkYXRlIE1hbmFnZXIgVGVzdHMiKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsTWlycm9yVGVzdHMuc3VpdGUoKSk7CQ0KLQkJc3VpdGUuYWRkVGVzdChBbGxTaXRlVmFsaWRhdGlvblRlc3RzLnN1aXRlKCkpOw0KLQkJc3VpdGUuYWRkVGVzdChBbGxQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0cy5zdWl0ZSgpKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsUmVndWxhckluc3RhbGxUZXN0cy5zdWl0ZSgpKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsQVBJVGVzdHMuc3VpdGUoKSk7DQotCQlzdWl0ZS5hZGRUZXN0KEFsbFBhcnNlclRlc3RzLnN1aXRlKCkpOw0KLQkJc3VpdGUuYWRkVGVzdChBbGxDb3JlVUlUZXN0cy5zdWl0ZSgpKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsQ29uZmlndXJhdGlvbnNUZXN0cy5zdWl0ZSgpKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsVHlwZXNUZXN0cy5zdWl0ZSgpKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsUmVndWxhclJlbW92ZVRlc3RzLnN1aXRlKCkpOw0KLQkJc3VpdGUuYWRkVGVzdChBbGxOZXN0ZWRUZXN0cy5zdWl0ZSgpKTsJDQotCQlzdWl0ZS5hZGRUZXN0KEFsbFJlY29uY2lsaWF0aW9uVGVzdHMuc3VpdGUoKSk7CQkJCQkNCi0JCXN1aXRlLmFkZFRlc3QoQWxsTW9kZWxUZXN0cy5zdWl0ZSgpKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsQnJhbmRpbmdUZXN0cy5zdWl0ZSgpKTsNCi0JCS8vc3VpdGUuYWRkVGVzdChBbGxTdGFuZGFsb25lVGVzdHMuc3VpdGUoKSk7DQotCQlyZXR1cm4gc3VpdGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlTWFuYWdlclRlc3RDYXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVNYW5hZ2VyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjNzZjYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVNYW5hZ2VyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHM7DQotDQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsNCi0vKioNCi0gKiBBbGwgSGVscCBTeXN0ZW0gVGVzdCBjYXNlcyBtdXN0IHN1YmNsYXNzIHRoaXMgYmFzZSBUZXN0Y2FzZS4NCi0gKiBTZWUgU2FtcGxlVGVzdENhc2UuamF2YSBmb3IgYSB0ZW1wbGF0ZS4NCi0gKi8NCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXBkYXRlTWFuYWdlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsNCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZGF0YVBhdGg7DQotDQotCXByb3RlY3RlZCBzdGF0aWMgVVJMIFNPVVJDRV9GSUxFX1NJVEU7DQotCXByb3RlY3RlZCBzdGF0aWMgVVJMIFNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVEOw0KLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBTT1VSQ0VfSFRUUF9TSVRFOw0KLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBUQVJHRVRfRklMRV9TSVRFOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9QQVRIID0gImRhdGEvIjsNCi0NCi0JLyoqDQotCSAqIERlZmF1bHQgQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsNCi0JCXN1cGVyKG5hbWUpOw0KLQkJdHJ5IHsNCi0JCQlpbml0KCk7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoZS50b1N0cmluZygpKTsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0KCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotDQotCQlJUGx1Z2luRGVzY3JpcHRvciBkYXRhRGVzYyA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUiKTsNCi0JCVVSTCByZXNvbHZlZFVSTCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwoUGxhdGZvcm0ucmVzb2x2ZShkYXRhRGVzYy5nZXRJbnN0YWxsVVJMKCkpKTsNCi0JCVVSTCBkYXRhVVJMID0gbmV3IFVSTChyZXNvbHZlZFVSTCwgREFUQV9QQVRIKTsNCi0JCWRhdGFQYXRoID0gZGF0YVVSTC5nZXRGaWxlKCk7DQotCQlTdHJpbmcgaG9tZVBhdGggPSAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsNCi0NCi0JCWlmIChidW5kbGUgPT0gbnVsbCkgew0KLQkJCUNsYXNzTG9hZGVyIGwgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgZGF0YVVSTCB9LCBudWxsKTsNCi0JCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoInJlc291cmNlcyIsIExvY2FsZS5nZXREZWZhdWx0KCksIGwpOw0KLQkJfQ0KLQ0KLQkJdHJ5IHsNCi0JCQlTT1VSQ0VfRklMRV9TSVRFID0gbmV3IEZpbGUoZGF0YVBhdGgpLnRvVVJMKCk7DQotCQkJU09VUkNFX0ZJTEVfU0lURV9JTlNUQUxMRUQgPSBuZXcgRmlsZShkYXRhUGF0aCArICJ0ZXN0QVBJLyIpLnRvVVJMKCk7DQotCQkJU09VUkNFX0hUVFBfU0lURSA9IG5ldyBVUkwoImh0dHAiLCBnZXRIdHRwSG9zdCgpLCBnZXRIdHRwUG9ydCgpLCBidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMSIpKTsNCi0JCQlUQVJHRVRfRklMRV9TSVRFID0gbmV3IFVSTCgiZmlsZSIsIG51bGwsIGhvbWVQYXRoICsgIi90YXJnZXQvIik7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoZS50b1N0cmluZygpKTsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQ0KLQkJLy9jbGVhbnVwIHRhcmdldCANCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoaG9tZVBhdGggKyAiL3RhcmdldC8iKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOw0KLQkJLy8gY2xlYW51cCBpbmZvIGFib3V0IGp1c3QgaW5zdGFsbGVkIHBsdWdpbnMNCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7DQotCQkNCi0JCS8vIHNldHVwIGNhY2hlIHNpdGUgdG8gZmFsc2UuIA0KLQkJLy8gTm90ZTogdGhlIHN0YW5kYWxvbmUgdGVzdHMgd2lsbCBzZXQgaXQgYmFjayB0byB0cnVlDQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmdsb2JhbFVzZUNhY2hlID0gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBzZXRVcC4gU3ViY2xhc3NlcyBhcmUgcHJldmVudGVkIA0KLQkgKiBmcm9tIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgdG8gbWFpbnRhaW4gbG9nZ2luZyBjb25zaXN0ZW5jeS4NCi0JICogdW1TZXRVcCgpIHNob3VsZCBiZSBvdmVycmlkZW4gaW5zdGVhZC4NCi0JICovDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tICIgKyB0aGlzLmdldE5hbWUoKSk7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXROYW1lKCkgKyAiOiBzZXRVcC4uLiIpOw0KLQkJdW1TZXRVcCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4NCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCB1bVNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkvLyBkbyBub3RoaW5nLg0KLQl9DQotDQotCS8qKg0KLQkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGVhckRvd24uICBTdWJjbGFzc2VzIGFyZSBwcmV2ZW50ZWQgDQotCSAqIGZyb20gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB0byBtYWludGFpbiBsb2dnaW5nIGNvbnNpc3RlbmN5Lg0KLQkgKiB1bVRlYXJEb3duKCkgc2hvdWxkIGJlIG92ZXJyaWRlbiBpbnN0ZWFkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldE5hbWUoKSArICI6IHRlYXJEb3duLi4uXG4iKTsNCi0JCXVtVGVhckRvd24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLg0KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgdW1UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gew0KLQkJLy8gZG8gbm90aGluZy4NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRIdHRwSG9zdCgpIHsNCi0JCXJldHVybiBVcGRhdGVUZXN0c1BsdWdpbi5nZXRXZWJBcHBTZXJ2ZXJIb3N0KCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0SHR0cFBvcnQoKSB7DQotCQlyZXR1cm4gVXBkYXRlVGVzdHNQbHVnaW4uZ2V0V2ViQXBwU2VydmVyUG9ydCgpOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSVNpdGUgc2l0ZSA9IGNvbmZpZ1NpdGUuZ2V0U2l0ZSgpOw0KLQkJcmVtb3ZlKGZlYXR1cmUsIHNpdGUpOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJU2l0ZSBzaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2UoZmVhdHVyZSk7DQotCQkvLyByZW1vdmUgdGhlIHBsdWdpbnMgYW5kIGZlYXR1cmVzIGRpcg0KLQkJU3RyaW5nIHNpdGVQYXRoID0gc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7DQotCQlGaWxlIGZpbGUgPSBudWxsOw0KLQ0KLQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyAiXyIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsNCi0JCWZpbGUgPSBuZXcgRmlsZShzaXRlUGF0aCwgImZlYXR1cmVzIiArIEZpbGUuc2VwYXJhdG9yICsgZmVhdHVyZU5hbWUpOw0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqUmVtb3ZpbmcgOiIgKyBmaWxlKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsNCi0NCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgew0KLQkJCVN0cmluZyBuYW1lID0gZW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyAiXyIgKyBlbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yOw0KLQkJCWZpbGUgPSBuZXcgRmlsZShzaXRlUGF0aCwgInBsdWdpbnMiICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipSZW1vdmluZyA6IiArIGZpbGUpOw0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsNCi0JCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihlbnRyaWVzW2ldKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVUZXN0c1BsdWdpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxNmMxMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuaGVscC5pbnRlcm5hbC5hcHBzZXJ2ZXIuV2ViYXBwTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsNCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7DQotDQotLyoqDQotICogbWFuYWdlcyB0aGUgc3RhcnR1byBhbmQgc2h1dG93biBvZiB0aGUgDQotICogd2ViIHNlcnZlcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBVcGRhdGVUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7DQotDQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBhcHBTZXJ2ZXJIb3N0ID0gbnVsbDsNCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGFwcFNlcnZlclBvcnQgPSAwOw0KLQlwcml2YXRlIHN0YXRpYyBVcGRhdGVUZXN0c1BsdWdpbiBwbHVnaW47DQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsNCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZD1mYWxzZTsNCi0NCi0JcHVibGljIHN0YXRpYyBVcGRhdGVUZXN0c1BsdWdpbiBnZXRQbHVnaW4oKSB7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KLQkJcGx1Z2luID0gdGhpczsNCi0JCWJ1bmRsZUNvbnRleHQgPSBjb250ZXh0Ow0KLQl9DQotCQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJV2ViYXBwTWFuYWdlci5zdG9wKCJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS51cGRhdGV0ZXN0cyIpOw0KLQkJcGx1Z2luID0gbnVsbDsNCi0JCWJ1bmRsZUNvbnRleHQgPSBudWxsOw0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgaG9zdCBpZGVudGlmaWVyIGZvciB0aGUgd2ViIGFwcCBzZXJ2ZXINCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYkFwcFNlcnZlckhvc3QoKSB7DQotCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7DQotCQlyZXR1cm4gYXBwU2VydmVySG9zdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcG9ydCBpZGVudGlmaWVyIGZvciB0aGUgd2ViIGFwcCBzZXJ2ZXINCi0JICovDQotCXB1YmxpYyBzdGF0aWMgaW50IGdldFdlYkFwcFNlcnZlclBvcnQoKSB7DQotCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7CQkNCi0JCXJldHVybiBhcHBTZXJ2ZXJQb3J0Ow0KLQl9DQotCS8qKg0KLQkgKiBNZXRob2QgaW5pdGlhbGl6ZS4NCi0JICovDQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsNCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJV2ViYXBwTWFuYWdlci5zdGFydCgib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMiLCAib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUiLCBuZXcgUGF0aCgid2Vic2VydmVyIikpOw0KLQkJCWFwcFNlcnZlckhvc3QgPSBXZWJhcHBNYW5hZ2VyLmdldEhvc3QoKTsNCi0JCQlhcHBTZXJ2ZXJQb3J0ID0gV2ViYXBwTWFuYWdlci5nZXRQb3J0KCk7DQotDQotCQkJdGV4dCA9ICJUaGUgd2ViU2VydmVyIGRpZCBzdGFydCBpcDoiICsgYXBwU2VydmVySG9zdCArICI6IiArIGFwcFNlcnZlclBvcnQ7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQl0ZXh0ID0gIlRoZSB3ZWJTZXJ2ZXIgZGlkbid0IHN0YXJ0ICI7DQotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZSIsIElTdGF0dXMuT0ssICJXZWJTZXJ2ZXIgbm90IHN0YXJ0ZWQuIFVwZGF0ZSBUZXN0cyByZXN1bHRzIGFyZSBpbnZhbGlkIiwgbnVsbCk7DQotCQkJVXBkYXRlQ29yZS53YXJuKCIiLG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cykpOw0KLQkJfWZpbmFsbHkgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbih0ZXh0KTsNCi0JCQlpbml0aWFsaXplZCA9IHRydWU7DQotCQl9DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0FsbEFQSVRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvQWxsQVBJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5NmIzOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvQWxsQVBJVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIE1hbmFnZXMgdGhlIEFQSSB0ZXN0cw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbGxBUElUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEFsbEFQSVRlc3RzKFN0cmluZyBuYW1lKSB7DQotCQlzdXBlcihuYW1lKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIExpc3Qgb2YgQVBJIHRlc3RzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0JCXN1aXRlLnNldE5hbWUoIkFQSSBUZXN0cyIpOw0KLQ0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlQVBJLmNsYXNzKSk7DQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdExvY2FsU2l0ZUFQSS5jbGFzcykpOwkJDQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFVwZGF0ZU1hbmFnZXJVdGlsc0FQSS5jbGFzcykpOwkJDQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZUFQSS5jbGFzcykpOw0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3REZWZhdWx0UGFja2FnZUZlYXR1cmVBUEkuY2xhc3MpKTsNCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0UGx1Z2luQ29udGFpbmVyQVBJLmNsYXNzKSk7DQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVNYW5hZ2VyQVBJLmNsYXNzKSk7CQkNCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0TmVzdGVkRmVhdHVyZUFQSS5jbGFzcykpOw0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkuY2xhc3MpKTsNCi0JCXJldHVybiBzdWl0ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvRGVmYXVsdEZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9EZWZhdWx0RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU2YmIzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9EZWZhdWx0RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7DQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyOw0KLS8qKg0KLSAqIEFic3RyYWN0IENsYXNzIHRoYXQgaW1wbGVtZW50cyBtb3N0IG9mIHRoZSBiZWhhdmlvciBvZiBhIGZlYXR1cmUNCi0gKiBBIGZlYXR1cmUgQUxXQVlTIGJlbG9uZ3MgdG8gYW4gSVNpdGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZlYXR1cmUgZXh0ZW5kcyBGZWF0dXJlIHsNCi0NCi0NCi0JLyoqDQotCSAqIENvcHkgY29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBEZWZhdWx0RmVhdHVyZShJRmVhdHVyZSBzb3VyY2VGZWF0dXJlLCBJU2l0ZSB0YXJnZXRTaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0aGlzKHRhcmdldFNpdGUpOw0KLQkJdGhpcy5zZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKHNvdXJjZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpKTsNCi0JCXRoaXMuc2V0SWRlbnRpZmllcihzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7DQotCQl0aGlzLnNldExhYmVsKHNvdXJjZUZlYXR1cmUuZ2V0TGFiZWwoKSk7DQotCQl0aGlzLnNldFVwZGF0ZVNpdGVFbnRyeShzb3VyY2VGZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeSgpKTsNCi0JCXRoaXMuc2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoc291cmNlRmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpKTsNCi0JCXRoaXMuc2V0UHJvdmlkZXIoc291cmNlRmVhdHVyZS5nZXRQcm92aWRlcigpKTsNCi0JCXRoaXMuc2V0RGVzY3JpcHRpb24oc291cmNlRmVhdHVyZS5nZXREZXNjcmlwdGlvbigpKTsNCi0JCXRoaXMuc2V0Q29weXJpZ2h0KHNvdXJjZUZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkpOw0KLQkJdGhpcy5zZXRMaWNlbnNlKHNvdXJjZUZlYXR1cmUuZ2V0TGljZW5zZSgpKTsNCi0JCXRoaXMuc2V0UGx1Z2luRW50cmllcyhzb3VyY2VGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKSk7DQotCQl0aGlzLnNldEltYWdlKHNvdXJjZUZlYXR1cmUuZ2V0SW1hZ2UoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIERlZmF1bHRGZWF0dXJlKElTaXRlIHRhcmdldFNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXN1cGVyKCk7DQotCQl0aGlzLnNldFNpdGUodGFyZ2V0U2l0ZSk7CQkNCi0JfQkNCi0JDQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgaWRlbnRpZmllcg0KLQkgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudGlmaWVyKSB7DQotCQlzZXRGZWF0dXJlSWRlbnRpZmllcihpZGVudGlmaWVyLmdldElkZW50aWZpZXIoKSk7DQotCQlzZXRGZWF0dXJlVmVyc2lvbihpZGVudGlmaWVyLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZGlzY292ZXJ5U2l0ZUVudHJpZXMNCi0JICogQHBhcmFtIGRpc2NvdmVyeUluZm9zIFRoZSBkaXNjb3ZlcnlJbmZvcyB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldERpc2NvdmVyeVNpdGVFbnRyaWVzKElVUkxFbnRyeVtdIGRpc2NvdmVyeUluZm9zKSB7DQotCQlzZXREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbHMoKFVSTEVudHJ5TW9kZWxbXSkgZGlzY292ZXJ5SW5mb3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB1cGRhdGVTaXRlRW50cnkNCi0JICogQHBhcmFtIHVwZGF0ZUluZm8gVGhlIHVwZGF0ZUluZm8gdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVTaXRlRW50cnkoSVVSTEVudHJ5IHVwZGF0ZUluZm8pIHsNCi0JCXNldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKChVUkxFbnRyeU1vZGVsKSB1cGRhdGVJbmZvKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkcyBhIGRpc2NvdmVyeUluZm8NCi0JICogQHBhcmFtIGRpc2NvdmVyeUluZm8gVGhlIGRpc2NvdmVyeUluZm8gdG8gYWRkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGREaXNjb3ZlcnlTaXRlRW50cnkoSVVSTEVudHJ5IGRpc2NvdmVyeUluZm8pIHsNCi0JCWFkZERpc2NvdmVyeVNpdGVFbnRyeU1vZGVsKChVUkxFbnRyeU1vZGVsKSBkaXNjb3ZlcnlJbmZvKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZGVzY3JpcHRpb24NCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKElVUkxFbnRyeSBkZXNjcmlwdGlvbikgew0KLQkJc2V0RGVzY3JpcHRpb25Nb2RlbCgoVVJMRW50cnlNb2RlbCkgZGVzY3JpcHRpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBjb3B5cmlnaHQNCi0JICogQHBhcmFtIGNvcHlyaWdodCBUaGUgY29weXJpZ2h0IHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KElVUkxFbnRyeSBjb3B5cmlnaHQpIHsNCi0JCXNldENvcHlyaWdodE1vZGVsKChVUkxFbnRyeU1vZGVsKSBjb3B5cmlnaHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBsaWNlbnNlDQotCSAqIEBwYXJhbSBsaWNlbnNlIFRoZSBsaWNlbnNlIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TGljZW5zZShJVVJMRW50cnkgbGljZW5zZSkgew0KLQkJc2V0TGljZW5zZU1vZGVsKChVUkxFbnRyeU1vZGVsKSBsaWNlbnNlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgaW1hZ2UNCi0JICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEltYWdlKFVSTCBpbWFnZSkgew0KLQkJaWYgKGltYWdlPT1udWxsKSByZXR1cm47DQotCQlzZXRJbWFnZVVSTFN0cmluZyhpbWFnZS50b0V4dGVybmFsRm9ybSgpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkcyBhbiBpbXBvcnQNCi0JICogQHBhcmFtIGFuSW1wb3J0IFRoZSBpbXBvcnQgdG8gYWRkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRJbXBvcnQoSUltcG9ydCBhbkltcG9ydCkgew0KLQkJaWYgKGFuSW1wb3J0ICE9IG51bGwpIHsNCi0JCQlhZGRJbXBvcnRNb2RlbCgoSW1wb3J0TW9kZWwpIGFuSW1wb3J0KTsNCi0JCX0NCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgcGx1Z2luRW50cmllcw0KLQkgKiBAcGFyYW0gcGx1Z2luRW50cmllcyBUaGUgcGx1Z2luRW50cmllcyB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBsdWdpbkVudHJpZXMoSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcykgew0KLQkJaWYgKHBsdWdpbkVudHJpZXMgIT0gbnVsbCkgew0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgew0KLQkJCQlhZGRQbHVnaW5FbnRyeShwbHVnaW5FbnRyaWVzW2ldKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIHNldHMgdGVoIFVSTCBpc2Ygbm90IGFscmVhZHkgcHJlc2VudA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VVJMKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uew0KLQkJLy9pZiAoZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpPT1udWxsKXsNCi0JCQlGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcih1cmwpOw0KLQkJCXRoaXMuc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOw0KLQkJCWNvbnRlbnRQcm92aWRlci5zZXRGZWF0dXJlKHRoaXMpOw0KLQkJLy99DQotCX0NCi0JDQotCQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7DQotCQlpZiAocGx1Z2luRW50cnkgIT0gbnVsbCkgew0KLQkJCWFkZFBsdWdpbkVudHJ5TW9kZWwoKFBsdWdpbkVudHJ5TW9kZWwpIHBsdWdpbkVudHJ5KTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2FkZE5vblBsdWdpbkVudHJ5KElOb25QbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZE5vblBsdWdpbkVudHJ5KElOb25QbHVnaW5FbnRyeSBkYXRhRW50cnkpIHsNCi0JCWlmIChkYXRhRW50cnkgIT0gbnVsbCkgew0KLQkJCWFkZE5vblBsdWdpbkVudHJ5TW9kZWwoKE5vblBsdWdpbkVudHJ5TW9kZWwpIGRhdGFFbnRyeSk7DQotCQl9DQotCX0JDQotDQotCX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvTXlVUkxFbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL015VVJMRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0NGRiNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvTXlVUkxFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlVSTEVudHJ5Ow0KLQ0KLS8qKg0KLSAqIFdyYXBwZXIgYXJvdW5kIFVSTEVudHJ5DQotICovDQotcHVibGljIGNsYXNzIE15VVJMRW50cnkgZXh0ZW5kcyBVUkxFbnRyeSB7DQotCQ0KLQlwdWJsaWMgTXlVUkxFbnRyeShTdHJpbmcgYW5ub3RhdGlvbiwgVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlzdXBlcigpOw0KLQkJc2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsNCi0JCWlmICh1cmwhPW51bGwpIHsNCi0JCQlzZXRVUkxTdHJpbmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJCXJlc29sdmUobnVsbCxudWxsKTsNCi0JCX0NCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZUFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiY2Y4MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZUFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JDQotCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgcmVtb3RlRmVhdHVyZT1udWxsOw0KLQkNCi0JLyoqDQotCSAqIFRlc3QgdGhlIHRlc3RGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZUFQSShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0DQotCSAqLw0KLQlwcml2YXRlIERlZmF1bHRGZWF0dXJlIGdldEZlYXR1cmUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChyZW1vdGVGZWF0dXJlID09IG51bGwpew0KLQ0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7DQotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCJ0ZXN0QVBJLyIrU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrImZlYXR1cmUzLyIsbnVsbCk7DQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsNCi0JCXJlZi5zZXRTaXRlKHNpdGUpOw0KLQkJcmVmLnNldFVSTCh1cmwpOw0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOw0KLQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShmZWF0dXJlLHNpdGUpOw0KLQ0KLQkJfQ0KLQkJcmV0dXJuIHJlbW90ZUZlYXR1cmU7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdElkZW50aWZpZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBpZDEgPSAieG1scy9hcGl0ZXN0cy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAvIjsNCi0JCVN0cmluZyBpZDIgPSAieG1scy9hcGl0ZXN0cy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUiOw0KLQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudDEgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigib3JnLnRlc3QxLmlkZW50MSIsIjEuMC4wIik7DQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50MiA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCJvcmcudGVzdDEuaWRlbnQyIiwiMS4wLjAiKTsJCQ0KLQkJDQotDQotCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsNCi0JCQkNCi0JCQlVUkwgdXJsMSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSxpZDEsbnVsbCk7CQkJDQotCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnNldFVSTCh1cmwxKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnNldElkZW50aWZpZXIoaWRlbnQxKTsNCi0JCQlhc3NlcnRFcXVhbHMoaWRlbnQxLnRvU3RyaW5nKCkscmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCSAJDQotCQkJIFVSTCB1cmwyID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLGlkMixudWxsKTsJCQ0KLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwodXJsMik7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50Mik7DQotCQkJYXNzZXJ0RXF1YWxzKGlkZW50Mi50b1N0cmluZygpLHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJDQotDQotCX0NCi0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFNpdGUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uew0KLQkJU3RyaW5nIGlkZW50MSA9IFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIKyJmZWF0dXJlMy8iOwkJDQotDQotCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsNCi0JCQkNCi0JCQlVUkwgaWQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWRlbnQxLG51bGwpOwkJCQ0KLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwoaWQpOw0KLQkJCWFzc2VydEVxdWFscyhzaXRlLHJlbW90ZUZlYXR1cmUuZ2V0U2l0ZSgpKTsNCi0NCi0JfQ0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJU3RyaW5nIGxhYmVsID0gImR1bW15IGxhYmVsIjsNCi0JCUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsNCi0JCWZlYXR1cmUuc2V0TGFiZWwobGFiZWwpOw0KLQkJYXNzZXJ0RXF1YWxzKGxhYmVsLGZlYXR1cmUuZ2V0TGFiZWwoKSk7DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVSTCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlVUkwgdXJsID0gbnVsbDsNCi0JCVN0cmluZyBsYWJlbCA9ICJPVEkgU2l0ZSI7DQotCQl0cnkgew0KLQkJCXVybCA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbS8iKTsNCi0JCQkNCi0JCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXt9IC8vIGltcG9zc2libGUgZWggIQ0KLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsNCi0JCWZlYXR1cmUuc2V0VXBkYXRlU2l0ZUVudHJ5KG5ldyBNeVVSTEVudHJ5KGxhYmVsLCB1cmwpKTsNCi0JCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKS5nZXRVUkwoKSk7DQotCQlhc3NlcnRFcXVhbHMobGFiZWwsZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKS5nZXRBbm5vdGF0aW9uKCkpOw0KLQ0KLQl9IA0KLQ0KLQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERpc2NvdmVyeVVSTHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJSVVSTEVudHJ5W10gdXJsSW5mbyA9IG5ldyBNeVVSTEVudHJ5WzJdOw0KLQkJVVJMW10gdXJsID0gbmV3IFVSTFsyXTsNCi0JCVN0cmluZ1tdIGxhYmVsID0gbmV3IFN0cmluZ1syXTsNCi0JCXRyeSB7DQotCQkJdXJsWzBdID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tLyIpOw0KLQkJCXVybFsxXSA9IG5ldyBVUkwoImh0dHA6Ly9lY2xpcHNlLm9yZy8iKTsNCi0JCQlsYWJlbFswXSA9ICJPVEkgU2l0ZSI7DQotCQkJbGFiZWxbMV0gPSAiRWNsaXBzZSBTaXRlIjsNCi0JCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXt9IC8vIGltcG9zc2libGUgZWggIQ0KLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsNCi0JCWZvciAoaW50IGk9MDtpPDI7aSsrKXsNCi0JCQkJdXJsSW5mb1tpXSA9IG5ldyBNeVVSTEVudHJ5KGxhYmVsW2ldLHVybFtpXSk7DQotCQl9DQotCQlmZWF0dXJlLnNldERpc2NvdmVyeVNpdGVFbnRyaWVzKHVybEluZm8pOw0KLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKS5sZW5ndGg7aSsrKXsNCi0JCQlhc3NlcnRFcXVhbHModXJsSW5mb1tpXSxmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyaWVzKClbaV0pOw0KLQkJfQ0KLQ0KLQl9DQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RQcm92aWRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlTdHJpbmcgcHJvdmlkZXIgPSAibm90IHNvIGR1bW15IHByb3ZpZGVyIjsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQkoKEZlYXR1cmUpZmVhdHVyZSkuc2V0UHJvdmlkZXIocHJvdmlkZXIpOw0KLQkJYXNzZXJ0RXF1YWxzKHByb3ZpZGVyLGZlYXR1cmUuZ2V0UHJvdmlkZXIoKSk7DQotCX0NCi0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBkZXNjID0gInByZXR0eSBsb25nIGRlc2NyaXB0aW9uIGFzIGEgc3RyaW5nIHdpdGggXHJcbiBhbmQgXHQgYW5kIFxuIjsNCi0JCUlVUkxFbnRyeSBpbmZvID0gbmV3IE15VVJMRW50cnkoZGVzYyxudWxsKTsNCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmZWF0dXJlLnNldERlc2NyaXB0aW9uKGluZm8pOw0KLQkJYXNzZXJ0RXF1YWxzKGRlc2MsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKSk7DQotCX0NCi0JDQotDQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVVSTCB1cmwgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20iKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsvKnByZXR0eSBpbXBvc3NpYmxlKi99DQotCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KG51bGwsdXJsKTsNCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmZWF0dXJlLnNldERlc2NyaXB0aW9uKGluZm8pOw0KLQkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkpOw0KLQl9CQ0KLQkNCi0NCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaXB0aW9uMigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJDQotIAkgVVJMIHVybCA9IG51bGw7DQotCQl0cnkgew0KLQkJCXVybCA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbSIpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpey8qcHJldHR5IGltcG9zc2libGUqL30NCi0JCVN0cmluZyBkZXNjID0gInByZXR0eSBsb25nIGRlc2NyaXB0aW9uIGFzIGEgc3RyaW5nIHdpdGggXHJcbiBhbmQgXHQgYW5kIFxuIjsNCi0JCUlVUkxFbnRyeSBpbmZvID0gbmV3IE15VVJMRW50cnkoZGVzYyx1cmwpOw0KLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsNCi0JCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7DQotCQlTdHJpbmcgcmVzdWx0ID0gZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKTsNCi0JCWFzc2VydEVxdWFscyhkZXNjLHJlc3VsdCk7DQotCQlhc3NlcnRFcXVhbHModXJsLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRVUkwoKSk7DQotCX0JDQotDQotDQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTI2MWIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotDQotDQotcHVibGljIGNsYXNzIFRlc3REZWZhdWx0UGFja2FnZUZlYXR1cmVBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQkNCi0JcHJpdmF0ZQlEZWZhdWx0RmVhdHVyZSByZW1vdGVGZWF0dXJlPW51bGw7DQotCQ0KLQkvKioNCi0JICogVGVzdCB0aGUgdGVzdEZlYXR1cmVzKCkNCi0JICovDQotCXB1YmxpYyBUZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QNCi0JICovDQotCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKHJlbW90ZUZlYXR1cmUgPT0gbnVsbCl7DQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsNCi0JCVVSTCBpZCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTFfMS4wLjAuamFyIixudWxsKTsJDQotCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOw0KLQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwoaWQpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlbW90ZUZlYXR1cmU7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdElkZW50aWZpZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCQ0KLQkJU3RyaW5nIGlkMSA9ICJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIjsNCi0JCVN0cmluZyBpZDIgPSAiZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciI7DQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50MSA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCJvcmcudGVzdDEuaWRlbnQxIiwiMS4wLjAiKTsNCi0JCVZlcnNpb25lZElkZW50aWZpZXIgaWRlbnQyID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIm9yZy50ZXN0MS5pZGVudDIiLCIxLjAuMCIpOwkJDQotCQkNCi0NCi0JCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsNCi0JCQkNCi0JCQlVUkwgdXJsMSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSxpZDEsbnVsbCk7CQkJDQotCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnNldFVSTCh1cmwxKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnNldElkZW50aWZpZXIoaWRlbnQxKTsNCi0JCQlhc3NlcnRFcXVhbHMoaWRlbnQxLnRvU3RyaW5nKCkscmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQkNCi0JCQkgVVJMIHVybDIgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWQyLG51bGwpOwkJDQotCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnNldFVSTCh1cmwyKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnNldElkZW50aWZpZXIoaWRlbnQyKTsJCQkNCi0JCQlhc3NlcnRFcXVhbHMoaWRlbnQyLnRvU3RyaW5nKCkscmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFNpdGUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBpZGVudDEgPSAib3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciI7CQkNCi0NCi0JCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsNCi0JCQkNCi0JCQlVUkwgaWQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWRlbnQxLG51bGwpOwkJDQotCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnNldFVSTChpZCk7CQ0KLQkJCWFzc2VydEVxdWFscyhzaXRlLHJlbW90ZUZlYXR1cmUuZ2V0U2l0ZSgpKTsNCi0NCi0JfQ0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBsYWJlbCA9ICJkdW1teSBsYWJlbCI7DQotCQlGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmZWF0dXJlLnNldExhYmVsKGxhYmVsKTsNCi0JCWFzc2VydEVxdWFscyhsYWJlbCxmZWF0dXJlLmdldExhYmVsKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVUkwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVVSTCB1cmwgPSBudWxsOw0KLQkJU3RyaW5nIGxhYmVsID0gIk9USSBTaXRlIjsNCi0JCXRyeSB7DQotCQkJdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tLyIpOw0KLQkJCQ0KLQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpe30gLy8gaW1wb3NzaWJsZSBlaCAhDQotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJZmVhdHVyZS5zZXRVcGRhdGVTaXRlRW50cnkobmV3IE15VVJMRW50cnkobGFiZWwsIHVybCkpOw0KLQkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeSgpLmdldFVSTCgpKTsNCi0JCWFzc2VydEVxdWFscyhsYWJlbCxmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeSgpLmdldEFubm90YXRpb24oKSk7DQotDQotCX0gDQotDQotDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY292ZXJ5VVJMcygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJSVVSTEVudHJ5W10gdXJsSW5mbyA9IG5ldyBVUkxFbnRyeVsyXTsNCi0JCVVSTFtdIHVybCA9IG5ldyBVUkxbMl07DQotCQlTdHJpbmdbXSBsYWJlbCA9IG5ldyBTdHJpbmdbMl07DQotCQl0cnkgew0KLQkJCXVybFswXSA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbS8iKTsNCi0JCQl1cmxbMV0gPSBuZXcgVVJMKCJodHRwOi8vZWNsaXBzZS5vcmcvIik7DQotCQkJbGFiZWxbMF0gPSAiT1RJIFNpdGUiOw0KLQkJCWxhYmVsWzFdID0gIkVjbGlwc2UgU2l0ZSI7DQotCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7fSAvLyBpbXBvc3NpYmxlIGVoICENCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmb3IgKGludCBpPTA7aTwyO2krKyl7DQotCQkJCXVybEluZm9baV0gPSBuZXcgTXlVUkxFbnRyeShsYWJlbFtpXSx1cmxbaV0pOw0KLQkJfQ0KLQkJZmVhdHVyZS5zZXREaXNjb3ZlcnlTaXRlRW50cmllcyh1cmxJbmZvKTsNCi0JCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCkubGVuZ3RoO2krKyl7DQotCQkJYXNzZXJ0RXF1YWxzKHVybEluZm9baV0sZmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpW2ldKTsNCi0JCX0NCi0NCi0NCi0JfQ0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBwcm92aWRlciA9ICJub3Qgc28gZHVtbXkgcHJvdmlkZXIiOw0KLQkJRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJZmVhdHVyZS5zZXRQcm92aWRlcihwcm92aWRlcik7DQotCQlhc3NlcnRFcXVhbHMocHJvdmlkZXIsZmVhdHVyZS5nZXRQcm92aWRlcigpKTsNCi0JfQ0KLQ0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBkZXNjID0gInByZXR0eSBsb25nIGRlc2NyaXB0aW9uIGFzIGEgc3RyaW5nIHdpdGggXHJcbiBhbmQgXHQgYW5kIFxuIjsNCi0JCUlVUkxFbnRyeSBpbmZvID0gbmV3IE15VVJMRW50cnkoZGVzYyxudWxsKTsNCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmZWF0dXJlLnNldERlc2NyaXB0aW9uKGluZm8pOw0KLQkJYXNzZXJ0RXF1YWxzKGRlc2MsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKSk7DQotCX0NCi0JDQotDQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVVSTCB1cmwgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20iKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsvKnByZXR0eSBpbXBvc3NpYmxlKi99DQotCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KG51bGwsdXJsKTsNCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmZWF0dXJlLnNldERlc2NyaXB0aW9uKGluZm8pOw0KLQkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaXB0aW9uMigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJDQotCQlVUkwgdXJsID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tIik7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7LypwcmV0dHkgaW1wb3NzaWJsZSovfQ0KLQkJU3RyaW5nIGRlc2MgPSAicHJldHR5IGxvbmcgZGVzY3JpcHRpb24gYXMgYSBzdHJpbmcgd2l0aCBcclxuIGFuZCBcdCBhbmQgXG4iOw0KLQkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShkZXNjLHVybCk7DQotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsNCi0JCWFzc2VydEVxdWFscyhkZXNjLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkpOw0KLQl9DQotDQotDQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RmVhdHVyZUNvbnRlbnRQcm92aWRlcl9GaWxlRmlsdGVyQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDU4ZjE1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RmVhdHVyZUNvbnRlbnRQcm92aWRlcl9GaWxlRmlsdGVyQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0KLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCQotCS8qKgotCSAqIFRlc3QgdGhlIHRlc3RGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlRmlsdGVyKCl7Ci0JCQotCQlTdHJpbmcgcDEgPSAiL3AxL3AyL2EuKiI7Ci0JCVN0cmluZyBwMiA9ICJwMS9wMi9iLioiOwotCQlTdHJpbmcgcDMgPSAiL3AxL3AyL2EudHh0IjsKLQkJU3RyaW5nIHA0ID0gIi9wMS9wMi8qLnR4dCI7Ci0JCQotCQlTdHJpbmcgbmFtZTEgPSAiL3AxL3AyL2EudHh0IjsKLQkJU3RyaW5nIG5hbWUyID0gIi9wMS9wMi9iLnR4dCI7Ci0JCVN0cmluZyBuYW1lMyA9ICIvcDMvcDIvYS50eHQiOwotCQlTdHJpbmcgbmFtZTQgPSAicDEvcDIvYS50eHQiOwotCQlTdHJpbmcgbmFtZTUgPSAiL3AxL3AyL2IudHh0IjsKLQkJU3RyaW5nIG5hbWU2ID0gIi9wMS9wMi9jLnR4dCI7Ci0JCVN0cmluZyBuYW1lNyA9ICIvcDEvcDIvcDMvYS50eHQiOwotCQkKLQkJCi0JCUZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3AgPSBuZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIobnVsbCk7Ci0JCQotCQlGZWF0dXJlQ29udGVudFByb3ZpZGVyLkZpbGVGaWx0ZXIgZmlsdGVyMSA9IGNwLm5ldyBGaWxlRmlsdGVyKHAxKTsKLQkJRmVhdHVyZUNvbnRlbnRQcm92aWRlci5GaWxlRmlsdGVyIGZpbHRlcjIgPSBjcC5uZXcgRmlsZUZpbHRlcihwMik7Ci0JCUZlYXR1cmVDb250ZW50UHJvdmlkZXIuRmlsZUZpbHRlciBmaWx0ZXIzID0gY3AubmV3IEZpbGVGaWx0ZXIocDMpOwotCQlGZWF0dXJlQ29udGVudFByb3ZpZGVyLkZpbGVGaWx0ZXIgZmlsdGVyNCA9IGNwLm5ldyBGaWxlRmlsdGVyKHA0KTsKLQotCQlhc3NlcnRUcnVlKCIxLjEiLGZpbHRlcjEuYWNjZXB0KG5hbWUxKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwhZmlsdGVyMS5hY2NlcHQobmFtZTIpKTsJCQotCQlhc3NlcnRUcnVlKCIxLjMiLCFmaWx0ZXIxLmFjY2VwdChuYW1lMykpOwkKLQkJYXNzZXJ0VHJ1ZSgiMS40IiwhZmlsdGVyMS5hY2NlcHQobmFtZTQpKTsJCQotCQlhc3NlcnRUcnVlKCIxLjUiLCFmaWx0ZXIxLmFjY2VwdChuYW1lNSkpOwkJCi0JCWFzc2VydFRydWUoIjEuNiIsIWZpbHRlcjEuYWNjZXB0KG5hbWU2KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMS43IiwhZmlsdGVyMS5hY2NlcHQobmFtZTcpKTsKLQkKLQkJYXNzZXJ0VHJ1ZSgiMi4xIiwhZmlsdGVyMi5hY2NlcHQobmFtZTEpKTsJCQotCQlhc3NlcnRUcnVlKCIyLjIiLCFmaWx0ZXIyLmFjY2VwdChuYW1lMikpOwkJCi0JCWFzc2VydFRydWUoIjIuMyIsIWZpbHRlcjIuYWNjZXB0KG5hbWUzKSk7CQotCQlhc3NlcnRUcnVlKCIyLjQiLCFmaWx0ZXIyLmFjY2VwdChuYW1lNCkpOwkJCi0JCWFzc2VydFRydWUoIjIuNSIsIWZpbHRlcjIuYWNjZXB0KG5hbWU1KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMi42IiwhZmlsdGVyMi5hY2NlcHQobmFtZTYpKTsJCQotCQlhc3NlcnRUcnVlKCIyLjciLCFmaWx0ZXIyLmFjY2VwdChuYW1lNykpOwotCi0JCWFzc2VydFRydWUoIjMuMSIsZmlsdGVyMy5hY2NlcHQobmFtZTEpKTsJCQotCQlhc3NlcnRUcnVlKCIzLjIiLCFmaWx0ZXIzLmFjY2VwdChuYW1lMikpOwkJCi0JCWFzc2VydFRydWUoIjMuMyIsIWZpbHRlcjMuYWNjZXB0KG5hbWUzKSk7CQotCQlhc3NlcnRUcnVlKCIzLjQiLCFmaWx0ZXIzLmFjY2VwdChuYW1lNCkpOwkJCi0JCWFzc2VydFRydWUoIjMuNSIsIWZpbHRlcjMuYWNjZXB0KG5hbWU1KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMy42IiwhZmlsdGVyMy5hY2NlcHQobmFtZTYpKTsJCQotCQlhc3NlcnRUcnVlKCIzLjciLCFmaWx0ZXIzLmFjY2VwdChuYW1lNykpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiNC4xIixmaWx0ZXI0LmFjY2VwdChuYW1lMSkpOwkJCi0JCWFzc2VydFRydWUoIjQuMiIsZmlsdGVyNC5hY2NlcHQobmFtZTIpKTsJCQotCQlhc3NlcnRUcnVlKCI0LjMiLCFmaWx0ZXI0LmFjY2VwdChuYW1lMykpOwkKLQkJYXNzZXJ0VHJ1ZSgiNC40IiwhZmlsdGVyNC5hY2NlcHQobmFtZTQpKTsJCQotCQlhc3NlcnRUcnVlKCI0LjUiLGZpbHRlcjQuYWNjZXB0KG5hbWU1KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiNC42IixmaWx0ZXI0LmFjY2VwdChuYW1lNikpOwkJCi0JCWFzc2VydFRydWUoIjQuNyIsIWZpbHRlcjQuYWNjZXB0KG5hbWU3KSk7CQkJCQkJCQkKLQkJCQkJCi0JfQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdExvY2FsU2l0ZUFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RMb2NhbFNpdGVBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlMzNlMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdExvY2FsU2l0ZUFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ2F0ZWdvcnlNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0TG9jYWxTaXRlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdExvY2FsU2l0ZUFQSShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCJzaXRlVGVzdExvY2FsU2l0ZS8iKSwgbnVsbCk7DQotCQlJQXJjaGl2ZVJlZmVyZW5jZVtdIGluZm8gPSBzaXRlLmdldEFyY2hpdmVzKCk7DQotCQkNCi0JCWlmIChpbmZvLmxlbmd0aDw9MCl7DQotCQkJZmFpbCgibm8gcGx1Z2lucyBpbiBzaXRlOiAiK3NpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7DQotCQl9DQotCQkgDQotCQlib29sZWFuIGZvdW5kMSA9IGZhbHNlOw0KLQkJYm9vbGVhbiBmb3VuZDIgPSBmYWxzZTsNCi0JCVN0cmluZyBuYW1lMT0gInBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIiOw0KLQkJU3RyaW5nIG5hbWUyID0gInBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIiOw0KLQkJDQotCQlmb3IgKGludCBpID0wOyBpPGluZm8ubGVuZ3RoOyBpKyspew0KLQkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTEpKSBmb3VuZDEgPSB0cnVlOw0KLQkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTIpKSBmb3VuZDIgPSB0cnVlOw0KLQkJfQ0KLQkJDQotCQlpZiAoIWZvdW5kMSB8fCAhZm91bmQyKXsNCi0JCQlmYWlsKCJDYW5ub3QgZmluZCBwbHVnaW4gOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIHZlcnNpb24gNS4wLjAgYW5kIDUuMC4xIG9uIHRoZSBzaXRlLCBieSBwYXJzaW5nIGZpbGUgc3lzdGVtIik7DQotCQl9DQotCQkNCi0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEJ1bmRsZU1hbmlmZXN0UGFyc2luZygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCJzaXRlVGVzdExvY2FsU2l0ZS8iKSxudWxsKTsNCi0JCUlBcmNoaXZlUmVmZXJlbmNlW10gaW5mbyA9IHNpdGUuZ2V0QXJjaGl2ZXMoKTsNCi0JCQ0KLQkJaWYgKGluZm8ubGVuZ3RoPD0wKXsNCi0JCQlmYWlsKCJubyBwbHVnaW5zIGluIHNpdGU6ICIrc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsNCi0JCX0NCi0JCSANCi0JCWJvb2xlYW4gZm91bmQxID0gZmFsc2U7DQotCQlib29sZWFuIGZvdW5kMiA9IGZhbHNlOw0KLQkJYm9vbGVhbiBmb3VuZDMgPSBmYWxzZTsNCi0JCVN0cmluZyBuYW1lMT0gInBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlTWFuaWZlc3RfMS4wLjEuamFyIjsNCi0JCVN0cmluZyBuYW1lMiA9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c0JVTkRMRVBBUlNFRF8xLjAuMy5qYXIiOw0KLQkJU3RyaW5nIG5hbWUzID0gInBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zLmphciI7DQotCQkNCi0JCWZvciAoaW50IGkgPTA7IGk8aW5mby5sZW5ndGg7IGkrKyl7DQotCQkJaWYgKGluZm9baV0uZ2V0UGF0aCgpLmVxdWFscyhuYW1lMSkpIGZvdW5kMSA9IHRydWU7DQotCQkJaWYgKGluZm9baV0uZ2V0UGF0aCgpLmVxdWFscyhuYW1lMikpIGZvdW5kMiA9IHRydWU7DQotCQkJaWYgKGluZm9baV0uZ2V0UGF0aCgpLmVxdWFscyhuYW1lMykpIGZvdW5kMyA9IHRydWU7DQotCQl9DQotCQkNCi0JCWlmICghZm91bmQxIHx8ICFmb3VuZDIpew0KLQkJCWZhaWwoIkNhbm5vdCBmaW5kIHBsdWdpbiA6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIgdmVyc2lvbiA1LjAuMCBhbmQgNS4wLjEgb24gdGhlIHNpdGUsIGJ5IHBhcnNpbmcgZmlsZSBzeXN0ZW0iKTsNCi0JCX0NCi0JCWlmIChmb3VuZDMpew0KLQkJCWZhaWwoIlBsdWdpbiBtYW5pZmVzdCBwYXJzZWQgaW5zdGVhZCBvZiBidW5kbGUgbWFuaWZlc3QuIik7DQotCQl9DQotCQkNCi0NCi0JfQ0KLQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsNCi0JCQ0KLQkJSUNhdGVnb3J5IGNhdGVnb3J5ID0gbmV3IENhdGVnb3J5KCJjYXRlZ29yeSIsIkxhYmVsIG9mIGNhdGVnb3J5Iik7DQotCQkNCi0JCSgoU2l0ZU1vZGVsKXNpdGUpLmFkZENhdGVnb3J5TW9kZWwoKENhdGVnb3J5TW9kZWwpY2F0ZWdvcnkpOw0KLQkJDQotCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gc2l0ZS5nZXRDYXRlZ29yaWVzKCk7DQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2F0ZWdvcmllcy5sZW5ndGg7IGluZGV4KyspIHsNCi0JCQlJQ2F0ZWdvcnkgZWxlbWVudCA9IGNhdGVnb3JpZXNbaW5kZXhdOw0KLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoImNhdGVnb3J5IikpIGZvdW5kID0gdHJ1ZTsNCi0JCX0NCi0JCWlmICghZm91bmQpIGZhaWwoImNhbm5vdCBmaW5kIGNhdGVnb3J5ICdjYXRlZ29yeScgaW4gc2l0ZSIpOw0KLQ0KLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOw0KLQkJcmVmLnNldFNpdGUoc2l0ZSk7DQotCQlyZWYuYWRkQ2F0ZWdvcnkoY2F0ZWdvcnkpOwkJDQotCQljYXRlZ29yaWVzID0gcmVmLmdldENhdGVnb3JpZXMoKTsNCi0JCWZvdW5kID0gZmFsc2U7DQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2F0ZWdvcmllcy5sZW5ndGg7IGluZGV4KyspIHsNCi0JCQlJQ2F0ZWdvcnkgZWxlbWVudCA9IGNhdGVnb3JpZXNbaW5kZXhdOw0KLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoImNhdGVnb3J5IikpIGZvdW5kID0gdHJ1ZTsNCi0JCX0NCi0JCWlmICghZm91bmQpIGZhaWwoImNhbm5vdCBmaW5kIGNhdGVnb3J5ICdjYXRlZ29yeScgaW4gZmVhdHVyZSIpOw0KLQkJDQotCQkJfQ0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdE5lc3RlZEZlYXR1cmVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0TmVzdGVkRmVhdHVyZUFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdjNWE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0TmVzdGVkRmVhdHVyZUFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3ROZXN0ZWRGZWF0dXJlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIFRlc3QgdGhlIHRlc3RGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3ROZXN0ZWRGZWF0dXJlQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCS8qKgotCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGdldFJvb3RGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbCIpLG51bGwpOwotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArICJyb290ZmVhdHVyZS5qYXIiLCBudWxsKTsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCXJlZi5zZXRTaXRlKHNpdGUpOwotCQlyZWYuc2V0VVJMKHVybCk7Ci0JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvIiksIG51bGwpOwotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyIiwgbnVsbCk7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotCQlyZWYuc2V0U2l0ZShzaXRlKTsKLQkJcmVmLnNldFVSTCh1cmwpOwotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSUZlYXR1cmUgcm9vdEZlYXR1cmUgPSBnZXRSb290RmVhdHVyZSgpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IHJvb3RGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gZ2V0Q2hpbGRGZWF0dXJlKCk7Ci0JCWFzc2VydEVxdWFscygiQ2hpbGRyZW4gZmVhdHVyZSBhcmUgbm90IGVxdWFsIiwgY2hpbGRGZWF0dXJlLCByZWZbMF0uZ2V0RmVhdHVyZShudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotCSAqLwotCXByaXZhdGUgSUZlYXR1cmUgZ2V0Um9vdEZlYXR1cmUyKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwiKSxudWxsKTsKLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAicm9vdGZlYXR1cmUuamFyIiwgbnVsbCk7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotCQlyZWYuc2V0U2l0ZShzaXRlKTsKLQkJcmVmLnNldFVSTCh1cmwpOwotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotCSAqLwotCXByaXZhdGUgSUZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlMigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwiKSxudWxsKTsKLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAiY2hpbGRyZW5mZWF0dXJlLmphciIsIG51bGwpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkwodXJsKTsKLQkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJRmVhdHVyZSByb290RmVhdHVyZSA9IGdldFJvb3RGZWF0dXJlMigpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IHJvb3RGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gZ2V0Q2hpbGRGZWF0dXJlMigpOwotCQlhc3NlcnRFcXVhbHMoIkNoaWxkcmVuIGZlYXR1cmUgYXJlIG5vdCBlcXVhbCIsIGNoaWxkRmVhdHVyZSwgcmVmWzBdLmdldEZlYXR1cmUobnVsbCkpOwotCX0KLQotLy8JLyoqCi0vLwkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0vLwkgKi8KLS8vCXByaXZhdGUgSUZlYXR1cmUgZ2V0Um9vdEZlYXR1cmUzKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0My9zaXRlLnhtbCIpLCBudWxsKTsKLS8vCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArICJyb290ZmVhdHVyZS5qYXIiLCBudWxsKTsKLS8vCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLS8vCQlyZWYuc2V0U2l0ZShzaXRlKTsKLS8vCQlyZWYuc2V0VVJMKHVybCk7Ci0vLwkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotLy8JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLS8vCQlyZXR1cm4gZmVhdHVyZTsKLS8vCX0KLQotLy8JLyoqCi0vLwkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0vLwkgKi8KLS8vCXByaXZhdGUgSUZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlMygpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotLy8KLS8vCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3NpdGUueG1sIikpOwotLy8JCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgImNoaWxkcmVuZmVhdHVyZS5qYXIiLCBudWxsKTsKLS8vCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLS8vCQlyZWYuc2V0U2l0ZShzaXRlKTsKLS8vCQlyZWYuc2V0VVJMKHVybCk7Ci0vLwkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotLy8JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLS8vCQlyZXR1cm4gZmVhdHVyZTsKLS8vCX0KLQotCS8qCi0JICogCi0JICovCi0JLyoJcHVibGljIHZvaWQgdGVzdE5lc3RlZDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJCUlGZWF0dXJlIHJvb3RGZWF0dXJlID0gZ2V0Um9vdEZlYXR1cmUzKCk7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IHJvb3RGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IGdldENoaWxkRmVhdHVyZTMoKTsKLQkJCWFzc2VydEVxdWFscygKLQkJCQkiQ2hpbGRyZW4gZmVhdHVyZSBhcmUgbm90IGVxdWFsIiwKLQkJCQljaGlsZEZlYXR1cmUsCi0JCQkJcmVmWzBdLmdldEZlYXR1cmUoKSk7Ci0JCX0KLQkqLwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFBsdWdpbkNvbnRhaW5lckFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RQbHVnaW5Db250YWluZXJBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVhNzc5MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFBsdWdpbkNvbnRhaW5lckFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFRlc3RQbHVnaW5Db250YWluZXJBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQ0KLQlwcml2YXRlIFNpdGUgc2l0ZTsNCi0JcHJpdmF0ZSBEZWZhdWx0RmVhdHVyZSBmZWF0dXJlOw0KLQ0KLQkvKioNCi0JICogdGhlIFNpdGUgdG8gdGVzdA0KLQkgKi8NCi0JcHJpdmF0ZSBTaXRlIGdldFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCWlmIChzaXRlID09IG51bGwpIHsNCi0NCi0JCQlzaXRlID0gKFNpdGUpU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsInRlc3RBUEkvIiksIG51bGwpOw0KLQ0KLQkJfQ0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QNCi0JICovDQotCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgew0KLQkJCUlTaXRlIHNpdGUgPSBnZXRTaXRlKCk7DQotCQkJVVJMIGlkID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMV8xLjAuMC5qYXIiLG51bGwpOwkJCQkJCQ0KLQkJCWZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7DQotCQkJZmVhdHVyZS5zZXRVUkwoaWQpOwkNCi0JCX0NCi0JCXJldHVybiBmZWF0dXJlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdFBsdWdpbkNvbnRhaW5lckFQSShTdHJpbmcgYXJnMCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0RmVhdHVyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsNCi0JCXBsdWdpbkVudHJ5LnNldFZlcnNpb25lZElkZW50aWZpZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXIoImlkIiwgIjYiKSk7DQotCQlGZWF0dXJlIF9mZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJKChEZWZhdWx0RmVhdHVyZSlfZmVhdHVyZSkuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOw0KLQkJYXNzZXJ0RXF1YWxzKF9mZWF0dXJlLmdldFBsdWdpbkVudHJ5Q291bnQoKSwgMSk7DQotCQlhc3NlcnRFcXVhbHMoX2ZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpWzBdLCBwbHVnaW5FbnRyeSk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEFic3RhY3RTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSA9IG5ldyBQbHVnaW5FbnRyeSgpOw0KLQkJcGx1Z2luRW50cnkuc2V0VmVyc2lvbmVkSWRlbnRpZmllcihuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigiaWQiLCAiNiIpKTsNCi0JCVNpdGUgX3NpdGUgPSBnZXRTaXRlKCk7DQotCQlfc2l0ZS5hZGRQbHVnaW5FbnRyeShwbHVnaW5FbnRyeSk7DQotCQlhc3NlcnRFcXVhbHMoX3NpdGUuZ2V0UGx1Z2luRW50cnlDb3VudCgpLCAxKTsNCi0JCWFzc2VydEVxdWFscyhfc2l0ZS5nZXRQbHVnaW5FbnRyaWVzKClbMF0sIHBsdWdpbkVudHJ5KTsNCi0NCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZUFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTJhNDI4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZUFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFNpdGVBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQkNCi0JLyoqDQotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkNCi0JICovDQotCXB1YmxpYyBUZXN0U2l0ZUFQSShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOw0KLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSxuZXcgRmlsZShTT1VSQ0VfRklMRV9TSVRFLmdldEZpbGUoKSkpOw0KLQkJDQotCQlJU2l0ZSBzaXRlMiA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSwgbnVsbCk7DQotCQlhc3NlcnRFcXVhbHMoc2l0ZTIuZ2V0VVJMKCksbmV3IFVSTCgiaHR0cCIsIGdldEh0dHBIb3N0KCksZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzEiKSsic2l0ZS54bWwiKSk7DQotDQotCX0NCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RTaXRlTWFuYWdlckFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RTaXRlTWFuYWdlckFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzI2NmEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZU1hbmFnZXJBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFNpdGVNYW5hZ2VyQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdFNpdGVNYW5hZ2VyQVBJKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCUlTaXRlIGZpbGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOw0KLQkJU3RyaW5nIHNpdGUgPSBmaWxlU2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpOwkJDQotCQlhc3NlcnRFcXVhbHMoVEFSR0VUX0ZJTEVfU0lURS50b0V4dGVybmFsRm9ybSgpLCBzaXRlKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFVua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmdHA6Ly8yNTUuMjU1LjI1NS4yNTUvIik7DQotCQl0cnkgew0KLQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZSh1cmwsbnVsbCk7DQotCQlmYWlsKCJDb25uZWN0ZWQgdG8gZnRwOi8vMjU1LjI1NS4yNTUuMjU1Lywgc2hvdWxkIG5vdCBoYXBwZW4iKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7DQotCQkJLy8gZXhwZWN0ZWQNCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsNCi0JCQkvLyBleHBlY3RlZCBhcyB0aGUgdmVyc2lvbiBvZiB0aGUgV2ViRGF2IEhUVFAgQ29ubmVjdGlvbiByZXR1cm5zIHNvDQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCQ0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQlJQ29uZmlndXJlZFNpdGVbXSBpbnN0U2l0ZXMgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQlhc3NlcnRUcnVlKGluc3RTaXRlcy5sZW5ndGg+MCk7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2FsIFNpdGU6IitpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCXJlbW92ZShyZW1vdGVGZWF0dXJlLGluc3RTaXRlc1swXS5nZXRTaXRlKCkpOwkJDQotCQlpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpLmluc3RhbGwocmVtb3RlRmVhdHVyZSxudWxsLG51bGwpOw0KLQkJDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlcy5sZW5ndGg+MCk7DQotDQotCQkvL2NsZWFudXANCi0JCWFzc2VydE5vdE51bGwocmVtb3RlRmVhdHVyZSk7CQkNCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGluc3RTaXRlc1swXS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpK0ZpbGUuc2VwYXJhdG9yK1NpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIK3JlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsNCi0JCWZpbGUgPSBuZXcgRmlsZShpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKStGaWxlLnNlcGFyYXRvcitTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgrIm9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIik7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQkNCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkNCi0NCi0JfQ0KLQkNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MjQ4OGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFVwZGF0ZU1hbmFnZXJVdGlsc0FQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCQ0KLQkvKioNCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Z2V0VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlVUkwgdXJsMSA9IG5ldyBVUkwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsNCi0JCVVSTCB1cmwyID0gbmV3IFVSTCgiZmlsZTovL2M6L2hlbGxvIik7DQotCQlVUkwgdXJsMyA9IG5ldyBVUkwoImZpbGU6L2hvbWUvZWNsaXBzZS8iKTsNCi0JCVVSTCB1cmw0ID0gbmV3IFVSTCgiZnRwOi9ob3N0OjgwODAvcGF0aC8iKTsNCi0JCVVSTCB1cmw1ID0gbmV3IFVSTCgiamFyOmZpbGU6L3RtcC8xMDAxMDAhLyIpOw0KLQkJDQotCQlTdHJpbmcgZGVmYXVsdDEgPSAiZGVmYXVsdDEvZGVmYXVsdCI7DQotCQlTdHJpbmcgZGVmYXVsdDIgPSAiL2RlZmF1bHQyLyI7DQotCQkNCi0JCVN0cmluZyBzdHIxID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJU3RyaW5nIHN0cjIgPSAicmVsYXRpdmUxL3BhdGgvIjsNCi0JCVN0cmluZyBzdHIzID0gIi9yZWxhdGl2ZTIvcGF0aCI7DQotCQkNCi0JCVN0cmluZyByZXN1bHQxPW51bGw7DQotCQlTdHJpbmcgcmVzdWx0Mj1udWxsOw0KLQkJDQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0JCS8vIDEuMA0KLQkJcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMSxzdHIxLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjEuMCIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMS4xDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwobnVsbCxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiMS4xIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAxLjINCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDEuMw0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDEsc3RyMixkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcmVsYXRpdmUxL3BhdGgvIjsNCi0JCWFzc2VydEVxdWFscygiMS4zIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAxLjQNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLHN0cjMsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3JlbGF0aXZlMi9wYXRoIjsNCi0JCWFzc2VydEVxdWFscygiMS40IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAxLjUNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLG51bGwsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2RlZmF1bHQxL2RlZmF1bHQiOw0KLQkJYXNzZXJ0RXF1YWxzKCIxLjUiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDEuNg0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDEsbnVsbCxkZWZhdWx0MikudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZGVmYXVsdDIvIjsNCi0JCWFzc2VydEVxdWFscygiMS42IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0JCS8vIDIuMA0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDIuMQ0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKG51bGwsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjIuMSIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMi4yDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiMi4yIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAyLjMNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwyLHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmaWxlOi8vYzovcmVsYXRpdmUxL3BhdGgvIjsNCi0JCWFzc2VydEVxdWFscygiMi4zIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAyLjQNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwyLHN0cjMsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmaWxlOi8vYzovcmVsYXRpdmUyL3BhdGgiOw0KLQkJYXNzZXJ0RXF1YWxzKCIyLjQiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDIuNQ0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsbnVsbCxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImZpbGU6Ly9jOi9kZWZhdWx0MS9kZWZhdWx0IjsNCi0JCWFzc2VydEVxdWFscygiMi41IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAyLjYNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwyLG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmaWxlOi8vYzovZGVmYXVsdDIvIjsNCi0JCWFzc2VydEVxdWFscygiMi42IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotDQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0JCS8vIDMuMA0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDMsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCIzLjAiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDMuMQ0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKG51bGwsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjMuMSIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMy4yDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiMy4yIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAzLjMNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvcmVsYXRpdmUxL3BhdGgvIjsNCi0JCWFzc2VydEVxdWFscygiMy4zIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAzLjQNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLHN0cjMsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvcmVsYXRpdmUyL3BhdGgiOw0KLQkJYXNzZXJ0RXF1YWxzKCIzLjQiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDMuNQ0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDMsbnVsbCxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImZpbGU6L2hvbWUvZWNsaXBzZS9kZWZhdWx0MS9kZWZhdWx0IjsNCi0JCWFzc2VydEVxdWFscygiMy41IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAzLjYNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvZGVmYXVsdDIvIjsNCi0JCWFzc2VydEVxdWFscygiMy42IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJCQkNCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLQkJLy8gNC4wDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNCxzdHIxLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjQuMCIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gNC4xDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwobnVsbCxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiNC4xIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA0LjINCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw0LHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCI0LjIiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDQuMw0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsc3RyMixkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImZ0cDovaG9zdDo4MDgwL3BhdGgvcmVsYXRpdmUxL3BhdGgvIjsNCi0JCWFzc2VydEVxdWFscygiNC4zIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA0LjQNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw0LHN0cjMsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmdHA6L2hvc3Q6ODA4MC9wYXRoL3JlbGF0aXZlMi9wYXRoIjsNCi0JCWFzc2VydEVxdWFscygiNC40IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA0LjUNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw0LG51bGwsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmdHA6L2hvc3Q6ODA4MC9wYXRoL2RlZmF1bHQxL2RlZmF1bHQiOw0KLQkJYXNzZXJ0RXF1YWxzKCI0LjUiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDQuNg0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsbnVsbCxkZWZhdWx0MikudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImZ0cDovaG9zdDo4MDgwL3BhdGgvZGVmYXVsdDIvIjsNCi0JCWFzc2VydEVxdWFscygiNC42IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0JCS8vIDUuMA0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDUsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCI1LjAiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDUuMQ0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKG51bGwsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjUuMSIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gNS4yDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiNS4yIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA1LjMNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvcmVsYXRpdmUxL3BhdGgvIjsNCi0JCWFzc2VydEVxdWFscygiNS4zIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA1LjQNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LHN0cjMsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvcmVsYXRpdmUyL3BhdGgiOw0KLQkJYXNzZXJ0RXF1YWxzKCI1LjQiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDUuNQ0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDUsbnVsbCxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImphcjpmaWxlOi90bXAvMTAwMTAwIS9kZWZhdWx0MS9kZWZhdWx0IjsNCi0JCWFzc2VydEVxdWFscygiNS41IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA1LjYNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvZGVmYXVsdDIvIjsNCi0JCWFzc2VydEVxdWFscygiNS42IixyZXN1bHQyLHJlc3VsdDEpOwkJCQkNCi0NCi0JfQ0KLQkNCi0JDQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0FsbEJyYW5kaW5nVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0FsbEJyYW5kaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhZjEzNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9BbGxCcmFuZGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5icmFuZGluZzsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBBUEkgdGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFsbEJyYW5kaW5nVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFsbEJyYW5kaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIExpc3Qgb2YgQVBJIHRlc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiQnJhbmRpbmcgVGVzdHMiKTsKLQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVuZGxlUHJvdmlkZXJUZXN0LmNsYXNzKSk7CQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoUHJvZHVjdFRlc3QuY2xhc3MpKTsJCi0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0J1bmRsZVByb3ZpZGVyVGVzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvQnVuZGxlUHJvdmlkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NzVkMzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvQnVuZGxlUHJvdmlkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5icmFuZGluZzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBCdW5kbGVQcm92aWRlclRlc3QgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JcHVibGljIEJ1bmRsZVByb3ZpZGVyVGVzdChTdHJpbmcgdGVzdGNhc2UpewotCQlzdXBlcih0ZXN0Y2FzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1haW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlCdW5kbGVHcm91cFByb3ZpZGVyW10gYnVuZGxlR3JvdXBQcm92aWRlcnMgPSBQbGF0Zm9ybS5nZXRCdW5kbGVHcm91cFByb3ZpZGVycygpOwotCQlmb3IgKGludCBpPTA7IGk8YnVuZGxlR3JvdXBQcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQnVuZGxlR3JvdXBQcm92aWRlcjoiK2J1bmRsZUdyb3VwUHJvdmlkZXJzW2ldLmdldE5hbWUoKSk7Ci0JCQlJQnVuZGxlR3JvdXBbXSBidW5kbGVHcm91cHMgPSBidW5kbGVHcm91cFByb3ZpZGVyc1tpXS5nZXRCdW5kbGVHcm91cHMoKTsKLQkJCWZvciAoaW50IGo9MDsgajxidW5kbGVHcm91cHMubGVuZ3RoOyBqKyspIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1bmRsZUdyb3VwIG5hbWU6IitidW5kbGVHcm91cHNbal0uZ2V0TmFtZSgpICsiXG4iICsKLQkJCQkJCSJkZXNjcmlwdGlvbjoiICsgYnVuZGxlR3JvdXBzW2pdLmdldERlc2NyaXB0aW9uKCkgKyAiXG4iKwotCQkJCQkJImlkOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0SWRlbnRpZmllcigpICsgIlxuIiArCi0JCQkJCQkicHJvdmlkZXI6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm92aWRlck5hbWUoKSArICJcbiIgKwotCQkJCQkJInZlcnNpb246IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRWZXJzaW9uKCkgKyAiXG4iICsKLQkJCQkJCSJsaWNlbnNlOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLkxJQ0VOU0VfSFJFRikgKyAiXG4iICsKLQkJCQkJCSJmZWF0dXJlSW1hZ2U6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm9wZXJ0eShJQnVuZGxlR3JvdXBDb25zdGFudHMuRkVBVFVSRV9JTUFHRSkgKyAiXG4iICsKLQkJCQkJCSJ0aXBzIGFuZCB0cmlja3M6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm9wZXJ0eShJQnVuZGxlR3JvdXBDb25zdGFudHMuVElQU19BTkRfVFJJQ0tTX0hSRUYpICsgIlxuIiArCi0JCQkJCQkid2VsY29tZVBhZ2U6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm9wZXJ0eShJQnVuZGxlR3JvdXBDb25zdGFudHMuV0VMQ09NRV9QQUdFKSArICJcbiIgKwotCQkJCQkJIndlbGNvbWVQZXJzcGVjdGl2ZToiICsgYnVuZGxlR3JvdXBzW2pdLmdldFByb3BlcnR5KElCdW5kbGVHcm91cENvbnN0YW50cy5XRUxDT01FX1BFUlNQRUNUSVZFKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJidW5kbGVzOiIpOwotCQkJCUJ1bmRsZVtdIGJ1bmRsZXMgPSBidW5kbGVHcm91cHNbal0uZ2V0QnVuZGxlcygpOwotCQkJCWZvciAoaW50IGI9MDsgYjxidW5kbGVzLmxlbmd0aDsgYisrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oYnVuZGxlc1tiXS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9Qcm9kdWN0VGVzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvUHJvZHVjdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkYmU3Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9Qcm9kdWN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYnJhbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLmJyYW5kaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBQcm9kdWN0VGVzdCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUHJvZHVjdFRlc3QoU3RyaW5nIHRlc3RjYXNlKXsKLQkJc3VwZXIodGVzdGNhc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCQlpZiAocHJvZHVjdCA9PSBudWxsKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBwcm9kdWN0IGRlZmluZWQiKTsKLQkJZWxzZQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9kdWN0IGlzOiBcbiIgKwotCQkJCQkibmFtZT0iICsgcHJvZHVjdC5nZXROYW1lKCkgKyAiXG4iICsKLQkJCQkJImFwcGxpY2F0aW9uPSIgKyBwcm9kdWN0LmdldEFwcGxpY2F0aW9uKCkgKyAiXG4iICsKLQkJCQkJImRlc2NyaXB0aW9uPSIgKyBwcm9kdWN0LmdldERlc2NyaXB0aW9uKCkgKyAiXG4iICsKLQkJCQkJImlkPSIrIHByb2R1Y3QuZ2V0SWQoKSArICJcbiIgKwotCQkJCQkiYWJvdXRfdGV4dDoiK3Byb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuQUJPVVRfVEVYVCkgKyJcbiIgKwotCQkJCQkiYWJvdXRfaW1hZ2U6Iitwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkFCT1VUX0lNQUdFKSArIlxuIiArCi0JCQkJCSJhcHBfbmFtZToiK3Byb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuQVBQX05BTUUpICsiXG4iICsKLQkJCQkJIndpbmRvd19pbWFnZToiK3Byb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuV0lORE9XX0lNQUdFKSArIlxuIiArCi0JCQkJCSJ3aW5kb3dfaW1hZ2VzOiIrcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XSU5ET1dfSU1BR0VTKSApOwotCQkJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL0FsbENvbmZpZ3VyYXRpb25zVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL0FsbENvbmZpZ3VyYXRpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2ZmJkYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9BbGxDb25maWd1cmF0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29uZmlndXJhdGlvbnM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxDb25maWd1cmF0aW9uc1Rlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi1wdWJsaWMgQWxsQ29uZmlndXJhdGlvbnNUZXN0cyhTdHJpbmcgbmFtZSkgew0KLQlzdXBlcihuYW1lKTsNCi19DQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgSW5zdGFsbCBUZXN0cyIpOw0KLQkNCi0vLwlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJldmVydC5jbGFzcykpOw0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEJhY2t3YXJkLmNsYXNzKSk7DQotCQkNCi0JcmV0dXJuIHN1aXRlOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdEJhY2t3YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9UZXN0QmFja3dhcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3MGZmOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9UZXN0QmFja3dhcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb25maWd1cmF0aW9uczsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0QmFja3dhcmQgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQkNCi0JLyoqDQotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkNCi0JICovDQotCXB1YmxpYyBUZXN0QmFja3dhcmQoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQmFja3dhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGNsZWFudXANCi0JCVNpdGVMb2NhbCBzaXRlTG9jYWwgPSAoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSk7DQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7DQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJDQotDQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdOw0KLQkJDQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gb2xkSW5zdGFsbENvbmZpZyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0JCUlDb25maWd1cmVkU2l0ZSBvbGRDb25maWdTaXRlID0gb2xkSW5zdGFsbENvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCQ0KLQkJKChDb25maWd1cmVkU2l0ZSlvbGRDb25maWdTaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7CQ0KLQkJYXNzZXJ0Tm90TnVsbCgiUmVmZXJlbmNlIGlzIG51bGwiLGZlYXR1cmVSZWYpOw0KLQkJcmVtb3ZlKGZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKSxvbGRDb25maWdTaXRlKTsJDQotCQlvbGRDb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpLG51bGwsbnVsbCk7DQotCQlzaXRlLnNhdmUoKTsNCi0JDQotCQkNCi0JCS8vIEFjdGl2aXR5IC0+IEluc3RhbGxDb25maWcNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50ID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOw0KLS8vCQlJQWN0aXZpdHkgYWN0aXZpdHkgPSBjdXJyZW50LmdldEFjdGl2aXRpZXMoKVswXTsJDQotLy8JCWFzc2VydFRydWUoYWN0aXZpdHkuZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKS5lcXVhbHMoY3VycmVudCkpOw0KLQkJDQotCQkvLyBDb25maWdTaXRlLT5JbnN0YWxsQ29uZmlnDQotCQlJQ29uZmlndXJlZFNpdGUgbmV3Q29uZmlnU2l0ZSA9IGN1cnJlbnQuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlhc3NlcnRUcnVlKG5ld0NvbmZpZ1NpdGUuZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKS5lcXVhbHMoY3VycmVudCkpOw0KLQkJDQotCQkvLyBjbGVhbnVwDQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkJDQotCX0NCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdFJldmVydC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdFJldmVydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGE1NDNmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RSZXZlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29uZmlndXJhdGlvbnM7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5Db25maWd1cmF0aW9uUG9saWN5TW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5Db25maWd1cmVkU2l0ZU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UmV2ZXJ0IGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdFJldmVydChTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVSZXZlcnRJbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvLyBjbGVhbnVwDQotCQlTaXRlTG9jYWwgc2l0ZUxvY2FsID0gKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpOw0KLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShzaXRlTG9jYWwuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkNCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkNCi0NCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07DQotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmMiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVsxXTsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7DQotCQkNCi0JCS8vIG9sZCBjb25maWcsIG5vIGZlYXR1cmVzIGluc3RhbGxlZA0KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG9sZCA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0JCUNvbmZpZ3VyYXRpb25Qb2xpY3kgZXhjbHVkZXBvbGljeSA9IG5ldyBDb25maWd1cmF0aW9uUG9saWN5KCk7DQotCQlleGNsdWRlcG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfRVhDTFVERSk7DQotCQlJQ29uZmlndXJlZFNpdGUgb2xkQ29uZmlnU2l0ZSA9IG9sZC5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCWV4Y2x1ZGVwb2xpY3kuc2V0Q29uZmlndXJlZFNpdGVNb2RlbCgoQ29uZmlndXJlZFNpdGVNb2RlbClvbGRDb25maWdTaXRlKTsJCQ0KLQkJKChDb25maWd1cmVkU2l0ZU1vZGVsKW9sZENvbmZpZ1NpdGUpLnNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgoQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKWV4Y2x1ZGVwb2xpY3kpOw0KLQkJDQotCQkvLyBpbnN0YWxsIG9uZSBmZWF0dXJlDQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7DQotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ld0NvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCWlmICghY29uZmlnU2l0ZS5nZXRTaXRlKCkuZXF1YWxzKG9sZENvbmZpZ1NpdGUuZ2V0U2l0ZSgpKSkgZmFpbCgiQ29uZmlnIHNpdGVzIGFyZSBub3QgZXF1YWxzIik7DQotCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsJDQotCQkNCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOwkJCQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbGVkRmVhdHVyZSA9IGNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlLG51bGwsbnVsbCk7DQotCQlzaXRlLnNhdmUoKTsNCi0NCi0JCS8vIHVuY29uZmlndXJlIGl0DQotCQljb25maWdTaXRlLnVuY29uZmlndXJlKGluc3RhbGxlZEZlYXR1cmUuZ2V0RmVhdHVyZShudWxsKSk7DQotDQotCQkvLyBpbnN0YWxsIGFub3RoZXIgZmVhdHVyZQ0KLQkJSUZlYXR1cmUgZmVhdHVyZTIgPSBmZWF0dXJlUmVmMi5nZXRGZWF0dXJlKG51bGwpOw0KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZzIgPSBzaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0JCUlDb25maWd1cmVkU2l0ZSBhbm90aGVyQ29uZmlnU2l0ZSA9IG5ld0NvbmZpZzIuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlpZiAoIWFub3RoZXJDb25maWdTaXRlLmdldFNpdGUoKS5lcXVhbHMob2xkQ29uZmlnU2l0ZS5nZXRTaXRlKCkpKSBmYWlsKCJDb25maWcgc2l0ZXMgYXJlIG5vdCBlcXVhbHMiKTsJCQ0KLQkJc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZzIpOwkJDQotCQlhbm90aGVyQ29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmUyLG51bGwsbnVsbCk7DQotCQlzaXRlLnNhdmUoKTsNCi0NCi0JCS8vIHJldmVydCB0byBvbGQgc3RhdGUgd2hlcmUgbm8gZmVhdHVyZSB3aGVyZSBjb25maWd1cmVkDQotCQlzaXRlLnJldmVydFRvKG9sZCxudWxsLG51bGwpOw0KLQkJc2l0ZS5zYXZlKCk7DQotCQkNCi0JCS8vIGNoZWNrDQotCQlTdHJpbmcgdGltZSA9ICIiK3NpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7DQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOw0KLQkJYXNzZXJ0VHJ1ZSgibmV3IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZXhpc3QiLCBmaWxlLmV4aXN0cygpKTsNCi0JCQ0KLQkJDQotCQkvL2ZpbmQgY29uZmlndXJlZCBzaXRlDQotCQlJQ29uZmlndXJlZFNpdGUgbmV3Q29uZmlnU2l0ZSA9IG51bGw7DQotCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoc2l0ZXNbaV0uZ2V0U2l0ZSgpLmVxdWFscyhvbGRDb25maWdTaXRlLmdldFNpdGUoKSkpew0KLQkJCQkgbmV3Q29uZmlnU2l0ZSA9IHNpdGVzW2ldOw0KLQkJCQkgYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKG5ld0NvbmZpZ1NpdGU9PW51bGwpIGZhaWwoIkNhbm5vdCBmaW5kIGNvbmZpZ3VyYXRpb24gc2l0ZSIpOw0KLQ0KLQkJaW50IG9sZE51bWJlciA9IG9sZENvbmZpZ1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoOw0KLQkJaW50IG5ld051bWJlciA9IG5ld0NvbmZpZ1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoOw0KLQkJDQotCQkvLw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWdGZWF0dXJlcyA9IG5ld0NvbmZpZ1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0ZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKGNvbmZpZ0ZlYXR1cmVzW2ldKTsNCi0JCX0JCQ0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMgb2xkOiIrb2xkTnVtYmVyKyIgbmV3OiIrbmV3TnVtYmVyLG9sZE51bWJlcj09bmV3TnVtYmVyKTsNCi0JCQ0KLQkJLy8gdGVzdCBvbmx5IDIgaW5zdGFsbCBjb25maWcgaW4gbG9jYWwgc2l0ZQ0KLQkJaW50IG5ld051bWJlclVuY29uZmlndXJlZEZlYXR1cmVzID0gKChDb25maWd1cmVkU2l0ZSluZXdDb25maWdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg7DQotCQlpbnQgb2xkTnVtYmVyVW5jb25maWd1cmVkRmVhdHVyZXMgPSAoKENvbmZpZ3VyZWRTaXRlKW9sZENvbmZpZ1NpdGUpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aDsJCQ0KLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIixvbGROdW1iZXJVbmNvbmZpZ3VyZWRGZWF0dXJlcysyLG5ld051bWJlclVuY29uZmlndXJlZEZlYXR1cmVzKTsNCi0JCQ0KLQkJLy8gY2xlYW51cA0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTs7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQ0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCQkNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJDQotCQl0aW1lID0gIiIrbmV3Q29uZmlnLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsNCi0JCWZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLCJEZWZhdWx0Q29uZmlnIit0aW1lKyIueG1sIikuZ2V0RmlsZSgpKTsJDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQ0KLQkJdGltZSA9ICIiK25ld0NvbmZpZzIuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOw0KLQkJZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCksIkRlZmF1bHRDb25maWciK3RpbWUrIi54bWwiKS5nZXRGaWxlKCkpOwkNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJDQotCX0NCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L0FsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxZmVmOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3Q7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0cw0KLQlleHRlbmRzIFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlIHsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsNCi0JCXN1cGVyKG5hbWUpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogTGlzdCBvZiBBUEkgdGVzdHMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQkJc3VpdGUuc2V0TmFtZSgiUGxhdGZvcm1Db25maWd1cmF0aW9uIFRlc3RzIik7DQotDQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFBsYXRDZmdBUEkuY2xhc3MpKTsNCi0NCi0JCXJldHVybiBzdWl0ZTsNCi0JfQ0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWZhMDFlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuYm9vdDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsNCi0JDQotCXByb3RlY3RlZCBTdHJpbmcgdGVtcERpcjsNCi0JDQotCXB1YmxpYyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZShTdHJpbmcgbmFtZSkgew0KLQkJc3VwZXIobmFtZSk7DQotCQl0cnkgew0KLQkJCWluaXQoKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJZmFpbChlLnRvU3RyaW5nKCkpOw0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgew0KLQkJLy8gZ2V0IG5ldyB0ZW1wIGRpcmVjdG9yeSBmb3IgdGVzdGNhc2UNCi0JCVN0cmluZyByb290ID0gZ2V0VGVtcERpcmVjdG9yeU5hbWUoKTsNCi0JCXNldHVwRGlyZWN0b3J5KHJvb3QpOw0KLQkJdGVtcERpciA9IHJvb3Q7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgew0KLQkJLy8gY2xlYW51cCB0ZXN0Y2FzZSB0ZW1wIGRpcmVjdG9yeQ0KLQkJaWYgKHRlbXBEaXIgIT0gbnVsbCkNCi0JCQljbGVhbnVwRGlyZWN0b3J5KHRlbXBEaXIpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBEaXJlY3RvcnlOYW1lKCkgew0KLQkJU3RyaW5nIHRtcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsNCi0JCWlmICghdG1wLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkNCi0JCQl0bXAgKz0gRmlsZS5zZXBhcmF0b3I7DQotCQlyZXR1cm4gdG1wKyJlY2xpcHNlIitGaWxlLnNlcGFyYXRvcisobmV3IERhdGUoKS5nZXRUaW1lKCkrRmlsZS5zZXBhcmF0b3IpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERpcmVjdG9yeShTdHJpbmcgbmFtZSkgew0KLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShuYW1lKTsNCi0JCWRpci5ta2RpcnMoKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW51cERpcmVjdG9yeShTdHJpbmcgbmFtZSkgew0KLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShuYW1lKTsNCi0JCWRlbGV0ZURpcmVjdG9yeShkaXIpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyKSB7DQotCQlGaWxlW10gbGlzdCA9IGRpci5saXN0RmlsZXMoKTsNCi0JCWlmIChsaXN0ID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJCQ0KLQkJZm9yIChpbnQgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAobGlzdFtpXS5pc0RpcmVjdG9yeSgpKSANCi0JCQkJZGVsZXRlRGlyZWN0b3J5KGxpc3RbaV0pOw0KLQkJCWlmICghbGlzdFtpXS5kZWxldGUoKSkNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZGVsZXRlICIrbGlzdFtpXS50b1N0cmluZygpKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvVGVzdFBsYXRDZmdBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0FQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE2NDA3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0FQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3Q7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UGxhdENmZ0FQSSBleHRlbmRzIFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlIHsNCi0JCQkNCi0JcHVibGljIFRlc3RQbGF0Q2ZnQVBJKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkNCi0JCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdA0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihudWxsKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQlBc3NlcnQuZmFpbCgiMC4wLjAgIitlLnRvU3RyaW5nKCkpOw0KLQkJfQ0KLQkJSVNpdGVFbnRyeVtdIGRmbHQgPSBjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMC4wLjEiLGRmbHQubGVuZ3RoLDApOw0KLQkJDQotCQkvLyBwb2xpY3kgdGVzdHMNCi0JCUlTaXRlUG9saWN5IHAxID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSwgbnVsbCk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjAuMCIscDEuZ2V0VHlwZSgpLElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjAuMSIscDEuZ2V0TGlzdCgpLmxlbmd0aCwwKTsNCi0JCXAxLnNldExpc3QobmV3IFN0cmluZ1tdIHsiZmlyc3QifSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjAuMiIscDEuZ2V0TGlzdCgpLmxlbmd0aCwxKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMC4zIixwMS5nZXRMaXN0KClbMF0sImZpcnN0Iik7DQotCQkNCi0JCUlTaXRlUG9saWN5IHAyID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1swXSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjEuMCIscDIuZ2V0VHlwZSgpLElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjEuMSIscDIuZ2V0TGlzdCgpLmxlbmd0aCwwKTsNCi0JCXAyLnNldExpc3QobmV3IFN0cmluZ1tdIHsiZmlyc3QiLCAic2Vjb25kIn0pOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xLjIiLHAyLmdldExpc3QoKS5sZW5ndGgsMik7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjEuMyIscDIuZ2V0TGlzdCgpWzFdLCJzZWNvbmQiKTsNCi0JCQ0KLQkJLy8gY3JlYXRlIHNvbWUgdXJscw0KLQkJVVJMIHUxID0gbnVsbDsNCi0JCVVSTCB1MiA9IG51bGw7DQotDQotCQlVUkwgdTQgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQl1MSA9IG5ldyBVUkwoImZpbGU6L2Q6L3RlbXAiKTsNCi0vLwkJCXUyID0gbmV3IFVSTCgiZmlsZTovL2xvY2FsaG9zdC90ZW1wIik7DQotCQkJbmV3IFVSTCgiaHR0cDovL3NvbWUuc2VydmVyL3RlbXAvIik7DQotCQkJdTQgPSBuZXcgVVJMKCJodHRwOi8vYmFkLnVybCIpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQlBc3NlcnQuZmFpbCgiMi4wLjAgdW5hYmxlIHRvIGNyZWF0ZSBVUkwgIitlKTsNCi0JCX0NCi0JCQkJDQotCQkvLyBzaXRlIGNyZWF0aW9uIHRlc3RzDQotCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5jcmVhdGVTaXRlRW50cnkodTEscDIpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjAiLHMxLmdldFVSTCgpLHUxKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMC4xIixzMS5nZXRTaXRlUG9saWN5KCkscDIpOw0KLQkJczEuc2V0U2l0ZVBvbGljeShwMSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjAuMiIsczEuZ2V0U2l0ZVBvbGljeSgpLHAxKTsNCi0JCQ0KLS8vCQlJU2l0ZUVudHJ5IHMyID0gY2ZpZy5jcmVhdGVTaXRlRW50cnkodTIscDEpOw0KLS8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMCIsczIuZ2V0VVJMKCksdTIpOw0KLS8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMSIsczIuZ2V0U2l0ZVBvbGljeSgpLHAxKTsNCi0vLwkJczIuc2V0U2l0ZVBvbGljeShwMik7DQotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4yIixzMi5nZXRTaXRlUG9saWN5KCkscDIpOw0KLQkJDQotCQkvLyBjb25maWd1cmUgc2l0ZSB0ZXN0cw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjAiLGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoLDApOw0KLQkJY2ZpZy5jb25maWd1cmVTaXRlKHMxKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4xIixjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aCwxKTsNCi0vLwkJY2ZpZy5jb25maWd1cmVTaXRlKHMyKTsNCi0vLwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjIiLGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoLDIpOw0KLS8vCQkNCi0JCS8vIGxvb2t1cCBzaXRlIHRlc3RzDQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjQuMCIsY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodTEpLHMxKTsNCi0vLwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy40LjEiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHUyKSxzMik7DQotCQlBc3NlcnQuYXNzZXJ0TnVsbCgiMy40LjMiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHU0KSk7DQotCQkNCi0JCS8vIHVuY29uZmlndXJlIHNpdGUgdGVzdHMNCi0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuNS4wIixjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aCwwKTsNCi0JCUFzc2VydC5hc3NlcnROdWxsKCIzLjUuMSIsY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodTEpKTsJCQ0KLS8vCQljZmlnLnVuY29uZmlndXJlU2l0ZShzMik7DQotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuNS4yIixjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aCwwKTsNCi0vLwkJQXNzZXJ0LmFzc2VydE51bGwoIjMuNS4zIixjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1MikpOwkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNhdmVSZXN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkJCQ0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIjAuMCBVbmFibGUgdG8gb2J0YWluIHRlbXAgZGlyZWN0b3J5Iix0ZW1wRGlyKTsNCi0JCQ0KLQkJLy8gZ2V0IG5ldyBjb25maWcgb2JqZWN0DQotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQljZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKG51bGwpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCUFzc2VydC5mYWlsKCIwLjAuMCAiK2UudG9TdHJpbmcoKSk7DQotCQl9DQotCQlJU2l0ZUVudHJ5W10gc2l0ZXMgPSBjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMC4wLjEiLHNpdGVzLmxlbmd0aCwwKTsNCi0JCQkJDQotCQkvLyBjcmVhdGUgcG9saWNpZXMNCi0JCUlTaXRlUG9saWN5IHAxID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSwgbnVsbCk7DQotCQlJU2l0ZVBvbGljeSBwMiA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUsIG5ldyBTdHJpbmdbMF0pOwkJDQotCQlJU2l0ZVBvbGljeSBwMyA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUsIG5ldyBTdHJpbmdbXSB7ImZpcnN0In0pOw0KLQkJSVNpdGVQb2xpY3kgcDQgPSBjZmlnLmNyZWF0ZVNpdGVQb2xpY3koSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFLCBuZXcgU3RyaW5nW10geyJmaXJzdCIsICJzZWNvbmQifSk7DQotCQkJCQkJDQotCQkvLyBjcmVhdGUgc29tZSB1cmxzDQotCQlVUkwgdTEgPSBudWxsOw0KLQkJVVJMIHUyID0gbnVsbDsNCi0JCVVSTCB1MyA9IG51bGw7DQotCQlVUkwgdTQgPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQl1MSA9IG5ldyBVUkwoImZpbGU6ZDovdGVtcC8iKTsNCi0JCQl1MiA9IG5ldyBVUkwoImZpbGU6Ly9sb2NhbGhvc3QvdGVtcC8iKTsNCi0JCQl1MyA9IG5ldyBVUkwoImh0dHA6Ly9zb21lLnNlcnZlci90ZW1wLyIpOw0KLQkJCXU0ID0gbmV3IFVSTCgiaHR0cDovL2Fub3RoZXIuc2VydmVyL3RlbXAvIik7DQotCQkJbmV3IFVSTCgiaHR0cDovL29uZS5tb3JlLnNlcnZlci90ZW1wLyIpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQlBc3NlcnQuZmFpbCgiMS4wIHVuYWJsZSB0byBjcmVhdGUgVVJMICIrZSk7DQotCQl9DQotCQkNCi0JCS8vIGNyZWF0ZSBhbmQgY29uZmlndXJlIHNpdGVzDQotCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5jcmVhdGVTaXRlRW50cnkodTEscDEpOw0KLQkJY2ZpZy5jb25maWd1cmVTaXRlKHMxKTsNCi0JCUlTaXRlRW50cnkgczIgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1MixwMik7DQotCQljZmlnLmNvbmZpZ3VyZVNpdGUoczIpOw0KLQkJSVNpdGVFbnRyeSBzMyA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUzLHAzKTsNCi0JCWNmaWcuY29uZmlndXJlU2l0ZShzMyk7DQotCQlJU2l0ZUVudHJ5IHM0ID0gY2ZpZy5jcmVhdGVTaXRlRW50cnkodTQscDQpOw0KLQkJY2ZpZy5jb25maWd1cmVTaXRlKHM0KTsNCi0JCXNpdGVzID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMSIsc2l0ZXMubGVuZ3RoLDQpOw0KLQkJDQotCQkvLyBkbyBzYXZlDQotCQl0cnkgew0KLQkJCWNmaWcuc2F2ZSgpOw0KLQkJCUFzc2VydC5mYWlsKCIyLjAgd2FzIGV4cGVjdGluZyBJT0V4Y2VwdGlvbiIpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJfQ0KLQkJDQotCQlVUkwgY2ZpZ1VSTCA9IG51bGw7DQotCQl0cnkgew0KLQkJCWNmaWdVUkwgPSBuZXcgVVJMKCJmaWxlOiIrdGVtcERpcisgInBsYXRmb3JtLnhtbCIpOw0KLQkJfSBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCUFzc2VydC5mYWlsKCIyLjEgdW5hYmxlIHRvIGNyZWF0ZSBVUkwgIitlKTsNCi0JCX0NCi0JCQ0KLQkJdHJ5IHsNCi0JCQljZmlnLnNhdmUoY2ZpZ1VSTCk7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJQXNzZXJ0LmZhaWwoIjIuMiAiK2UpOw0KLQkJfQ0KLQkJDQotCQkvLyByZWxvYWQgY29uZmlndXJhdGlvbgkNCi0JCXRyeSB7DQotCQkJQ29uZmlndXJhdG9yVXRpbHMuZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKGNmaWdVUkwpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCUFzc2VydC5mYWlsKCIyLjMgIitlLnRvU3RyaW5nKCkpOw0KLQkJfQ0KLQkJSVNpdGVFbnRyeVtdIG5ld1NpdGVzID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjIuNCIsbmV3U2l0ZXMubGVuZ3RoLDQpOw0KLQkJDQotCQkvLyBjaGVjayB3aGF0IHdlJ3ZlIGdvdA0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjEiLHNpdGVzWzBdLmdldFVSTCgpLG5ld1NpdGVzWzBdLmdldFVSTCgpKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMC4yIixzaXRlc1swXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpLG5ld1NpdGVzWzBdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCkpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjMiLHNpdGVzWzBdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCksbmV3U2l0ZXNbMF0uZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKSk7DQotCQkNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4xIixzaXRlc1sxXS5nZXRVUkwoKSxuZXdTaXRlc1sxXS5nZXRVUkwoKSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMiIsc2l0ZXNbMV0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSxuZXdTaXRlc1sxXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4zIixzaXRlc1sxXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzFdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOw0KLQkJDQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjIuMSIsc2l0ZXNbMl0uZ2V0VVJMKCksbmV3U2l0ZXNbMl0uZ2V0VVJMKCkpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4yLjIiLHNpdGVzWzJdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbMl0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjIuMyIsc2l0ZXNbMl0uZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKSxuZXdTaXRlc1syXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpKTsNCi0JCQ0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjEiLHNpdGVzWzNdLmdldFVSTCgpLG5ld1NpdGVzWzNdLmdldFVSTCgpKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4yIixzaXRlc1szXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpLG5ld1NpdGVzWzNdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCkpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjMiLHNpdGVzWzNdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCksbmV3U2l0ZXNbM10uZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKSk7DQotCQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEN1cnJlbnRDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkJCQ0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIjAuMCBVbmFibGUgdG8gb2J0YWluIHRlbXAgZGlyZWN0b3J5Iix0ZW1wRGlyKTsNCi0JCQ0KLQkJLy8gZ2V0IG5ldyBjb25maWcgb2JqZWN0DQotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBudWxsOw0KLQkJY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsNCi0JCWNmaWcuZ2V0UGx1Z2luUGF0aCgpOw0KLQkJY2ZpZy5zYXZlKCk7DQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnRGVmYXVsdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2EwYjAxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0RlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFBsYXRDZmdEZWZhdWx0DQotCWV4dGVuZHMgUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2Ugew0KLQkJDQotCXB1YmxpYyBUZXN0UGxhdENmZ0RlZmF1bHQoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbCgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gbnVsbDsNCi0JCWNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7DQotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnkgc2UgPSBjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOw0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeSBzcCA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1tdIHsiMSIsICIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJ9KTsNCi0JCXNlLnNldFNpdGVQb2xpY3koc3ApOw0KLQkJY2ZpZy5zYXZlKCk7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUgLi4uIik7DQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvaW1wbGVtZW50YXRpb24vU2l0ZUZUUC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvaW1wbGVtZW50YXRpb24vU2l0ZUZUUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzU5YjIzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuaW1wbGVtZW50YXRpb247DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVVSTEVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi0NCi1wdWJsaWMgY2xhc3MgU2l0ZUZUUCBpbXBsZW1lbnRzIElTaXRlIHsNCi0NCi0JcHJpdmF0ZSBVUkwgdXJsOw0KLQlwdWJsaWMgU2l0ZUZUUChVUkwgdXJsKXsNCi0JCXRoaXMudXJsID0gdXJsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldEZlYXR1cmVSZWZlcmVuY2VzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNpbnN0YWxsKElGZWF0dXJlLCBGZWF0dXJlVmVyaWZpY2F0aW9uIHZlcmlmaWVyLElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI3JlbW92ZShJRmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2FkZFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkU2l0ZUNoYW5nZWRMaXN0ZW5lcihJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI3JlbW92ZVNpdGVDaGFuZ2VkTGlzdGVuZXIoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlU2l0ZUNoYW5nZWRMaXN0ZW5lcihJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2dldFVSTCgpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXRUeXBlKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCi0JCXJldHVybiAib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmZ0cCI7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXRDYXRlZ29yaWVzKCkNCi0JICovDQotCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXRBcmNoaXZlcygpDQotCSAqLw0KLQlwdWJsaWMgSUFyY2hpdmVSZWZlcmVuY2VbXSBnZXRBcmNoaXZlcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotIA0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2FkZENhdGVnb3J5KElDYXRlZ29yeSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5KElDYXRlZ29yeSBjYXRlZ29yeSkgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjc2F2ZSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXRQbHVnaW5FbnRyaWVzKCkNCi0JICovDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRQbHVnaW5FbnRyaWVzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2dldFBsdWdpbkVudHJ5Q291bnQoKQ0KLQkgKi8NCi0JcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXREb3dubG9hZFNpemVGb3IoSUZlYXR1cmUpDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemVGb3IoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSkNCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCXJldHVybiAwOw0KLQl9DQotDQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNzdG9yZShJUGx1Z2luRW50cnksIFN0cmluZywgSW5wdXRTdHJlYW0pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9yZShJUGx1Z2luRW50cnkgZW50cnksIFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBpblN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQ0KLQkgKi8NCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNyZW1vdmUoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlKElQbHVnaW5FbnRyeSBlbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjc2V0U2l0ZUNvbnRlbnRDb25zdW1lcihJU2l0ZUNvbnRlbnRDb25zdW1lcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNpdGVDb250ZW50Q29uc3VtZXIoSVNpdGVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyKSB7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNzZXRTaXRlQ29udGVudFByb3ZpZGVyKElTaXRlQ29udGVudFByb3ZpZGVyKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihJU2l0ZUNvbnRlbnRQcm92aWRlciBzaXRlQ29udGVudFByb3ZpZGVyKSB7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXRTaXRlQ29udGVudFByb3ZpZGVyKCkNCi0JICovDQotCXB1YmxpYyBJU2l0ZUNvbnRlbnRQcm92aWRlciBnZXRTaXRlQ29udGVudFByb3ZpZGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXREZWZhdWx0UGFja2FnZWRGZWF0dXJlVHlwZSgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNzdG9yZShJRmVhdHVyZSwgU3RyaW5nLCBJbnB1dFN0cmVhbSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3JlKElGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBpblN0cmVhbSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCX0NCi0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI3JlbW92ZShJUGx1Z2luRW50cnksIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVBsdWdpbkVudHJ5IGVudHJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2dldENhdGVnb3J5KFN0cmluZykNCi0JICovDQotCXB1YmxpYyBJQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoU3RyaW5nIGtleSkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNjcmVhdGVTaXRlQ29udGVudENvbnN1bWVyKElGZWF0dXJlKQ0KLQkgKi8NCi0JcHVibGljIElTaXRlQ29udGVudENvbnN1bWVyIGNyZWF0ZVNpdGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXRGZWF0dXJlUmVmZXJlbmNlKElGZWF0dXJlKQ0KLQkgKi8NCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZSBnZXRGZWF0dXJlUmVmZXJlbmNlKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0RGVzY3JpcHRpb24oKQ0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0UGx1Z2luRW50cmllc09ubHlSZWZlcmVuY2VkQnkoSUZlYXR1cmUpDQotCSAqLw0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllc09ubHlSZWZlcmVuY2VkQnkoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSVNpdGUjYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgZmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotDQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoU3RyaW5nIHR5cGUsIFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2NyZWF0ZUZlYXR1cmUoamF2YS5sYW5nLlN0cmluZywgamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFN0cmluZyB0eXBlLCBVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2dldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFBGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTc5YjE5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuaW1wbGVtZW50YXRpb247DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2RlcjsNCi0NCi1wdWJsaWMgY2xhc3MgU2l0ZUZUUEZhY3RvcnkgZXh0ZW5kcyBTaXRlTW9kZWxGYWN0b3J5IGltcGxlbWVudHMgSVNpdGVGYWN0b3J5IHsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRSA9ICJhL2IvYy8iOw0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCwgYm9vbGVhbikNCi0JICovDQotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsNCi0JCUlTaXRlIHNpdGUgPSBudWxsOw0KLQkJSW5wdXRTdHJlYW0gc2l0ZVN0cmVhbSA9IG51bGw7DQotDQotCQl0cnkgew0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7DQotCQkJc2l0ZVN0cmVhbSA9IHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKTsNCi0NCi0JCQlTaXRlTW9kZWxGYWN0b3J5IGZhY3RvcnkgPSAoU2l0ZU1vZGVsRmFjdG9yeSkgdGhpczsNCi0JCQlmYWN0b3J5LnBhcnNlU2l0ZShzaXRlU3RyZWFtKTsNCi0NCi0JCQlzaXRlID0gbmV3IFNpdGVGVFAobmV3IFVSTCgiaHR0cDovL2VjbGlwc2Uub3JnLyIgKyBGSUxFKSk7DQotCQkJDQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIFVSTCIsIGUpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gYWNjZXNzIFVSTCIsSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OLCBlKTsNCi0JCX0gZmluYWxseSB7DQotCQkJdHJ5IHsNCi0JCQkJaWYgKHNpdGVTdHJlYW0gIT0gbnVsbCkNCi0JCQkJCXNpdGVTdHJlYW0uY2xvc2UoKTsNCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjYW5QYXJzZVNpdGVUeXBlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGNhblBhcnNlU2l0ZVR5cGUoU3RyaW5nIHR5cGUpIHsNCi0JCXJldHVybiAib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuZnRwIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9BbGxNaXJyb3JUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL0FsbE1pcnJvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTkxODYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL0FsbE1pcnJvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1pcnJvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgQWxsTWlycm9yVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCXB1YmxpYyBBbGxNaXJyb3JUZXN0cyhTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJNaXJyb3IgVGVzdHMiKTsKLQkJCi0JCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0aGUgdGVzdCBtZXRob2RzIGluIHRoZSBjbGFzcyB0aGF0IHN0YXJ0cyB3aXRoICJ0ZXN0IgotCQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvci5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5jbGFzcykpOwotCQkKLQkJLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKLQkJLy9zdWl0ZS5hZGRUZXN0KG5ldyBUZXN0R2V0RmVhdHVyZSgibWV0aG9kVGhhdERvZXNOb3RTdGFydFdpdGh0ZXN0IikpOwotCQlyZXR1cm4gc3VpdGU7CQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL01pcnJvck1hbmFnZXJUZXN0Q2FzZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL01pcnJvck1hbmFnZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDlmYjk4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9NaXJyb3JNYW5hZ2VyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1pcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBNaXJyb3JNYW5hZ2VyVGVzdENhc2UgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2V7Ci0JcHVibGljIHN0YXRpYyBpbnQgZXhpdFZhbHVlPS0xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGVyck91dHB1dDsKLQkKLQlwdWJsaWMgTWlycm9yTWFuYWdlclRlc3RDYXNlKFN0cmluZyBhcmcwKXsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCS8vV2F0Y2hEb2cgdGhyZWFkIHRvIGtpbGwgbWlycm9yaW5nIHByb2Nlc3MgaWYgaXQgaGFuZ3MgKG9yIHRha2VzIHRvbyBsb25nKQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGltZXIgZXh0ZW5kcyBUaHJlYWR7Ci0JCXByaXZhdGUgUHJvY2VzcyBwcm9jOwotCQkKLQkJcHVibGljIFRpbWVyKFByb2Nlc3MgcHJvYyl7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZXREYWVtb24odHJ1ZSk7Ci0JCQl0aGlzLnByb2MgPSBwcm9jOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCXRyeSB7Ci0JCQkJLy8gTm90ZTogbm9ybWFsIHRlc3Qgb24gMi4yR2h6IFA0IGlzIDIuOXMgCi0JCQkJLy86LiBnaXZpbmcgMTAweCBsZWV3YXkgdG8gY29tcGxldGUgcHJvY2VzcyBiZWZvcmUga2lsbGluZyBpdAotCQkJCXNsZWVwKDMwMDAwMCk7IAotCQkJCXByb2MuZGVzdHJveSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vIHN0cnVjdHVyZSB0byBob2xkIGNhdGVnb3J5IGRlZmluaXRpb24gbmFtZXMgYW5kIGRlc2NyaXB0aW9ucwotCWNsYXNzIENhdGVnb3J5RGVmaW5pdGlvbiB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIGRlc2M7Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgZGVzYykgewotCQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7Ci0JCQlyZXR1cm4gZGVzYzsKLQkJfQotCX0KLQkKLQkvLyBzdHJ1Y3R1cmUgdG8gaG9sZCBmZWF0dXJlIElEcyBhbmQgdGhlaXIgY2F0ZWdvcnkgbmFtZXMKLQlwdWJsaWMgY2xhc3MgRmVhdHVyZUNhdGVnb3J5ewotCQlwcml2YXRlIFN0cmluZyBmZWF0dXJlSWQ7Ci0JCXByaXZhdGUgQXJyYXlMaXN0IGNhdGVnb3J5OwotCQkKLQkJcHVibGljIEZlYXR1cmVDYXRlZ29yeSgpewotCQkJY2F0ZWdvcnkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVJRChTdHJpbmcgZmlkKXsKLQkJCWZlYXR1cmVJZCA9IGZpZDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnkoU3RyaW5nIGNhdCl7Ci0JCQljYXRlZ29yeS5hZGQoY2F0KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSUQoKXsKLQkJCXJldHVybiBmZWF0dXJlSWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRDYXRlZ29yaWVzKCl7Ci0JCQlyZXR1cm4gKFN0cmluZ1tdKWNhdGVnb3J5LnRvQXJyYXkobmV3IFN0cmluZ1tjYXRlZ29yeS5zaXplKCldKTsKLQkJfQotCX0KLQkKLQkvLyBTdHJlYW1Db25zdW1lciB0byBkaXNwbGF5IG91dHB1dCB0byBvdXRwdXQgZmlsZXMgb3IgY29uc29sZQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyZWFtQ29uc3VtZXIgZXh0ZW5kcyBUaHJlYWQgewotCQlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIGJSZWFkZXI7Ci0KLQkJcHVibGljIFN0cmVhbUNvbnN1bWVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCQlzdXBlcigpOwotCQkJc2V0RGFlbW9uKHRydWUpOwotCQkJYlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxpbmU7Ci0JCQkJd2hpbGUgKG51bGwgIT0gKGxpbmUgPSBiUmVhZGVyLnJlYWRMaW5lKCkpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKLQkJCQkJZXJyT3V0cHV0LmFwcGVuZChsaW5lKTsKLQkJCQkJZXJyT3V0cHV0LmFwcGVuZCgiXG4iKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGFycmF5IGNvbnNpc3Rpbmcgb2YgY29tbWFuZHMgYW5kIHRoZWlyIGFyZ3VtZW50cyB0bwotCSAqIGJlIHJ1bi4KLQkgKiBAcGFyYW0gcmVtb3RlTG9jIC0gcGF0aCBvZiByZW1vdGUgc2l0ZSAoc2l0ZSBiZWluZyBtaXJyb3JlZCkKLQkgKiBAcGFyYW0gdG9Mb2NhbFNpdGVVcmwgLSBwYXRoIG9mIGxvY2FsIHNpdGUgKG5ldyBtaXJyb3Igc2l0ZSkKLQkgKiBAcGFyYW0gZmlkIC0gZmVhdHVyZSBpZCBvZiBmZWF0dXJpbmcgYmVpbmcgbWlycm9yIChvcHRpb25hbCAtIGNhbiBiZSBudWxsKQotCSAqIEBwYXJhbSB2ZXIgLSB2ZXJzaW9uIG9mIGZlYXR1cmUgdG8gYmUgbWlycm9yZWQgKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCi0JICogQHBhcmFtIG1pclVybCAtIGRpcmVjdG9yeSBsb2NhdGlvbiBvZiBwb2xpY3kueG1sIChvcHRpb25hbCAtIGNhbiBiZSBtdWxsKQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWFuZCgKLQkJU3RyaW5nIHJlbW90ZUxvYywKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsLAotCQlTdHJpbmcgZmlkLAotCQlTdHJpbmcgdmVyLAotCQlTdHJpbmcgbWlyVXJsKSB7Ci0JCWZpbmFsIFN0cmluZyBjbGFzc3BhdGggPSAic3RhcnR1cC5qYXIiOwotCQlmaW5hbCBTdHJpbmcgbGF1bmNoZXIgPSAib3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5NYWluIjsKLQkJZmluYWwgU3RyaW5nIGNvbW1hbmQgPSAibWlycm9yIjsKLQkJZmluYWwgU3RyaW5nIGFwcGxpY2F0aW9uID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnN0YW5kYWxvbmVVcGRhdGUiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19DUCA9ICItY3AiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19BUFAgPSAiLWFwcGxpY2F0aW9uIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQ01EID0gIi1jb21tYW5kIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfRklEID0gIi1mZWF0dXJlSWQiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19EQVRBID0gIi1kYXRhIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfVkVSU0lPTiA9ICItdmVyc2lvbiI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0ZST00gPSAiLWZyb20iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19UTyA9ICItdG8iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19VUkwgPSAiLW1pcnJvclVSTCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1NQTEFTSCA9ICItbm9zcGxhc2giOwotCQlmaW5hbCBTdHJpbmcgRkxBR19DT05TT0xFTE9HID0gIi1jb25zb2xlbG9nIjsKLQkJZmluYWwgU3RyaW5nIGRhdGEgPQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlTdHJpbmdbXSBjbWQgPQotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQlnZXRKYXZhVk1QYXRoKCksCi0JCQkJRkxBR19DUCwKLQkJCQljbGFzc3BhdGgsCi0JCQkJbGF1bmNoZXIsCi0JCQkJRkxBR19BUFAsCi0JCQkJYXBwbGljYXRpb24sCi0JCQkJRkxBR19DTUQsCi0JCQkJY29tbWFuZCwKLQkJCQlGTEFHX0ZST00sCi0JCQkJKHJlbW90ZUxvYyAhPW51bGwgPyByZW1vdGVMb2MgOiAiIiksCi0JCQkJRkxBR19UTywKLQkJCQl0b0xvY2FsU2l0ZVVybCwKLQkJCQkoZmlkICE9IG51bGwgPyBGTEFHX0ZJRCA6ICIiKSwKLQkJCQkoZmlkICE9IG51bGwgPyBmaWQgOiAiIiksCi0JCQkJKHZlciAhPSBudWxsID8gRkxBR19WRVJTSU9OIDogIiIpLAotCQkJCSh2ZXIgIT0gbnVsbCA/IHZlciA6ICIiKSwKLQkJCQkobWlyVXJsICE9IG51bGwgPyBGTEFHX1VSTCA6ICIiKSwKLQkJCQkobWlyVXJsICE9IG51bGwgPyBtaXJVcmwgOiAiIiksCi0JCQkJRkxBR19TUExBU0gsCi0JCQkJRkxBR19EQVRBLAotCQkJCWRhdGEsCi0JCQkJRkxBR19DT05TT0xFTE9HfTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKFN0cmluZyB1cmwsIFN0cmluZyBmaWQsIFN0cmluZyB2ZXIpewotCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSh1cmwgKyAiL3NpdGUueG1sIik7Ci0JCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7Ci0JCUZpbGVSZWFkZXIgZnJlYWRlcjsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7Ci0JCVN0cmluZyBqYXJOYW1lID0gZmlkICsgIl8iICsgdmVyICsgIi5qYXIiOwotCQlTdHJpbmcgZmVhdHVyZSA9ICI8ZmVhdHVyZSB1cmw9XCIiICsKLQkJCSJmZWF0dXJlcy8iICsgamFyTmFtZSArIAotCQkJIlwiIGlkPVwiIiArIGZpZCArIAotCQkJIlwiIHZlcnNpb249XCIiICsgdmVyKyJcIj4iOwotCQl0cnkgewotCQkJZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHNpdGUpOwotCQkJYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdvdWxkIGhhdmUgYmVlbiBjYXVnaHQgYnkgYXNzZXJ0IGFib3ZlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCXdoaWxlICgodGV4dCA9IGJyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCXRleHQgPSB0ZXh0LnRyaW0oKTsKLQkJCQlpZiAodGV4dC5lcXVhbHMoZmVhdHVyZSkpewotCQkJCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQkJCWZyZWFkZXIuY2xvc2UoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGVja1NpdGVYTUwoU3RyaW5nIHVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbWlycm9yID0gbmV3IEZpbGUodXJsKTsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKG1pcnJvci5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0VHJ1ZShtaXJyb3IuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNoZWNrUG9saWN5WE1MKFN0cmluZyB1cmwpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIG1pcnJvciA9IG5ldyBGaWxlKHVybCk7Ci0JCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKHVybCArICIvcG9saWN5LnhtbCIpOwotCQlhc3NlcnRUcnVlKG1pcnJvci5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0VHJ1ZShtaXJyb3IuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1BvbGljeVVSTChTdHJpbmcgdXJsLCBTdHJpbmcgbWlycm9yVXJsKXsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9wb2xpY3kueG1sIik7Ci0JCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7Ci0JCUZpbGVSZWFkZXIgZnJlYWRlcjsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJdHJ5IHsKLQkJCWZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihzaXRlKTsKLQkJCWJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3b3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGJ5IGFzc2VydCBhYm92ZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXdoaWxlICgodGV4dCA9IGJyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCWlmICh0ZXh0LmluZGV4T2YobWlycm9yVXJsKSE9LTEpewotCQkJCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQkJCWZyZWFkZXIuY2xvc2UoKTsJCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJZnJlYWRlci5jbG9zZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KFN0cmluZyB1cmwpIHsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOwotCQlGaWxlUmVhZGVyIGZyZWFkZXI7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOwotCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlpZiAodGV4dC5pbmRleE9mKCJjYXRlZ29yeS1kZWYiKSE9LTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVjbGlwc2VSb290KCkgewotCQlyZXR1cm4gQ29uZmlndXJhdG9yVXRpbHMuZ2V0SW5zdGFsbFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZUZpcnN0KAotCQkJImZpbGU6IiwKLQkJCSIiKTsKLQl9Ci0JCi0JcHVibGljIEZlYXR1cmVDYXRlZ29yeVtdIGdldEZlYXR1cmVDYXRlZ29yaWVzKFN0cmluZyB1cmwpewotCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSh1cmwgKyAiL3NpdGUueG1sIik7Ci0JCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7Ci0JCUZpbGVSZWFkZXIgZnJlYWRlcjsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7Ci0JCUFycmF5TGlzdCBmZWF0dXJlQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBuZXcgRmVhdHVyZUNhdGVnb3J5WzBdOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUZlYXR1cmVDYXRlZ29yeSBjdXJyVG9rID0gbmV3IEZlYXR1cmVDYXRlZ29yeSgpOwotCQkJYm9vbGVhbiBhZGQgPSBmYWxzZTsKLQkJCXdoaWxlKCh0ZXh0ID1icmVhZGVyLnJlYWRMaW5lKCkpIT1udWxsKXsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3RyVG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0KTsKLQkJCQl3aGlsZSAoc3RyVG9rLmhhc01vcmVUb2tlbnMoKSl7Ci0JCQkJCVN0cmluZyB0ZW1wID0gc3RyVG9rLm5leHRUb2tlbigpOwotCQkJCQlpZiAodGVtcC5lcXVhbHMoIjwvZmVhdHVyZT4iKSl7Ci0JCQkJCQlhZGQgPSB0cnVlOwotCQkJCQl9IGVsc2UgaWYgKHRlbXAuc3RhcnRzV2l0aCgiaWQiKSl7Ci0JCQkJCQljdXJyVG9rLnNldEZlYXR1cmVJRCh0ZW1wLnNwbGl0KCJcIiIpWzFdKTsKLQkJCQkJfSBlbHNlIGlmICh0ZW1wLnN0YXJ0c1dpdGgoIm5hbWUiKSl7Ci0JCQkJCQljdXJyVG9rLmFkZENhdGVnb3J5KHRlbXAuc3BsaXQoIlwiIilbMV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChhZGQpewotCQkJCQlmZWF0dXJlQ2F0ZWdvcmllcy5hZGQoY3VyclRvayk7Ci0JCQkJCWN1cnJUb2sgPSBuZXcgRmVhdHVyZUNhdGVnb3J5KCk7Ci0JCQkJCWFkZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJZnJlYWRlci5jbG9zZSgpOwotCQkJcmV0dXJuIChGZWF0dXJlQ2F0ZWdvcnlbXSlmZWF0dXJlQ2F0ZWdvcmllcy50b0FycmF5KG5ldyBGZWF0dXJlQ2F0ZWdvcnlbZmVhdHVyZUNhdGVnb3JpZXMuc2l6ZSgpXSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJCXJldHVybiBuZXcgRmVhdHVyZUNhdGVnb3J5WzBdOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVZNUGF0aCgpIHsKLQkJLy8gQ3JlYXRlIGNvbW1hbmQgc3RyaW5nIGZvciBsYXVuY2hpbmcgdGhlIHByb2Nlc3MKLQkJU3RyaW5nIHZtID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLm5hbWUiKTsKLQkJU3RyaW5nIGV4ZWN1dGFibGUgPSAiSjkiLmVxdWFscyh2bSkgPyAiajkiIDogImphdmEiOwotCQlpZiAob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkpCi0JCQlleGVjdXRhYmxlICs9ICJ3LmV4ZSI7Ci0KLQkJU3RyaW5nIGphdmFJbnN0YWxsRGlyID0KLQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBGaWxlLnNlcGFyYXRvciArICJiaW4iOwotCQlyZXR1cm4gamF2YUluc3RhbGxEaXIgKyBGaWxlLnNlcGFyYXRvciArIGV4ZWN1dGFibGU7Ci0JfQotCQotCXB1YmxpYyBDYXRlZ29yeURlZmluaXRpb25bXSBnZXRDYXRlZ29yeURlZmluaXRpb25zKFN0cmluZyB1cmwpIHsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOwotCQlGaWxlUmVhZGVyIGZyZWFkZXI7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOwotCQlBcnJheUxpc3QgY2F0RGVmID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uWzBdOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWJvb2xlYW4gYWRkID0gZmFsc2U7Ci0JCQlib29sZWFuIGlzRGVzYyA9IGZhbHNlOwotCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIHRlbXAgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7Ci0JCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlpZiAodGV4dC50cmltKCkuc3RhcnRzV2l0aCgiPGNhdGVnb3J5LWRlZiIpCi0JCQkJCSYmIHRleHQuaW5kZXhPZigibmFtZSIpICE9IC0xKSB7Ci0JCQkJCXRlbXAuc2V0TmFtZSh0ZXh0LnNwbGl0KCJcIiIpWzFdKTsKLQkJCQkJYWRkID0gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0LnRyaW0oKS5lcXVhbHMoIjxkZXNjcmlwdGlvbj4iKSkgewotCQkJCQlpc0Rlc2MgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAodGV4dC50cmltKCkuZXF1YWxzKCI8L2Rlc2NyaXB0aW9uPiIpKSB7Ci0JCQkJCWlzRGVzYyA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoaXNEZXNjKSB7Ci0JCQkJCXRlbXAuc2V0RGVzYyh0ZXh0LnRyaW0oKSk7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0LnRyaW0oKS5lcXVhbHMoIjwvY2F0ZWdvcnktZGVmPiIpKSB7Ci0JCQkJCWFkZCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChhZGQpIHsKLQkJCQkJY2F0RGVmLmFkZCh0ZW1wKTsKLQkJCQkJYWRkID0gZmFsc2U7Ci0JCQkJCXRlbXAgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQlyZXR1cm4gKENhdGVnb3J5RGVmaW5pdGlvbltdKWNhdERlZi50b0FycmF5KG5ldyBDYXRlZ29yeURlZmluaXRpb25bY2F0RGVmLnNpemUoKV0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQlyZXR1cm4gbmV3IENhdGVnb3J5RGVmaW5pdGlvblswXTsKLQkJfQotCi0JfQotCQotCXB1YmxpYyBpbnQgcGVyZm9ybU1pcnJvcihTdHJpbmdbXSBjbWRfbWlycm9yKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEVjbGlwc2VSb290KCkpOwotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMYXVuY2hpbmc6Iik7Ci0JCQlmb3IoaW50IGk9MDsgaTxjbWRfbWlycm9yLmxlbmd0aDsgaSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGNtZF9taXJyb3JbaV0rIiAiKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJUHJvY2VzcyBwcm9jID0KLQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZF9taXJyb3IsIChTdHJpbmdbXSkgbnVsbCwgZmlsZSk7Ci0KLQkJCVN0cmVhbUNvbnN1bWVyIG91dHB1dHMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCW91dHB1dHMuc3RhcnQoKTsKLQkJCVN0cmVhbUNvbnN1bWVyIGVycm9ycyA9IG5ldyBTdHJlYW1Db25zdW1lcihwcm9jLmdldEVycm9yU3RyZWFtKCkpOwotCQkJZXJyb3JzLnN0YXJ0KCk7Ci0JCQlUaW1lciB0aW1lciA9IG5ldyBUaW1lcihwcm9jKTsKLQkJCXRpbWVyLnN0YXJ0KCk7Ci0KLQkJCXJldHVybiBwcm9jLndhaXRGb3IoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIDApOwotCX0KLQkKLQkvLyBlbnN1cmUgb3V0cHV0IHN0cmluZyBidWZmZXIgZW5kcyB3aXRoICJNaXJyb3IgY29tbWFuZCBjb21wbGV0ZWQKLQkvLyBzdWNjZXNzZnVsbHkuIgotCS8vIG5vdGU6IG91dHB1dCBtYXkgaW5zdGVhZCBieSAiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKLQlwdWJsaWMgdm9pZCB0ZXN0TWlycm9yU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0KLQkJCW5ldyBTdHJpbmdUb2tlbml6ZXIoCi0JCQkJZXJyT3V0cHV0LnRvU3RyaW5nKCksCi0JCQkJIlxuIik7Ci0JCVN0cmluZyBsYXN0TGluZSA9IG5ldyBTdHJpbmcoKTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpewotCQkJbGFzdExpbmUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCWxhc3RMaW5lLmVxdWFscygiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKQotCQkJCXx8IGxhc3RMaW5lLmVxdWFscygiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjYWQyNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIGV4dGVuZHMgTWlycm9yTWFuYWdlclRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWlycm9yZWQ7Ci0KLQlwdWJsaWMgVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvcihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJZXJyT3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpc01pcnJvcmVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTFjIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMy4wLjAiOwotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKLQkJLy8gZmlyc3QgbWlycm9yCi0JCVN0cmluZyBmcm9tUmVtb3RlU2l0ZVVybCA9Ci0JCQkiZmlsZToiCi0JCQkJKyBkYXRhUGF0aAotCQkJCSsgIm1pcnJvcnMvdXBkYXRlLXNpdGUxIjsKLQkJaWYgKCFpc01pcnJvcmVkKSB7Ci0JCQlleGl0VmFsdWUgPQotCQkJCXBlcmZvcm1NaXJyb3IoCi0JCQkJCWdldENvbW1hbmQoZnJvbVJlbW90ZVNpdGVVcmwsdG9Mb2NhbFNpdGVVcmwsIG51bGwsIG51bGwsIG1pcnJvclVSTCkpOwotCQkKLQkJLy8gZW5kIG9mIGZpcnN0IG1pcnJvcgotCQlmcm9tUmVtb3RlU2l0ZVVybCA9Ci0JCQkiZmlsZToiCi0JCQkrIGRhdGFQYXRoCi0JCQkrICJtaXJyb3JzL3VwZGF0ZS1zaXRlNSI7Ci0JCQlleGl0VmFsdWUgPQotCQkJCXBlcmZvcm1NaXJyb3IoCi0JCQkJCWdldENvbW1hbmQoZnJvbVJlbW90ZVNpdGVVcmwsdG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbiwgbWlycm9yVVJMKSk7Ci0JCQlpc01pcnJvcmVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8vIG1ha2Ugc3VyZSBlYWNoIGZlYXR1cmUgaXMgdW5kZXIgaXRzIGNvcnJlY3QgY2F0ZWdvcnkgbmFtZXMKLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUNhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkgICAgICAgIGRhdGFQYXRoCi0JCQkJKyAibWlycm9ycy91cGRhdGUtc2l0ZTUiOwotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCUZlYXR1cmVDYXRlZ29yeVtdIG1pcnJvckZlYXR1cmVzID0gZ2V0RmVhdHVyZUNhdGVnb3JpZXModG9Mb2NhbFNpdGVVcmwpOwotCQlGZWF0dXJlQ2F0ZWdvcnlbXSByZXF1aXJlZCA9IG5ldyBGZWF0dXJlQ2F0ZWdvcnlbMV07Ci0JCXJlcXVpcmVkWzBdID0gbmV3IEZlYXR1cmVDYXRlZ29yeSgpOwotCQlyZXF1aXJlZFswXS5zZXRGZWF0dXJlSUQoInVwZGF0ZS5mZWF0dXJlMWMiKTsKLQkJcmVxdWlyZWRbMF0uYWRkQ2F0ZWdvcnkoIlNpdGU1LUNhdGVnb3J5MSIpOwotCQlhc3NlcnRUcnVlKGNoZWNrRmVhdHVyZUNhdGVnb3JpZXNDb250YWluZWQocmVxdWlyZWQsIG1pcnJvckZlYXR1cmVzKSk7Ci0JfQotCQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RFeGl0VmFsdWUoKTsKLQl9Ci0JCi0JLy8gZW5zdXJlIGNhdGVnb3J5IGRlZmluaXRpb25zIGV4aXN0Ci0JcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWFzc2VydFRydWUoZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KHRvTG9jYWxTaXRlVXJsKSk7Ci0JfQotCi0JLy8gZW5zdXJlIGZlYXR1cmUgZXhpc3RzIHBlciBzaXRlLnhtbAotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKCkgewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxYyI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjMuMC4wIjsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCWNoZWNrRmVhdHVyZUluU2l0ZVhNTEV4aXN0cyh0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUlkLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLy8gZW5zdXJlIHNpdGUueG1sIGlzIGdlbmVyYXRlZAotCXB1YmxpYyB2b2lkIHRlc3RTaXRlWE1MRXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJY2hlY2tTaXRlWE1MKHRvTG9jYWxTaXRlVXJsKTsKLQl9Ci0KLQkvLyBlbnN1cmUgcG9saWN5LnhtbCBpcyBnZW5lcmF0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5WE1MRXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJY2hlY2tQb2xpY3lYTUwodG9Mb2NhbFNpdGVVcmwpOwotCX0KLQotCS8vIGVuc3VyZSBwb2xpY3kueG1sIHJlZmVyZW5jZXMgdGhlIGNvcnJlY3QgbWlycm9yVVJMCi0JcHVibGljIHZvaWQgdGVzdFBvbGljeVVSTCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKLQkJYXNzZXJ0VHJ1ZShjaGVja1BvbGljeVVSTCh0b0xvY2FsU2l0ZVVybCwgbWlycm9yVVJMKSk7Ci0JfQotCi0JLy8gZW5zdXJlIGFsbCBqYXJzIGluIGZlYXR1cmVzIGRpcmVjdG9yeSBtaXJyb3JlZAotCXB1YmxpYyB2b2lkIHRlc3RBbGxGZWF0dXJlSmFyc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nW10gZmVhdHVyZUphcnMgPSB7ICJ1cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciIgfTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0FsbEZlYXR1cmVKYXJzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSmFycykpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgamFycyBpbiBwbHVnaW5zIGRpcmVjdG9yeSBtaXJyb3JlZAotCXB1YmxpYyB2b2lkIHRlc3RBbGxQbHVnaW5KYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmdbXSBwbHVnaW5KYXJzID0KLQkJCXsgImNvbS5wbHVnaW4xXzEuMC4wLmphciIsICJjb20ucGx1Z2luMWFfMS4wLjEuamFyIiB9OwotCQlhc3NlcnRUcnVlKGNoZWNrQWxsUGx1Z2luSmFycyh0b0xvY2FsU2l0ZVVybCwgcGx1Z2luSmFycykpOwotCX0KLQotCS8vIGVuc3VyZSBvdXRwdXQgc3RyaW5nIGJ1ZmZlciBlbmRzIHdpdGggIk1pcnJvciBjb21tYW5kIGNvbXBsZXRlZAotCS8vIHN1Y2Nlc3NmdWxseS4iCi0JLy8gbm90ZTogb3V0cHV0IG1heSBpbnN0ZWFkIGJ5ICJDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgotCXB1YmxpYyB2b2lkIHRlc3RNaXJyb3JTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RNaXJyb3JTdWNjZXNzKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNoZWNrQWxsRmVhdHVyZUphcnMoU3RyaW5nIHVybCwgU3RyaW5nW10gamFyTmFtZXMpIHsKLQkJRmlsZSBmZWF0dXJlc0RpciA9IG5ldyBGaWxlKHVybCArICIvZmVhdHVyZXMiKTsKLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlc0Rpci5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoZmVhdHVyZXNEaXIuaXNEaXJlY3RvcnkoKSk7Ci0JCVN0cmluZ1tdIGxpc3QgPSBmZWF0dXJlc0Rpci5saXN0KCk7Ci0KLQkJQXJyYXlMaXN0IGxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWxzLmFkZChsaXN0W2ldKTsKLQkJfQotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgamFyTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCWFzc2VydFRydWUobHMuY29udGFpbnMoamFyTmFtZXNbal0pKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0FsbFBsdWdpbkphcnMoU3RyaW5nIHVybCwgU3RyaW5nW10gamFyTmFtZXMpIHsKLQkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUodXJsICsgIi9wbHVnaW5zIik7Ci0JCWFzc2VydFRydWUocGx1Z2luc0Rpci5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUocGx1Z2luc0Rpci5pc0RpcmVjdG9yeSgpKTsKLQkJU3RyaW5nW10gbGlzdCA9IHBsdWdpbnNEaXIubGlzdCgpOwotCi0JCUFycmF5TGlzdCBscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlscy5hZGQobGlzdFtpXSk7Ci0JCX0KLQotCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlQ2F0ZWdvcmllc0NvbnRhaW5lZChGZWF0dXJlQ2F0ZWdvcnlbXSByZXF1aXJlZCxGZWF0dXJlQ2F0ZWdvcnlbXSBsb2NhbERlZnMpewotCQlib29sZWFuIGhhc01hdGNoOwotCQlmb3IgKGludCBpID0gMCA7IGk8cmVxdWlyZWQubGVuZ3RoOyBpKyspewotCQkJaGFzTWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqPGxvY2FsRGVmcy5sZW5ndGg7IGorKyl7Ci0JCQkJaWYgKGxvY2FsRGVmc1tqXS5nZXRGZWF0dXJlSUQoKS5lcXVhbHMocmVxdWlyZWRbaV0uZ2V0RmVhdHVyZUlEKCkpICYmCi0JCQkJCWNoZWNrQ2F0ZWdvcmllc01hdGNoKGxvY2FsRGVmc1tqXS5nZXRDYXRlZ29yaWVzKCksIHJlcXVpcmVkW2ldLmdldENhdGVnb3JpZXMoKSkpewotCQkJCQkJaGFzTWF0Y2ggPSB0cnVlOwotCQkJCQkJaj1sb2NhbERlZnMubGVuZ3RoOwotCQkJCX0KLQkJCX0KLQkJCWlmICghaGFzTWF0Y2gpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjaGVja0NhdGVnb3JpZXNNYXRjaChTdHJpbmdbXSBsb2NhbENhdCwgU3RyaW5nW10gcmVtb3RlQ2F0KXsKLQkJYm9vbGVhbiBoYXNNYXRjaDsKLQkJZm9yIChpbnQgaSA9IDA7IGk8bG9jYWxDYXQubGVuZ3RoOyBpKyspewotCQkJaGFzTWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqPHJlbW90ZUNhdC5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYgKGxvY2FsQ2F0W2ldLmVxdWFscyhyZW1vdGVDYXRbal0pKXsKLQkJCQkJaGFzTWF0Y2ggPSB0cnVlOwotCQkJCQlqPXJlbW90ZUNhdC5sZW5ndGg7Ci0JCQkJfQotCQkJfQotCQkJaWYoIWhhc01hdGNoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVhMjYwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFRlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IgZXh0ZW5kcyBNaXJyb3JNYW5hZ2VyVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNaXJyb3JlZDsKLQotCXB1YmxpYyBUZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCQllcnJPdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlzTWlycm9yZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMWMiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIzLjAuMCI7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOwotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkJCSJmaWxlOiIKLQkJCQkrIGRhdGFQYXRoCi0JCQkJKyAibWlycm9ycy91cGRhdGUtc2l0ZTQiOwotCQlpZiAoIWlzTWlycm9yZWQpIHsKLQkJCWV4aXRWYWx1ZSA9Ci0JCQkJcGVyZm9ybU1pcnJvcigKLQkJCQkJZ2V0Q29tbWFuZChmcm9tUmVtb3RlU2l0ZVVybCx0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUlkLCB2ZXJzaW9uLCBtaXJyb3JVUkwpKTsKLQkJCWlzTWlycm9yZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVzdEV4aXRWYWx1ZSgpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgZXhpc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlEZWZpbml0aW9uc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJYXNzZXJ0VHJ1ZShkb2VzQ2F0ZWdvcnlEZWZpbml0aW9uRXhpc3QodG9Mb2NhbFNpdGVVcmwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluU2l0ZVhNTEV4aXN0cygpIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMWMiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIzLjAuMCI7Ci0JCWFzc2VydFRydWUoCi0JCQljaGVja0ZlYXR1cmVJblNpdGVYTUxFeGlzdHModG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbikpOwotCX0KLQotCS8vIGVuc3VyZSBzaXRlLnhtbCBpcyBnZW5lcmF0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWNoZWNrU2l0ZVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCi0JLy8gZW5zdXJlIHBvbGljeS54bWwgaXMgZ2VuZXJhdGVkCi0JcHVibGljIHZvaWQgdGVzdFBvbGljeVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWNoZWNrUG9saWN5WE1MKHRvTG9jYWxTaXRlVXJsKTsKLQl9Ci0KLQkvLyBlbnN1cmUgcG9saWN5LnhtbCB1c2VzIHRoZSBjb3JyZWN0IG1pcnJvclVSTAotCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgbWlycm9yVVJMID0gImh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvbXktbWlycm9yLXVybCI7Ci0JCWFzc2VydFRydWUoY2hlY2tQb2xpY3lVUkwodG9Mb2NhbFNpdGVVcmwsIG1pcnJvclVSTCkpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgamFycyBpbiBmZWF0dXJlcyBkaXJlY3RvcnkgbWlycm9yZWQKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmVhdHVyZUphcnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZ1tdIGZlYXR1cmVKYXJzID0geyAidXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciIsICJ1cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyIiwgInVwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyIiwgInVwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyIiB9OwotCQlhc3NlcnRUcnVlKGNoZWNrQWxsRmVhdHVyZUphcnModG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVKYXJzKSk7Ci0JfQotCi0JLy8gZW5zdXJlIGFsbCBqYXJzIGluIHBsdWdpbnMgZGlyZWN0b3J5IG1pcnJvcmVkCi0JcHVibGljIHZvaWQgdGVzdEFsbFBsdWdpbkphcnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZ1tdIHBsdWdpbkphcnMgPQotCQkJeyAiY29tLnBsdWdpbjFfMS4wLjAuamFyIiwgImNvbS5wbHVnaW4xYV8xLjAuMS5qYXIiIH07Ci0JCWFzc2VydFRydWUoY2hlY2tBbGxQbHVnaW5KYXJzKHRvTG9jYWxTaXRlVXJsLCBwbHVnaW5KYXJzKSk7Ci0JfQotCi0JLy8gZW5zdXJlIG91dHB1dCBzdHJpbmcgYnVmZmVyIGVuZHMgd2l0aCAiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkCi0JLy8gc3VjY2Vzc2Z1bGx5LiIKLQkvLyBub3RlOiBvdXRwdXQgbWF5IGluc3RlYWQgYnkgIkNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCi0JcHVibGljIHZvaWQgdGVzdE1pcnJvclN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVzdE1pcnJvclN1Y2Nlc3MoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0FsbEZlYXR1cmVKYXJzKFN0cmluZyB1cmwsIFN0cmluZ1tdIGphck5hbWVzKSB7Ci0JCUZpbGUgZmVhdHVyZXNEaXIgPSBuZXcgRmlsZSh1cmwgKyAiL2ZlYXR1cmVzIik7Ci0JCWFzc2VydFRydWUoZmVhdHVyZXNEaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKGZlYXR1cmVzRGlyLmlzRGlyZWN0b3J5KCkpOwotCQlTdHJpbmdbXSBsaXN0ID0gZmVhdHVyZXNEaXIubGlzdCgpOwotCi0JCUFycmF5TGlzdCBscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlscy5hZGQobGlzdFtpXSk7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMobGlzdC5sZW5ndGgsIGphck5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgamFyTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCWFzc2VydFRydWUobHMuY29udGFpbnMoamFyTmFtZXNbal0pKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0FsbFBsdWdpbkphcnMoU3RyaW5nIHVybCwgU3RyaW5nW10gamFyTmFtZXMpIHsKLQkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUodXJsICsgIi9wbHVnaW5zIik7Ci0JCWFzc2VydFRydWUocGx1Z2luc0Rpci5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUocGx1Z2luc0Rpci5pc0RpcmVjdG9yeSgpKTsKLQkJU3RyaW5nW10gbGlzdCA9IHBsdWdpbnNEaXIubGlzdCgpOwotCi0JCUFycmF5TGlzdCBscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlscy5hZGQobGlzdFtpXSk7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMobGlzdC5sZW5ndGgsIGphck5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgamFyTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCWFzc2VydFRydWUobHMuY29udGFpbnMoamFyTmFtZXNbal0pKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0NhdGVnb3J5RGVmaW5pdGlvbnNDb250YWluZWQoQ2F0ZWdvcnlEZWZpbml0aW9uW10gbG9jYWxEZWZzLCBDYXRlZ29yeURlZmluaXRpb25bXSByZW1vdGVEZWZzKXsKLQkJYm9vbGVhbiBoYXNNYXRjaDsKLQkJZm9yIChpbnQgaSA9IDAgOyBpPGxvY2FsRGVmcy5sZW5ndGg7IGkrKyl7Ci0JCQloYXNNYXRjaCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGo8cmVtb3RlRGVmcy5sZW5ndGg7IGorKyl7Ci0JCQkJaWYgKGxvY2FsRGVmc1tpXS5nZXROYW1lKCkuZXF1YWxzKHJlbW90ZURlZnNbal0uZ2V0TmFtZSgpKQotCQkJCQkJJiYgbG9jYWxEZWZzW2ldLmdldERlc2MoKS5lcXVhbHMocmVtb3RlRGVmc1tqXS5nZXREZXNjKCkpKQotCQkJCQloYXNNYXRjaCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoIWhhc01hdGNoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0KLQotCS8vIHN0YXJ0IHRlc3RpbmcgY2F0ZWdvcnkgZGVmaW5pdGlvbnMKLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlEZWZpbml0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZyBmcm9tUmVtb3RlU2l0ZVVybCA9Ci0JCSAgICAgICAgZGF0YVBhdGgKLQkJCQkrICJtaXJyb3JzL3VwZGF0ZS1zaXRlNCI7Ci0JCUNhdGVnb3J5RGVmaW5pdGlvbltdIGxvY2FsRGVmcyA9IGdldENhdGVnb3J5RGVmaW5pdGlvbnModG9Mb2NhbFNpdGVVcmwpOwotCQlDYXRlZ29yeURlZmluaXRpb25bXSByZW1vdGVEZWZzID0gZ2V0Q2F0ZWdvcnlEZWZpbml0aW9ucyhmcm9tUmVtb3RlU2l0ZVVybCk7Ci0JCWFzc2VydFRydWUoY2hlY2tDYXRlZ29yeURlZmluaXRpb25zQ29udGFpbmVkKGxvY2FsRGVmcywgcmVtb3RlRGVmcykpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhMGIyNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IgZXh0ZW5kcyBNaXJyb3JNYW5hZ2VyVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNaXJyb3JlZDsKLQkKLQlwdWJsaWMgVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCQllcnJPdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlzTWlycm9yZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMSI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7Ci0JCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKLQkJU3RyaW5nIGZyb21SZW1vdGVTaXRlVXJsID0gImZpbGU6IiArIGRhdGFQYXRoICsgIm1pcnJvcnMvdXBkYXRlLXNpdGUxIjsKLQkJaWYgKCFpc01pcnJvcmVkKSB7Ci0JCQlleGl0VmFsdWUgPQotCQkJCXBlcmZvcm1NaXJyb3IoCi0JCQkJCWdldENvbW1hbmQoZnJvbVJlbW90ZVNpdGVVcmwsdG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbiwgbWlycm9yVVJMKSk7Ci0JCQlpc01pcnJvcmVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RFeGl0VmFsdWUoKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGNhdGVnb3J5IGRlZmluaXRpb25zIGV4aXN0Ci0JcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKLQkJYXNzZXJ0VHJ1ZShkb2VzQ2F0ZWdvcnlEZWZpbml0aW9uRXhpc3QodG9Mb2NhbFNpdGVVcmwpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgZmVhdHVyZSBleGlzdHMgcGVyIHNpdGUueG1sCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVJblNpdGVYTUxFeGlzdHMoKXsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7Ci0JCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCQlhc3NlcnRUcnVlKGNoZWNrRmVhdHVyZUluU2l0ZVhNTEV4aXN0cyh0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUlkLCB2ZXJzaW9uKSk7Ci0JfQotCQotCS8vIGVuc3VyZSBzaXRlLnhtbCBpcyBnZW5lcmF0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKLQkJY2hlY2tTaXRlWE1MKHRvTG9jYWxTaXRlVXJsKTsKLQl9Ci0KLQkvLyBlbnN1cmUgcG9saWN5LnhtbCBpcyBnZW5lcmF0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5WE1MRXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQljaGVja1BvbGljeVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCQotCS8vIGVuc3VyZSBwb2xpY3kueG1sIHVzZXMgdGhlIGNvcnJlY3QgbWlycm9yVVJMCi0JcHVibGljIHZvaWQgdGVzdFBvbGljeVVSTCgpIHRocm93cyBFeGNlcHRpb257Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQlTdHJpbmcgbWlycm9yVVJMID0gImh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvbXktbWlycm9yLXVybCI7Ci0JCWFzc2VydFRydWUoY2hlY2tQb2xpY3lVUkwodG9Mb2NhbFNpdGVVcmwsIG1pcnJvclVSTCkpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgamFycyBmb3IgZmVhdHVyZXMgYW5kIHBsdWdpbnMgbWlycm9yZWQKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsSmFyc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMSI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQkJU3RyaW5nIGphck5hbWUgPSBmZWF0dXJlSWQgKyAiXyIgKyB2ZXJzaW9uICsgIi5qYXIiOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0b0xvY2FsU2l0ZVVybCArICIvZmVhdHVyZXMvIiArIGphck5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOwotCX0KLQotCS8vIGVuc3VyZSBvdXRwdXQgc3RyaW5nIGJ1ZmZlciBlbmRzIHdpdGggIk1pcnJvciBjb21tYW5kIGNvbXBsZXRlZAotCS8vIHN1Y2Nlc3NmdWxseS4iCi0JLy8gbm90ZTogb3V0cHV0IG1heSBpbnN0ZWFkIGJ5ICJDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgotCXB1YmxpYyB2b2lkIHRlc3RNaXJyb3JTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RNaXJyb3JTdWNjZXNzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9BbGxNb2RlbFRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9BbGxNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDhkZTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvQWxsTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1vZGVsOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBNYW5hZ2VzIHRoZSBBUEkgdGVzdHMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWxsTW9kZWxUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEFsbE1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsNCi0JCXN1cGVyKG5hbWUpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogTGlzdCBvZiBBUEkgdGVzdHMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQkJc3VpdGUuc2V0TmFtZSgiTW9kZWwgVGVzdHMiKTsNCi0NCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShGZWF0dXJlTWFpbi5jbGFzcykpOw0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFNpdGVNYWluLmNsYXNzKSk7CQkNCi0NCi0JCXJldHVybiBzdWl0ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9GZWF0dXJlTWFpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvRmVhdHVyZU1haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkZDQ3MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9GZWF0dXJlTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZU1haW4gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQ0KLQlwdWJsaWMgRmVhdHVyZU1haW4oU3RyaW5nIHRlc3RjYXNlKXsNCi0JCXN1cGVyKHRlc3RjYXNlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFpbigpIHRocm93cyBFeGNlcHRpb24gew0KLQkJDQotCQlGZWF0dXJlTW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmVhdHVyZU1vZGVsRmFjdG9yeSgpOw0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLQkJRmVhdHVyZU1vZGVsIGZlYXR1cmUgPSBudWxsOw0KLQkJDQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnNpbmcgZmVhdHVyZSAuLi4iKTsNCi0JCXRyeSB7DQotCQkJaXMgPSBGZWF0dXJlTWFpbi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJmZWF0dXJlLnhtbCIpOwkJDQotCQkJZmVhdHVyZSA9IGZhY3RvcnkucGFyc2VGZWF0dXJlKGlzKTsNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKGlzICE9IG51bGwpIHsNCi0JCQkJdHJ5IHsgaXMuY2xvc2UoKTt9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlTdHJpbmcgYmFzZSA9ICJodHRwOi8vYW5vdGhlci5zZXJ2ZXIvZmVhdHVyZS54bWwiOw0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvbHZpbmcgZmVhdHVyZSB1c2luZyAiK2Jhc2UrIiAuLi4iKTsNCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7DQotCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC90ZXN0Iik7DQotCQlmZWF0dXJlLnJlc29sdmUobmV3IFVSTChiYXNlKSwgbmV3IFVSTChiYXNlKSk7DQotCX0NCi0JDQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUZlYXR1cmUoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgew0KLS8vCQlpZiAoZmVhdHVyZSA9PSBudWxsKSByZXR1cm47DQotLy8JCQ0KLS8vCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLS8vCQl3LnByaW50bG4oaW4rIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOw0KLS8vCQkNCi0vLwkJdy5wcmludGxuKGluKyI8ZmVhdHVyZSIpOw0KLS8vCQl3LnByaW50bG4oaW4rIiAgICIrImlkPVwiIitmZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCkrIlwiIik7DQotLy8JCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrZmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpKyJcIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIiAgICIrImxhYmVsPVwiIitmZWF0dXJlLmdldExhYmVsKCkrIlwiIik7DQotLy8JCXcucHJpbnRsbihpbisiICAgIisicHJvdmlkZXItbmFtZT1cIiIrZmVhdHVyZS5nZXRQcm92aWRlcigpKyJcIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIiAgICIrImltYWdlPVwiIitmZWF0dXJlLmdldEltYWdlVVJMU3RyaW5nKCkrIlwiIC0+ICIrZmVhdHVyZS5nZXRJbWFnZVVSTCgpKTsNCi0vLwkJdy5wcmludGxuKGluKyIgICAiKyJvcz1cIiIrZmVhdHVyZS5nZXRPUygpKyJcIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIiAgICIrIndzPVwiIitmZWF0dXJlLmdldFdTKCkrIlwiIik7DQotLy8JCXcucHJpbnRsbihpbisiICAgIisibmw9XCIiK2ZlYXR1cmUuZ2V0TkwoKSsiXCIiKTsNCi0vLwkJdy5wcmludGxuKGluKyIgICAiKyJhcHBsaWNhdGlvbj1cIiIrZmVhdHVyZS5nZXRBcHBsaWNhdGlvbigpKyJcIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIiAgICIrIj4iKTsNCi0vLwkJDQotLy8JCXdyaXRlRGVzY3JpcHRpb24odywgbGV2ZWwrMSwgZmVhdHVyZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkpOw0KLS8vCQl3cml0ZUNvcHlyaWdodCh3LCBsZXZlbCsxLCBmZWF0dXJlLmdldENvcHlyaWdodE1vZGVsKCkpOw0KLS8vCQl3cml0ZUxpY2Vuc2UodywgbGV2ZWwrMSwgZmVhdHVyZS5nZXRMaWNlbnNlTW9kZWwoKSk7DQotLy8JCXdyaXRlVVJMcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsNCi0vLwkJd3JpdGVQcmVyZXFzKHcsIGxldmVsKzEsIGZlYXR1cmUpOw0KLS8vCQl3cml0ZVBsdWdpbkVudHJpZXModywgbGV2ZWwrMSwgZmVhdHVyZSk7DQotLy8JCXdyaXRlTm9uUGx1Z2luRW50cmllcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsNCi0vLwkJICAgICAgICAgDQotLy8gICAgICAgIHcucHJpbnRsbihpbisiPC9mZWF0dXJlPiIpOw0KLS8vCX0NCi0vLwkNCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRGVzY3JpcHRpb24oUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBVUkxFbnRyeU1vZGVsIHVlKSB7DQotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7DQotLy8JCXcucHJpbnRsbigiIik7DQotLy8JCXcucHJpbnRsbihpbisiPGRlc2NyaXB0aW9uIHVybD1cIiIrdWUuZ2V0VVJMU3RyaW5nKCkrIlwiIC0+ICIrdWUuZ2V0VVJMKCkrIj4iKTsNCi0vLwkJdy5wcmludGxuKGluK3VlLmdldEFubm90YXRpb24oKSk7DQotLy8JCXcucHJpbnRsbihpbisiPC9kZXNjcmlwdGlvbj4iKTsNCi0vLwl9DQotLy8JDQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUNvcHlyaWdodChQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsNCi0vLwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0vLwkJdy5wcmludGxuKCIiKTsNCi0vLwkJdy5wcmludGxuKGluKyI8Y29weXJpZ2h0IHVybD1cIiIrdWUuZ2V0VVJMU3RyaW5nKCkrIlwiIC0+ICIrdWUuZ2V0VVJMKCkrIj4iKTsNCi0vLwkJdy5wcmludGxuKGluK3VlLmdldEFubm90YXRpb24oKSk7DQotLy8JCXcucHJpbnRsbihpbisiPC9jb3B5cmlnaHQ+Iik7DQotLy8JfQ0KLS8vCQ0KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVMaWNlbnNlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgew0KLS8vCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLS8vCQl3LnByaW50bG4oIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIjxsaWNlbnNlIHVybD1cIiIrdWUuZ2V0VVJMU3RyaW5nKCkrIlwiIC0+ICIrdWUuZ2V0VVJMKCkrIj4iKTsNCi0vLwkJdy5wcmludGxuKGluK3VlLmdldEFubm90YXRpb24oKSk7DQotLy8JCXcucHJpbnRsbihpbisiPC9saWNlbnNlPiIpOw0KLS8vCX0NCi0vLwkNCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlVVJMcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7DQotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7DQotLy8JCVN0cmluZyBpbjIgPSBnZXRJbmRlbnQobGV2ZWwrMSk7DQotLy8JCXcucHJpbnRsbigiIik7DQotLy8JCXcucHJpbnRsbihpbisiPHVybD4iKTsNCi0vLwkJDQotLy8JCVVSTEVudHJ5TW9kZWwgdXBkYXRlID0gZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnlNb2RlbCgpOw0KLS8vCQl3LnByaW50bG4oaW4yKyI8dXBkYXRlIik7DQotLy8JCXcucHJpbnRsbihpbjIrIiAgICIrInVybD1cIiIrdXBkYXRlLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK3VwZGF0ZS5nZXRVUkwoKSk7DQotLy8JCXcucHJpbnRsbihpbjIrIiAgICIrImxhYmVsPVwiIit1cGRhdGUuZ2V0QW5ub3RhdGlvbigpKyJcIiIpOw0KLS8vCQl3LnByaW50bG4oaW4yKyIgICAiKyIvPiIpOw0KLS8vCQkNCi0vLwkJVVJMRW50cnlNb2RlbFtdIGRpc2NvdmVyeSA9IGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJ5TW9kZWxzKCk7DQotLy8JCWZvciAoaW50IGk9MDsgaTxkaXNjb3ZlcnkubGVuZ3RoOyBpKyspIHsNCi0vLwkJCXcucHJpbnRsbihpbjIrIjxkaXNjb3ZlcnkiKTsNCi0vLwkJCXcucHJpbnRsbihpbjIrIiAgICIrInVybD1cIiIrZGlzY292ZXJ5W2ldLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK2Rpc2NvdmVyeVtpXS5nZXRVUkwoKSk7DQotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyJsYWJlbD1cIiIrZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb24oKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbjIrIiAgICIrIi8+Iik7DQotLy8JCX0NCi0vLwkJDQotLy8JCXcucHJpbnRsbihpbisiPC91cmw+Iik7DQotLy8JfQ0KLS8vCQ0KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVQcmVyZXFzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsNCi0vLwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0vLwkJU3RyaW5nIGluMiA9IGdldEluZGVudChsZXZlbCsxKTsNCi0vLwkJdy5wcmludGxuKCIiKTsNCi0vLwkJdy5wcmludGxuKGluKyI8cmVxdWlyZXM+Iik7DQotLy8JCQ0KLS8vCQlJbXBvcnRNb2RlbFtdIGltcCA9IGZlYXR1cmUuZ2V0SW1wb3J0TW9kZWxzKCk7DQotLy8JCWZvciAoaW50IGk9MDsgaTxpbXAubGVuZ3RoOyBpKyspIHsNCi0vLwkJCXcucHJpbnRsbihpbjIrIjxpbXBvcnQiKTsNCi0vLwkJCXcucHJpbnRsbihpbjIrIiAgICIrInBsdWdpbj1cIiIraW1wW2ldLmdldElkZW50aWZpZXIoKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbjIrIiAgICIrInZlcnNpb249XCIiK2ltcFtpXS5nZXRWZXJzaW9uKCkrIlwiIik7DQotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyJtYXRjaD1cIiIraW1wW2ldLmdldE1hdGNoaW5nUnVsZU5hbWUoKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbjIrIiAgICIrIi8+Iik7DQotLy8JCX0NCi0vLwkJDQotLy8JCXcucHJpbnRsbihpbisiPC9yZXF1aXJlcz4iKTsNCi0vLwl9DQotLy8JDQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVBsdWdpbkVudHJpZXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgew0KLS8vCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLS8vCQl3LnByaW50bG4oIiIpOw0KLS8vCQkNCi0vLwkJUGx1Z2luRW50cnlNb2RlbFtdIHBsdWdpbiA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cnlNb2RlbHMoKTsNCi0vLwkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbi5sZW5ndGg7IGkrKykgew0KLS8vCQkJdy5wcmludGxuKGluKyI8cGx1Z2luIik7DQotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrImlkPVwiIitwbHVnaW5baV0uZ2V0UGx1Z2luSWRlbnRpZmllcigpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJ2ZXJzaW9uPVwiIitwbHVnaW5baV0uZ2V0UGx1Z2luVmVyc2lvbigpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJmcmFnbWVudD1cIiIrcGx1Z2luW2ldLmlzRnJhZ21lbnQoKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbisiICAgIisib3M9XCIiK3BsdWdpbltpXS5nZXRPUygpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJ3cz1cIiIrcGx1Z2luW2ldLmdldFdTKCkrIlwiIik7DQotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrIm5sPVwiIitwbHVnaW5baV0uZ2V0TkwoKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbisiICAgIisiZG93bmxvYWQtc2l6ZT1cIiIrcGx1Z2luW2ldLmdldERvd25sb2FkU2l6ZSgpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJpbnN0YWxsLXNpemU9XCIiK3BsdWdpbltpXS5nZXRJbnN0YWxsU2l6ZSgpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyIvPiIpOw0KLS8vCQl9DQotLy8JfQ0KLS8vCQ0KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVOb25QbHVnaW5FbnRyaWVzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsNCi0vLwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0vLwkJdy5wcmludGxuKCIiKTsNCi0vLwkJDQotLy8JCU5vblBsdWdpbkVudHJ5TW9kZWxbXSBkYXRhID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyeU1vZGVscygpOw0KLS8vCQlmb3IgKGludCBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKykgew0KLS8vCQkJdy5wcmludGxuKGluKyI8ZGF0YSIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJpZD1cIiIrZGF0YVtpXS5nZXRJZGVudGlmaWVyKCkrIlwiIik7DQotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrImRvd25sb2FkLXNpemU9XCIiK2RhdGFbaV0uZ2V0RG93bmxvYWRTaXplKCkrIlwiIik7DQotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrImluc3RhbGwtc2l6ZT1cIiIrZGF0YVtpXS5nZXRJbnN0YWxsU2l6ZSgpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyIvPiIpOw0KLS8vCQl9DQotLy8JfQ0KLS8vCQ0KLS8vCQ0KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbmRlbnQoaW50IGxldmVsKSB7DQotLy8JCVN0cmluZyBpbmRlbnQgPSAiIjsNCi0vLwkJZm9yIChpbnQgaT0wOyBpPGxldmVsOyBpKyspIA0KLS8vCQkJaW5kZW50ICs9ICIgICAiOw0KLS8vCQlyZXR1cm4gaW5kZW50Ow0KLS8vCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvU2l0ZU1haW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL1NpdGVNYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjAyNjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvU2l0ZU1haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubW9kZWw7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBTaXRlTWFpbiBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCQ0KLQlwdWJsaWMgU2l0ZU1haW4oU3RyaW5nIG5hbWUpew0KLQkJc3VwZXIobmFtZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdE1haW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCQ0KLQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlcj1uZXcgU3RyaW5nV3JpdGVyKCk7DQotCQlQcmludFdyaXRlciB3ID0gbmV3IFByaW50V3JpdGVyKHN0cldyaXRlcik7DQotDQotCQlwcm9jZXNzKCJzaXRlX29sZF9mb3JtYXQueG1sIix3KTsNCi0JCXByb2Nlc3MoInNpdGUueG1sIix3KTsNCi0JCXRyeSB7DQotCQkJcHJvY2Vzcygic2l0ZV93aXRoX3R5cGUueG1sIix3KTsNCi0JCQlmYWlsKCJJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIGUpIHsNCi0JCQlhc3NlcnRFcXVhbHMoZS5nZXROZXdUeXBlKCksInNvbWUub3RoZXIuc2l0ZS50eXBlIik7DQotCQl9IGZpbmFsbHkgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJXcml0ZXIpOw0KLQkJCXcuY2xvc2UoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzKFN0cmluZyB4bWwsIFByaW50V3JpdGVyIHcpIHRocm93cyBFeGNlcHRpb24gew0KLQkJDQotCQlTaXRlTW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBuZXcgU2l0ZU1vZGVsRmFjdG9yeSgpOw0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLQkJU2l0ZU1vZGVsIHNpdGUgPSBudWxsOw0KLQkJDQotCQl3LnByaW50bG4oIiIpOw0KLQkJdy5wcmludGxuKCJQYXJzaW5nIHNpdGUgbWFwIC4uLiIpOw0KLQkJdHJ5IHsNCi0JCQlpcyA9IFNpdGVNYWluLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oeG1sKTsJCQ0KLQkJCXNpdGUgPSBmYWN0b3J5LnBhcnNlU2l0ZShpcyk7DQotCQl9ICBmaW5hbGx5IHsNCi0JCQlpZiAoaXMgIT0gbnVsbCkgew0KLQkJCQl0cnkgeyBpcy5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30NCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmIChzaXRlID09IG51bGwpIHJldHVybjsNCi0JCQ0KLQkJU3RyaW5nIGJhc2UgPSAiaHR0cDovL2Fub3RoZXIuc2VydmVyL3NpdGUueG1sIjsNCi0JCXcucHJpbnRsbigiUmVzb2x2aW5nIHNpdGUgdXNpbmcgIitiYXNlKyIgLi4uIik7DQotCQlzaXRlLnJlc29sdmUobmV3IFVSTChiYXNlKSwgbnVsbCk7DQotCQkNCi0JCXcucHJpbnRsbigiV3JpdGluZyBzaXRlIC4uLiIpOw0KLQkJd3JpdGVTaXRlKHcsMCxzaXRlKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNpdGUoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgew0KLQkJaWYgKHNpdGUgPT0gbnVsbCkgcmV0dXJuOw0KLQkJDQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLQkJdy5wcmludGxuKGluKyI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsNCi0JCQ0KLQkJdy5wcmludGxuKGluKyI8c2l0ZSIpOw0KLQkJdy5wcmludGxuKGluKyIgICAiKyJ0eXBlPVwiIitzaXRlLmdldFR5cGUoKSsiXCIiKTsNCi0JCXcucHJpbnRsbihpbisiICAgIisiPiIpOw0KLQkJDQotCQl3cml0ZURlc2NyaXB0aW9uKHcsIGxldmVsKzEsIHNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpKTsNCi0JCXdyaXRlRmVhdHVyZXModywgbGV2ZWwrMSwgc2l0ZSk7DQotCQl3cml0ZUFyY2hpdmVzKHcsIGxldmVsKzEsIHNpdGUpOw0KLQkJd3JpdGVDYXRlZ29yeURlZnModywgbGV2ZWwrMSwgc2l0ZSk7DQotICAgICAgICAgDQotICAgICAgICB3LnByaW50bG4oaW4rIjwvZmVhdHVyZT4iKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZURlc2NyaXB0aW9uKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgew0KLQkJaWYgKHVlID09IG51bGwpIHJldHVybjsNCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7DQotCQl3LnByaW50bG4oIiIpOw0KLQkJdy5wcmludGxuKGluKyI8ZGVzY3JpcHRpb24gdXJsPVwiIit1ZS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIit1ZS5nZXRVUkwoKSsiPiIpOw0KLQkJdy5wcmludGxuKGluK3VlLmdldEFubm90YXRpb24oKSk7DQotCQl3LnByaW50bG4oaW4rIjwvZGVzY3JpcHRpb24+Iik7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVGZWF0dXJlcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFNpdGVNb2RlbCBzaXRlKSB7DQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLQkJZ2V0SW5kZW50KGxldmVsKzEpOw0KLQkJdy5wcmludGxuKCIiKTsNCi0JCQ0KLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7DQotCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsNCi0JCQl3LnByaW50bG4oaW4rIjxmZWF0dXJlIik7DQotCQkJdy5wcmludGxuKGluKyIgICAiKyJ0eXBlPVwiIitmZWF0dXJlc1tpXS5nZXRUeXBlKCkrIlwiIik7DQotCQkJdy5wcmludGxuKGluKyIgICAiKyJ1cmw9XCIiK2ZlYXR1cmVzW2ldLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK2ZlYXR1cmVzW2ldLmdldFVSTCgpKTsNCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIj4iKTsNCi0JCQl3cml0ZUNhdGVnb3JpZXModywgbGV2ZWwrMSwgZmVhdHVyZXNbaV0pOw0KLQkJCXcucHJpbnRsbihpbisiPC9mZWF0dXJlPiIpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQXJjaGl2ZXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgew0KLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0JCXcucHJpbnRsbigiIik7DQotCQkNCi0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmUgPSBzaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCWZvciAoaW50IGk9MDsgaTxhcmNoaXZlLmxlbmd0aDsgaSsrKSB7DQotCQkJdy5wcmludGxuKGluKyI8YXJjaGl2ZSIpOw0KLQkJCXcucHJpbnRsbihpbisiICAgIisicGF0aD1cIiIrYXJjaGl2ZVtpXS5nZXRQYXRoKCkrIlwiIik7DQotCQkJdy5wcmludGxuKGluKyIgICAiKyJ1cmw9XCIiK2FyY2hpdmVbaV0uZ2V0VVJMU3RyaW5nKCkrIlwiIC0+ICIrYXJjaGl2ZVtpXS5nZXRVUkwoKSk7DQotCQkJdy5wcmludGxuKGluKyIgICAiKyIvPiIpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ2F0ZWdvcnlEZWZzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgU2l0ZU1vZGVsIHNpdGUpIHsNCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7DQotCQlnZXRJbmRlbnQobGV2ZWwrMSk7DQotCQl3LnByaW50bG4oIiIpOw0KLQkJDQotCQlDYXRlZ29yeU1vZGVsW10gY2F0ID0gc2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOw0KLQkJZm9yIChpbnQgaT0wOyBpPGNhdC5sZW5ndGg7IGkrKykgew0KLQkJCXcucHJpbnRsbihpbisiPGNhdGVnb3J5LWRlZiIpOw0KLQkJCXcucHJpbnRsbihpbisiICAgIisibmFtZT1cIiIrY2F0W2ldLmdldE5hbWUoKSsiXCIiKTsNCi0JCQl3LnByaW50bG4oaW4rIiAgICIrImxhYmVsPVwiIitjYXRbaV0uZ2V0TGFiZWwoKSsiXCIiKTsNCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIj4iKTsNCi0JCQl3cml0ZURlc2NyaXB0aW9uKHcsIGxldmVsKzEsIGNhdFtpXS5nZXREZXNjcmlwdGlvbk1vZGVsKCkpOw0KLQkJCXcucHJpbnRsbihpbisiPC9jYXRlZ29yeS1kZWY+Iik7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDYXRlZ29yaWVzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlKSB7DQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLQkJU3RyaW5nW10gY2F0ID0gZmVhdHVyZS5nZXRDYXRlZ29yeU5hbWVzKCk7DQotCQlmb3IgKGludCBpPTA7IGk8Y2F0Lmxlbmd0aDsgaSsrKSB7DQotCQkJdy5wcmludGxuKGluKyI8Y2F0ZWdvcnkgbmFtZT1cIiIrY2F0W2ldKyJcIiIpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW5kZW50KGludCBsZXZlbCkgew0KLQkJU3RyaW5nIGluZGVudCA9ICIiOw0KLQkJZm9yIChpbnQgaT0wOyBpPGxldmVsOyBpKyspIA0KLQkJCWluZGVudCArPSAiICAgIjsNCi0JCXJldHVybiBpbmRlbnQ7DQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiOTY1MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPGZlYXR1cmUgaWQ9Im15LmZlYXR1cmUiIHZlcnNpb249IjMuNy4xIiBsYWJlbD0iJXMxIiBwcm92aWRlci1uYW1lPSJWSyBJbmMuIg0KLSAgICAgICAgIGltYWdlPSJpbWFnZXMvZmVhdHVyZS5naWYiIG9zPSJXaW4zMiIgd3M9IldpbjMyIiBubD0iZW5fQ0EsZW5fVVMiDQotICAgICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCI+DQotDQotICAgPGluc3RhbGwtaGFuZGxlciB1cmw9Imluc3RhbGwvaGFuZGxlci5odG1sIiBsaWJyYXJ5PSJjdXN0b20uamFyIiBjbGFzcz0iSW5zdGFsbEhhbmRsZXIiLz4NCi0gICANCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LnRvb2xzLmNvbS9mZWF0dXJlcy9teS5mZWF0dXJlIj4NCi0gICAgICBEZXNjcmlwdGlvbiBvZiBteS5mZWF0dXJlDQotICAgPC9kZXNjcmlwdGlvbj4NCi0gICANCi0gICA8Y29weXJpZ2h0IHVybD0iY29weXJpZ2h0L215LmZlYXR1cmUiPg0KLSAgICAgIENvcHlyaWdodCBmb3IgbXkuZmVhdHVyZQ0KLSAgIDwvY29weXJpZ2h0Pg0KLSAgIA0KLSAgIDxsaWNlbnNlIHVybD0iJXVybDEiPg0KLSAgICAgIExpY2Vuc2UgZm9yIG15LmZlYXR1cmUNCi0gICA8L2xpY2Vuc2U+DQotICAgDQotICAgPHVybD4NCi0gICAgICA8dXBkYXRlIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdXBkYXRlIiBsYWJlbD0iVXBkYXRlIHNpdGUiLz4NCi0gICAgICA8ZGlzY292ZXJ5IHVybD0iaHR0cDovL3d3dy50b29scy5jb20vZGlzY292ZXJ5MSIgbGFiZWw9IiVzMiIvPg0KLSAgICAgIDxkaXNjb3ZlcnkgdXJsPSIldXJsMiIgbGFiZWw9IiVzMyBEaXNjb3Zlcnkgc2l0ZSAyIi8+DQotICAgICAgPGRpc2NvdmVyeSB1cmw9IiV1cmwzIGh0dHA6Ly93d3cudG9vbHMuY29tL2Rpc2NvdmVyeTMiIGxhYmVsPSJEaXNjb3Zlcnkgc2l0ZSAzIi8+DQotICAgPC91cmw+DQotICAgDQotICAgPHJlcXVpcmVzPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJwbHVnaW4uMSIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJwZXJmZWN0Ii8+DQotICAgICAgPGltcG9ydCBwbHVnaW49InBsdWdpbi4yIiB2ZXJzaW9uPSIzLjIuMCIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJwbHVnaW4uMyIvPg0KLSAgIDwvcmVxdWlyZXM+DQotICAgDQotICAgPHBsdWdpbiBpZD0ibXkucGx1Z2luLjEiIHZlcnNpb249IjEuMC4wIiBmcmFnbWVudD0idHJ1ZSINCi0gICAgICAgICAgIG9zPSJXaW4zMiIgd3M9IldpbjMyIiBubD0iZW5fVVMiIGRvd25sb2FkLXNpemU9IjIzNDU2IiBpbnN0YWxsLXNpemU9IjEyMzQ1NjciLz4NCi0gICA8cGx1Z2luIGlkPSJteS5wbHVnaW4uMiIgdmVyc2lvbj0iMS4wLjEiLz4NCi0gICA8cGx1Z2luIGlkPSJteS5wbHVnaW4uMyIgdmVyc2lvbj0iMS4wLjIiLz4NCi0gICANCi0gICA8ZGF0YSBpZD0iZXhhbXBsZXMuemlwIiBkb3dubG9hZC1zaXplPSIyMzQ1NiIgaW5zdGFsbC1zaXplPSIxMjM0NTY3Ii8+DQotICAgPGRhdGEgaWQ9ImN1c3RvbS9ydC5qYXIiLz4NCi0NCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxNmYyNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPHNpdGU+DQotDQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdXBkYXRlU2l0ZSI+DQotICAgICAgU2l0ZSBkZXNjcmlwdGlvbg0KLSAgIDwvZGVzY3JpcHRpb24+DQotDQotICAgPGZlYXR1cmUgdHlwZT0ibXkuZmVhdHVyZS50eXBlIiB1cmw9ImZlYXR1cmUxLmphciI+DQotICAgICAgPGNhdGVnb3J5IG5hbWU9InRvb2xzIi8+DQotICAgICAgPGNhdGVnb3J5IG5hbWU9InV0aWxpdGllcyIvPg0KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ3aW5kb3dzLnRvb2xzIi8+DQotICAgPC9mZWF0dXJlPg0KLSAgIA0KLSAgIDxmZWF0dXJlIHR5cGU9IiIgdXJsPSJmaWxlOi9mZWF0dXJlMi5qYXIiPg0KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1dGlsaXRpZXMiLz4NCi0gICA8L2ZlYXR1cmU+DQotICAgDQotICAgDQotICAgPGFyY2hpdmUgcGF0aD0iZmlyc3QvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMS5qYXIiLz4NCi0gICA8YXJjaGl2ZSBwYXRoPSJzZWNvbmQvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMi5qYXIiLz4NCi0gICANCi0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9InRvb2xzIiBsYWJlbD0iRGV2ZWxvcG1lbnQgVG9vbHMiPg0KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3Rvb2xzIj4NCi0gICAgICAgICBUaGlzIGlzIGRlc2NyaXB0aW9uIGZvciB0b29scw0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgPC9jYXRlZ29yeS1kZWY+DQotICAgDQotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ1dGlsaXRpZXMiIGxhYmVsPSJVdGlsaXRpZXMiPg0KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9InRvb2xzLmh0bWwiLz4vDQotICAgPC9jYXRlZ29yeS1kZWY+DQotICAgDQotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ3aW5kb3dzLnRvb2xzIiBsYWJlbD0iV2luZG93cyBEZXZlbG9wbWVudCBUb29scyIvPg0KLQ0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX29sZF9mb3JtYXQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV9vbGRfZm9ybWF0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxMGVmNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX29sZF9mb3JtYXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08c2l0ZSB1cmw9Ind3dy50b29scy5jb20vdXBkYXRlU2l0ZSI+DQotDQotICAgPGZlYXR1cmUgdHlwZT0ibXkuZmVhdHVyZS50eXBlIiB1cmw9ImZlYXR1cmUxLmphciI+DQotICAgICAgPGNhdGVnb3J5IG5hbWU9InRvb2xzIi8+DQotICAgICAgPGNhdGVnb3J5IG5hbWU9InV0aWxpdGllcyIvPg0KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ3aW5kb3dzLnRvb2xzIi8+DQotICAgPC9mZWF0dXJlPg0KLSAgIA0KLSAgIDxmZWF0dXJlIHR5cGU9IiIgdXJsPSJmZWF0dXJlMi5qYXIiPg0KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1dGlsaXRpZXMiLz4NCi0gICA8L2ZlYXR1cmU+DQotICANCi0gICA8YXJjaGl2ZSBwYXRoPSJmaXJzdC9hcmNoaXZlIiB1cmw9ImFyY2hpdmUxLmphciIvPg0KLSAgIDxhcmNoaXZlIHBhdGg9InNlY29uZC9hcmNoaXZlIiB1cmw9ImFyY2hpdmUyLmphciIvPg0KLSAgIA0KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0idG9vbHMiIGxhYmVsPSJEZXZlbG9wbWVudCBUb29scyI+DQotICAgICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdG9vbHMiPg0KLSAgICAgICAgIFRoaXMgaXMgZGVzY3JpcHRpb24gZm9yIHRvb2xzDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICA8L2NhdGVnb3J5LWRlZj4NCi0gICANCi0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9InV0aWxpdGllcyIgbGFiZWw9IlV0aWxpdGllcyI+DQotICAgICAgPGRlc2NyaXB0aW9uIHVybD0idXRpbGl0aWVzLmh0bWwiLz4NCi0gICA8L2NhdGVnb3J5LWRlZj4NCi0gICANCi0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IndpbmRvd3MudG9vbHMiIGxhYmVsPSJXaW5kb3dzIERldmVsb3BtZW50IFRvb2xzIi8+DQotDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGVfd2l0aF90eXBlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGVfd2l0aF90eXBlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlM2EzZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX3dpdGhfdHlwZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPHNpdGUgdXJsPSJodHRwOi8vd3d3LnRvb2xzLmNvbS91cGRhdGVTaXRlIiB0eXBlPSJzb21lLm90aGVyLnNpdGUudHlwZSI+DQotDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3Rlc3QucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3Rlc3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwMTgxOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC90ZXN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSMgDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXMxID0gU3RyaW5nIDENCi1zMiA9IFN0cmluZyAyDQotdXJsMSA9IHJlbGF0aXZlL2luZGV4Lmh0bWwNCi11cmwyID0gaHR0cDovL3NvbWUuc2VydmVyL3Rvb2xzLmh0bWwNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uYXRpdmVUZXN0cy9UZXN0TG9jYWxTeXN0ZW1JbmZvLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uYXRpdmVUZXN0cy9UZXN0TG9jYWxTeXN0ZW1JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmY2NjYmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmF0aXZlVGVzdHMvVGVzdExvY2FsU3lzdGVtSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubmF0aXZlVGVzdHM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSVZvbHVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5Mb2NhbFN5c3RlbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RMb2NhbFN5c3RlbUluZm8gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogVGVzdCB0aGUgbmF0aXZlcwotCSAqLwotCXB1YmxpYyBUZXN0TG9jYWxTeXN0ZW1JbmZvKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJLy8gbW91bnQgcG9pbnQKLSAgICAgICBJVm9sdW1lW10gYSA9IExvY2FsU3lzdGVtSW5mby5nZXRWb2x1bWVzKCk7Ci0gICAgICAgIGlmIChhPT1udWxsKSB0aHJvdyBuZXcgRXhjZXB0aW9uKCJjYW5ub3QgZmluZCBuYXRpdmUgbGlicmFyeSIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kICIrYS5sZW5ndGgrIiBtb3VudCBwb2ludHMuIik7Ci0JCWZvciAoaW50IGkgPTA7IGk8YS5sZW5ndGg7aSsrKXsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIiMiK2krIiAtICIrYVtpXSk7Ci0JCQkKLQkJCUZpbGUgcm9vdCA9IGFbaV0uZ2V0RmlsZSgpOwotCQkJU3RyaW5nIGxhYmVsID0gYVtpXS5nZXRMYWJlbCgpOwotCQkJaWYgKGxhYmVsPT1udWxsKSBsYWJlbD0iTk8gTEFCRUwiOwotCQkJaW50IHR5cGUgPSBhW2ldLmdldFR5cGUoKTsKLQkJCWxvbmcgc2l6ZSA9IExvY2FsU3lzdGVtSW5mby5nZXRGcmVlU3BhY2Uocm9vdCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtPjoiK2xhYmVsKyI6IitnZXRUeXBlKHR5cGUpKyI6IitnZXRTaXplKHNpemUpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKGludCB0eXBlKXsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfRklYRUQgOgotCQkJCXJldHVybiAiVk9MVU1FIEZJWEVEIjsKLQkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9SRU1PVEUgOgotCQkJCXJldHVybiAiVk9MVU1FIFJFTU9URSI7Ci0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfUkVNT1ZBQkxFIDoKLQkJCQlyZXR1cm4gIlZPTFVNRSBSRU1PVkFCTEUiOwotCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX0NEUk9NIDoKLQkJCQlyZXR1cm4gIlZPTFVNRSBDRFJPTSI7CQkJCQotCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX1VOS05PV04gOgotCQkJCXJldHVybiAiVk9MVU1FIFVOS05PV04iOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuICJXUk9ORyBWT0xVTUUgSU5GTyI7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2l6ZShsb25nIHNpemUpewotCQlpZiAoc2l6ZT09TG9jYWxTeXN0ZW1JbmZvLlNJWkVfVU5LTk9XTikgcmV0dXJuICJVTktOT1dOIFNJWkUiOwotCQkKLQkJbG9uZyBrYiA9IHNpemUvKDEwMjQqMTAyNCk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHNpemUrIiAoIitrYisiTUIpIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmVzdGVkZmVhdHVyZXMvQWxsTmVzdGVkVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL0FsbE5lc3RlZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjMzYzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmVzdGVkZmVhdHVyZXMvQWxsTmVzdGVkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm5lc3RlZGZlYXR1cmVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBbGxOZXN0ZWRUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci1wdWJsaWMgQWxsTmVzdGVkVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0Jc3VpdGUuc2V0TmFtZSgiTmVzdGVkIEluc3RhbGwgVGVzdHMiKTsKLQkKLQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0JwotCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RJbnN0YWxsLmNsYXNzKSk7Ci0KLQkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZAotCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsJCi0JCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmVzdGVkZmVhdHVyZXMvVGVzdEluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL1Rlc3RJbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzJkYmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmVzdGVkZmVhdHVyZXMvVGVzdEluc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uZXN0ZWRmZWF0dXJlczsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKLQkgKi8KLQlwdWJsaWMgVGVzdEluc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CQkKLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKLQkJCi0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9Ci0JCQlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbCIpLG51bGwpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci0KLQkJLy8gdmVyaWZ5IHJvb3QgRmVhdHVyZQotCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBwbHVnaW5YTUxGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKAotCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAotCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCS8vIGNsZWFuIHBsdWdpbnMgJiBmZWF0dXJlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihlbnRyaWVzW2ldKTsKLQkJfQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOwotCi0JCS8vIHZlcmlmeSBjaGlsZCBGZWF0dXJlCi0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9Ci0JCQlyZW1vdGVGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOwotCQllbnRyaWVzID0gY2hpbGRGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJcGx1Z2luWE1MRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7Ci0JCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsKLQotCQlmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgY2hpbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwKLQkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCQkvLyBjbGVhbiBwbHVnaW5zCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCX0KLQotCQkvLyBjbGVhbiBmZWF0dXJlcwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RIVFRQU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlTaXRlIHJlbW90ZVNpdGUgPQotCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9IVFRQX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvIiksbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCi0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgicm9vdGZlYXR1cmUuamFyIikpIHsKLQkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydE5vdE51bGwoIkNhbm5vdCBmaW5kIHJvb3RmZWF0dXJlLmphciBvbiBzaXRlIiwgcmVtb3RlRmVhdHVyZSk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci0KLQkJLy8gcm9vdGZlYXR1cmUuamFyIHNob3VsZCBub3QgYmUgaW4gdGhlIGxvY2FsIHNpdGUKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0gbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobG9jYWxGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJyb290ZmVhdHVyZS5qYXIiKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoCi0JCQkiRm91bmQgcm9vdGZlYXR1cmUuamFyIG9uIHRhcmdldCBzaXRlLiBUYXJnZXQgc2l0ZSBmZWF0dXJlIHJlZiBzaG91bGRub3QgY29udGFpbiBKQVIgZmlsZSIsCi0JCQkhZm91bmQpOwotCi0JCS8vIGNoZWNrIHJvb3QKLQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsJCQotCQlGaWxlIHBsdWdpblhNTEZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7Ci0JCWFzc2VydFRydWUoCi0JCQkicGx1Z2luIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBwbHVnaW5YTUxGaWxlLAotCQkJcGx1Z2luWE1MRmlsZS5leGlzdHMoKSk7Ci0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0KLQkJLy8gY2xlYW4gcGx1Z2lucyAmIGZlYXR1cmUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwbHVnaW5OYW1lID0gZW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLQkJCUluc3RhbGxSZWdpc3RyeS51bnJlZ2lzdGVyUGx1Z2luKGVudHJpZXNbaV0pOwotCQl9Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7Ci0KLQkJLy8gdmVyaWZ5IGNoaWxkIEZlYXR1cmUKLQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0KLQkJCXJlbW90ZUZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCWVudHJpZXMgPSBjaGlsZEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCXBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCWFzc2VydFRydWUoCi0JCQkicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgcGx1Z2luRmlsZSwKLQkJCXBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCQlwbHVnaW5YTUxGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOwotCi0JCWZlYXR1cmVGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJKyBjaGlsZEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKAotCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAotCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCS8vIGNsZWFuIHBsdWdpbnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLQkJfQotCi0JCS8vIGNsZWFuIGZlYXR1cmVzCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHRocm93cyBFeGNlcHRpb24gewotLy8KLS8vCQkvLyBjbGVhbnVwIGxvY2FsIGZpbGVzLi4uCi0vLwkJVVJMIGxvY2FsVVJMID0gKChTaXRlTG9jYWwpIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpOwotLy8JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKLS8vCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotLy8KLS8vCQlVUkwgSU5TVEFMTF9TSVRFID0gbnVsbDsKLS8vCQl0cnkgewotLy8JCQlJTlNUQUxMX1NJVEUgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwiKTsKLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8KLS8vCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShJTlNUQUxMX1NJVEUsbnVsbCk7Ci0vLwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLS8vCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLS8vCi0vLwkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApCi0vLwkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7Ci0vLwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoInJvb3RmZWF0dXJlLmphciIpKSB7Ci0vLwkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCByb290ZmVhdHVyZS5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOwotLy8JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0vLwkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPQotLy8JCQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLS8vCi0vLwkJKChDb25maWd1cmVkU2l0ZSlzaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7Ci0vLwkJc2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotLy8KLS8vCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0vLwkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotLy8KLS8vCQlTdHJpbmcgc2l0ZVBhdGggPSBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0vLwkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotLy8JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGVQYXRoLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLS8vCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotLy8KLS8vCQlGaWxlIGZlYXR1cmVGaWxlID0KLS8vCQkJbmV3IEZpbGUoCi0vLwkJCQlzaXRlUGF0aCwKLS8vCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0vLwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLS8vCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotLy8KLS8vCQkvL2NsZWFudXAKLS8vCQlGaWxlIGZpbGUgPQotLy8JCQluZXcgRmlsZSgKLS8vCQkJCXNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQotLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3IKLS8vCQkJCQkrIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0vLwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0vLwkJLy8gY2xlYW4gcGx1Z2lucwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotLy8JCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLS8vCQkJcGx1Z2luRmlsZSA9Ci0vLwkJCQluZXcgRmlsZSgKLS8vCQkJCQlzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCksCi0vLwkJCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0vLwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLS8vCQl9Ci0vLwotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKAotLy8JCQluZXcgRmlsZSgKLS8vCQkJCSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKQotLy8JCQkJCS5nZXRVUkwoKQotLy8JCQkJCS5nZXRGaWxlKCkpKTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9BbGxQYXJzZXJUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL0FsbFBhcnNlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzAxYTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL0FsbFBhcnNlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQWxsUGFyc2VyVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLXB1YmxpYyBBbGxQYXJzZXJUZXN0cyhTdHJpbmcgbmFtZSkgew0KLQlzdXBlcihuYW1lKTsNCi19DQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotCXN1aXRlLnNldE5hbWUoIlBhcnNpbmcgVGVzdHMiKTsNCi0JDQotCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0ZWggdGVzdCBtZXRob2RzIGluIHRlaCBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnDQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZVBhcnNlLmNsYXNzKSk7DQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVBhcnNlLmNsYXNzKSk7CQ0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdENhdGVnb3JpZXMuY2xhc3MpKTsJCQ0KLQkNCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QNCi0JLy9zdWl0ZS5hZGRUZXN0KG5ldyBUZXN0R2V0RmVhdHVyZSgibWV0aG9kVGhhdERvZXNOb3RTdGFydFdpdGh0ZXN0IikpOwkNCi0JDQotCXJldHVybiBzdWl0ZTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0Q2F0ZWdvcmllcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RDYXRlZ29yaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDNjYmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RDYXRlZ29yaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFRlc3RDYXRlZ29yaWVzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQ0KLQkgKi8NCi0JcHVibGljIFRlc3RDYXRlZ29yaWVzKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcmllcygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ4bWxzL3NpdGUxLyIpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUocmVtb3RlVXJsLG51bGwpOw0KLQ0KLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCS8vSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcmllcygpOw0KLQ0KLQkJSUNhdGVnb3J5IGZlYXR1cmVDYXRlZ29yeSA9IGZlYXR1cmVbMF0uZ2V0Q2F0ZWdvcmllcygpWzBdOw0KLQ0KLQkJYXNzZXJ0RXF1YWxzKCJVTUwgdG9vbHMiLCBmZWF0dXJlQ2F0ZWdvcnkuZ2V0TGFiZWwoKSk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyZWRDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInhtbHMvc2l0ZTEvIik7DQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVcmwsbnVsbCk7DQotDQotCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhdCBvcmRlcmVkLT4iICsgY2F0ZWdvcmllc1tpXS5nZXROYW1lKCkpOw0KLQkJfQ0KLQ0KLQkJYXNzZXJ0RXF1YWxzKCJFY2xpcHNlIHRvb2xzIiwgY2F0ZWdvcmllc1sxXS5nZXRMYWJlbCgpKTsNCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNsYXRlZENhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7DQotDQotCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7DQotDQotCQlhc3NlcnRFcXVhbHMoIlJlcXVpcmVkIERyaXZlcnMiLCBjYXRlZ29yaWVzWzBdLmdldExhYmVsKCkpOw0KLQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0RmVhdHVyZVBhcnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdEZlYXR1cmVQYXJzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDIyZWU2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0RmVhdHVyZVBhcnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlcjsNCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5EZWZhdWx0RmVhdHVyZVBhcnNlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5VUkxFbnRyeU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVQYXJzZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDENCi0JICovDQotCXB1YmxpYyBUZXN0RmVhdHVyZVBhcnNlKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVN0cmluZyB4bWxGaWxlID0gInhtbHMvZmVhdHVyZV8xLjAuMC8iOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7DQotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChyZW1vdGVTaXRlLmdldFVSTCgpLCB4bWxGaWxlLCBudWxsKTsNCi0NCi0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOw0KLQkJcmVmLnNldFNpdGUocmVtb3RlU2l0ZSk7DQotCQlyZWYuc2V0VVJMKHVybCk7DQotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7DQotDQotCQlTdHJpbmcgcHJvdiA9IGZlYXR1cmUuZ2V0UHJvdmlkZXIoKTsNCi0JCWFzc2VydEVxdWFscygiT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIsIHByb3YpOw0KLQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUxLnhtbCIpOw0KLQkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOw0KLQkJCXBhcnNlci5pbml0KG5ldyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkoKSk7DQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJCXJlbW90ZUZlYXR1cmUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgTk9UIGJlIHRocm93biIpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMWJpcygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUxYmlzLnhtbCIpOw0KLQkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOw0KLQkJCXBhcnNlci5pbml0KG5ldyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkoKSk7DQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJCXJlbW90ZUZlYXR1cmUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgTk9UIGJlIHRocm93biIpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMigpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUyLnhtbCIpOw0KLQkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOw0KLQkJCXBhcnNlci5pbml0KG5ldyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkoKSk7DQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJCXJlbW90ZUZlYXR1cmUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQl0cnkgew0KLQkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvZmVhdHVyZTMueG1sIik7DQotCQkJRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7DQotCQkJcGFyc2VyLmluaXQobmV3IEZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeSgpKTsNCi0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJCUZlYXR1cmVNb2RlbCByZW1vdGVGZWF0dXJlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQkJcmVtb3RlRmVhdHVyZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7DQotDQotCQkJU3RyaW5nIGNvcHlyaWdodFN0cmluZyA9IHJlbW90ZUZlYXR1cmUuZ2V0Q29weXJpZ2h0TW9kZWwoKS5nZXRVUkwoKS5nZXRGaWxlKCk7DQotCQkJYm9vbGVhbiByZXNvbHZlZCA9IGNvcHlyaWdodFN0cmluZy5pbmRleE9mKFNpdGVNYW5hZ2VyLmdldE9TKCkpICE9IC0xOw0KLQkJCWFzc2VydFRydWUoIkNvcHlyaWdodCBVUkwgbm90IHJlc29sdmVkOiIgKyBjb3B5cmlnaHRTdHJpbmcsIHJlc29sdmVkKTsNCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQl9DQotDQotCS8vIHBhcnNlIHR5cGUNCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQl0cnkgew0KLQkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvZmVhdHVyZTQueG1sIik7DQotCQkJRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7DQotCQkJcGFyc2VyLmluaXQobmV3IEZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeSgpKTsNCi0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJCUZlYXR1cmVNb2RlbCByZW1vdGVGZWF0dXJlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQkJcmVtb3RlRmVhdHVyZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7DQotDQotCQkJVVJMRW50cnlNb2RlbFtdIG1vZGVscyA9IHJlbW90ZUZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJ5TW9kZWxzKCk7DQotCQkJYXNzZXJ0VHJ1ZSgiRGlzY292ZXJ5IG1vZGVsIGlzIG5vdCBhIFdlYiBNb2RlbCIsIG1vZGVsc1swXS5nZXRUeXBlKCk9PUlVUkxFbnRyeS5XRUJfU0lURSk7DQotCQkJVVJMRW50cnlNb2RlbCBjb3B5cmlnaHQgPSByZW1vdGVGZWF0dXJlLmdldENvcHlyaWdodE1vZGVsKCk7DQotCQkJYXNzZXJ0VHJ1ZSgiQ29weXJpZ2h0IG1vZGVsIGlzIG5vdCBhbiBVcGRhdGUgTW9kZWwiLCBjb3B5cmlnaHQuZ2V0VHlwZSgpPT1JVVJMRW50cnkuVVBEQVRFX1NJVEUpOw0KLQkJCQ0KLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RTaXRlUGFyc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0U2l0ZVBhcnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzRjODguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RTaXRlUGFyc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlNpdGVGaWxlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2RlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIFRlc3RTaXRlUGFyc2UgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxDQotCSAqLw0KLQlwdWJsaWMgVGVzdFNpdGVQYXJzZShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInhtbHMvc2l0ZTEvIik7DQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVcmwsbnVsbCk7DQotDQotCQkvL0lGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCS8vSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcmllcygpOw0KLQ0KLQkJU3RyaW5nIHBhdGggPSByZW1vdGVVcmwuZ2V0RmlsZSgpOw0KLQkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwYXRoICsgImluZGV4Lmh0bWwiKSwgbmV3IEZpbGUocGF0aDIpKTsNCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyT2ZGZWF0dXJlcygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoImh0dHAiLCBnZXRIdHRwSG9zdCgpLCBnZXRIdHRwUG9ydCgpLCBidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMiIpKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVSTCxudWxsKTsNCi0NCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCWFzc2VydEVxdWFscyhmZWF0dXJlLmxlbmd0aCwgMik7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGUueG1sIik7DQotCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsNCi0JCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7DQotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOw0KLQkJQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7DQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZS5sZW5ndGggPT0gNik7DQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY2F0ZWdvcmllcyIsIGNhdGVnb3JpZXMubGVuZ3RoID09IDMpOw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFyY2hpdmVzIiwgYXJjaGl2ZXMubGVuZ3RoID09IDApOw0KLQ0KLQkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvIikuZ2V0RmlsZSgpOw0KLQkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJYXNzZXJ0RXF1YWxzKHBhdGggKyAiaW5kZXguaHRtbCIsIHBhdGgyKTsNCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvcmVkZG90LnhtbCIpOw0KLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOw0KLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCUNhdGVnb3J5TW9kZWxbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOw0KLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZXMgPSByZW1vdGVTaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0NCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBmZWF0dXJlcyIsIGZlYXR1cmUubGVuZ3RoID09IDIpOw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNhdGVnb3JpZXMiLCBjYXRlZ29yaWVzLmxlbmd0aCA9PSAxKTsNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAyKTsNCi0NCi0JCVN0cmluZyB2YWxpZGVTdHJpbmcgPSAiVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlIDxjdXJyZW50bHk+IGF2YWlsYWJsZSB2ZXJzaW9ucyBvZiBSZWQgRG90IGZlYXR1cmUuIDxncmVldGluZz5IZWxsbywgd29ybGQhPC9ncmVldGluZz4iOw0KLQkJYXNzZXJ0RXF1YWxzKHZhbGlkZVN0cmluZywgcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpWzBdLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkpOw0KLQ0KLQkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvIikuZ2V0RmlsZSgpOw0KLQkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJYXNzZXJ0RXF1YWxzKHBhdGggKyAiaW5kZXguaHRtbCIsIHBhdGgyKTsNCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvcmVkZG90MS54bWwiKTsNCi0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOw0KLQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsNCi0JCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7DQotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7DQotDQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7DQotCQlDYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsNCi0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7DQotDQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlLmxlbmd0aCA9PSAyKTsNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjYXRlZ29yaWVzIiwgY2F0ZWdvcmllcy5sZW5ndGggPT0gMSk7DQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMik7DQotDQotCQlTdHJpbmcgdmFsaWRlU3RyaW5nID0gIlRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSA8Y3VycmVudGx5PiBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLiI7DQotCQlhc3NlcnRFcXVhbHModmFsaWRlU3RyaW5nLCByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKClbMF0uZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldEFubm90YXRpb24oKSk7DQotDQotCQlTdHJpbmcgcGF0aCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy8iKS5nZXRGaWxlKCk7DQotCQlTdHJpbmcgcGF0aDIgPSByZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRVUkwoKS5nZXRGaWxlKCk7DQotCQlhc3NlcnRFcXVhbHMocGF0aCArICJpbmRleC5odG1sIiwgcGF0aDIpOw0KLQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkNCgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJTaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sIik7DQotCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsNCi0JCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7DQotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOw0KLQkJLy9DYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsNCi0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7DQotDQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlLmxlbmd0aCA9PSAyKTsNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAzKTsNCi0NCi0JCVVSTCBwYXRoMSA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJTaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIiKTsNCi0JCVVSTCB1cmwxID0gZmVhdHVyZVswXS5nZXRVUkwoKTsNCi0JCWFzc2VydEVxdWFscyhwYXRoMSwgdXJsMSk7DQotCQlVUkwgcGF0aDIgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9oZWxwLmphciIpOw0KLQkJYXNzZXJ0RXF1YWxzKHBhdGgyLCBhcmNoaXZlc1swXS5nZXRVUkwoKSk7DQotDQotCQlTdHJpbmcgcGF0aCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJTaXRlVVJMVGVzdC9kYXRhL2luZm8vIikuZ2V0RmlsZSgpOw0KLQkJU3RyaW5nIHBhdGgzID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJYXNzZXJ0RXF1YWxzKHBhdGggKyAic2l0ZUluZm8uaHRtbCIsIHBhdGgzKTsNCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTIueG1sIik7DQotCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsNCi0JCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7DQotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZVJlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOw0KLQkJLy9DYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsNCi0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7DQotDQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlUmVmLmxlbmd0aCA9PSAxKTsNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAwKTsNCi0NCi0JCXRyeSB7DQotCQkJKChGZWF0dXJlUmVmZXJlbmNlKSBmZWF0dXJlUmVmWzBdKS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJVGhyb3dhYmxlIGUxID0gZS5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKTsNCi0JCQlpZiAoZTEuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIm5vdC1lY2xpcHNlIikgPT0gLTEpIHsNCi0JCQkJdGhyb3cgZTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGU0LnhtbCIpOw0KLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOw0KLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCS8vQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7DQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZVJlZi5sZW5ndGggPT0gMik7DQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMCk7DQotDQotCQl0cnkgew0KLQkJCSgoRmVhdHVyZVJlZmVyZW5jZSkgZmVhdHVyZVJlZlswXSkuZ2V0RmVhdHVyZShudWxsKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVRocm93YWJsZSBlMSA9IGUuZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCk7DQotCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsNCi0JCQlpZiAobXNnLmluZGV4T2YoIl8xLjAuMC5qYXIvZmVhdHVyZS54bWwiKSA9PSAtMSkgew0KLQkJCQl0aHJvdyBlOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VVbmtub3duQ2F0ZWdvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTMueG1sIik7DQotCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsNCi0JCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7DQotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZVJlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOw0KLQkJSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9ICgoU2l0ZUZlYXR1cmVSZWZlcmVuY2UpIGZlYXR1cmVSZWZbMF0pLmdldENhdGVnb3JpZXMoKTsNCi0JCWFzc2VydFRydWUoY2F0ZWdvcmllcy5sZW5ndGggPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQl0cnkgew0KLQkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTcueG1sIik7DQotCQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotCQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsNCi0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7DQotDQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7DQotCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCXRyeSB7DQotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlOC54bWwiKTsNCi0JCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsNCi0JCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOw0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7DQotCQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkOSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGU5LnhtbCIpOw0KLQkJCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOw0KLQkJCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7DQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQxMCgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGUxMC54bWwiKTsNCi0JCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsNCi0JCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOw0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7DQotCQkJcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBtb2RlbHMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCWFzc2VydEVxdWFscygiSW52YWxpZCB2ZXJzaW9uZWQgaWRlbnRpZmllciIsIG1vZGVsc1swXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpLCAib3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlIik7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVjb25jaWxpYXRpb24vQWxsUmVjb25jaWxpYXRpb25UZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVjb25jaWxpYXRpb24vQWxsUmVjb25jaWxpYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjlkMTdhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL0FsbFJlY29uY2lsaWF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlY29uY2lsaWF0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIEFQSSB0ZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQWxsUmVjb25jaWxpYXRpb25UZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWxsUmVjb25jaWxpYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogTGlzdCBvZiBBUEkgdGVzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJBUEkgVGVzdHMiKTsKLQotCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmNsYXNzKSk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL1Rlc3RTaXRlUmVjb25jaWxpYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL1Rlc3RTaXRlUmVjb25jaWxpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmZTQ3OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9UZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVjb25jaWxpYXRpb247Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNpdGVSZWNvbmNpbGlhdGlvbiBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0KLQkKLQotCS8qKgotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdFNpdGVSZWNvbmNpbGlhdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29uZmlnU2l0ZShpbnQgcG9saWN5LCBVUkwgdXJsLFN0cmluZ1tdIGxpc3RPZlBsdWdpbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgeG1sRmlsZSA9ICgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKHhtbEZpbGUpKTsJCQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwotCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQlJU2l0ZVBvbGljeSBwMSA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShwb2xpY3ksIGxpc3RPZlBsdWdpbnMpOwkKLQkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHVybCxwMSk7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzMSk7CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29uZmlnU2l0ZShVUkwgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZ2V0IG5ldyBjb25maWcgb2JqZWN0Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHVybCk7Ci0JCWFzc2VydE5vdE51bGwoIlVuYWJsZSB0byBmaW5kIHNpdGUgZW50cnk6Iit1cmwsczEpOwotCQljZmlnLnVuY29uZmlndXJlU2l0ZShzMSk7Ci0JCWNmaWcuc2F2ZSgpOwotCX0JCi0JLyoqCi0JICogU2l0ZSAxIGNvbnRhaW5zIGEgZmVhdHVyZSB3aGljaCBuZWVkcyBhIHBsdWdpbiB0YWh0IGlzIG5vdCBvbiB0aGUgcGF0aCB3aGVuIHdlIHN0YXJ0Ci0JICogaXQgd2lsbCBuZXZlciBiZSBjb25maWd1cmVkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpdGVJbmNsdWRlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlpbnQgcG9saWN5ICA9IElTaXRlUG9saWN5LlVTRVJfSU5DTFVERTsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLG51bGwsZGF0YVBhdGgrInJlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvIik7Ci0JCVN0cmluZ1tdIHBsdWdpbnMgPSBuZXcgU3RyaW5nW117fTsKLQkJYWRkQ29uZmlnU2l0ZShwb2xpY3ksdXJsLCBwbHVnaW5zKTsKLQotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCSgoU2l0ZUxvY2FsKWxvY2FsKS5zZXRTdGFtcCgwKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gbmV3U2l0ZXMgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlJQ29uZmlndXJlZFNpdGUgbmV3U2l0ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChuZXdTaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCksdXJsKSl7Ci0JCQkJbmV3U2l0ZSA9IG5ld1NpdGVzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmV3U2l0ZT09bnVsbCkgZmFpbCgiU2l0ZSBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbiIpOwotCQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSBuZXdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwkJCi0JCXJlZiA9ICgoQ29uZmlndXJlZFNpdGUpbmV3U2l0ZSkuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHVuY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsJCQotCQkKLQkJcmVtb3ZlQ29uZmlnU2l0ZSh1cmwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaXRlRXhjbHVkZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCWludCBwb2xpY3kgID0gSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFOwotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsbnVsbCxkYXRhUGF0aCsicmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS8iKTsKLQkJU3RyaW5nW10gcGx1Z2lucyA9IG5ldyBTdHJpbmdbXXt9OwotCQlhZGRDb25maWdTaXRlKHBvbGljeSx1cmwsIHBsdWdpbnMpOwotCQkKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkoKFNpdGVMb2NhbClsb2NhbCkuc2V0U3RhbXAoMCk7CQkKLQkJSUNvbmZpZ3VyZWRTaXRlW10gbmV3U2l0ZXMgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlJQ29uZmlndXJlZFNpdGUgbmV3U2l0ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChuZXdTaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCksdXJsKSl7Ci0JCQkJbmV3U2l0ZSA9IG5ld1NpdGVzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmV3U2l0ZT09bnVsbCkgZmFpbCgiU2l0ZSBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbiIpOwotCQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSBuZXdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwkJCi0JCXJlZiA9ICgoQ29uZmlndXJlZFNpdGUpbmV3U2l0ZSkuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHVuY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsJCQkJCi0JCXJlbW92ZUNvbmZpZ1NpdGUodXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBTaXRlIDIgY29udGFpbnMgYSBmZWF0dXJlIHdoaWNoIG5lZWRzIGEgcGx1Z2luIHRhaHQgaXMgb24gdGhlIHBhdGggd2hlbiB3ZSBzdGFydAotCSAqIGl0IHdpbGwgYmUgY29uZmlndXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaXRlSW5jbHVkZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCWludCBwb2xpY3kgID0gSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFOwotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsbnVsbCxkYXRhUGF0aCsicmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi8iKTsKLQkJU3RyaW5nW10gcGx1Z2lucyA9IG5ldyBTdHJpbmdbXXt9OwotCQlhZGRDb25maWdTaXRlKHBvbGljeSx1cmwsIHBsdWdpbnMpOwotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCSgoU2l0ZUxvY2FsKWxvY2FsKS5zZXRTdGFtcCgwKTsJCQotCQlJQ29uZmlndXJlZFNpdGVbXSBuZXdTaXRlcyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBuZXdTaXRlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG5ld1NpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKSx1cmwpKXsKLQkJCQluZXdTaXRlID0gbmV3U2l0ZXNbaV07Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXdTaXRlPT1udWxsKSBmYWlsKCJTaXRlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uIik7Ci0JCQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IG5ld1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7Ci0JCXJlZiA9ICgoQ29uZmlndXJlZFNpdGUpbmV3U2l0ZSkuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHVuY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsKLQkJCi0JCXJlbW92ZUNvbmZpZ1NpdGUodXJsKTsKLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpdGVFeGNsdWRlMigpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJaW50IHBvbGljeSAgPSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREU7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIixudWxsLGRhdGFQYXRoKyJyZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyLyIpOwotCQlTdHJpbmdbXSBwbHVnaW5zID0gbmV3IFN0cmluZ1tde307Ci0JCWFkZENvbmZpZ1NpdGUocG9saWN5LHVybCwgcGx1Z2lucyk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJKChTaXRlTG9jYWwpbG9jYWwpLnNldFN0YW1wKDApOwkJCi0JCUlDb25maWd1cmVkU2l0ZVtdIG5ld1NpdGVzID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIG5ld1NpdGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwobmV3U2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLHVybCkpewotCQkJCW5ld1NpdGUgPSBuZXdTaXRlc1tpXTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5ld1NpdGU9PW51bGwpIGZhaWwoIlNpdGUgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb24iKTsKLQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmID0gbmV3U2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsKLQkJcmVmID0gKChDb25maWd1cmVkU2l0ZSluZXdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwotCi0JCXJlbW92ZUNvbmZpZ1NpdGUodXJsKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL0FsbFJlZ3VsYXJJbnN0YWxsVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL0FsbFJlZ3VsYXJJbnN0YWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1N2I1NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9BbGxSZWd1bGFySW5zdGFsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxSZWd1bGFySW5zdGFsbFRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi1wdWJsaWMgQWxsUmVndWxhckluc3RhbGxUZXN0cyhTdHJpbmcgbmFtZSkgew0KLQlzdXBlcihuYW1lKTsNCi19DQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgSW5zdGFsbCBUZXN0cyIpOw0KLQkNCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcNCi0NCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RJbnN0YWxsLmNsYXNzKSk7DQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0SW5zdGFsbFVSTFNJdGVYTUwuY2xhc3MpKTsJDQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U3BhY2VJbkluc3RhbGwuY2xhc3MpKTsJDQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0R2V0RmVhdHVyZS5jbGFzcykpOw0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEV4ZWN1dGFibGVJbnN0YWxsLmNsYXNzKSk7CQ0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwuY2xhc3MpKTsJCQ0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdERhdGFFbnRyeUluc3RhbGwuY2xhc3MpKTsNCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RMb2NhbFNpdGUuY2xhc3MpKTsJCQ0KLQkNCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QNCi0JLy9zdWl0ZS5hZGRUZXN0KG5ldyBUZXN0R2V0RmVhdHVyZSgibWV0aG9kVGhhdERvZXNOb3RTdGFydFdpdGh0ZXN0IikpOwkNCi0JDQotCXJldHVybiBzdWl0ZTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL011bHRpcGxlVGVzdExvY2FsU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvTXVsdGlwbGVUZXN0TG9jYWxTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzI1YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvTXVsdGlwbGVUZXN0TG9jYWxTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZVRlc3RMb2NhbFNpdGUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLXB1YmxpYyBNdWx0aXBsZVRlc3RMb2NhbFNpdGUoU3RyaW5nIG5hbWUpIHsNCi0Jc3VwZXIobmFtZSk7DQotfQ0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQlzdWl0ZS5zZXROYW1lKCJNdWx0aXBsZSBUZXN0IExvY2FsIFNpdGUiKTsNCi0JDQotCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0ZWggdGVzdCBtZXRob2RzIGluIHRlaCBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnDQotCQ0KLQlmb3IoaW50IGk9MDsgaTw1MDsgaSsrKXsNCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0TG9jYWxTaXRlLmNsYXNzKSk7DQotCX0NCi0JDQotCXJldHVybiBzdWl0ZTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3REYXRhRW50cnlJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RGF0YUVudHJ5SW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDIwM2JjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3REYXRhRW50cnlJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0RGF0YUVudHJ5SW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDENCi0JICovDQotCXB1YmxpYyBUZXN0RGF0YUVudHJ5SW5zdGFsbChTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFdpdGggc2l0ZS54bWwNCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3REYXRhRW50cnlTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFudXAgdGFyZ2V0IA0KLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0JCQ0KLQkJVVJMIG5ld1VSTCA9bmV3IEZpbGUoZGF0YVBhdGggKyAiZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvc2l0ZS54bWwiKS50b1VSTCgpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3VVJMLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOw0KLQkJDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7DQotCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7DQotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsNCi0NCi0JCQkvLyB2ZXJpZnkNCi0JCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7DQotCQkJSU5vblBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQkJCWFzc2VydFRydWUoIm5vIGRhdGEgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0JCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCk7DQotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpK0ZpbGUuc2VwYXJhdG9yKyBwbHVnaW5OYW1lKTsNCi0JCQlhc3NlcnRUcnVlKCJkYXRhIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQkJfSANCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0NCi0NCi0JfQ0KLQkNCi0JDQotCS8qKg0KLQkgKiBXaXRoIHNpdGUueG1sDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RGF0YUVudHJ5U2l0ZVBhY2thZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFudXAgdGFyZ2V0IA0KLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0JCQ0KLQkJVVJMIG5ld1VSTCA9bmV3IEZpbGUoZGF0YVBhdGggKyAiZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvc2l0ZS54bWwiKS50b1VSTCgpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3VVJMLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOw0KLQkJDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7DQotCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7DQotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsNCi0NCi0JCQkvLyB2ZXJpZnkNCi0JCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7DQotCQkJSU5vblBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQkJCWFzc2VydFRydWUoIm5vIGRhdGEgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0JCQllbnRyaWVzWzBdLmdldElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKStGaWxlLnNlcGFyYXRvcisgIm5vbmRhdGEiK0ZpbGUuc2VwYXJhdG9yKyJmaWxlMS56aXAiKTsNCi0JCQlhc3NlcnRUcnVlKCJEYXRhIGZpbGUgaW5zaWRlIHRoZSBqYXIgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrcGx1Z2luRmlsZSwgcGx1Z2luRmlsZS5leGlzdHMoKSk7DQotCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKStGaWxlLnNlcGFyYXRvcisgImZpbGUuemlwIik7DQotCQkJYXNzZXJ0VHJ1ZSgiRGF0YSBmaWxlIG91dHNpZGUgdGhlIGphciBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsNCi0JCQkNCi0JCX0gDQotCQkNCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0NCi0NCi0JfQkNCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVJbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDdjMTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0RXhlY3V0YWJsZUluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxDQotCSAqLw0KLQlwdWJsaWMgVGVzdEV4ZWN1dGFibGVJbnN0YWxsKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQkNCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsNCi0JCQ0KLQkJLy9jbGVhbnVwIHRhcmdldCANCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CQkNCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7DQotCQkNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVELG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZW1vdGVGZWF0dXJlUmVmZXJlbmNlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IHJlbW90ZUZlYXR1cmVSZWZlcmVuY2VbMF0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsNCi0JCWFzc2VydE5vdE51bGwocmVtb3RlRmVhdHVyZSk7DQotCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOwkJDQotCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLG51bGwsbnVsbCk7DQotCQkNCi0JCS8vIHZlcmlmeQ0KLQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOw0KLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsKGVudHJpZXMhPW51bGwgJiYgZW50cmllcy5sZW5ndGghPTApKTsNCi0JCVN0cmluZyBwbHVnaW5OYW1lPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSxTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgrcGx1Z2luTmFtZSk7DQotCQlpZiAoTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoInVzIikgIT0gLTEpDQotCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIscGx1Z2luRmlsZS5leGlzdHMoKSk7DQotDQotCQlGaWxlIGZlYXR1cmVGaWxlID0gbmV3IEZpbGUoc2l0ZSxTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCtyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSxmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5OiIrZmVhdHVyZUZpbGUsZmVhdHVyZUZpbGUuaXNEaXJlY3RvcnkoKSk7DQotDQotCQkNCi0JCUZpbGUgZmVhdHVyZUZpbGVYTUwgPSBuZXcgRmlsZShzaXRlLFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIK3JlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkrRmlsZS5zZXBhcmF0b3IrImZlYXR1cmUueG1sIik7DQotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiBubyBmZWF0dXJlLnhtbCIsZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOw0KLQ0KLQkJLy9jbGVhbnVwIHRhcmdldCANCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOw0KLQkJDQotCX0NCi0NCi19DQotDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzg5YjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxDQotCSAqLw0KLQlwdWJsaWMgVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBXaXRoIHNpdGUueG1sDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZVBhY2thZ2VFeGVjdXRhYmxlRmVhdHVyZVNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgIA0KLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0JCQ0KLQkJVVJMIG5ld1VSTCA9IG5ldyBGaWxlKGRhdGFQYXRoICsgIkV4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3NpdGUueG1sIikudG9VUkwoKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsNCi0JCQ0KLQkJLy8gYXQgbGVhc3Qgb25lIGV4ZWN1dGFibGUgZmVhdHVyZSBhbmQgb24gcGFja2FnZWQNCi0JCWJvb2xlYW4gZXhlY0ZlYXR1cmUgPSBmYWxzZTsNCi0JCWJvb2xlYW4gcGFja0ZlYXR1cmUgPSBmYWxzZTsNCi0NCi0JCWlmIChmZWF0dXJlc1JlZi5sZW5ndGg9PTApIGZhaWwgKCJubyBmZWF0dXJlIGZvdW5kIik7DQotCQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgew0KLQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7CQkJDQotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsNCi0JCQkNCi0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHBhY2tGZWF0dXJlID0gdHJ1ZTsNCi0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcikgZXhlY0ZlYXR1cmUgPSB0cnVlOw0KLQ0KLQkJCS8vIHZlcmlmeQ0KLQkJCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7DQotCQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsNCi0JCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrcGx1Z2luRmlsZSwgcGx1Z2luRmlsZS5leGlzdHMoKSk7DQotDQotCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK2ZlYXR1cmVGaWxlLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotDQotCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7DQotCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseTogbm8gZmVhdHVyZS54bWwiLCBmZWF0dXJlRmlsZVhNTC5leGlzdHMoKSk7DQotCQl9DQotDQotCQlpZiAoIWV4ZWNGZWF0dXJlICYmICFwYWNrRmVhdHVyZSl7DQotCQkJZmFpbCgiY2Fubm90IGZpbmQgb25lIGV4ZWN1dGFibGUgYW5kIG9uZSBwYWNrYWdlIGZlYXR1cmUgb24gdGVoIHNpdGUiKTsNCi0JCX0NCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0NCi0NCi0JfQ0KLQkNCi0JDQotCS8qKg0KLQkgKiBXaXRob3V0IHNpdGUueG1sDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZU5vU2l0ZVhNTFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOw0KLQkJDQotCQlVUkwgbmV3VVJMID0gbmV3IEZpbGUoZGF0YVBhdGggKyAiRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS8iKS50b1VSTCgpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3VVJMLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOw0KLQkJDQotCQkvLyBhdCBsZWFzdCBvbmUgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBvbiBwYWNrYWdlZA0KLQkJYm9vbGVhbiBleGVjRmVhdHVyZSA9IGZhbHNlOw0KLQkJYm9vbGVhbiBwYWNrRmVhdHVyZSA9IGZhbHNlOw0KLQ0KLQkJaWYgKGZlYXR1cmVzUmVmLmxlbmd0aD09MCkgZmFpbCAoIm5vIGZlYXR1cmUgZm91bmQiKTsNCi0JDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7DQotCQkJdHJ5IHsNCi0JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsNCi0JCQkJVGhyb3dhYmxlIGUxID0gZS5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKTsNCi0JCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwnLycpOw0KLQkJCQlpZiAobXNnLmluZGV4T2YoIkNWUy9mZWF0dXJlLnhtbCIpPT0tMSl7DQotCQkJCQl0aHJvdyBlOw0KLQkJCQl9CQkJCQ0KLQkJCX0NCi0JCQlpZiAocmVtb3RlRmVhdHVyZSE9bnVsbCl7DQotCQkJCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7DQotCQkJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsbnVsbCwgbnVsbCk7DQotCQkJCQ0KLQkJCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHBhY2tGZWF0dXJlID0gdHJ1ZTsNCi0JCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIpIGV4ZWNGZWF0dXJlID0gdHJ1ZTsNCi0JDQotCQkJCS8vIHZlcmlmeQ0KLQkJCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7DQotCQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsNCi0JCQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQkJCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7DQotCQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOw0KLQkJCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrcGx1Z2luRmlsZSwgcGx1Z2luRmlsZS5leGlzdHMoKSk7DQotCQ0KLQkJCQlGaWxlIGZlYXR1cmVGaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK2ZlYXR1cmVGaWxlLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotCQ0KLQkJCQlGaWxlIGZlYXR1cmVGaWxlWE1MID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IgKyAiZmVhdHVyZS54bWwiKTsNCi0JCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseTogbm8gZmVhdHVyZS54bWwiLCBmZWF0dXJlRmlsZVhNTC5leGlzdHMoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKCFleGVjRmVhdHVyZSAmJiAhcGFja0ZlYXR1cmUpew0KLQkJCWZhaWwoImNhbm5vdCBmaW5kIG9uZSBleGVjdXRhYmxlIGFuZCBvbmUgcGFja2FnZSBmZWF0dXJlIG9uIHRlaCBzaXRlIik7DQotCQl9DQotDQotCQkvL2NsZWFudXAgdGFyZ2V0IA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotDQotDQotCX0NCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RHZXRGZWF0dXJlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0R2V0RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNlNjg5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RHZXRGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotDQotcHVibGljIGNsYXNzIFRlc3RHZXRGZWF0dXJlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0NCi0JLyoqDQotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkNCi0JICovDQotCXB1YmxpYyBUZXN0R2V0RmVhdHVyZShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsNCi0JCQ0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlpZiAocmVtb3RlRmVhdHVyZXM9PW51bGwgfHwgcmVtb3RlRmVhdHVyZXMubGVuZ3RoPT0wKSBmYWlsKCJObyBmZWF0dXJlIGF2YWlsYWJsZSBmb3IgdGVzdGluZyIpOw0KLQkJZm9yIChpbnQgaT0wO2k8cmVtb3RlRmVhdHVyZXMubGVuZ3RoO2krKyl7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJmZWF0dXJlOiIrcmVtb3RlRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7DQotCQl9DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVIVFRQU2l0ZSgpIHRocm93cyBFeGNlcHRpb257IA0KLQkJDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZW1vdGVGZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCWlmIChyZW1vdGVGZWF0dXJlcz09bnVsbCB8fCByZW1vdGVGZWF0dXJlcy5sZW5ndGg9PTApIGZhaWwoIk5vIGZlYXR1cmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nIik7CQkNCi0JCWZvciAoaW50IGk9MDtpPHJlbW90ZUZlYXR1cmVzLmxlbmd0aDtpKyspew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmVhdHVyZToiK3JlbW90ZUZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0SW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQ4MWRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFRF9GRUFUVVJFX1RZUEUgPSAicGFja2FnZWQiOyAvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciB7DQotDQotCQlwdWJsaWMgYm9vbGVhbiBub3RpZmllZCA9IGZhbHNlOw0KLQ0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQkJbm90aWZpZWQgPSB0cnVlOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aWZpZWQgRGVmYXVsdEZlYXR1cmUgSW5zdGFsbGVkIik7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl9Ow0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl9Ow0KLQ0KLQkJcHVibGljIGJvb2xlYW4gaXNOb3RpZmllZCgpIHsNCi0JCQlyZXR1cm4gbm90aWZpZWQ7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQ0KLQkgKi8NCi0JcHVibGljIFRlc3RJbnN0YWxsKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElGZWF0dXJlIGdldEZlYXR1cmUxKElTaXRlIHNpdGUpDQotCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOw0KLQkJcmVmLnNldFNpdGUoc2l0ZSk7DQotCQlyZWYuc2V0VVJMU3RyaW5nKCJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiKTsNCi0JCXJlZi5zZXRUeXBlKGdldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkpOw0KLQkJcmVmLnJlc29sdmUoc2l0ZS5nZXRVUkwoKSwgbnVsbCk7DQotCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobnVsbCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGdldEZlYXR1cmUxKHJlbW90ZVNpdGUpOw0KLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOw0KLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7DQotDQotCQkvLyB2ZXJpZnkNCi0JCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOw0KLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQkJRmlsZSBwbHVnaW5YTUxGaWxlID0NCi0JCQluZXcgRmlsZSgNCi0JCQkJc2l0ZSwNCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsNCi0JCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsNCi0NCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlzaXRlLA0KLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSA0KLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCWFzc2VydFRydWUoDQotCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLA0KLQkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsNCi0JCS8vY2xlYW51cA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsNCi0NCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0SFRUUFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7DQotDQotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkNCi0JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgc2l0ZSIpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChmZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJmZWF0dXJlczIuamFyIikpIHsNCi0JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWFzc2VydE5vdE51bGwoIkNhbm5vdCBmaW5kIGZlYXR1cmUyLmphciBvbiBzaXRlIiwgcmVtb3RlRmVhdHVyZSk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7DQotCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsNCi0NCi0JCS8vIGZlYXR1cmUyLmphciBzaG91bGQgbm90IGJlIGluIHRoZSBsb2NhbCBzaXRlDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPSBsb2NhbFNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCkNCi0JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsNCi0NCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChsb2NhbEZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImZlYXR1cmVzMi5qYXIiKSkgew0KLQkJCQlmb3VuZCA9IHRydWU7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWFzc2VydFRydWUoDQotCQkJIkZvdW5kIGZlYXR1cmUyLmphciBvbiB0YXJnZXQgc2l0ZS4gVGFyZ2V0IHNpdGUgZmVhdHVyZSByZWYgc2hvdWxkbm90IGNvbnRhaW4gSkFSIGZpbGUiLA0KLQkJCSFmb3VuZCk7DQotDQotCQkvLyBjaGVjaw0KLQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQ0KLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7DQotCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsNCi0NCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlzaXRlLA0KLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSA0KLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotDQotCQkvL2xvY2FsU2l0ZS5zYXZlKCk7DQotDQotCQkvL2NsZWFudXANCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGNsZWFudXAgbG9jYWwgZmlsZXMuLi4NCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOw0KLQ0KLQkJVVJMIElOU1RBTExfU0lURSA9IG51bGw7DQotCQl0cnkgew0KLQkJCUlOU1RBTExfU0lURSA9DQotCQkJCW5ldyBVUkwoImh0dHAiLCBnZXRIdHRwSG9zdCgpLCBnZXRIdHRwUG9ydCgpLCBidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMiIpKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJZmFpbChlLnRvU3RyaW5nKCkpOw0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShJTlNUQUxMX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7DQotDQotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkNCi0JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgc2l0ZSIpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChmZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJoZWxwRmVhdHVyZS5qYXIiKSkgew0KLQkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgaGVscC5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOw0KLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0NCi0JCQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCk7DQotCQlzaXRlLmFkZENvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsNCi0NCi0JCSgoQ29uZmlndXJlZFNpdGUpc2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOw0KLQkJc2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOw0KLQ0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOw0KLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQ0KLQkJU3RyaW5nIHNpdGVQYXRoID0gc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZVBhdGgsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOw0KLQkJaWYgKExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKS5pbmRleE9mKCJmciIpICE9IC0xKQ0KLQkJCWFzc2VydFRydWUoInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCXNpdGVQYXRoLA0KLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSA0KLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotDQotCQkvL2NsZWFudXANCi0JCUZpbGUgZmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCXNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQ0KLQkJCQkJKyBGaWxlLnNlcGFyYXRvcg0KLQkJCQkJKyBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSA0KLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7DQotCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihlbnRyaWVzWzBdKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKA0KLQkJCW5ldyBGaWxlKA0KLQkJCQkoKEluc3RhbGxDb25maWd1cmF0aW9uKSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkNCi0JCQkJCS5nZXRVUkwoKQ0KLQkJCQkJLmdldEZpbGUoKSkpOw0KLQ0KLQkJc2l0ZS5yZW1vdmVDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7DQotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBoYXNuJ3QgcmVjZWl2ZWQgbm90aWZpY2F0aW9uIiwgbGlzdGVuZXIuaXNOb3RpZmllZCgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZVNpdGVXaXRob3V0U2l0ZVhNTCgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsNCi0JCUlDb25maWd1cmVkU2l0ZSBsb2NhbFNpdGUgPQ0KLQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7DQotDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gbG9jYWxTaXRlLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJaWYgKGZlYXR1cmVzLmxlbmd0aCA9PSAwKQ0KLQkJCWZhaWwoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gZmVhdHVyZSwgc2hvdWxkIG5vdCBjb250YWluIGFuIFhNTCBmaWxlIGJ1dCBmZWF0dXJlcyBzaG91bGQgYmUgZm91bmQgYW55d2F5IGJ5IHBhcnNpbmciKTsNCi0JCWlmIChsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldEFyY2hpdmVzKCkubGVuZ3RoID09IDApDQotCQkJZmFpbCgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBhcmNoaXZlcywgc2hvdWxkIG5vdCBjb250YWluIGFuIFhNTCBmaWxlIGJ1dCBhcmNoaXZlcyBzaG91bGQgYmUgZm91bmQgYW55d2F5IGJ5IHBhcnNpbmciKTsNCi0NCi0JCS8vY2xlYW51cA0KLQkJRmlsZSBmaWxlID0NCi0JCQluZXcgRmlsZSgNCi0JCQkJbG9jYWxTaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkNCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3INCi0JCQkJCSsgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgNCi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOw0KLQkJZmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpDQotCQkJCQkrIEZpbGUuc2VwYXJhdG9yDQotCQkJCQkrIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSA0KLQkJCQkJKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNiIpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOw0KLQkJZmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpDQotCQkJCQkrIEZpbGUuc2VwYXJhdG9yDQotCQkJCQkrIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSA0KLQkJCQkJKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMCIpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOw0KLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7DQotDQotCQl0cnkgew0KLQkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iKSxudWxsKTsNCi0JCQlmYWlsKCJUaGUgc2l0ZSBjb250YWlucyBzaXRlLnhtbC4uLiBpdCBzaG91bGQgYmUgYW4gSFRUUCBzaXRlIHdpdGhvdXQgYW4gWE1MIGZpbGUiKTsJCQkNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCS8vIGV4cGVjdGVkDQotCQl9DQotDQotCX0NCi0NCi0vLwkvKioNCi0vLwkqIA0KLS8vCSovDQotLy8JcHJpdmF0ZSBGZWF0dXJlIGNyZWF0ZVBhY2thZ2VkRmVhdHVyZShVUkwgdXJsLCBJU2l0ZSBzaXRlKQ0KLS8vCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotLy8JCVN0cmluZyBwYWNrYWdlZEZlYXR1cmVUeXBlID0gSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEU7DQotLy8JCUZlYXR1cmUgcmVzdWx0ID0gbnVsbDsNCi0vLwkJaWYgKHBhY2thZ2VkRmVhdHVyZVR5cGUgIT0gbnVsbCkgew0KLS8vCQkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPQ0KLS8vCQkJCUZlYXR1cmVUeXBlRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEZhY3RvcnkocGFja2FnZWRGZWF0dXJlVHlwZSk7DQotLy8JCQlyZXN1bHQgPSAoRmVhdHVyZSkgZmFjdG9yeS5jcmVhdGVGZWF0dXJlKHVybCwgc2l0ZSk7DQotLy8JCX0NCi0vLwkJcmV0dXJuIHJlc3VsdDsNCi0vLwl9DQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpIHsNCi0JCVN0cmluZyBwbHVnaW5JRCA9DQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi4iOw0KLQkJcmV0dXJuIHBsdWdpbklEICsgUEFDS0FHRURfRkVBVFVSRV9UWVBFOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RJbnN0YWxsVVJMU0l0ZVhNTC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGxVUkxTSXRlWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODJiYzguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGxVUkxTSXRlWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuKjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEluc3RhbGxVUkxTSXRlWE1MIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRURfRkVBVFVSRV9UWVBFID0gInBhY2thZ2VkIjsgLy8kTk9OLU5MUy0xJAkNCi0NCi0JcHVibGljIGNsYXNzIExpc3RlbmVyIGltcGxlbWVudHMgSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIHsNCi0NCi0JCXB1YmxpYyBib29sZWFuIG5vdGlmaWVkID0gZmFsc2U7DQotDQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlSW5zdGFsbGVkKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCQlub3RpZmllZCA9IHRydWU7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmllZCBEZWZhdWx0RmVhdHVyZSBJbnN0YWxsZWQiKTsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVSZW1vdmVkKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVDb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCX0NCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJfQ0KLQ0KLQkJcHVibGljIGJvb2xlYW4gaXNOb3RpZmllZCgpIHsNCi0JCQlyZXR1cm4gbm90aWZpZWQ7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQ0KLQkgKi8NCi0JcHVibGljIFRlc3RJbnN0YWxsVVJMU0l0ZVhNTChTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRGZWF0dXJlMShJU2l0ZSBzaXRlKQ0KLQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7DQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsNCi0JCXJlZi5zZXRTaXRlKHNpdGUpOw0KLQkJcmVmLnNldFVSTFN0cmluZygiZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIik7DQotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7DQotCQlyZWYucmVzb2x2ZShzaXRlLmdldFVSTCgpLCBudWxsKTsNCi0JCXJldHVybiByZWYuZ2V0RmVhdHVyZShudWxsKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZVNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCUlTaXRlIHJlbW90ZVNpdGUgPQ0KLQkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCBTaXRlLlNJVEVfWE1MKSx0cnVlLG51bGwpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGdldEZlYXR1cmUxKHJlbW90ZVNpdGUpOw0KLQkJVVJMIHVybCA9IFRBUkdFVF9GSUxFX1NJVEU7DQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7DQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIGZpbGUubWtkaXJzKCk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHVybCx0cnVlLG51bGwpOw0KLQkJcmVtb3ZlKHJlbW90ZUZlYXR1cmUsbG9jYWxTaXRlKTsNCi0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOw0KLQ0KLQkJLy8gdmVyaWZ5DQotCQlTdHJpbmcgc2l0ZSA9IFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpOw0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7DQotCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luRmlsZS5leGlzdHMoKSk7DQotCQlGaWxlIHBsdWdpblhNTEZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlzaXRlLA0KLQkJCQlTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lICsgRmlsZS5zZXBhcmF0b3IgKyAicGx1Z2luLnhtbCIpOw0KLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCXNpdGUsDQotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIDQotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJYXNzZXJ0VHJ1ZSgNCi0JCQkiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgZmVhdHVyZUZpbGUsDQotCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQkJLy9jbGVhbnVwDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOw0KLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0SFRUUFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGNsZWFuDQotCQlGaWxlIHRhcmdldEZpbGUgID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldEZpbGUpOw0KLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsNCi0NCi0JCUlTaXRlIHJlbW90ZVNpdGUgPQ0KLQkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfSFRUUF9TSVRFLCBTaXRlLlNJVEVfWE1MKSx0cnVlLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOw0KLQ0KLQkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApDQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiZmVhdHVyZXMyLmphciIpKSB7DQotCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCBmZWF0dXJlMi5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOw0KLQkJVVJMIHVybCA9IFRBUkdFVF9GSUxFX1NJVEU7DQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7DQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIGZpbGUubWtkaXJzKCk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHVybCx0cnVlLG51bGwpOw0KLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7DQotDQotCQkvLyBmZWF0dXJlMi5qYXIgc2hvdWxkIG5vdCBiZSBpbiB0aGUgbG9jYWwgc2l0ZQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0gbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApDQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7DQotDQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAobG9jYWxGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJmZWF0dXJlczIuamFyIikpIHsNCi0JCQkJZm91bmQgPSB0cnVlOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKA0KLQkJCSJGb3VuZCBmZWF0dXJlMi5qYXIgb24gdGFyZ2V0IHNpdGUuIFRhcmdldCBzaXRlIGZlYXR1cmUgcmVmIHNob3VsZG5vdCBjb250YWluIEpBUiBmaWxlIiwNCi0JCQkhZm91bmQpOw0KLQ0KLQkJLy8gY2hlY2sNCi0JCVN0cmluZyBzaXRlID0gVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCk7DQotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7DQotDQotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7DQotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsNCi0JCWFzc2VydFRydWUoInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCXNpdGUsDQotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIDQotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsNCi0NCi0JCS8vbG9jYWxTaXRlLnNhdmUoKTsNCi0NCi0JCS8vY2xlYW51cA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsNCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGNsZWFudXAgbG9jYWwgZmlsZXMuLi4NCi0JCVNpdGVMb2NhbCBzaXRlTG9jYWwgPSAoKFNpdGVMb2NhbCkgU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpOw0KLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShzaXRlTG9jYWwuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOw0KLQkJLy9pZiAoIWxvY2FsRmlsZS5leGlzdHMoKSkgZmFpbCgiTG9jYWxTaXRlIGZpbGUgZG9lc24ndCBleGlzdCAtPiIrbG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpKyI8LSIpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkNCi0JCS8qDQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShsb2NhbEZpbGUsU2l0ZUxvY2FsLlNJVEVfTE9DQUxfRklMRSk7DQotCQlpZiAoIWxvY2FsRmlsZS5leGlzdHMoKSkgZmFpbCgiTG9jYWxTaXRlLnhtbCBkb2Vzbid0IGV4aXN0OiIrbG9jYWxGaWxlKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOw0KLQkJKi8NCi0JCQ0KLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGUgPSBudWxsOw0KLQ0KLQkJVVJMIElOU1RBTExfU0lURSA9IG51bGw7DQotCQl0cnkgew0KLQkJCUlOU1RBTExfU0lURSA9DQotCQkJCW5ldyBVUkwoImh0dHAiLCBnZXRIdHRwSG9zdCgpLCBnZXRIdHRwUG9ydCgpLCBidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMiIpKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJZmFpbChlLnRvU3RyaW5nKCkpOw0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShJTlNUQUxMX1NJVEUsdHJ1ZSxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsNCi0NCi0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQ0KLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImhlbHBGZWF0dXJlLmphciIpKSB7DQotCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCBoZWxwLmphciBvbiBzaXRlIiwgcmVtb3RlRmVhdHVyZSk7DQotCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOw0KLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCk7DQotCQlzaXRlLmFkZENvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsNCi0NCi0JCSgoQ29uZmlndXJlZFNpdGUpc2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOw0KLQkJc2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOw0KLQ0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOw0KLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQ0KLQkJU3RyaW5nIHNpdGVQYXRoID0gc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZVBhdGgsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOw0KLQkJaWYgKExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKS5pbmRleE9mKCJmciIpICE9IC0xKQ0KLQkJCWFzc2VydFRydWUoInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCXNpdGVQYXRoLA0KLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSA0KLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCWlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigiZnIiKSAhPSAtMSB8fA0KLQkJCQlMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigidXMiKSAhPSAtMSB8fA0KLQkJCQlMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigiZGUiKSAhPSAtMSkNCi0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotDQotCQkvL2NsZWFudXANCi0JCUZpbGUgZmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCXNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQ0KLQkJCQkJKyBGaWxlLnNlcGFyYXRvcg0KLQkJCQkJKyBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSA0KLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSgNCi0JCQluZXcgRmlsZSgNCi0JCQkJKChJbnN0YWxsQ29uZmlndXJhdGlvbikgbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpDQotCQkJCQkuZ2V0VVJMKCkNCi0JCQkJCS5nZXRGaWxlKCkpKTsNCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7DQotCQkNCi0JCXNpdGUucmVtb3ZlQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOw0KLQkJYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgaGFzbid0IHJlY2VpdmVkIG5vdGlmaWNhdGlvbiIsIGxpc3RlbmVyLmlzTm90aWZpZWQoKSk7DQotCX0NCi0NCi0vLwlwdWJsaWMgdm9pZCB0ZXN0RmlsZVNpdGVXaXRob3V0U2l0ZVhNTCgpIHRocm93cyBFeGNlcHRpb24gew0KLS8vDQotLy8JCUlTaXRlIHJlbW90ZVNpdGUgPQ0KLS8vCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsIFNpdGUuU0lURV9YTUwpLHRydWUsbnVsbCk7DQotLy8JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsNCi0vLwkJSUNvbmZpZ3VyZWRTaXRlIGxvY2FsU2l0ZSA9DQotLy8JCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOw0KLS8vCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7DQotLy8NCi0vLwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IGxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0vLwkJaWYgKGZlYXR1cmVzLmxlbmd0aCA9PSAwKQ0KLS8vCQkJZmFpbCgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBmZWF0dXJlLCBzaG91bGQgbm90IGNvbnRhaW4gYW4gWE1MIGZpbGUgYnV0IGZlYXR1cmVzIHNob3VsZCBiZSBmb3VuZCBhbnl3YXkgYnkgcGFyc2luZyIpOw0KLS8vCQlpZiAobG9jYWxTaXRlLmdldFNpdGUoKS5nZXRBcmNoaXZlcygpLmxlbmd0aCA9PSAwKQ0KLS8vCQkJZmFpbCgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBhcmNoaXZlcywgc2hvdWxkIG5vdCBjb250YWluIGFuIFhNTCBmaWxlIGJ1dCBhcmNoaXZlcyBzaG91bGQgYmUgZm91bmQgYW55d2F5IGJ5IHBhcnNpbmciKTsNCi0vLw0KLS8vCQkvL2NsZWFudXANCi0vLwkJRmlsZSBmaWxlID0NCi0vLwkJCW5ldyBGaWxlKA0KLS8vCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpDQotLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3INCi0vLwkJCQkJKyBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSA0KLS8vCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsNCi0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOw0KLS8vCQlmaWxlID0NCi0vLwkJCW5ldyBGaWxlKA0KLS8vCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpDQotLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3INCi0vLwkJCQkJKyBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgNCi0vLwkJCQkJKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNiIpOw0KLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7DQotLy8JCWZpbGUgPQ0KLS8vCQkJbmV3IEZpbGUoDQotLy8JCQkJbG9jYWxTaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkNCi0vLwkJCQkJKyBGaWxlLnNlcGFyYXRvcg0KLS8vCQkJCQkrIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSA0KLS8vCQkJCQkrICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wIik7DQotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsNCi0vLwkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOw0KLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsNCi0vLw0KLS8vCX0NCi0NCi0JLyoqDQotCSogDQotCSovDQotLy8JcHJpdmF0ZSBGZWF0dXJlIGNyZWF0ZVBhY2thZ2VkRmVhdHVyZShVUkwgdXJsLCBJU2l0ZSBzaXRlKQ0KLS8vCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotLy8JCVN0cmluZyBwYWNrYWdlZEZlYXR1cmVUeXBlID0gSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEU7DQotLy8JCUZlYXR1cmUgcmVzdWx0ID0gbnVsbDsNCi0vLwkJaWYgKHBhY2thZ2VkRmVhdHVyZVR5cGUgIT0gbnVsbCkgew0KLS8vCQkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPQ0KLS8vCQkJCUZlYXR1cmVUeXBlRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEZhY3RvcnkocGFja2FnZWRGZWF0dXJlVHlwZSk7DQotLy8JCQlyZXN1bHQgPSAoRmVhdHVyZSkgZmFjdG9yeS5jcmVhdGVGZWF0dXJlKHVybCwgc2l0ZSk7DQotLy8JCX0NCi0vLwkJcmV0dXJuIHJlc3VsdDsNCi0vLwl9DQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpIHsNCi0JCVN0cmluZyBwbHVnaW5JRCA9DQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi4iOw0KLQkJcmV0dXJuIHBsdWdpbklEICsgUEFDS0FHRURfRkVBVFVSRV9UWVBFOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RMb2NhbFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RMb2NhbFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjZTJhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0TG9jYWxTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0TG9jYWxTaXRlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdExvY2FsU2l0ZShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkNvbmZpZ0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vY2xlYW4gdXANCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkNCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQ0KLQ0KLQ0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQlzaXRlLnNhdmUoKTsNCi0JCWFzc2VydFRydWUoImNvbmZpZyBmaWxlIGhhc24ndCBiZWVuIHNhdmVkIGluIDoiK2xvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgbG9jYWxGaWxlLmV4aXN0cygpKTsNCi0JCQ0KLQkJLy8gY2xlYW51cA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkNCi0JCQ0KLQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbmZpZ0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vY2xlYW4gdXANCi0NCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkNCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7DQotDQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCWFzc2VydFRydWUoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gYW4gaGlzdG9yeSBvZiBpbnN0YWxsIGNvbmZpZ3VyYXRpb24iLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGghPTApOw0KLQkJYXNzZXJ0VHJ1ZSgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBhbiBjdXJyZW50IGluc3RhbGwgY29uZmlndXJhdGlvbiIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpIT1udWxsKTsNCi0JCWFzc2VydFRydWUoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gc2l0ZSBmb3IgdGhlIGN1cnJlbnQgaW5zdGFsbCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGghPTApOw0KLQkJDQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgQ29uZmlnIFNpdGUgaXMgOiIrc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsNCi0JCQ0KLQkJLy8gY2xlYW51cAkNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJDQotCQkNCi0NCi0JfQ0KLQkNCi0vKglwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZlYXR1cmVTYXZlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFuIHVwDQotCQlTaXRlTG9jYWwgc2l0ZUxvY2FsID0gKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCVVSTCBuZXdVUkwgPSBuZXcgVVJMKHNpdGVMb2NhbC5nZXRMb2NhdGlvblVSTCgpLFNpdGVMb2NhbC5TSVRFX0xPQ0FMX0ZJTEUpOw0KLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXdVUkwuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKCgoSW5zdGFsbENvbmZpZ3VyYXRpb24pc2l0ZUxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLmdldFVSTCgpLmdldEZpbGUoKSkpOwkNCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkNCi0NCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURV9JTlNUQUxMRUQpOw0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKCk7DQotCQlpbnQgb2xkTnVtYmVyID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aDsNCi0JCQ0KLQkJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQ0KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOw0KLQkJbmV3Q29uZmlnLnNldExhYmVsKCJuZXcgTGFiZWwiKTsJCQ0KLQkJLy9JSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOw0KLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgY29uZmlnUG9saWN5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCkuY3JlYXRlQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKCk7DQotCQljb25maWdQb2xpY3kuc2V0UG9saWN5KElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKTsNCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeSgoQ29uZmlndXJhdGlvblBvbGljeSljb25maWdQb2xpY3kpOw0KLQkJaW50IG9sZE51bWJlck9maGlzdG9yeSA9IHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGg7CQkNCi0JCXNpdGUuYWRkQ29uZmlndXJhdGlvbihuZXdDb25maWcpOwkNCi0JCWFzc2VydE5vdE51bGwoZmVhdHVyZSk7CQ0KLQ0KLQkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5pc1VwZGF0YWJsZSh0cnVlKTsNCi0JCXJlbW92ZShmZWF0dXJlLGNvbmZpZ1NpdGUpOwkJCQkNCi0JCWNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlLG51bGwsbnVsbCk7DQotCQkJCQ0KLQkJLy8gdGVoIGN1cnJlbnQgb25lIHBvaW50cyB0byBhIHJlYWwgZmF0dXJlDQotCQkvLyBkb2VzIG5vdCB0aHJvdyBlcnJvci4NCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlMiA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCWFzc2VydFRydWUoIk5vIENvbmZpZ3VyZWQgZmVhdHVyZXMgZm91bmQiLGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoPjApOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gY29uZmlnU2l0ZTIuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKClbMF07DQotCQlJRmVhdHVyZSBmZWF0dXJlMiA9IHJlZi5nZXRGZWF0dXJlKCk7DQotCQkvL1N0cmluZyBjb25maWd1cmVkRmVhdHVyZSA9IGZlYXR1cmUyLmdldExhYmVsKCk7DQotDQotCQlhc3NlcnRFcXVhbHMoZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCksIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIik7DQotCQlhc3NlcnRUcnVlKCJXcm9uZyBpZCAgdmVyc2lvbiBvZiBmZWF0dXJlIixmZWF0dXJlMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMCIpKTsNCi0JCQ0KLQkJLy8gb25seSBvbmUgZmVhdHVyZSBjb25maWd1cmVkDQotCQlhc3NlcnRUcnVlKCJ0b28gbWFueSBmZWF0dXJlcyBjb25maWd1cmVkIixjb25maWdTaXRlMi5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOw0KLQkJDQotCQkvLyBubyBmZWF0dXJlIHVuY29uZmlndXJlZA0KLQkJYXNzZXJ0VHJ1ZSgidG9vIG1hbnkgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUyKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTApOw0KLQkJDQotCQkvLyB0ZXN0IG9ubHkgMiBpbnN0YWxsIGNvbmZpZyBpbiBsb2NhbCBzaXRlDQotCQkvL2Fzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGhpc3RvcnkgaW4gTG9jYWwgc2l0ZToiLG9sZE51bWJlck9maGlzdG9yeSsxLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGgpOw0KLQkJDQotCQkvLyB0ZXN0IHNhbWUgIyBvZiBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsNCi0JCQ0KLQkJLy90ZXN0IG9ubHkgb25lIGZlYXR1cmUgZm9yIHRoZSBzaXRlDQotCQlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOw0KLQkJDQotCQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzDQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYWN0aXZpdGllcyBmb3IgaW5zdGFsbCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRBY3Rpdml0aWVzKCkubGVuZ3RoPT0yKTsNCi0NCi0JCXNpdGUuc2F2ZSgpOwkJDQotDQotCQkvLyBjaGVjaw0KLQkJLy8gdGhlcmUgYXJlIDIgY29uZmlndXJhdGlvbg0KLQkJU3RyaW5nIHRpbWUgPSAiIitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOw0KLQkJVVJMIGxvY2F0aW9uID0gKChTaXRlTG9jYWwpc2l0ZSkuZ2V0TG9jYXRpb25VUkwoKTsNCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sIkNvbmZpZyIrdGltZSsiLnhtbCIpLmdldEZpbGUoKSk7DQotCQlhc3NlcnRUcnVlKCJuZXcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBleGlzdCIsIGZpbGUuZXhpc3RzKCkpOw0KLQkJDQotCQkvLyBjbGVhbnVwDQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGVMb2NhbC5TSVRFX0xPQ0FMX0ZJTEUpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQ0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlTG9jYWwuREVGQVVMVF9DT05GSUdfRklMRSkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkNCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCtGaWxlLnNlcGFyYXRvcitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKS5nZXRGaWxlKCkpOwkJDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJDQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLmdldEZpbGUoKSk7CQkNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQ0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoZmVhdHVyZTIuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOw0KLQl9DQotKi8NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RSZXRyaXZlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFuIHVwDQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJDQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJDQotDQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVELG51bGwpOw0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJaW50IG9sZE51bWJlciA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg7CQkNCi0JCQ0KLQkJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQ0KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOw0KLQkJbmV3Q29uZmlnLnNldExhYmVsKCJuZXcgTGFiZWwiKTsJCQ0KLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgY29uZmlnUG9saWN5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCkuY3JlYXRlQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKCk7DQotCQljb25maWdQb2xpY3kuc2V0UG9saWN5KElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKTsNCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKChDb25maWd1cmF0aW9uUG9saWN5TW9kZWwpY29uZmlnUG9saWN5KTsJDQotCQlpbnQgb2xkTnVtYmVyT2ZoaXN0b3J5ID0gc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aDsJCQkNCi0JCXNpdGUuYWRkQ29uZmlndXJhdGlvbihuZXdDb25maWcpOw0KLQkJYXNzZXJ0Tm90TnVsbChmZWF0dXJlKTsJCQkNCi0JCQ0KLQkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7DQotCQlyZW1vdmUoZmVhdHVyZSxjb25maWdTaXRlKTsJCQkNCi0JCWNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlLG51bGwsbnVsbCk7DQotCQlzaXRlLnNhdmUoKTsNCi0JCQ0KLQkJLy8gd2UgY3JlYXRlZCB0aGUgc2Vjb25kIHhtbCBmaWxlDQotDQotCQkvL2RvIG5vdCBjbGVhbnVwLCB3ZSB3YW50IHRvIHJldXNlIHByZXZpb3VzbHkgY3JlYXRlZCBsb2NhbCBzaXRlDQotCQkvLyBidXQgZm9yY2UgcmUtcmVhZCBvZiB4bWwgRmlsZQ0KLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsNCi0JCXNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCQ0KLQkJLy8gY2hlY2sNCi0JCS8vIHRoZXJlIGFyZSAyIGNvbmZpZ3VyYXRpb24NCi0JCVN0cmluZyB0aW1lID0gIiIrc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsNCi0JCVVSTCBsb2NhdGlvbiA9ICgoU2l0ZUxvY2FsKXNpdGUpLmdldExvY2F0aW9uVVJMKCk7CQkNCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sInBsYXRmb3JtLnhtbCIpLmdldEZpbGUoKSk7DQotCQlhc3NlcnRUcnVlKCJuZXcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBleGlzdCIsIGZpbGUuZXhpc3RzKCkpOw0KLQkJDQotCQkvLyB0ZWggY3VycmVudCBvbmUgcG9pbnRzIHRvIGEgcmVhbCBmYXR1cmUNCi0JCS8vIGRvZXMgbm90IHRocm93IGVycm9yLg0KLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUyID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY29uZmlnU2l0ZTIuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7DQotCQlJRmVhdHVyZSBmZWF0dXJlMiA9IG51bGw7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCQlJRmVhdHVyZSBmZWF0dXJlMyA9IHJlZnNbaV0uZ2V0RmVhdHVyZShudWxsKTsJCQkNCi0JCQlpZiAoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIi5lcXVhbHMoZmVhdHVyZTMuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpKXsNCi0JCQkJZmVhdHVyZTIgPSBmZWF0dXJlMzsNCi0JCQkJYnJlYWs7DQotCQkJfQkJDQotCQl9DQotCQlhc3NlcnROb3ROdWxsKCJGZWF0dXJlIDIgaXMgTnVsbCIsZmVhdHVyZTIpOw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgaWQgIHZlcnNpb24gb2YgZmVhdHVyZSIsZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTNfMS4wLjAiKSk7DQotCQkNCi0JCS8vIHRlc3Qgb25seSAyIGluc3RhbGwgY29uZmlnIGluIGxvY2FsIHNpdGUNCi0vLwkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgaGlzdG9yeSBpbiBMb2NhbCBzaXRlOiIsb2xkTnVtYmVyT2ZoaXN0b3J5KzEsc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCk7DQotCQkNCi0JCS8vIHRlc3QgIyBvZiBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsNCi0JCQ0KLQkJLy90ZXN0IG9ubHkgb25lIGZlYXR1cmUgZm9yIHRoZSBzaXRlDQotLy8JCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7DQotCQkNCi0JCS8vIHRlc3Qgb25seSAyIGFjdGl2aXRpZXMNCi0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFjdGl2aXRpZXMgZm9yIGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0QWN0aXZpdGllcygpLmxlbmd0aD09Mik7DQotCQkNCi0JCQ0KLQkJLy8gY2xlYW51cA0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJDQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQ0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkJCQkNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RSZXRyaXZlQ29uZmlnSFRUUEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vY2xlYW4gdXANCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOw0KLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCQ0KLQ0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJDQotCQkvLyB3ZSBhcmUgbm90IGNoZWNraW5nIGlmIHRoaXMgaXMgcmVhZCBvbmx5DQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7DQotCQluZXdDb25maWcuc2V0TGFiZWwoIm5ldyBMYWJlbCIpOwkJDQotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ld0NvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBjb25maWdQb2xpY3kgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKS5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsNCi0JCWNvbmZpZ1BvbGljeS5zZXRQb2xpY3koSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpOw0KLQkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCljb25maWdQb2xpY3kpOwkNCi0JCWludCBvbGROdW1iZXJPZmhpc3RvcnkgPSBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoOwkJCQ0KLQkJc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZyk7DQotCQkNCi0JDQotCQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsJCQkJDQotCQljb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZSxudWxsLG51bGwpOw0KLQkJc2l0ZS5zYXZlKCk7DQotDQotCQkvL2RvIG5vdCBjbGVhbnVwLCB3ZSB3YW50IHRvIHJldXNlIHByZXZpb3VzbHkgY3JlYXRlZCBsb2NhbCBzaXRlDQotCQkvLyBidXQgZm9yY2UgcmUtcmVhZCBvZiB4bWwgRmlsZQ0KLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsNCi0JCXNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCWZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCWludCBvbGROdW1iZXIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoOwkJDQotCQkNCi0JCS8vIGNoZWNrDQotCQkvLyB0aGVyZSBhcmUgMiBjb25maWd1cmF0aW9uDQotCQlTdHJpbmcgdGltZSA9ICIiK3NpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7DQotCQlVUkwgbG9jYXRpb24gPSAoKFNpdGVMb2NhbClzaXRlKS5nZXRMb2NhdGlvblVSTCgpOwkJDQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLCJwbGF0Zm9ybS54bWwiKS5nZXRGaWxlKCkpOw0KLQkJYXNzZXJ0VHJ1ZSgibmV3IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZXhpc3QiLCBmaWxlLmV4aXN0cygpKTsNCi0JCQ0KLQkJLy8gdGVoIGN1cnJlbnQgb25lIHBvaW50cyB0byBhIHJlYWwgZmF0dXJlDQotCQkvLyBkb2VzIG5vdCB0aHJvdyBlcnJvci4NCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlMiA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY29uZmlnU2l0ZTIuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7DQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQotCQlJRmVhdHVyZSBmZWF0dXJlMiA9IG51bGw7DQotCQlmb3IgKGludCBpID0gMDsgIWZvdW5kICYmIGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJDQotCQkJaWYgKCJvcmcudGVzdDEuaWRlbnQxXzEuMC4wIi5lcXVhbHMoZmVhdHVyZTMuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpKXsNCi0JCQkJZmVhdHVyZTIgPSBmZWF0dXJlMzsNCi0JCQkJZm91bmQgPSB0cnVlOw0KLQkJCX0JCQ0KLQkJfQ0KLQ0KLQkJLy9TdHJpbmcgY29uZmlndXJlZEZlYXR1cmUgPSBmZWF0dXJlMi5nZXRMYWJlbCgpOw0KLQkJYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZmVhdHVyZSBvcmcudGVzdDEuaWRlbnQxXzEuMC4wIGluIGNvbmZpZ3VyZWQgU2l0ZSIsZm91bmQpOw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgaWQgIHZlcnNpb24gb2YgZmVhdHVyZSIsZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgib3JnLnRlc3QxLmlkZW50MV8xLjAuMCIpKTsNCi0JCQ0KLQkJLy8gdGVzdCBvbmx5IDIgaW5zdGFsbCBjb25maWcgaW4gbG9jYWwgc2l0ZQ0KLS8vCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBoaXN0b3J5IGluIExvY2FsIHNpdGU6IixvbGROdW1iZXJPZmhpc3RvcnkrMSxzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoKTsNCi0JCQ0KLQkJLy8gdGVzdCBzYW1lIG51bWJlciBvZiBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsNCi0JCQ0KLQkJLy90ZXN0IG9ubHkgb25lIGZlYXR1cmUgZm9yIHRoZSBzaXRlDQotLy8JCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7DQotCQkNCi0JCS8vIHRlc3Qgb25seSAyIGFjdGl2aXRpZXMNCi0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFjdGl2aXRpZXMgZm9yIGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0QWN0aXZpdGllcygpLmxlbmd0aD09Mik7DQotCQkNCi0JCQ0KLQkJLy8gY2xlYW51cA0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYXRpb24uZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJDQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQ0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkJCQkJCQ0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkJDQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShmZWF0dXJlMi5nZXRVUkwoKS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7DQotCX0NCi0JDQotLy9UT0RPIHVuY29tbWVudCB0aGlzIG9uY2Ugc2l0ZSBkaXNhYmxpbmcgaXMgc3VwcG9ydGVkDQotcHVibGljIHZvaWQgdGVzdFJldHJpdmVDb25maWdIVFRQSW5zdGFsbE5vdEVuYWJsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLS8qDQotCS8vY2xlYW4gdXANCi0JU2l0ZUxvY2FsIHNpdGVMb2NhbCA9IChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCVVSTCBuZXdVUkwgPSBuZXcgVVJMKHNpdGVMb2NhbC5nZXRMb2NhdGlvblVSTCgpLFNpdGVMb2NhbC5TSVRFX0xPQ0FMX0ZJTEUpOw0KLQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ld1VSTC5nZXRGaWxlKCkpOw0KLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsNCi0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKCgoSW5zdGFsbENvbmZpZ3VyYXRpb24pc2l0ZUxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLmdldFVSTCgpLmdldEZpbGUoKSkpOwkNCi0JSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCQ0KLQ0KLQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSk7DQotCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQ0KLQkvLyB3ZSBhcmUgbm90IGNoZWNraW5nIGlmIHRoaXMgaXMgcmVhZCBvbmx5DQotCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWcgPSBzaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0JbmV3Q29uZmlnLnNldExhYmVsKCJuZXcgTGFiZWwiKTsJCQ0KLQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ld0NvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGNvbmZpZ1BvbGljeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOw0KLQljb25maWdQb2xpY3kuc2V0UG9saWN5KElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKTsNCi0JKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCljb25maWdQb2xpY3kpOwkNCi0JaW50IG9sZE51bWJlck9maGlzdG9yeSA9IHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGg7CQkJDQotCXNpdGUuYWRkQ29uZmlndXJhdGlvbihuZXdDb25maWcpOw0KLQkJDQotCQ0KLQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsNCi0JY29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmUsbnVsbCxudWxsKTsNCi0JKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRFbmFibGVkKGZhbHNlKTsJDQotCXNpdGUuc2F2ZSgpOw0KLQ0KLQkvL2RvIG5vdCBjbGVhbnVwLCB3ZSB3YW50IHRvIHJldXNlIHByZXZpb3VzbHkgY3JlYXRlZCBsb2NhbCBzaXRlDQotCS8vIGJ1dCBmb3JjZSByZS1yZWFkIG9mIHhtbCBGaWxlDQotCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7DQotCXNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOw0KLQlpbnQgb2xkTnVtYmVyID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aDsJCQ0KLQkJDQotCS8vIGNoZWNrDQotCS8vIHRoZXJlIGFyZSAyIGNvbmZpZ3VyYXRpb24NCi0JU3RyaW5nIHRpbWUgPSAiIitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOw0KLQlVUkwgbG9jYXRpb24gPSAoKFNpdGVMb2NhbClzaXRlKS5nZXRMb2NhdGlvblVSTCgpOwkJDQotCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uLmdldEZpbGUoKSk7DQotCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7DQotCQkNCi0JLy8gdGVoIGN1cnJlbnQgb25lIHBvaW50cyB0byBhIHJlYWwgZmF0dXJlDQotCS8vIGRvZXMgbm90IHRocm93IGVycm9yLg0KLQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZTIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQkNCi0JSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY29uZmlnU2l0ZTIuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7DQotCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsNCi0JSUZlYXR1cmUgZmVhdHVyZTIgPSBudWxsOw0KLQlmb3IgKGludCBpID0gMDsgIWZvdW5kICYmIGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7DQotCQlJRmVhdHVyZSBmZWF0dXJlMyA9IHJlZnNbaV0uZ2V0RmVhdHVyZShudWxsKTsJCQkNCi0JCWlmICgib3JnLnRlc3QxLmlkZW50MV8xLjAuMCIuZXF1YWxzKGZlYXR1cmUzLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSl7DQotCQkJZmVhdHVyZTIgPSBmZWF0dXJlMzsNCi0JCQlmb3VuZCA9IHRydWU7DQotCQl9CQkNCi0JfQ0KLQ0KLQkvL1N0cmluZyBjb25maWd1cmVkRmVhdHVyZSA9IGZlYXR1cmUyLmdldExhYmVsKCk7DQotCWFzc2VydFRydWUoImZvdW5kIGZlYXR1cmUgb3JnLnRlc3QxLmlkZW50MV8xLjAuMCBpbiBkaXNhYmxlZCBjb25maWd1cmVkIFNpdGUiLCFmb3VuZCk7DQotCQkNCi0JLy90ZXN0IG5vIGNvbmZpZ3VyZWQgZmVhdHVyZXMNCi0vLwlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTApOw0KLQkNCi0JDQotCWNvbmZpZ1NpdGUyLnNldEVuYWJsZWQodHJ1ZSk7DQotCXJlZnMgPSBjb25maWdTaXRlMi5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsJDQotCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgew0KLQkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJDQotCQlpZiAoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiLmVxdWFscyhmZWF0dXJlMy5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkpew0KLQkJCWZlYXR1cmUyID0gZmVhdHVyZTM7DQotCQkJZm91bmQgPSB0cnVlOw0KLQkJfQkJDQotCX0NCi0NCi0JLy9TdHJpbmcgY29uZmlndXJlZEZlYXR1cmUgPSBmZWF0dXJlMi5nZXRMYWJlbCgpOw0KLQlhc3NlcnRUcnVlKCJjYW5ub3QgZmluZCBmZWF0dXJlIG9yZy50ZXN0MS5pZGVudDFfMS4wLjAgaW4gY29uZmlndXJlZCBTaXRlIixmb3VuZCk7DQotCWFzc2VydFRydWUoIldyb25nIGlkICB2ZXJzaW9uIG9mIGZlYXR1cmUiLGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiKSk7DQotCQkNCi0JLy8gdGVzdCBvbmx5IDIgaW5zdGFsbCBjb25maWcgaW4gbG9jYWwgc2l0ZQ0KLS8vCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGhpc3RvcnkgaW4gTG9jYWwgc2l0ZToiLG9sZE51bWJlck9maGlzdG9yeSsxLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGgpOw0KLQkJDQotCS8vIHRlc3Qgc2FtZSBudW1iZXIgb2Ygc2l0ZXMgaW4gY3VycmVudCBjb25maWcNCi0vLwlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY29uZmlnIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoPT1vbGROdW1iZXIpOw0KLQkJDQotCS8vdGVzdCBvbmx5IG9uZSBmZWF0dXJlIGZvciB0aGUgc2l0ZQ0KLS8vCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7DQotCQkNCi0JLy8gdGVzdCBvbmx5IDIgYWN0aXZpdGllcw0KLS8vCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhY3Rpdml0aWVzIGZvciBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldEFjdGl2aXRpZXMoKS5sZW5ndGg9PTIpOw0KLQkJDQotCQkNCi0JLy8gY2xlYW51cA0KLQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGVMb2NhbC5TSVRFX0xPQ0FMX0ZJTEUpLmdldEZpbGUoKSk7DQotCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJDQotCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sU2l0ZUxvY2FsLkRFRkFVTFRfQ09ORklHX0ZJTEUpLmdldEZpbGUoKSk7DQotCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkNCi0JbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIK0ZpbGUuc2VwYXJhdG9yK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLmdldEZpbGUoKSk7CQkNCi0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQ0KLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoKChJbnN0YWxsQ29uZmlndXJhdGlvbilzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLmdldFVSTCgpLmdldEZpbGUoKSkpOwkJCQkJCQ0KLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQkNCi0JbG9jYWxGaWxlID0gbmV3IEZpbGUoZmVhdHVyZTIuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsNCi0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ki8NCi19DQotDQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RTcGFjZUluSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdFNwYWNlSW5JbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNmU0YTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdFNwYWNlSW5JbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFNwYWNlSW5JbnN0YWxsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQ0KLQkgKi8NCi0JcHVibGljIFRlc3RTcGFjZUluSW5zdGFsbChTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BhY2VJblVSTCgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJLy9jbGVhbnVwIHRhcmdldCANCi0JCVVSTCB0ZXN0VVJMID0gbmV3IFVSTChUQVJHRVRfRklMRV9TSVRFLCJ0ZXN0IHNpdGUgc3BhY2UvIik7IA0KLQkJU3RyaW5nIHRlc3RQYXRoID0gdGVzdFVSTC5nZXRGaWxlKCk7DQotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKHRlc3RQYXRoKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOw0KLQkJDQotCQlVUkwgbmV3VVJMID0gbmV3IEZpbGUoZGF0YVBhdGggKyAiU2l0ZSB3aXRoIHNwYWNlL3NpdGUueG1sIikudG9VUkwoKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCx0cnVlLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRlc3RVUkwuZ2V0RmlsZSgpKTsNCi0JCWlmICghZmlsZS5leGlzdHMoKSkgZmlsZS5ta2RpcnMoKTsNCi0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUodGVzdFVSTCx0cnVlLG51bGwpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7DQotCQkNCi0JCS8vIGF0IGxlYXN0IG9uZSBleGVjdXRhYmxlIGZlYXR1cmUgYW5kIG9uIHBhY2thZ2VkDQotCQlib29sZWFuIGV4ZWNGZWF0dXJlID0gZmFsc2U7DQotCQlib29sZWFuIHBhY2tGZWF0dXJlID0gZmFsc2U7DQotDQotCQlpZiAoZmVhdHVyZXNSZWYubGVuZ3RoPT0wKSBmYWlsICgibm8gZmVhdHVyZSBmb3VuZCIpOw0KLQkNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsNCi0JCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNSZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOyANCi0JCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLG51bGwpOw0KLQkJCQ0KLQkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcikgcGFja0ZlYXR1cmUgPSB0cnVlOw0KLQkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKSBleGVjRmVhdHVyZSA9IHRydWU7DQotDQotCQkJLy8gdmVyaWZ5DQotCQkJU3RyaW5nIHNpdGUgPSB0ZXN0VVJMLmdldEZpbGUoKTsNCi0JCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7DQotCQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsNCi0JCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luRmlsZS5leGlzdHMoKSk7DQotDQotCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK2ZlYXR1cmVGaWxlLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotDQotCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7DQotCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseTogbm8gZmVhdHVyZS54bWwiLCBmZWF0dXJlRmlsZVhNTC5leGlzdHMoKSk7DQotCQl9DQotDQotCQlpZiAoIWV4ZWNGZWF0dXJlICYmICFwYWNrRmVhdHVyZSl7DQotCQkJZmFpbCgiY2Fubm90IGZpbmQgb25lIGV4ZWN1dGFibGUgYW5kIG9uZSBwYWNrYWdlIGZlYXR1cmUgb24gdGVoIHNpdGUiKTsNCi0JCX0NCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0NCi0NCi0JfQ0KLQkNCi0JDQotCS8qKg0KLQkgKg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdFNwYWNlSW5IVFRQVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFudXAgdGFyZ2V0ICANCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOw0KLQkJDQotCQlTdHJpbmcgcGF0aCA9IGJ1bmRsZS5nZXRTdHJpbmcoIkhUVFBfUEFUSF8zIik7DQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKCJodHRwIixnZXRIdHRwSG9zdCgpLGdldEh0dHBQb3J0KCkscGF0aCksdHJ1ZSxudWxsKTsJCQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSx0cnVlLG51bGwpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7DQotCQkNCi0JCS8vIGF0IGxlYXN0IG9uZSBleGVjdXRhYmxlIGZlYXR1cmUgYW5kIG9uIHBhY2thZ2VkDQotCQlib29sZWFuIGV4ZWNGZWF0dXJlID0gZmFsc2U7DQotCQlib29sZWFuIHBhY2tGZWF0dXJlID0gZmFsc2U7DQotDQotCQlpZiAoZmVhdHVyZXNSZWYubGVuZ3RoPT0wKSBmYWlsICgibm8gZmVhdHVyZSBmb3VuZCIpOw0KLQkNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsNCi0JCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNSZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLG51bGwpOw0KLQkJCQ0KLQkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcikgcGFja0ZlYXR1cmUgPSB0cnVlOw0KLQkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKSBleGVjRmVhdHVyZSA9IHRydWU7DQotDQotCQkJLy8gdmVyaWZ5DQotCQkJU3RyaW5nIHNpdGUgPSBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKTsJCQkNCi0JCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7DQotCQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsNCi0JCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luRmlsZS5leGlzdHMoKSk7DQotDQotCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK2ZlYXR1cmVGaWxlLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotDQotCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7DQotCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseTogbm8gZmVhdHVyZS54bWwiLCBmZWF0dXJlRmlsZVhNTC5leGlzdHMoKSk7DQotCQl9DQotDQotCQlpZiAoIWV4ZWNGZWF0dXJlICYmICFwYWNrRmVhdHVyZSl7DQotCQkJZmFpbCgiY2Fubm90IGZpbmQgb25lIGV4ZWN1dGFibGUgYW5kIG9uZSBwYWNrYWdlIGZlYXR1cmUgb24gdGVoIHNpdGUiKTsNCi0JCX0NCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7DQotDQotCX0NCi0JCQ0KLQkJDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJSZW1vdmUvQWxsUmVndWxhclJlbW92ZVRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFyUmVtb3ZlL0FsbFJlZ3VsYXJSZW1vdmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdlYzc1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJSZW1vdmUvQWxsUmVndWxhclJlbW92ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhclJlbW92ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7DQotDQotDQotcHVibGljIGNsYXNzIEFsbFJlZ3VsYXJSZW1vdmVUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotcHVibGljIEFsbFJlZ3VsYXJSZW1vdmVUZXN0cyhTdHJpbmcgbmFtZSkgew0KLQlzdXBlcihuYW1lKTsNCi19DQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgUmVtb3ZlIFRlc3RzIik7DQotCQ0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW92ZS5jbGFzcykpOw0KLQkNCi0JcmV0dXJuIHN1aXRlOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9UZXN0UmVtb3ZlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFyUmVtb3ZlL1Rlc3RSZW1vdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlYjEyMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFyUmVtb3ZlL1Rlc3RSZW1vdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFyUmVtb3ZlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFJlbW92ZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotDQotCXB1YmxpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciB7DQotDQotCQlwdWJsaWMgYm9vbGVhbiBub3RpZmllZCA9IGZhbHNlOw0KLQ0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQkJbm90aWZpZWQgPSB0cnVlOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aWZpZWQgRGVmYXVsdEZlYXR1cmUgSW5zdGFsbGVkIik7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl9DQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl9Ow0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl9Ow0KLQ0KLQkJcHVibGljIGJvb2xlYW4gaXNOb3RpZmllZCgpIHsNCi0JCQlyZXR1cm4gbm90aWZpZWQ7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQ0KLQkgKi8NCi0JcHVibGljIFRlc3RSZW1vdmUoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCXByaXZhdGUgSUZlYXR1cmUgZ2V0RmVhdHVyZTEoSVNpdGUgc2l0ZSkNCi0JCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQkJLy9VUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCAiZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIiwgbnVsbCk7DQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsNCi0JCXJlZi5zZXRTaXRlKHNpdGUpOw0KLQkJcmVmLnNldFVSTFN0cmluZygiZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIik7DQotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7DQotCQlyZWYucmVzb2x2ZShzaXRlLmdldFVSTCgpLCBudWxsKTsNCi0JCXJldHVybiByZWYuZ2V0RmVhdHVyZShudWxsKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJLy8gaW5zdGFsbCBmZWF0dXJlDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGdldEZlYXR1cmUxKHJlbW90ZVNpdGUpOw0KLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7DQotDQotCQkvLyB0aGVuIHJlbW92ZSBpdA0KLQkJYXNzZXJ0Tm90TnVsbCgiRmVhdHVyZSBpcyBudWxsIixyZWYuZ2V0RmVhdHVyZShudWxsKSk7DQotCQlTdHJpbmcgZmVhdHVyZVJlZiA9IHJlZi5nZXRGZWF0dXJlKG51bGwpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJbG9jYWxTaXRlLnJlbW92ZShyZWYuZ2V0RmVhdHVyZShudWxsKSwgbnVsbCk7DQotDQotCQkvLyB2ZXJpZnkNCi0JCVN0cmluZyBzaXRlID0gVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCk7DQotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7DQotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7DQotDQotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsNCi0JCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBpbnN0YWxsZWQgbG9jYWxseSIsICFwbHVnaW5GaWxlLmV4aXN0cygpKTsNCi0NCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQ0KLQkJCW5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgZmVhdHVyZVJlZik7DQotCQlhc3NlcnRUcnVlKA0KLQkJCSJmZWF0dXJlIGluZm8gaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLA0KLQkJCSFmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vQWxsU2l0ZVZhbGlkYXRpb25UZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vQWxsU2l0ZVZhbGlkYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA2M2E5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL0FsbFNpdGVWYWxpZGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnNpdGV2YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEFsbFNpdGVWYWxpZGF0aW9uVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCXB1YmxpYyBBbGxTaXRlVmFsaWRhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiU2l0ZSBWYWxpZGF0aW9uIFRlc3RzIik7Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVWYWxpZGF0aW9uLmNsYXNzKSk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL1Rlc3RTaXRlVmFsaWRhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vVGVzdFNpdGVWYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWEyN2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vVGVzdFNpdGVWYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc2l0ZXZhbGlkYXRpb247Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuKjsKLQotcHVibGljIGNsYXNzIFRlc3RTaXRlVmFsaWRhdGlvbiBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIAotCSAqLwotCXB1YmxpYyBUZXN0U2l0ZVZhbGlkYXRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbmZpZ1NpdGUoVVJMIHVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCUlTaXRlRW50cnkgczEgPSBjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1cmwpOwotCQlhc3NlcnROb3ROdWxsKCJVbmFibGUgdG8gZmluZCBzaXRlIGVudHJ5OiIrdXJsLHMxKTsKLQkJY2ZpZy51bmNvbmZpZ3VyZVNpdGUoczEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFRBUkdFVF9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlMS9lY2xpcHNlIik7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlbW90ZVVybC5nZXRGaWxlKCkpOwotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJZmlsZS5ta2RpcnMoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlID0gY3VycmVudENvbmZpZy5jcmVhdGVDb25maWd1cmVkU2l0ZShmaWxlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQotCQlTdHJpbmcgbXNnID0gIlRoZSBzaXRlICIrZmlsZSsiIHNob3VsZCBiZSB1cGRhdGFibGUuIjsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKXsKLQkJCWZhaWwobXNnK3N0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWN1cnJlbnRDb25maWcucmVtb3ZlQ29uZmlndXJlZFNpdGUoY29uZmlndXJlZFNpdGUpOwotCQlyZW1vdmVDb25maWdTaXRlKGNvbmZpZ3VyZWRTaXRlLmdldFNpdGUoKS5nZXRVUkwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlMi9lY2xpcHNlLyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZTsKLQkJdHJ5IHsKLQkJIGNvbmZpZ3VyZWRTaXRlID0gY3VycmVudENvbmZpZy5jcmVhdGVDb25maWd1cmVkU2l0ZShmaWxlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RhdHVzIHN0YXR1cyA9IGNvbmZpZ3VyZWRTaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOwotCi0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIi5lY2xpcHNlVU0iKSk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOwotCQlpZiAoc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGlzIHNpdGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZToiKT09LTEpewotCQkJZmFpbCgiV3JvbmcgdmFsaWRhdGlvbjoiK3N0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlMygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlMy9lY2xpcHNlLyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoZmlsZSwiLmVjbGlwc2VVTSIpKTsKLQotCQlTdHJpbmcgbXNnID0gIlRoZSBzaXRlICIrZmlsZSsiIHNob3VsZCBub3QgYmUgdXBkYXRhYmxlLiI7Ci0JCWlmIChzdGF0dXMuaXNPSygpKXsKLQkJCWZhaWwobXNnK3N0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0vLwkJaWYgKHN0YXR1cy5nZXRNZXNzYWdlKCkuaW5kZXhPZigiVGhpcyBzaXRlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIHNpdGU6Iik9PS0xKXsKLS8vCQkJZmFpbCgiV3JvbmcgdmFsaWRhdGlvbjoiK3N0YXR1cy5nZXRNZXNzYWdlKCkpOwotLy8JCX0KLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFNpdGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ2YWxpZGF0aW9uL3NpdGU0L2VjbGlwc2UvIik7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlbW90ZVVybC5nZXRGaWxlKCkpOwotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlID0gY3VycmVudENvbmZpZy5jcmVhdGVDb25maWd1cmVkU2l0ZShmaWxlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQotCQlTdHJpbmcgbXNnID0gIlRoZSBzaXRlICIrZmlsZSsiIHNob3VsZCBub3QgYmUgdXBkYXRhYmxlLiI7Ci0JCWlmIChzdGF0dXMuaXNPSygpKXsKLQkJCWZhaWwobXNnK3N0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWlmIChzdGF0dXMuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIlRoZSBzaXRlIGNhbm5vdCBiZSBtb2RpZmllZCBieSB0aGlzIHByb2R1Y3QuIEl0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHByb2R1Y3Q6Iik9PS0xKXsKLQkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTUvIik7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlbW90ZVVybC5nZXRGaWxlKCkpOwotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlID0gY3VycmVudENvbmZpZy5jcmVhdGVDb25maWd1cmVkU2l0ZShmaWxlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQotCQlTdHJpbmcgbXNnID0gIlRoZSBzaXRlICIrZmlsZSsiIHNob3VsZCBiZSB1cGRhdGFibGUuIjsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKXsKLQkJCWZhaWwobXNnK3N0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCQotCQkJLy8gZ2V0IG5ldyBjb25maWcgb2JqZWN0Ci0JCVVSTCB1cmwgPSBjb25maWd1cmVkU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCk7Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHVybCk7Ci0JCWFzc2VydE5vdE51bGwoIlNpdGUgZW50cnkgbm90IGZvdW5kOiIrdXJsLHMxKTsKLQkJY2ZpZy51bmNvbmZpZ3VyZVNpdGUoczEpOwotCQljZmlnLnNhdmUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNpdGU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ2YWxpZGF0aW9uL3NpdGU2L2NoaWxkcmVuL2NoaWxkcmVuL2VjbGlwc2UvIik7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlbW90ZVVybC5nZXRGaWxlKCkpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIGZpbGUubWtkaXJzKCk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUgPSBjdXJyZW50Q29uZmlnLmNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IGNvbmZpZ3VyZWRTaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOwotCi0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIi5lY2xpcHNlVU0iKSk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOwotCQlpZiAoc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotLy8JCWlmIChzdGF0dXMuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIlRoaXMgc2l0ZSBpcyBjb250YWluZWQgaW4gYW5vdGhlciBzaXRlOiIpPT0tMSl7Ci0vLwkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLS8vCQl9Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvQWxsU3RhbmRhbG9uZVRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL0FsbFN0YW5kYWxvbmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDg5MzA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvQWxsU3RhbmRhbG9uZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgQWxsU3RhbmRhbG9uZVRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlewotCi0JcHVibGljIEFsbFN0YW5kYWxvbmVUZXN0cyhTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJTdGFuZGFsb25lIFRlc3RzIik7Ci0JCQotCQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGhlIHRlc3QgbWV0aG9kcyBpbiAKLQkJLy8gdGhlIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAidGVzdCIKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlSW5zdGFsbC5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVVcGRhdGUuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlRW5hYmxlLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZURpc2FibGUuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlVW5pbnN0YWxsLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0QnVuZGxlc0luc3RhbGwuY2xhc3MpKTsKLQkJLy9hbmQgdGhpcyBvbmUncyBmb3IgZnVuIDopCi0vLwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlU2VhcmNoLmNsYXNzKSk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9TdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1N0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyMDRlMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1N0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy4qOwotCi1wdWJsaWMgY2xhc3MgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgZXJyT3V0cHV0OwotCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBleGl0VmFsdWU9IG5ldyBJbnRlZ2VyKC0xKTsKLQlwdWJsaWMgc3RhdGljIFVSTCBUQVJHRVRfRklMRV9TSVRFOwotCXByaXZhdGUgYm9vbGVhbiBvbGRDYWNoZSA9IGZhbHNlOwotCQotCXN0YXRpYyB7Ci0JCUZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKLQkJdGFyZ2V0RGlyID0gbmV3IEZpbGUodGFyZ2V0RGlyLCAic3RhbmRhbG9uZSIpOwotCQl0YXJnZXREaXIgPSBuZXcgRmlsZSh0YXJnZXREaXIsICJteXRhcmdldCIpOwotCQlpZiAodGFyZ2V0RGlyLmV4aXN0cygpKQotCQkJZGVsZXRlRGlyZWN0b3J5KHRhcmdldERpcik7Ci0JCXRyeSB7Ci0JCQlUQVJHRVRfRklMRV9TSVRFID0gdGFyZ2V0RGlyLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIChTdHJpbmcgYXJnMCl7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bVNldFVwKCkgewotCQkvLyBzZXR1cCBjYWNoZSBzaXRlIHRvIHRydWUKLQkJb2xkQ2FjaGUgPSBJbnRlcm5hbFNpdGVNYW5hZ2VyLmdsb2JhbFVzZUNhY2hlOwotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmdsb2JhbFVzZUNhY2hlID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW1UZWFyRG93bigpIHsKLQkJLy8gZG8gbm90aGluZy4KLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5nbG9iYWxVc2VDYWNoZSA9IG9sZENhY2hlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjaGVja0NvbmZpZ3VyZWRTaXRlcygpewotCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Iik7Ci0JCXRyeSB7Ci0JCQlsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0TGFiZWwoKSk7Ci0JCQotCQkvL0dldCBzaXRlIHRvIGluc3RhbGwgdG8KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjdXJyZW50Q29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotLy8JCi0vLwkJCS8vIHN0YXJ0IG9mIGNvbmZpZyBzaXRlIHByaW50Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiR0VUVElORyBDT05GSUdVUkVEIFNJVEVTLi4uIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpPHNpdGVzLmxlbmd0aDsgaSsrKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2l0ZSAjIiArIGkgKyAiOiAiICsgc2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKSk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJ+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Iik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9Ci0JfQotCQotCS8vIGdldCB0aGUgZmlyc3QgY29uZmlndXJlZCBzaXRlIGZvdW5kIGJlY2F1c2UgdGhpcyBpcyB0aGUgb25lIHdlJ3JlIG1vc3QgbGlrZWx5IHRvIAotCS8vIGhhdmUgaW5zdGFsbGVkIGludG8KLQlwdWJsaWMgSVNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoVVJMIHRhcmdldCl7Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGN1cnJlbnRDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxucmV0cmlldmluZyBjb25maWd1cmVkIHNpdGVzLi4uIik7Ci0JCQlTdHJpbmcgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGk8c2l0ZXMubGVuZ3RoIDsgaSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNpdGVbIitpKyJdOiAiICsgc2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpKTsKLQkJCQlTdHJpbmcgc2l0ZUZpbGUgPSBuZXcgRmlsZShzaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlpZiAodGFyZ2V0RmlsZS5lcXVhbHMoc2l0ZUZpbGUpKQotCQkJCQlyZXR1cm4gc2l0ZXNbaV0uZ2V0U2l0ZSgpOwotCQkJfQotCQkJaWYgKHNpdGVzLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHNpdGVzWzBdLmdldFNpdGUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvL1dhdGNoRG9nIHRocmVhZCB0byBraWxsIG1pcnJvcmluZyBwcm9jZXNzIGlmIGl0IGhhbmdzIChvciB0YWtlcyB0b28gbG9uZykKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRpbWVyIGV4dGVuZHMgVGhyZWFkewotCQlwcml2YXRlIFByb2Nlc3MgcHJvYzsKLQkJCi0JCXB1YmxpYyBUaW1lcihQcm9jZXNzIHByb2MpewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2V0RGFlbW9uKHRydWUpOwotCQkJdGhpcy5wcm9jID0gcHJvYzsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQl0cnkgewotCQkJCS8vIHNsZWVwIHRpbWUgNW1pbgotCQkJCXNsZWVwKDMwMDAwMCk7IAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVzdHJveWluZyBwcm9jZXNzIik7Ci0JCQkJcHJvYy5kZXN0cm95KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vIFN0cmVhbUNvbnN1bWVyIHRvIGRpc3BsYXkgb3V0cHV0IHRvIG91dHB1dCBmaWxlcyBvciBjb25zb2xlCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1Db25zdW1lciBleHRlbmRzIFRocmVhZCB7Ci0JCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgYlJlYWRlcjsKLQotCQlwdWJsaWMgU3RyZWFtQ29uc3VtZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJCXN1cGVyKCk7Ci0JCQlzZXREYWVtb24odHJ1ZSk7Ci0JCQliUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSkpOwotCQkJZXJyT3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbGluZTsKLQkJCQl3aGlsZSAobnVsbCAhPSAobGluZSA9IGJSZWFkZXIucmVhZExpbmUoKSkpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKGxpbmUpOwotCQkJCQllcnJPdXRwdXQuYXBwZW5kKGxpbmUpOwotCQkJCQllcnJPdXRwdXQuYXBwZW5kKCJcbiIpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZCA6IGNvbW1hbmQgYXJndW1lbnQgdG8gcnVuIG9uIHNpdGUvZmVhdHVyZSAKLQkgKiAoaS5lLiAnaW5zdGFsbCcsICdlbmFibGUnLCAnZGlzYWJsZScsICd1cGRhdGUnKSAqPGk+cmVxdWlyZWQ8L2k+KgotCSAqIEBwYXJhbSBmaWQgOiBmZWF0dXJlIGlkIG9mIHRoZSBmZWF0dXJlIGJlaW5nIGluc3RhbGxlZCwgZW5hYmxlZCwgZXRjLgotCSAqIChvcHRpb25hbCAtIGNhbiBiZSBudWxsKQotCSAqIEBwYXJhbSB2ZXIgOiB2ZXJzaW9uIG9mIGZlYXR1cmUgYmVpbmcgaW5zdGFsbGVkLCBlbmFibGVkLCBldGMuIChvcHRpb25hbCAtIGNhbiBiZSBudWxsKQotCSAqIEBwYXJhbSBjb25maWcgOiBsb2NhdGlvbiBvZiBjb25maWd1cmF0aW9uIGluZm8gKGkuZS4gZmlsZTpEOlx0ZW1wXC5jb25maWdcKQotCSAqIEBwYXJhbSByZW1vdGVMb2MgOiByZW1vdGUgc2l0ZSB1cmwgKHJlcXVpcmVkIGZvciBpbnN0YWxsaW5nL3NlYXJjaGluZyBmcm9tIHJlbW90ZSBzaXRlKQotCSAqIEBwYXJhbSBsb2NhbExvYyA6IHRhcmdldCBzaXRlIGRpcmVjdG9yeSAocmVxdWlyZWQgdW5sZXNzIHVwZGF0aW5nL3NlYXJjaGluZykKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IGNvbnNpc3Rpbmcgb2YgY29tbWFuZHMgYW5kIHRoZWlyIGFyZ3VtZW50cyB0bwotCSAqIGJlIHJ1bgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb21tYW5kKAotCQlTdHJpbmcgY29tbWFuZCwKLQkJU3RyaW5nIGZpZCwKLQkJU3RyaW5nIHZlciwKLQkJU3RyaW5nIGNvbmZpZywKLQkJU3RyaW5nIHJlbW90ZUxvYywKLQkJU3RyaW5nIGxvY2FsTG9jKXsKLQkJZmluYWwgU3RyaW5nIGNsYXNzcGF0aCA9ICJzdGFydHVwLmphciI7Ci0JCWZpbmFsIFN0cmluZyBsYXVuY2hlciA9ICJvcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyLk1haW4iOwotCQlmaW5hbCBTdHJpbmcgYXBwbGljYXRpb24gPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc3RhbmRhbG9uZVVwZGF0ZSI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NQID0gIi1jcCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0FQUCA9ICItYXBwbGljYXRpb24iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19DTUQgPSAiLWNvbW1hbmQiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19GSUQgPSAiLWZlYXR1cmVJZCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0RBVEEgPSAiLWRhdGEiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19WRVJTSU9OID0gIi12ZXJzaW9uIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfRlJPTSA9ICItZnJvbSI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1RPID0gIi10byI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NPTkZJRyA9ICItY29uZmlndXJhdGlvbiI7Ci0vLwkJZmluYWwgU3RyaW5nIEZMQUdfVVJMID0gIi1taXJyb3JVUkwiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19TUExBU0ggPSAiLW5vc3BsYXNoIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQ09OU09MRUxPRyA9ICItY29uc29sZWxvZyI7Ci0JCWZpbmFsIFN0cmluZyBkYXRhID0KLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nW10gY21kID0KLQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJZ2V0SmF2YVZNUGF0aCgpLAotCQkJCUZMQUdfQ1AsCi0JCQkJY2xhc3NwYXRoLAotCQkJCWxhdW5jaGVyLAotCQkJCUZMQUdfQVBQLAotCQkJCWFwcGxpY2F0aW9uLAotCQkJCUZMQUdfQ01ELAotCQkJCWNvbW1hbmQsCi0JCQkJKHJlbW90ZUxvYyAhPW51bGwgPyBGTEFHX0ZST00gOiAiIiksCi0JCQkJKHJlbW90ZUxvYyAhPW51bGwgPyByZW1vdGVMb2MgOiAiIiksCi0JCQkJKGxvY2FsTG9jICE9bnVsbCA/IEZMQUdfVE8gOiAiIiksCi0JCQkJKGxvY2FsTG9jICE9bnVsbCA/bG9jYWxMb2MucmVwbGFjZUZpcnN0KCJmaWxlOiIsICIiKSA6ICIiKSwKLQkJCQkoZmlkICE9IG51bGwgPyBGTEFHX0ZJRCA6ICIiKSwKLQkJCQkoZmlkICE9IG51bGwgPyBmaWQgOiAiIiksCi0JCQkJKHZlciAhPSBudWxsID8gRkxBR19WRVJTSU9OIDogIiIpLAotCQkJCSh2ZXIgIT0gbnVsbCA/IHZlciA6ICIiKSwKLQkJCQkoY29uZmlnICE9IG51bGwgPyBGTEFHX0NPTkZJRyA6ICIiKSwKLQkJCQkoY29uZmlnICE9IG51bGwgPyBjb25maWcgOiAiIiksCi0JCQkJRkxBR19TUExBU0gsCi0JCQkJRkxBR19EQVRBLAotCQkJCWRhdGEsCi0JCQkJRkxBR19DT05TT0xFTE9HfTsKLQkJZm9yIChpbnQgaSA9IDAgO2k8Y21kLmxlbmd0aDsgaSsrKXsKLQkJCVN5c3RlbS5vdXQucHJpbnQoY21kW2ldICsgIiAiKTsJCQkKLQkJfVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlyZXR1cm4gY21kOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFWTVBhdGgoKSB7Ci0JCS8vIENyZWF0ZSBjb21tYW5kIHN0cmluZyBmb3IgbGF1bmNoaW5nIHRoZSBwcm9jZXNzCi0JCVN0cmluZyB2bSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIik7Ci0JCVN0cmluZyBleGVjdXRhYmxlID0gIko5Ii5lcXVhbHModm0pID8gImo5IiA6ICJqYXZhIjsKLQkJaWYgKG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfV0lOMzIuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpKQotCQkJZXhlY3V0YWJsZSArPSAidy5leGUiOwotCi0JCVN0cmluZyBqYXZhSW5zdGFsbERpciA9Ci0JCQlTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgKyAiYmluIjsKLQkJcmV0dXJuIGphdmFJbnN0YWxsRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBleGVjdXRhYmxlOwotCX0KLQkKLQlwdWJsaWMgaW50IHBlcmZvcm1BY3Rpb24oU3RyaW5nW10gY21kKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEVjbGlwc2VSb290KCkpOwotCQl0cnkgewotCi0JCQlQcm9jZXNzIHByb2MgPQotCQkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY21kLCAoU3RyaW5nW10pIG51bGwsIGZpbGUpOwotCi0JCQlTdHJlYW1Db25zdW1lciBvdXRwdXRzID0gbmV3IFN0cmVhbUNvbnN1bWVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQlvdXRwdXRzLnN0YXJ0KCk7Ci0JCQlTdHJlYW1Db25zdW1lciBlcnJvcnMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHJvYy5nZXRFcnJvclN0cmVhbSgpKTsKLQkJCWVycm9ycy5zdGFydCgpOwotCQkJVGltZXIgdGltZXIgPSBuZXcgVGltZXIocHJvYyk7Ci0JCQl0aW1lci5zdGFydCgpOwotCi0JCQlyZXR1cm4gcHJvYy53YWl0Rm9yKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFY2xpcHNlUm9vdCgpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRvclV0aWxzLmdldEluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpLnJlcGxhY2VGaXJzdCgKLQkJCSJmaWxlOiIsCi0JCQkiIik7Ci0JfQotCQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0QXJyYXlMaXN0KFN0cmluZ1tdIGxpc3QpewotCQlBcnJheUxpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpID0gMDsgaTwgbGlzdC5sZW5ndGg7IGkrKyl7Ci0JCQl0ZW1wLmFkZChsaXN0W2ldKTsKLQkJfQotCQlyZXR1cm4gdGVtcDsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkZpbGUoRmlsZSBsb2NhbEZpbGUpIHsKLQotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWFkaW5nIGZyb20gOiAiICsgbG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQlGaWxlUmVhZGVyIGZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihsb2NhbEZpbGUpOwotCQkJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7Ci0JCQkJU3RyaW5nIGNvbmZpZ0ZpbGVOYW1lPSIiLCBsaW5lOwotCQkJCXdoaWxlIChicmVhZGVyLnJlYWR5KCkpIHsKLQkJCQkJbGluZSA9IGJyZWFkZXIucmVhZExpbmUoKTsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JCQkJCWlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCI8Y29uZmlnIHVybCIpKSB7Ci0JCQkJCQljb25maWdGaWxlTmFtZSA9IGxpbmUuc3BsaXQoIlwiIilbMV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gcmVhZCBjb25maWcgZmlsZQotCQkJCUZpbGUgcGFyZW50ID0gbmV3IEZpbGUobG9jYWxGaWxlLmdldFBhcmVudCgpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInBhcmVudDogIiArIHBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJU3RyaW5nW10gcGFyTGlzdCA9IHBhcmVudC5saXN0KCk7Ci0JCQkJaW50IGxhdGVzdCA9IDA7IAotCQkJCWZvciAoaW50IGkgPSBwYXJMaXN0Lmxlbmd0aC0xOyBpPj0wOyBpLS0pewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInBhckxpc3RbIiArIGkgKyAiXTogIiArIHBhckxpc3RbaV0pOwotCQkJCQlpZiAocGFyTGlzdFtpXS5zdGFydHNXaXRoKCJwbGF0Zm9ybSIpKXsKLQkJCQkJCWxhdGVzdCA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShwYXJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIHBhckxpc3RbbGF0ZXN0XSk7Ci0JCQkJcmV0dXJuIGNvbmZpZ0ZpbGU7Ci0JCQkJLy8gZW5kIG9mIGNvbmZpZyBmaWxlIHJlYWQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGxvY2FsRmlsZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXIpIHsKLQkJRmlsZVtdIGxpc3QgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQkKLQkJZm9yIChpbnQgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChsaXN0W2ldLmlzRGlyZWN0b3J5KCkpIAotCQkJCWRlbGV0ZURpcmVjdG9yeShsaXN0W2ldKTsKLQkJCWlmICghbGlzdFtpXS5kZWxldGUoKSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBkZWxldGUgIitsaXN0W2ldLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0QnVuZGxlc0luc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEJ1bmRsZXNJbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMmFiOTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0QnVuZGxlc0luc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEJ1bmRsZXNJbnN0YWxsIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luc3RhbGxlZDsKLQotCXB1YmxpYyBUZXN0QnVuZGxlc0luc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzSW5zdGFsbGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibG9va2luZyBhdCBjb25maWd1cmVkIHNpdGVzIGF2YWlsYWJsZS4uLi4iKTsKLQkJLy9jaGVja0NvbmZpZ3VyZWRTaXRlcygpOwotCQkKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPSAiaHR0cDovLyIrZ2V0SHR0cEhvc3QoKSsiOiIrIGdldEh0dHBQb3J0KCkrICIvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMvYnVuZGxlU2l0ZS8iOzsKLQkJaWYgKCFpc0luc3RhbGxlZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOwotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAotCQkJCQkiaW5zdGFsbCIsCi0JCQkJCWZlYXR1cmVJZCwKLQkJCQkJdmVyc2lvbiwKLQkJCQkJbnVsbCwKLQkJCQkJZnJvbVJlbW90ZVNpdGVVcmwsCi0JCQkJCVRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpc0luc3RhbGxlZCA9IHRydWU7Ci0JCX0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBsdWdpbnNFeGlzdCgpIHsKLQkJSVNpdGUgbG9jYWxTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvY2FsU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5FbnRyaWVzID0gbG9jYWxTaXRlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwbHVnaW5FbnRyaWVzID09IG51bGwgfHwgcGx1Z2luRW50cmllcy5sZW5ndGggPT0gMCl7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHBsdWdpbiBlbnRyaWVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJZmFpbCgiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCX0gZWxzZXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKyl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBwbHVnaW46ICIgKyBwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCQlsaXN0LmFkZChwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZ1tdIHBsdWdpbk5hbWVzID0KLQkJCXsJImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW5fMS4wLjAiLAotCQkJCSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpXzIuMC4wIiwKLQkJCQkiY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50XzEuMC4wIiwKLQkJCQkiY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWlfMS4wLjAifTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzSW5MaXN0KHBsdWdpbk5hbWVzLCBsaXN0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVzRXhpc3QoKSB7Ci0JCXRyeSB7Ci0JCQlJU2l0ZSBsb2NhbFNpdGUgPSAgZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSk7Ci0JCQkvLyBnZXQgZmVhdHVyZSByZWZlcmVuY2VzIAotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0KLQkJCQlsb2NhbFNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWwgY3VycmVudENPbmZpZ1NpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykKLQkJCQkJbGlzdC5hZGQobG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBmZWF0dXJlTmFtZXMgPQotCQkJCXsKLQkJCQkJImNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlXzEuMC4wIn07Ci0JCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QoZmVhdHVyZU5hbWVzLCBsaXN0KSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9Ci0JfQotCi0JLy8gbWFrZXMgc3VyZSBhbGwgZmlsZXMvZGlyZWN0b3JpZXMgaW4gIm5hbWVzIiBhcmUgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nICJsaXN0IgotCXB1YmxpYyBib29sZWFuIGNoZWNrRmlsZXNJbkxpc3QoCi0JCVN0cmluZ1tdIG5hbWVzLAotCQlBcnJheUxpc3QgbGlzdCkgewotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG5hbWVzW2ldKTsKLQkJCWlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVEaXNhYmxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRGlzYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI3OGU1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVEaXNhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVEaXNhYmxlIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlzYWJsZWQ7Ci0JCi0JcHVibGljIFRlc3RGZWF0dXJlRGlzYWJsZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJaXNEaXNhYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7Ci0JCXN1cGVyLnVtU2V0VXAoKTsKLQkJCi0JCVN0cmluZyBmZWF0dXJlSWQgPSAibXkuYWxwaGFiZXQiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7Ci0KLQkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJaWYgKCFpc0Rpc2FibGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCSJkaXNhYmxlIiwKLQkJCQkJZmVhdHVyZUlkLAotCQkJCQl2ZXJzaW9uLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaXNEaXNhYmxlZCA9IHRydWU7Ci0JCQljaGVja0NvbmZpZ3VyZWRTaXRlcygpOwotCQl9Ci0JfQotCQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFZhbHVlOiAiICsgZXhpdFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXRWYWx1ZSwgSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVTdGF0dXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4obG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbEZpbGUuZXhpc3RzKCkpOwotCQlGaWxlIGNvbmZpZ0ZpbGUgPSBnZXRMYXRlc3RDb25maWd1cmF0aW9uRmlsZShsb2NhbEZpbGUpOwotCQotCQlTdHJpbmdbXSBuYW1lcyA9Ci0JCQl7Ci0JCQkJImZlYXR1cmVzL215LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAvIiwKLQkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMC8iLAotCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldF8xLjAuMC8iIH07Ci0JCWFzc2VydFRydWUoY29uZmlnRmlsZS5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoY2hlY2tGZWF0dXJlc0Rpc2FibGVkKGdldEFycmF5TGlzdChuYW1lcyksY29uZmlnRmlsZSwgVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0ZlYXR1cmVzRGlzYWJsZWQoQXJyYXlMaXN0IGZlYXR1cmVOYW1lcywgRmlsZSBjb25maWdGaWxlLCBTdHJpbmcgc2l0ZUxvY2F0aW9uKXsKLQkJdHJ5IHsKLQkJCUZpbGVSZWFkZXIgZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGNvbmZpZ0ZpbGUpOwotCQkJQnVmZmVyZWRSZWFkZXIgYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJCVN0cmluZyBsaW5lOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3cgcmVhZGluZy4uLiIgKyBjb25maWdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWJvb2xlYW4gaXNTaXRlVG9DaGVjayA9IGZhbHNlOwotCQkJd2hpbGUgKGJyZWFkZXIucmVhZHkoKSkgewotCQkJCWxpbmUgPSBicmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxzaXRlIHVybCIpKXsKLQkJCQkJaXNTaXRlVG9DaGVjayA9IGxpbmUudHJpbSgpLnNwbGl0KCJcIiIpWzFdLnJlcGxhY2VGaXJzdCgiZmlsZToiLCIiKS5lcXVhbHMoc2l0ZUxvY2F0aW9uKTsKLQkJCQl9IGVsc2UgaWYgKGlzU2l0ZVRvQ2hlY2sgJiYgbGluZS50cmltKCkuc3RhcnRzV2l0aCgiPGZlYXR1cmUgY29uZmlndXJlZCIpKXsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKGxpbmUpOwotCQkJCQlTdHJpbmdbXSBjb25maWdMaW5lID0gbGluZS5zcGxpdCgiXCIiKTsKLQkJCQkJaWYgKGZlYXR1cmVOYW1lcy5jb250YWlucyhjb25maWdMaW5lWzNdKSAmJiBjb25maWdMaW5lWzFdLmVxdWFscygidHJ1ZSIpKXsKLQkJCQkJCWZhaWwoY29uZmlnTGluZVszXSArICIgaGFzIG5vdCBiZWVuIGRpc2FibGVkLiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVFbmFibGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVFbmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5YWM2Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRW5hYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVFbmFibGUgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkOwotCQotCXB1YmxpYyBUZXN0RmVhdHVyZUVuYWJsZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJaXNFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQotCQlzdXBlci51bVNldFVwKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCWlmICghaXNFbmFibGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCSJlbmFibGUiLAotCQkJCQlmZWF0dXJlSWQsCi0JCQkJCXZlcnNpb24sCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCVRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpc0VuYWJsZWQgPSB0cnVlOwotCQkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJfQotCX0KLQkKLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWFzc2VydFRydWUobG9jYWxGaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBjb25maWdGaWxlID0gZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkZpbGUobG9jYWxGaWxlKTsKLQkJCi0JCVN0cmluZ1tdIG5hbWVzID0KLQkJCXsKLQkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMC8iLAotCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wLyIsCi0JCQkJImZlYXR1cmVzL215LmFscGhhYmV0XzEuMC4wLyIgfTsKLQkJYXNzZXJ0VHJ1ZShjb25maWdGaWxlLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0ZlYXR1cmVzRW5hYmxlZChnZXRBcnJheUxpc3QobmFtZXMpLGNvbmZpZ0ZpbGUsIFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlc0VuYWJsZWQoQXJyYXlMaXN0IGZlYXR1cmVOYW1lcywgRmlsZSBjb25maWdGaWxlLCBTdHJpbmcgc2l0ZUxvY2F0aW9uKXsKLQkJdHJ5IHsKLQkJCUZpbGVSZWFkZXIgZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGNvbmZpZ0ZpbGUpOwotCQkJQnVmZmVyZWRSZWFkZXIgYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJCVN0cmluZyBsaW5lOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3cgcmVhZGluZy4uLiIgKyBjb25maWdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWJvb2xlYW4gaXNTaXRlVG9DaGVjayA9IGZhbHNlOwotCQkJd2hpbGUgKGJyZWFkZXIucmVhZHkoKSkgewotCQkJCWxpbmUgPSBicmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxzaXRlIHVybCIpKXsKLQkJCQkJaXNTaXRlVG9DaGVjayA9IGxpbmUudHJpbSgpLnNwbGl0KCJcIiIpWzFdLnJlcGxhY2VGaXJzdCgiZmlsZToiLCIiKS5lcXVhbHMoc2l0ZUxvY2F0aW9uKTsKLQkJCQl9IGVsc2UgaWYgKGlzU2l0ZVRvQ2hlY2sgJiYgbGluZS50cmltKCkuc3RhcnRzV2l0aCgiPGZlYXR1cmUgY29uZmlndXJlZCIpKXsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKGxpbmUpOwotCQkJCQlTdHJpbmdbXSBjb25maWdMaW5lID0gbGluZS5zcGxpdCgiXCIiKTsKLQkJCQkJaWYgKGZlYXR1cmVOYW1lcy5jb250YWlucyhjb25maWdMaW5lWzNdKSAmJiBjb25maWdMaW5lWzFdLmVxdWFscygiZmFsc2UiKSl7Ci0JCQkJCQlmYWlsKGNvbmZpZ0xpbmVbM10gKyAiIGhhcyBub3QgYmVlbiBlbmFibGVkLiIpOwotCQkJCQl9Ci0JCQkJCS8vIHRlbXAgLSBkZWxldGUgbGF0ZXIKLQkJCQkJaWYgKGZlYXR1cmVOYW1lcy5jb250YWlucyhjb25maWdMaW5lWzNdKSkKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKLQkJCQkJLy8gZW5kIG9mIHRlbXAgZGVsZXRlCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTZkMWZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVJbnN0YWxsIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luc3RhbGxlZDsKLQotCXB1YmxpYyBUZXN0RmVhdHVyZUluc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzSW5zdGFsbGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibG9va2luZyBhdCBjb25maWd1cmVkIHNpdGVzIGF2YWlsYWJsZS4uLi4iKTsKLQkJLy9jaGVja0NvbmZpZ3VyZWRTaXRlcygpOwotCQkKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJteS5hbHBoYWJldCI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkJImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0UvcGxhdGZvcm0tdXBkYXRlLWhvbWUvMy4wL3NpdGUvIjsKLQkJaWYgKCFpc0luc3RhbGxlZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOwotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAotCQkJCQkiaW5zdGFsbCIsCi0JCQkJCWZlYXR1cmVJZCwKLQkJCQkJdmVyc2lvbiwKLQkJCQkJbnVsbCwKLQkJCQkJZnJvbVJlbW90ZVNpdGVVcmwsCi0JCQkJCVRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpc0luc3RhbGxlZCA9IHRydWU7Ci0JCX0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBsdWdpbnNFeGlzdCgpIHsKLQkJSVNpdGUgbG9jYWxTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvY2FsU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5FbnRyaWVzID0gbG9jYWxTaXRlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwbHVnaW5FbnRyaWVzID09IG51bGwgfHwgcGx1Z2luRW50cmllcy5sZW5ndGggPT0gMCl7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHBsdWdpbiBlbnRyaWVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJZmFpbCgiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCX0gZWxzZXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKyl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBwbHVnaW46ICIgKyBwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCQlsaXN0LmFkZChwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZ1tdIHBsdWdpbk5hbWVzID0KLQkJCXsJIm15LmFscGhhYmV0LmxldHRlci5hXzEuMC4wIiwKLQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmJfMS4wLjAiLAotCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuY18xLjAuMCIsCi0JCQkJIm15LmFscGhhYmV0LmxldHRlci5lXzEuMC4wIiwKLQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJIm15LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAiLAotCQkJCSJteS5hbHBoYWJldF8xLjAuMCIgfTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzSW5MaXN0KHBsdWdpbk5hbWVzLCBsaXN0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVzRXhpc3QoKSB7Ci0JCXRyeSB7Ci0JCQlJU2l0ZSBsb2NhbFNpdGUgPSAgZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSk7Ci0JCQkvLyBnZXQgZmVhdHVyZSByZWZlcmVuY2VzIAotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0KLQkJCQlsb2NhbFNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWwgY3VycmVudENPbmZpZ1NpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykKLQkJCQkJbGlzdC5hZGQobG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBmZWF0dXJlTmFtZXMgPQotCQkJCXsKLQkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldF8xLjAuMCIgfTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChmZWF0dXJlTmFtZXMsIGxpc3QpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0KLQkvLyBtYWtlcyBzdXJlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbiAibmFtZXMiIGFyZSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgImxpc3QiCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGaWxlc0luTGlzdCgKLQkJU3RyaW5nW10gbmFtZXMsCi0JCUFycmF5TGlzdCBsaXN0KSB7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obmFtZXNbaV0pOwotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSl7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFZhbHVlOiAiICsgZXhpdFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXRWYWx1ZSwgSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVuaW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVuaW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWEzNmZkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVVbmluc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVVbmluc3RhbGwgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmluc3RhbGxlZDsKLQkKLQlwdWJsaWMgVGVzdEZlYXR1cmVVbmluc3RhbGwoU3RyaW5nIGFyZzApewotCQlzdXBlcihhcmcwKTsKLQkJaXNVbmluc3RhbGxlZCA9IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlzdXBlci51bVNldFVwKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibG9va2luZyBhdCBjb25maWd1cmVkIHNpdGVzIGF2YWlsYWJsZS4uLi4iKTsKLQkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJCi0JCVN0cmluZyBmZWF0dXJlSWQgPSAibXkuYWxwaGFiZXQiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7Ci0KLQkJaWYoIWlzVW5pbnN0YWxsZWQpewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOwotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAotCQkJCQkidW5pbnN0YWxsIiwKLQkJCQkJZmVhdHVyZUlkLAotCQkJCQl2ZXJzaW9uLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaXNVbmluc3RhbGxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVzVW5pbnN0YWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlTaXRlIGxvY2FsU2l0ZSA9IGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOwotCQkJCi0JCQkvLyBnZXQgZmVhdHVyZSByZWZlcmVuY2VzIAotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0KLQkJCQlsb2NhbFNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGxvY2FsRmVhdHVyZXMgPT0gbnVsbCB8fCBsb2NhbEZlYXR1cmVzLmxlbmd0aCA9PSAwKXsKLQkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJCQlsaXN0LmFkZChsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9Ci0JCQkJewotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzTm90SW5MaXN0KGZlYXR1cmVOYW1lcywgbGlzdCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc1VuaW5zdGFsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQkJCQotCQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcyA9IGxvY2FsU2l0ZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChwbHVnaW5FbnRyaWVzID09IG51bGwgfHwgcGx1Z2luRW50cmllcy5sZW5ndGggPT0gMCkKLQkJCQlmYWlsKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCWVsc2UKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspewotCQkJCQlsaXN0LmFkZChwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwbHVnaW4gZm91bmQ6ICIgKyBwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCQl9Ci0KLQkJCVN0cmluZ1tdIHBsdWdpbk5hbWVzID0KLQkJCQl7CSJteS5hbHBoYWJldC5sZXR0ZXIuYV8xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuYl8xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuY18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuZV8xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXRfMS4wLjAiIH07Ci0JCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNOb3RJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsJCi0JfQotCQotCS8vIG1ha2VzIHN1cmUgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIGluICJuYW1lcyIgYXJlIE5PVCBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgImxpc3QiCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGaWxlc05vdEluTGlzdCgKLQkJU3RyaW5nW10gbmFtZXMsCi0JCUFycmF5TGlzdCBsaXN0KSB7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlYXJjaGluZyBmb3IgIiArIG5hbWVzW2ldICsgIi4uLiIpOwotCQkJaWYgKGxpc3QuY29udGFpbnMobmFtZXNbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVXBkYXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVXBkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTZhNDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVwZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVVcGRhdGUgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVcGRhdGVkOwotCQotCXB1YmxpYyBUZXN0RmVhdHVyZVVwZGF0ZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJaXNVcGRhdGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb2tpbmcgYXQgY29uZmlndXJlZCBzaXRlcyBhdmFpbGFibGUuLi4uIik7Ci0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjEiOwotCi0JCWlmICghaXNVcGRhdGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCQkidXBkYXRlIiwKLQkJCQkJCWZlYXR1cmVJZCwKLQkJCQkJCXZlcnNpb24sCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCVRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpc1VwZGF0ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0KLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc0V4aXN0KCkgewotCi0JCQlJU2l0ZSBsb2NhbFNpdGUgPSAgZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0KLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApCi0JCQkJZmFpbCgiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQllbHNlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWxpc3QuYWRkKAotCQkJCQkJcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCi0JCQlTdHJpbmdbXSBwbHVnaW5OYW1lcyA9Ci0JCQkJewotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmFfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmJfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmVfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5hXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5iXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5jXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5lXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjEiLAotCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldF8xLjAuMSIgfTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChwbHVnaW5OYW1lcywgbGlzdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlc0V4aXN0KCkgewotCQl0cnkgewotCQkJSVNpdGUgbG9jYWxTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0KLQkJCS8vIGdldCBmZWF0dXJlIHJlZmVyZW5jZXMKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9Ci0JCQkJbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCkgewotCQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJbGlzdC5hZGQoCi0JCQkJCQlsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCQkJbG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nW10gZmVhdHVyZU5hbWVzID0KLQkJCQl7Ci0JCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXRfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4xIiB9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzSW5MaXN0KGZlYXR1cmVOYW1lcywgbGlzdCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfQotCX0KLQotCS8vIG1ha2VzIHN1cmUgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIGluICJuYW1lcyIgYXJlIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZwotCS8vICJsaXN0IgotCXB1YmxpYyBib29sZWFuIGNoZWNrRmlsZXNJbkxpc3QoU3RyaW5nW10gbmFtZXMsIEFycmF5TGlzdCBsaXN0KSB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvQWxsVHlwZXNUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvQWxsVHlwZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzA2NDhkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3R5cGVzL0FsbFR5cGVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy50eXBlczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7DQotDQotDQotcHVibGljIGNsYXNzIEFsbFR5cGVzVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLXB1YmxpYyBBbGxUeXBlc1Rlc3RzKFN0cmluZyBuYW1lKSB7DQotCXN1cGVyKG5hbWUpOw0KLX0NCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0Jc3VpdGUuc2V0TmFtZSgiUmVndWxhciBJbnN0YWxsIFRlc3RzIik7DQotCQ0KLQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0Jw0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVUeXBlLmNsYXNzKSk7DQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVR5cGUuY2xhc3MpKTsJDQotCQ0KLQkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZA0KLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQ0KLQkNCi0JcmV0dXJuIHN1aXRlOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdEZlYXR1cmVUeXBlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9UZXN0RmVhdHVyZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjOTM0My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9UZXN0RmVhdHVyZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudHlwZXM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVUeXBlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRSA9ICJwYWNrYWdlZCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTExFRF9GRUFUVVJFX1RZUEUgPSAiaW5zdGFsbGVkIjsgLy8kTk9OLU5MUy0xJAkNCi0JDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdEZlYXR1cmVUeXBlKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQkNCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSB7DQotCQlTdHJpbmcgcGx1Z2luSUQgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCkgKyAiLiI7IC8vJE5PTi1OTFMtMSQNCi0JCXJldHVybiBwbHVnaW5JRCArIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRTsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVUeXBlKCkgew0KLQkJU3RyaW5nIHBsdWdpbklEID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi4iOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gcGx1Z2luSUQgKyBJTlNUQUxMRURfRkVBVFVSRV9UWVBFOw0KLQl9CQkNCi0JDQotCS8qKg0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVBhY2thZ2VkRmVhdHVyZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9ueyANCi0JCUZlYXR1cmVUeXBlRmFjdG9yeSBmYWN0b3JpZXMgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsNCi0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7DQotCQkNCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7DQotCQlVUkwgZmVhdHVyZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwiZmVhdHVyZXMvZmVhdHVyZXMyLmphciAiKTsNCi0JCQ0KLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZVVSTCxzaXRlLG51bGwpOw0KLQkJDQotCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsNCi0JfQkNCi0JDQotCQkvKioNCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVFeGVjdXRhYmxlRmVhdHVyZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9ueyANCi0JCUZlYXR1cmVUeXBlRmFjdG9yeSBmYWN0b3JpZXMgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsNCi0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpKTsNCi0JCQ0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsNCi0JCVVSTCBmZWF0dXJlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCJ0ZXN0QVBJLyIrU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrImZlYXR1cmUzLyIpOw0KLQkJDQotCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShmZWF0dXJlVVJMLHNpdGUsbnVsbCk7DQotCQkNCi0JCWFzc2VydFRydWUoIkZhY3RvcnkgZG9lc24ndCBjcmVhdGUgc2FtZSBmZWF0dXJlIixhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOw0KLQl9CQ0KLQkNCi0JLyoqDQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9ueyANCi0JCUZlYXR1cmVUeXBlRmFjdG9yeSBmYWN0b3JpZXMgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsNCi0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7DQotCQkNCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZSBmZWF0dXJlID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7DQotCQkNCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlKGZlYXR1cmUuZ2V0VVJMKCksc2l0ZSxudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZSgiRmFjdG9yeSBkb2Vzbid0IGNyZWF0ZSBzYW1lIGZlYXR1cmUiLGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsNCi0JfQ0KLQkNCi0JDQotCS8qKg0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVOZXdUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgDQotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7DQotCQlJRmVhdHVyZUZhY3RvcnkgZmFjdG9yeSA9IGZhY3Rvcmllcy5nZXRGYWN0b3J5KGdldERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZVR5cGUoKSk7DQotCQkNCi0JCVN0cmluZyBmZWF0dXJlUGF0aCA9IGRhdGFQYXRoKyJGZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sIjsNCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBGaWxlKGZlYXR1cmVQYXRoKS50b1VSTCgpLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdOw0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOw0KLQkJDQotCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShmZWF0dXJlLmdldFVSTCgpLHNpdGUsbnVsbCk7DQotDQotCQlhc3NlcnRUcnVlKGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIpOwkJDQotCQlhc3NlcnRUcnVlKCgoRmVhdHVyZVJlZmVyZW5jZSlyZWYpLmdldFR5cGUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZlYXR1cmUxIikpOwkJDQotCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOw0KLQ0KLQ0KLQl9DQotCQ0KLQkNCi0JCS8qKg0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVBbm90aGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb257IA0KLQkJRmVhdHVyZVR5cGVGYWN0b3J5IGZhY3RvcmllcyA9IEZlYXR1cmVUeXBlRmFjdG9yeS5nZXRJbnN0YW5jZSgpOw0KLQkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBmYWN0b3JpZXMuZ2V0RmFjdG9yeShnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpKTsNCi0JCQ0KLQkJU3RyaW5nIGZlYXR1cmVQYXRoID0gZGF0YVBhdGgrIkZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvc2l0ZS54bWwiOw0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IEZpbGUoZmVhdHVyZVBhdGgpLnRvVVJMKCksbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07CQkNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsNCi0JCQ0KLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5nZXRVUkwoKSxzaXRlLG51bGwpOw0KLQkJDQotCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOw0KLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcik7DQotCQlhc3NlcnRUcnVlKCgoRmVhdHVyZVJlZmVyZW5jZSlyZWYpLmdldFR5cGUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIikpOw0KLQkJDQotCX0NCi0JCQ0KLQkJDQotCS8qKg0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVVbmtub3duVHlwZSgpIHRocm93cyBFeGNlcHRpb257IA0KLQkJU3RyaW5nIGZlYXR1cmVQYXRoID0gZGF0YVBhdGgrIkZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvc2l0ZS54bWwiOw0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IEZpbGUoZmVhdHVyZVBhdGgpLnRvVVJMKCksbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07CQkNCi0JCXRyeSB7DQotCQkJcmVmLmdldEZlYXR1cmUobnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZSgiaWQgZm91bmQsIHNob3VsZCBub3QgYmUgZm91bmQiLGZhbHNlKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7DQotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnVua25vd250eXBlLmphciIpPT0tMSl7DQotCQkJCXRocm93IGU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCX0JCQ0KLQkJDQotfQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3R5cGVzL1Rlc3RTaXRlVHlwZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdFNpdGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZTdjZTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdFNpdGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudHlwZXM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5TaXRlVVJMQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuaW1wbGVtZW50YXRpb24uU2l0ZUZUUEZhY3Rvcnk7DQotDQotcHVibGljIGNsYXNzIFRlc3RTaXRlVHlwZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdFNpdGVUeXBlKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJU3RyaW5nIGZlYXR1cmVQYXRoID0gZGF0YVBhdGggKyAiU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbCI7DQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgRmlsZShmZWF0dXJlUGF0aCkudG9VUkwoKSxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsNCi0NCi0JCWFzc2VydFRydWUoc2l0ZS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBTaXRlVVJMQ29udGVudFByb3ZpZGVyKTsNCi0JCWFzc2VydFRydWUoKChTaXRlKSBzaXRlKS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5odHRwIikpOw0KLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcik7DQotDQotCX0NCi0NCi0JLyoqDQotCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkJICovDQotCXB1YmxpYyB2b2lkIHRlc3RGVFBTaXRlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgIkZUUExpa2VTaXRlLyIpLG51bGwpOw0KLQ0KLQkJLy8gc2hvdWxkIG5vdCBmaW5kIHRoZSBtYXBwaW5nDQotCQkvLyBidXQgdGhlbiBzaG91bGQgYXR0ZW1wdCB0byByZWFkIHRoZSBYTUwgZmlsZQ0KLQkJLy8gZm91bmQgYSBuZXcgdHlwZQ0KLQkJLy8gY2FsbCB0aGUgbmV3IHR5cGUNCi0JCWFzc2VydFRydWUoDQotCQkJIldyb25nIHNpdGUgdHlwZSIsDQotCQkJc2l0ZS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuZnRwIikpOw0KLQkJYXNzZXJ0VHJ1ZSgNCi0JCQkiV3JvbmcgZmlsZSIsDQotCQkJc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkuZXF1YWxzKCIvIiArIFNpdGVGVFBGYWN0b3J5LkZJTEUpKTsNCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlZnRwLnhtbCIpOw0KLQkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVSTCxudWxsKTsNCi0JCQlzaXRlLmdldEFyY2hpdmVzKCk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiPC9mZWF0dXJlPiIpID09IC0xKSB7DQotCQkJCXRocm93IGU7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL0FsbENvcmVVSVRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9BbGxDb3JlVUlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMThhYjE2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL0FsbENvcmVVSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudWl2YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxDb3JlVUlUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotcHVibGljIEFsbENvcmVVSVRlc3RzKFN0cmluZyBuYW1lKSB7DQotCXN1cGVyKG5hbWUpOw0KLX0NCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0Jc3VpdGUuc2V0TmFtZSgiUmVndWxhciBJbnN0YWxsIFRlc3RzIik7DQotCQ0KLQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0Jw0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFVJTGFiZWwuY2xhc3MpKTsNCi0JDQotCS8vIG9yIHlvdSBjYW4gc3BlY2lmeSB0aGUgbWV0aG9kDQotCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsJDQotCQ0KLQlyZXR1cm4gc3VpdGU7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9UZXN0VUlMYWJlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdWl2YWx1ZXMvVGVzdFVJTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3NTRhNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9UZXN0VUlMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFVJTGFiZWwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQ0KLQkvKioNCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3RVSUxhYmVsKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQkNCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgdGVzdEhUVFBTaXRlLg0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hbmFnZXJTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgDQotCQkNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoImh0dHAiLGdldEh0dHBIb3N0KCksZ2V0SHR0cFBvcnQoKSxidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMiIpKSxudWxsKTsNCi0JCUlDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3JpZXMoKTsNCi0JCWZvciAoaW50IGkgPTA7IGk8Y2F0ZWdvcmllcy5sZW5ndGg7IGkrKyl7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYXRlZ29yeSAtPiIrY2F0ZWdvcmllc1tpXS5nZXRMYWJlbCgpKyI6IitjYXRlZ29yaWVzW2ldLmdldE5hbWUoKSk7DQotCQl9DQotCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZW1vdGVGZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCWlmIChyZW1vdGVGZWF0dXJlcz09bnVsbCB8fCByZW1vdGVGZWF0dXJlcy5sZW5ndGg9PTApIGZhaWwoIk5vIGZlYXR1cmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nIik7CQkNCi0JCWZvciAoaW50IGk9MDtpPHJlbW90ZUZlYXR1cmVzLmxlbmd0aDtpKyspew0KLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVGZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmVhdHVyZToiK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyItPiIrZmVhdHVyZS5nZXRMYWJlbCgpKTsNCi0JCQlwcmludChmZWF0dXJlLmdldExpY2Vuc2UoKSwiTGljZW5zZSIpOw0KLQkJCXByaW50KGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCksIkNvcHlyaWdodCIpOwkJCQ0KLQkJCXByaW50KGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKSwiRGVzY3JpcHRpb24iKTsJCQkJDQotCQkJDQotCQkJLy8gY2hlY2sgdGhhdCBpdCBkb3dubG9hZHMgdGhlIGZlYXR1cmUuamFyIHVuZGVyIHRoZSBjb3Zlcg0KLQkJCS8vIGFuZCB1bnBhY2sgaXQNCi0JCQkNCi0JCQlVUkwgdXJsID0gZmVhdHVyZS5nZXRMaWNlbnNlKCkuZ2V0VVJMKCk7DQotCQkJaWYgKHVybCE9bnVsbCl7DQotCQkJCWFzc2VydFRydWUoKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKS5leGlzdHMoKSk7DQotCQkJfQ0KLQ0KLQkJCXVybCA9IGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkuZ2V0VVJMKCk7DQotCQkJaWYgKHVybCE9bnVsbCl7DQotCQkJCWFzc2VydFRydWUoKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKS5leGlzdHMoKSk7DQotCQkJfQ0KLQkJCQ0KLQkJCXVybCA9IGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRVUkwoKTsNCi0JCQlpZiAodXJsIT1udWxsKXsNCi0JCQkJYXNzZXJ0VHJ1ZSgobmV3IEZpbGUodXJsLmdldEZpbGUoKSkpLmV4aXN0cygpKTsNCi0JCQl9DQotCQkJDQotCQl9DQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogTWV0aG9kIHByaW50Lg0KLQkgKiBAcGFyYW0gaW5mbw0KLQkgKiBAcGFyYW0gdGV4dA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByaW50KElVUkxFbnRyeSBpbmZvLCBTdHJpbmcgdGV4dCl7DQotCQlTeXN0ZW0ub3V0LnByaW50KCItPiIrdGV4dCsiOiIpOw0KLQkJaWYgKGluZm8uZ2V0VVJMKCkhPW51bGwpIA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPCIraW5mby5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKyI+Iik7DQotCQllbHNlIA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbmZvLmdldEFubm90YXRpb24oKSk7DQotCX0NCi19IA0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS90ZXN0LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4ODg1NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+IA0KLSAgDQotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPg0KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4NCi0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uIi8+DQotICANCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+DQotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZSIvPg0KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4NCi0gIDxwcm9wZXJ0eSBuYW1lPSJjbGFzcy1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLkFsbFRlc3RzIiAvPg0KLSAgDQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+DQotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPg0KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+DQotICA8dGFyZ2V0IG5hbWU9ImluaXQiPg0KLSAgICA8dHN0YW1wLz4NCi0gICAgPGRlbGV0ZT4NCi0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+DQotICAgIDwvZGVsZXRlPg0KLSAgPC90YXJnZXQ+DQotICANCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+DQotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4NCi0gICAgPHByb3BlcnR5IG5hbWU9InNuaWZmLWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS91cGRhdGVfY29yZV9zbmlmZl9mb2xkZXIiLz4NCi0gICAgPGRlbGV0ZSBkaXI9IiR7c25pZmYtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4NCi0gICAgDQotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPg0KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c25pZmYtZm9sZGVyfSIvPg0KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+DQotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9IiR7Y2xhc3MtbmFtZX0iLz4NCi0gICAgPC9hbnQ+DQotICA8L3RhcmdldD4NCi0gIA0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+DQotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+DQotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+DQotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPg0KLSAgPC90YXJnZXQ+DQotICANCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4NCi0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4NCi0gICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4NCi0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPg0KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+DQotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+DQotICAgIDwvYW50Pg0KLSAgPC90YXJnZXQ+DQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS90ZXN0X3dpdGhfbWFpbC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvdGVzdF93aXRoX21haWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjFkNDA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS90ZXN0X3dpdGhfbWFpbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4gCi0gIAotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPgotICAKLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuQWxsVGVzdHMiIC8+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNuaWZmLWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS91cGRhdGVfY29yZV9zbmlmZl9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtzbmlmZi1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIAotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtzbmlmZi1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9IiR7Y2xhc3MtbmFtZX0iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJlbWFpbC1mcm9tIiB2YWx1ZT0iRWNsaXBzZV9BdXRvbWF0ZWRfVGVzdEBvdGkuY29tIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVtYWlsLXN1YmplY3QiIHZhbHVlPSJJbnN0YWxsL1VwZGF0ZTogTmlnaHRseSBCdWlsZCBSZXBvcnQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZW1haWwtc3ViamVjdC1sb2ciIHZhbHVlPSJJbnN0YWxsL1VwZGF0ZTogTmlnaHRseSAubG9nIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVtYWlsLXNlcnZlciIgdmFsdWU9ImQyNW1sMDQudG9yb2xhYi5pYm0uY29tIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImluZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS8ke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaW5maWxlLWxvZyIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS93b3Jrc3BhY2UvLm1ldGFkYXRhLy5sb2ciLz4KLSAgICAgIAotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgICAKLSAgICA8dG91Y2ggZmlsZT0iJHtpbmZpbGUtbG9nfSIvPgotCi0gICAgPG1haWwgZnJvbT0iJHtlbWFpbC1mcm9tfSIgdG9saXN0PSJjZWxla0BjYS5pYm0uY29tIgotICAgICAgICAgIHN1YmplY3Q9IiR7ZW1haWwtc3ViamVjdH0iIGZpbGVzPSIke2luZmlsZX0iCi0gICAgICAgICAgbWFpbGhvc3Q9IiR7ZW1haWwtc2VydmVyfSIvPgotCi0gICAgPG1haWwgZnJvbT0iJHtlbWFpbC1mcm9tfSIgdG9saXN0PSJjZWxla0BjYS5pYm0uY29tIgotICAgICAgICAgIHN1YmplY3Q9IiR7ZW1haWwtc3ViamVjdC1sb2d9IiBmaWxlcz0iJHtpbmZpbGUtbG9nfSIKLSAgICAgICAgICBtYWlsaG9zdD0iJHtlbWFpbC1zZXJ2ZXJ9Ii8+Ci0KLSAgICA8bWFpbCBmcm9tPSIke2VtYWlsLWZyb219IiB0b2xpc3Q9ImNlbGVrQHJvZ2Vycy5jb20iCi0gICAgICAgICAgc3ViamVjdD0iJHtlbWFpbC1zdWJqZWN0LWxvZ30iIGZpbGVzPSIke2luZmlsZS1sb2d9IgotICAgICAgICAgIG1haWxob3N0PSIke2VtYWlsLXNlcnZlcn0iLz4KLQotICAgIDxtYWlsIGZyb209IiR7ZW1haWwtZnJvbX0iIHRvbGlzdD0iY2VsZWtAcm9nZXJzLmNvbSIKLSAgICAgICAgICBzdWJqZWN0PSIke2VtYWlsLXN1YmplY3R9IiBmaWxlcz0iJHtpbmZpbGV9IgotICAgICAgICAgIG1haWxob3N0PSIke2VtYWlsLXNlcnZlcn0iLz4KLQotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjkxNDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdlODFlYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTwvaGVhZD4NCi0gIDxib2R5Pg0KLTxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCi08YnI+DQotPGJyPg0KLSAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCi0gICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KLSAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCi0gIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCi1tYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQotVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCi0gICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KLSAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KLSAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCi0gIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQotICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KLSAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQotICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KLSAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KLSAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCi0gICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCi0gIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCi0gIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KLSAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCi1ncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQotaW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQotc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KLXN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCi10aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCi10b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQotICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCi0gcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCi13YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQotPGJyPg0KLTxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc0MWQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+DQotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KLSAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+DQotICA8dXJsPg0KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGF0aC9mZWF0dXJlMS8iLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICA8L3VybD4NCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwNzIxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg0ZjY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTg3YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkNGJiZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGU+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDwvZmVhdHVyZT4NCi0NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UuaGVscF8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9oZWxwLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZV8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmp1bml0XzMuNS4wLmphciIgdXJsPSJwbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiIHVybD0icGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgDQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICANCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzY3ZDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBiNDBhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3dlbF9tbC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvd2VsX21sLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL3NpdGVJbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08L2hlYWQ+DQotICA8Ym9keT4NCi08aW1nIHNyYz0iaW1nL3RvcF90aXRsc20uZ2lmIiBhbHQ9IiIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI1MCI+DQotPGJyPg0KLTxicj4NCi0gICAgIEl0IHN0YXJ0ZWQgd2l0aCBTbWFsbHRhbGs8YnI+DQotICAgIE9USSBoYXMgYmVlbiBidWlsZGluZyB0b29scyBmb3IgcGxhdGZvcm0taW5kZXBlbmRlbnQgT08gZGV2ZWxvcG1lbnQgc2luY2UNCi0gIDE5ODguIE91ciBFTlZZJnJlZzsgdGVjaG5vbG9neSBmaXJzdCBicm91Z2h0IGNvbGxhYm9yYXRpdmUgc29mdHdhcmUgZGV2ZWxvcG1lbnQsDQotICB2ZXJzaW9uIG1hbmFnZW1lbnQgYW5kIHNoYXJlZCByZXBvc2l0b3JpZXMgdG8gU21hbGx0YWxrLiBJQk0gaXMgb25lIG9mDQotbWFueSAgIGNvbXBhbmllcyB0byBsaWNlbnNlIEVOVlksIHdoaWNoIGNvbnRpbnVlcyB0byBiZSB0aGUgZm91bmRhdGlvbiBvZg0KLVZpc3VhbEFnZSZyZWc7ICAgU21hbGx0YWxrLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOZXh0IGNhbWUgSmF2YSYjODQ4Mjs8YnI+DQotICAgIEJlY2F1c2Ugb2Ygb3VyIGV4cGVydGlzZSBpbiBPTyB0ZWNobm9sb2d5LCBJQk0gdHVybmVkIHRvIE9USSBmb3IgYSBuZXh0LWdlbmVyYXRpb24NCi0gIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBKYXZhLiBUaGUgcmVzdWx0IGlzIFZpc3VhbEFnZSBmb3IgSmF2YSwgd2hpY2gNCi0gIGNvbnRpbnVlcyB0byB3aW4gYXdhcmRzIGZvciBpdHMgaW5ub3ZhdGl2ZSBJREUgYW5kIHRlYW0gc3VwcG9ydC4gSW5mb1dvcmxkDQotICBoYXMgY2hvc2VuIFZpc3VhbEFnZSBmb3IgSmF2YSBhcyBkZXZlbG9wbWVudCB0b29sIG9mIHRoZSB5ZWFyIC0geWVhciBhZnRlcg0KLSAgeWVhciBhZnRlciB5ZWFyITxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBUaGVuIHBlcnZhc2l2ZSBjb21wdXRpbmc8YnI+DQotICAgIE9USSBjb250aW51ZXMgaXRzIGRldmVsb3BtZW50IG9mIElCTSdzIFZpc3VhbEFnZSBNaWNybyBFZGl0aW9uLCBhIHN0YXRlLW9mLXRoZS1hcnQNCi0gIHBsYXRmb3JtIGZvciBjb2xsYWJvcmF0aXZlIGRldmVsb3BtZW50IG9mIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQgc3lzdGVtcw0KLSAgdGhhdCBhcmUgdmVyeSBsZWFuLiBBcyB0aGUgc3RlYWR5IHN0cmVhbSBvZiBwcmVzcyByZWxlYXNlcyBhdHRlc3RzLCBWaXN1YWxBZ2UNCi0gIE1pY3JvIEVkaXRpb24gaXMgYWxyZWFkeSBsaWNlbnNlZCB0byB0aGUgbGVhZGluZyBtaWNyb2NoaXAgbWFudWZhY3R1cmVycywNCi0gIG1pY3Jva2VybmVsIGRldmVsb3BlcnMsIGFuZCBwcm9kdWNlcnMgb2YgaGFuZGhlbGQgYW5kIGNvbnN1bWVyIGRldmljZXMuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5vdyBpdCdzIEVjbGlwc2U8YnI+DQotICAgIE9USSBoYXMgYnVpbHQgdGhlIG5leHQgZ2VuZXJhdGlvbiBJQk0gYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgdG9vbHMgcGxhdGZvcm0uDQotICBFY2xpcHNlIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yDQotICBhbnl0aGluZyBhbmQgbm90aGluZyBpbiBwYXJ0aWN1bGFyLiBUaGUgcmVhbCB2YWx1ZSBjb21lcyBmcm9tIHRvb2wgcGx1Zy1pbnMNCi0gIHRoYXQgInRlYWNoIiBFY2xpcHNlIGhvdyB0byB3b3JrIHdpdGggdGhpbmdzIC0gamF2YSBmaWxlcywgd2ViIGNvbnRlbnQsDQotZ3JhcGhpY3MsICB2aWRlbyAtIGFsbW9zdCBhbnl0aGluZyB5b3UgY2FuIGltYWdpbmUuIEVjbGlwc2UgYWxsb3dzIHlvdSB0bw0KLWluZGVwZW5kZW50bHkgIGRldmVsb3AgdG9vbHMgdGhhdCBpbnRlZ3JhdGUgd2l0aCBvdGhlciBwZW9wbGUncyB0b29scyBzbw0KLXNlYW1sZXNzbHkgeW91IHdvbid0IGtub3cgd2hlcmUgb25lIHRvb2wgZW5kcyBhbmQgYW5vdGhlciBzdGFydHMuIFRoZSBJQk0NCi1zdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGlzIHRlY2hub2xvZ3ksIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoLCB3aWxsIGJlDQotdGhlIGNvcmUgb2YgdGhlIG5leHQgIGdlbmVyYXRpb24gb2YgSUJNIGFuZCBJQk0gQnVzaW5lc3MgUGFydG5lciBlLWJ1c2luZXNzDQotdG9vbHMgb3B0aW1pemVkIGZvciAgdGhlIFdlYlNwaGVyZSBzb2Z0d2FyZSBwbGF0Zm9ybS48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgU28gd2hhdCdzIG5leHQ/PGJyPg0KLSAgICBPVEkgY29udGludWVzIHRvIGRlbGl2ZXIgb2JqZWN0LW9yaWVudGVkIHRlY2hub2xvZ3kgdGhhdCBzY2FsZXMgYWNyb3NzDQotIHBsYXRmb3JtcywgIGFjcm9zcyB0ZWFtcyBhbmQgYWNyb3NzIHByb2plY3Qgc2l6ZS4gRnJvbSBhIG1haW5mcmFtZSB0byBhDQotd2F0Y2ggIC0gd2UncmUgIGNsb3NpbmcgaW4gb24gdGhhdCB2aXNpb24uPGJyPg0KLTxicj4NCi08aW1nIHNyYz0iaW1nL3dlbF9tbC5qcGciIHdpZHRoPSI0NjAiIGhlaWdodD0iNDYwIiBhbHQ9IiI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvUGRlX2NvcmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9oZWxwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2p1bml0XzMuNy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWZkYTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSA+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvaGVscC5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvUGRlX2NvcmUuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5qdW5pdF8zLjUuMC5qYXIiIHVybD0icGx1Z2lucy9qdW5pdF8zLjcuamFyIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICANCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9mZWF0dXJlczIuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9mZWF0dXJlczIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRmNzJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvZmVhdHVyZXMyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhZWUzZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTE1ZmY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmUzOGQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjI2NjVjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MTk4MDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWY1YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRiMDRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMDhmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwOWM4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciIgb3M9IioiLz4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBkODgyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk5NWQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMi5wbHVnaW4yXzIuMi4yLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMi5wbHVnaW4yXzIuMi4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5OTVkNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3MzdmNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjg2OTBmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhNjEyZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvc2l0ZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTFjZWQ0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvc2l0ZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1kcml2ZXJzPVJlcXVpcmVkIERyaXZlcnMNCi1zZWN1cml0eT1TZWN1cml0eSBGaXhlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTdkOWIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cyIgbmFtZT0iVGVzdHMiIHZlcnNpb249IjAuMC4xIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIvPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIi8+DQotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4NCi0gIDwvZmVhdHVyZT4NCi0NCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPg0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPg0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTIiIGxhYmVsPSIlc2VjdXJpdHkiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9XRUItSU5GL3dlYi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2ZDkwNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4NCi0NCi0NCi08IURPQ1RZUEUgd2ViLWFwcA0KLSAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiINCi0gICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMi4yLmR0ZCI+DQotDQotPHdlYi1hcHA+DQotICAgIA0KLTwvd2ViLWFwcD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvZmVhdHVyZXMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmVfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL2ZlYXR1cmVzL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMzU4OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvZmVhdHVyZXMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWlfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWlfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzlkMmNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudF8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnRfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGIwMmJiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWlfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmVjMDJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWlfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxYjY5My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiMTMzMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmVfMS4wLjAuamFyIiBpZD0iY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJCdW5kbGVGZWF0dXJlIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IkJ1bmRsZUZlYXR1cmUiIGxhYmVsPSJGZWF0dXJlIHdpdGggQnVuZGxlcyIvPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyMDkwMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luPC9wcm9qZWN0PgotCQk8cHJvamVjdD5jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLnRlbXBsYXRlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiY2Q0MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmb3JtPg0KLSAgIDxwLz48cD48Yj5UaXBzIG9uIHdvcmtpbmcgd2l0aCB0aGlzIHBsdWctaW4gcHJvamVjdDwvYj48L3A+PGxpPkZvciB0aGUgdmlldyBvZiB0aGUgbmV3IHBsdWctaW4gYXQgYSBnbGFuY2UsIGdvIHRvIHRoZSA8aW1nIGhyZWY9InBhZ2VJbWFnZSIvPjxhIGhyZWY9Ik92ZXJ2aWV3UGFnZSI+T3ZlcnZpZXc8L2E+LjwvbGk+PGxpPllvdSBjYW4gdGVzdCB0aGUgY29udHJpYnV0aW9ucyBvZiB0aGlzIHBsdWctaW4gYnkgbGF1bmNoaW5nIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHdvcmtiZW5jaC4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgY2xpY2sgPGI+UnVuIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLnJ1biI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPjxsaT5Zb3UgY2FuIGFkZCBtb3JlIGZ1bmN0aW9uYWxpdHkgdG8gdGhpcyBwbHVnLWluIGJ5IGFkZGluZyBleHRlbnNpb25zIHVzaW5nIHRoZSA8YSBocmVmPSJhY3Rpb24ubmV3RXh0ZW5zaW9uIj5OZXcgRXh0ZW5zaW9uIFdpemFyZDwvYT4uPC9saT48bGk+VGhlIHBsdWctaW4gcHJvamVjdCBjb250YWlucyBKYXZhIGNvZGUgdGhhdCB5b3UgY2FuIGRlYnVnLiBQbGFjZSBicmVha3BvaW50cyBpbiBKYXZhIGNsYXNzZXMuIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIHNlbGVjdCA8Yj5EZWJ1ZyBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5kZWJ1ZyI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPg0KLTwvZm9ybT4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDY4NmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1HZW5lcmF0ZWQtZnJvbTogMTA3NzA2Mjk3NDQ1MQ0KLUJ1bmRsZS1OYW1lOiBVaSBGcmFnbWVudA0KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpDQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCi1CdW5kbGUtQ2xhc3NQYXRoOiB1aS5qYXINCi1MZWdhY3k6IHRydWUNCi1GcmFnbWVudC1Ib3N0OiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpOyBidW5kbGUtdmVyc2lvbj0yLjAuMA0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhN2VlNDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS51aS5qYXIgPSBzcmMvCi1vdXRwdXQudWkuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICB1aS5qYXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9mcmFnbWVudC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQ4NGIzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPGZyYWdtZW50Ci0gICBpZD0iY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkiCi0gICBuYW1lPSJVaSBGcmFnbWVudCIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCi0gICBwbHVnaW4taWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkiCi0gICBwbHVnaW4tdmVyc2lvbj0iMi4wLjAiCi0gICBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InVpLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzZTRiYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZjkzYTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQxMDQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlIgotICAgICAgbGFiZWw9ImNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyI+Ci0KLSAgIDxsaWNlbnNlPgotICAgICAgQSBwbGFjZWhvbGRlciBsaWNlbnNlIGZvciB0aGUgZmVhdHVyZS4KLSAgIDwvbGljZW5zZT4KLQotICAgPGluc3RhbGwtaGFuZGxlci8+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkMGMyMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Y29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLnRlbXBsYXRlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8udGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmNkNDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8udGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZvcm0+DQotICAgPHAvPjxwPjxiPlRpcHMgb24gd29ya2luZyB3aXRoIHRoaXMgcGx1Zy1pbiBwcm9qZWN0PC9iPjwvcD48bGk+Rm9yIHRoZSB2aWV3IG9mIHRoZSBuZXcgcGx1Zy1pbiBhdCBhIGdsYW5jZSwgZ28gdG8gdGhlIDxpbWcgaHJlZj0icGFnZUltYWdlIi8+PGEgaHJlZj0iT3ZlcnZpZXdQYWdlIj5PdmVydmlldzwvYT4uPC9saT48bGk+WW91IGNhbiB0ZXN0IHRoZSBjb250cmlidXRpb25zIG9mIHRoaXMgcGx1Zy1pbiBieSBsYXVuY2hpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgd29ya2JlbmNoLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBjbGljayA8Yj5SdW4gQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24ucnVuIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+PGxpPllvdSBjYW4gYWRkIG1vcmUgZnVuY3Rpb25hbGl0eSB0byB0aGlzIHBsdWctaW4gYnkgYWRkaW5nIGV4dGVuc2lvbnMgdXNpbmcgdGhlIDxhIGhyZWY9ImFjdGlvbi5uZXdFeHRlbnNpb24iPk5ldyBFeHRlbnNpb24gV2l6YXJkPC9hPi48L2xpPjxsaT5UaGUgcGx1Zy1pbiBwcm9qZWN0IGNvbnRhaW5zIEphdmEgY29kZSB0aGF0IHlvdSBjYW4gZGVidWcuIFBsYWNlIGJyZWFrcG9pbnRzIGluIEphdmEgY2xhc3Nlcy4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgc2VsZWN0IDxiPkRlYnVnIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLmRlYnVnIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+DQotPC9mb3JtPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDY2NDgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyOTA5NDg3DQotQnVuZGxlLU5hbWU6IEZyYWdtZW50IEZyYWdtZW50DQotQnVuZGxlLVZlcnNpb246IDEuMC4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50DQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCi1CdW5kbGUtQ2xhc3NQYXRoOiBmcmFnbWVudC5qYXINCi1MZWdhY3k6IHRydWUNCi1GcmFnbWVudC1Ib3N0OiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luOyBidW5kbGUtdmVyc2lvbj0xLjAuMA0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3ZTBlOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS5mcmFnbWVudC5qYXIgPSBzcmMvCi1vdXRwdXQuZnJhZ21lbnQuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBmcmFnbWVudC5qYXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvZnJhZ21lbnQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWNkNmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPGZyYWdtZW50Ci0gICBpZD0iY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50IgotICAgbmFtZT0iRnJhZ21lbnQgRnJhZ21lbnQiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICAgcGx1Z2luLWlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luIgotICAgcGx1Z2luLXZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJmcmFnbWVudC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMzU1My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+Y29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnRlbXBsYXRlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JjZDQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Zm9ybT4NCi0gICA8cC8+PHA+PGI+VGlwcyBvbiB3b3JraW5nIHdpdGggdGhpcyBwbHVnLWluIHByb2plY3Q8L2I+PC9wPjxsaT5Gb3IgdGhlIHZpZXcgb2YgdGhlIG5ldyBwbHVnLWluIGF0IGEgZ2xhbmNlLCBnbyB0byB0aGUgPGltZyBocmVmPSJwYWdlSW1hZ2UiLz48YSBocmVmPSJPdmVydmlld1BhZ2UiPk92ZXJ2aWV3PC9hPi48L2xpPjxsaT5Zb3UgY2FuIHRlc3QgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgdGhpcyBwbHVnLWluIGJ5IGxhdW5jaGluZyBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSB3b3JrYmVuY2guIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIGNsaWNrIDxiPlJ1biBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5ydW4iPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT48bGk+WW91IGNhbiBhZGQgbW9yZSBmdW5jdGlvbmFsaXR5IHRvIHRoaXMgcGx1Zy1pbiBieSBhZGRpbmcgZXh0ZW5zaW9ucyB1c2luZyB0aGUgPGEgaHJlZj0iYWN0aW9uLm5ld0V4dGVuc2lvbiI+TmV3IEV4dGVuc2lvbiBXaXphcmQ8L2E+LjwvbGk+PGxpPlRoZSBwbHVnLWluIHByb2plY3QgY29udGFpbnMgSmF2YSBjb2RlIHRoYXQgeW91IGNhbiBkZWJ1Zy4gUGxhY2UgYnJlYWtwb2ludHMgaW4gSmF2YSBjbGFzc2VzLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBzZWxlY3QgPGI+RGVidWcgQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24uZGVidWciPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT4NCi08L2Zvcm0+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1MDdhOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyOTk5ODI3DQotQnVuZGxlLU5hbWU6IFVpIFBsdWctaW4NCi1CdW5kbGUtVmVyc2lvbjogMi4wLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpDQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCi1CdW5kbGUtQ2xhc3NQYXRoOiB1aS5qYXINCi1MZWdhY3k6IHRydWUNCi1CdW5kbGUtQWN0aXZhdG9yOiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLlVpUGx1Z2luDQotUmVxdWlyZS1CdW5kbGU6IA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLnVpLA0KLSBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luOyBidW5kbGUtdmVyc2lvbj0xLjAuMDt2ZXJzaW9uLW1hdGNoPXBlcmZlY3QNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5jbGFzcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL2Jpbi9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL3VpL1VpUGx1Z2luLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjczMTg5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL2Jpbi9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL3VpL1VpUGx1Z2luLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjN2QzYjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLnVpLmphciA9IHNyYy8KLW91dHB1dC51aS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICB1aS5qYXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWZmZGVmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkiCi0gICBuYW1lPSJVaSBQbHVnLWluIgotICAgdmVyc2lvbj0iMi4wLjAiCi0gICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgIGNsYXNzPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLlVpUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ1aS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9InBlcmZlY3QiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9zcmMvY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvc3JjL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vdWkvVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhYmE1MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9zcmMvY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotcGFja2FnZSBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVaVBsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVpUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkuVWlQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFVpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzE5ZDczLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Y29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8udGVtcGxhdGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8udGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmNkNDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmb3JtPg0KLSAgIDxwLz48cD48Yj5UaXBzIG9uIHdvcmtpbmcgd2l0aCB0aGlzIHBsdWctaW4gcHJvamVjdDwvYj48L3A+PGxpPkZvciB0aGUgdmlldyBvZiB0aGUgbmV3IHBsdWctaW4gYXQgYSBnbGFuY2UsIGdvIHRvIHRoZSA8aW1nIGhyZWY9InBhZ2VJbWFnZSIvPjxhIGhyZWY9Ik92ZXJ2aWV3UGFnZSI+T3ZlcnZpZXc8L2E+LjwvbGk+PGxpPllvdSBjYW4gdGVzdCB0aGUgY29udHJpYnV0aW9ucyBvZiB0aGlzIHBsdWctaW4gYnkgbGF1bmNoaW5nIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHdvcmtiZW5jaC4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgY2xpY2sgPGI+UnVuIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLnJ1biI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPjxsaT5Zb3UgY2FuIGFkZCBtb3JlIGZ1bmN0aW9uYWxpdHkgdG8gdGhpcyBwbHVnLWluIGJ5IGFkZGluZyBleHRlbnNpb25zIHVzaW5nIHRoZSA8YSBocmVmPSJhY3Rpb24ubmV3RXh0ZW5zaW9uIj5OZXcgRXh0ZW5zaW9uIFdpemFyZDwvYT4uPC9saT48bGk+VGhlIHBsdWctaW4gcHJvamVjdCBjb250YWlucyBKYXZhIGNvZGUgdGhhdCB5b3UgY2FuIGRlYnVnLiBQbGFjZSBicmVha3BvaW50cyBpbiBKYXZhIGNsYXNzZXMuIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIHNlbGVjdCA8Yj5EZWJ1ZyBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5kZWJ1ZyI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPg0KLTwvZm9ybT4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFhZGFmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotR2VuZXJhdGVkLWZyb206IDEwNzcwNjI2MDM3MDgNCi1CdW5kbGUtTmFtZTogUGx1Z2luIFBsdWctaW4NCi1CdW5kbGUtVmVyc2lvbjogMS4wLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luDQotQnVuZGxlLVZlbmRvcjogRVhBTVBMRQ0KLUJ1bmRsZS1DbGFzc1BhdGg6IHBsdWdpbi5qYXINCi1MZWdhY3k6IHRydWUNCi1CdW5kbGUtQWN0aXZhdG9yOiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLlBsdWdpblBsdWdpbg0KLVJlcXVpcmUtQnVuZGxlOiANCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS51aQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL2Jpbi9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL1BsdWdpblBsdWdpbi5jbGFzcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL2Jpbi9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL1BsdWdpblBsdWdpbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjYWYwMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhMTZkNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UucGx1Z2luLmphciA9IHNyYy8KLW91dHB1dC5wbHVnaW4uamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLmphcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5N2JjNzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbiIKLSAgIG5hbWU9IlBsdWdpbiBQbHVnLWluIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgIGNsYXNzPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLlBsdWdpblBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0icGx1Z2luLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL3NyYy9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL1BsdWdpblBsdWdpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vc3JjL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vUGx1Z2luUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MGIzOTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vc3JjL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vUGx1Z2luUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi1wYWNrYWdlIGNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQbHVnaW5QbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQbHVnaW5QbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi5QbHVnaW5QbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGx1Z2luUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBQbHVnaW5QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ4MjQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NDBmOWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS5pZGU8L3Byb2plY3Q+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNDExYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmRhMjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgKi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwNCi1zb3VyY2UuZm9ybXMuamFyID0gc3JjLw0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5OTQ3Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jDQotIyBwbHVnaW4ueG1sIHByb3BlcnRpZXMNCi0jDQotDQotbmFtZSA9IEluc3RhbGwvVXBkYXRlIEZvcm1zDQotcHJvdmlkZXItbmFtZSA9IEVjbGlwc2Uub3JnDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJhMTY3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KLTxwbHVnaW4NCi0gICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zIg0KLSAgIG5hbWU9IiVuYW1lIg0KLSAgIHZlcnNpb249IjMuMC4wIg0KLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlci1uYW1lIg0KLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuRm9ybXNQbHVnaW4iPg0KLQ0KLSAgIDxydW50aW1lPg0KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImZvcm1zLmphciI+DQotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgICAgICAgPHBhY2thZ2VzIHByZWZpeGVzPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwiLz4NCi0gICAgICA8L2xpYnJhcnk+DQotICAgPC9ydW50aW1lPg0KLSAgIDxyZXF1aXJlcz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4NCi0gICA8L3JlcXVpcmVzPg0KLQ0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9BYnN0cmFjdEZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9BYnN0cmFjdEZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyNTQ0MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy4qOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBJRm9ybSBpbnRlcmZhY2UgYW5kDQotICogcHJvdmlkZXMgc29tZSBjb21tb24gc2VydmljZXMgdG8gaXRzIHN1YmNsYXNzZXMuDQotICogSXQgaGFuZGxlcyBzb21lIGNvbW1vbiBwcm9wZXJ0aWVzIGxpa2UgaGVhZGluZw0KLSAqIHRleHQsIGltYWdlIGFuZCBjb2xvcnMsIGFzIHdlbGwgYXMNCi0gKiBmb250IGNoYW5nZSBwcm9jZXNzaW5nLg0KLSAqLw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZvcm0gaW1wbGVtZW50cyBJRm9ybSwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgew0KLQlwcm90ZWN0ZWQgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeTsNCi0JcHJvdGVjdGVkIENvbG9yIGhlYWRpbmdCYWNrZ3JvdW5kOw0KLQlwcm90ZWN0ZWQgQ29sb3IgaGVhZGluZ0ZvcmVncm91bmQ7DQotCXByb3RlY3RlZCBib29sZWFuIGhlYWRpbmdWaXNpYmxlID0gdHJ1ZTsNCi0JcHJvdGVjdGVkIEltYWdlIGhlYWRpbmdJbWFnZTsNCi0JcHJvdGVjdGVkIFN0cmluZyBoZWFkaW5nVGV4dDsNCi0JcHJvdGVjdGVkIEZvbnQgdGl0bGVGb250Ow0KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGh5cGVybGlua0NvbG9yTGlzdGVuZXI7DQotDQotCXB1YmxpYyBBYnN0cmFjdEZvcm0oKSB7DQotCQlmYWN0b3J5ID0gbmV3IEZvcm1XaWRnZXRGYWN0b3J5KCk7DQotCQl0aXRsZUZvbnQgPSBKRmFjZVJlc291cmNlcy5nZXRIZWFkZXJGb250KCk7DQotCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5hZGRMaXN0ZW5lcih0aGlzKTsNCi0JCUlQcmVmZXJlbmNlU3RvcmUgcHN0b3JlID0gSkZhY2VQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCi0JCWh5cGVybGlua0NvbG9yTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7DQotCQkJCWlmIChlLmdldFByb3BlcnR5KCkuZXF1YWxzKEpGYWNlUHJlZmVyZW5jZXMuSFlQRVJMSU5LX0NPTE9SKQ0KLQkJCQkJfHwgZS5nZXRQcm9wZXJ0eSgpLmVxdWFscygNCi0JCQkJCQlKRmFjZVByZWZlcmVuY2VzLkFDVElWRV9IWVBFUkxJTktfQ09MT1IpKSB7DQotCQkJCQl1cGRhdGVIeXBlcmxpbmtDb2xvcnMoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX07DQotCQlwc3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihoeXBlcmxpbmtDb2xvckxpc3RlbmVyKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSHlwZXJsaW5rQ29sb3JzKCkgew0KLQkJZmFjdG9yeS51cGRhdGVIeXBlcmxpbmtDb2xvcnMoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNjb21taXRDaGFuZ2VzKGJvb2xlYW4pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjb21taXRDaGFuZ2VzKGJvb2xlYW4gb25TYXZlKSB7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jY3JlYXRlQ29udHJvbChDb21wb3NpdGUpDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpOw0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlmYWN0b3J5LmRpc3Bvc2UoKTsNCi0JCUpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOw0KLQkJSVByZWZlcmVuY2VTdG9yZSBwc3RvcmUgPSBKRmFjZVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2VTdG9yZSgpOw0KLQkJcHN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7DQotCQlwc3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihoeXBlcmxpbmtDb2xvckxpc3RlbmVyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNkb0dsb2JhbEFjdGlvbihTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBkb0dsb2JhbEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNleHBhbmRUbyhPYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBleHBhbmRUbyhPYmplY3Qgb2JqZWN0KSB7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZ2V0Q29udHJvbCgpDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgQ29udHJvbCBnZXRDb250cm9sKCk7DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2dldEZhY3RvcnkoKQ0KLQkgKi8NCi0JcHVibGljIEZvcm1XaWRnZXRGYWN0b3J5IGdldEZhY3RvcnkoKSB7DQotCQlyZXR1cm4gZmFjdG9yeTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNnZXRIZWFkaW5nQmFja2dyb3VuZCgpDQotCSAqLw0KLQlwdWJsaWMgQ29sb3IgZ2V0SGVhZGluZ0JhY2tncm91bmQoKSB7DQotCQlyZXR1cm4gaGVhZGluZ0JhY2tncm91bmQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZ2V0SGVhZGluZ0ZvcmVncm91bmQoKQ0KLQkgKi8NCi0JcHVibGljIENvbG9yIGdldEhlYWRpbmdGb3JlZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGhlYWRpbmdGb3JlZ3JvdW5kOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2dldEhlYWRpbmdJbWFnZSgpDQotCSAqLw0KLQlwdWJsaWMgSW1hZ2UgZ2V0SGVhZGluZ0ltYWdlKCkgew0KLQkJcmV0dXJuIGhlYWRpbmdJbWFnZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNnZXRIZWFkaW5nKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKSB7DQotCQlpZiAoaGVhZGluZ1RleHQgPT0gbnVsbCkNCi0JCQlyZXR1cm4gIiI7DQotCQlyZXR1cm4gaGVhZGluZ1RleHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jaW5pdGlhbGl6ZShPYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCBtb2RlbCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2lzSGVhZGluZ1Zpc2libGUoKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNIZWFkaW5nVmlzaWJsZSgpIHsNCi0JCXJldHVybiBoZWFkaW5nVmlzaWJsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNyZWdpc3RlclNlY3Rpb24oRm9ybVNlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZWdpc3RlclNlY3Rpb24oRm9ybVNlY3Rpb24gc2VjdGlvbikgew0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI3NldEZvY3VzKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI3NldEhlYWRpbmdCYWNrZ3JvdW5kKENvbG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0SGVhZGluZ0JhY2tncm91bmQoQ29sb3IgbmV3SGVhZGluZ0JhY2tncm91bmQpIHsNCi0JCXRoaXMuaGVhZGluZ0JhY2tncm91bmQgPSBuZXdIZWFkaW5nQmFja2dyb3VuZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNzZXRIZWFkaW5nRm9yZWdyb3VuZChDb2xvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdGb3JlZ3JvdW5kKENvbG9yIG5ld0hlYWRpbmdGb3JlZ3JvdW5kKSB7DQotCQl0aGlzLmhlYWRpbmdGb3JlZ3JvdW5kID0gbmV3SGVhZGluZ0ZvcmVncm91bmQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jc2V0SGVhZGluZ0ltYWdlKEltYWdlKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0SGVhZGluZ0ltYWdlKEltYWdlIGhlYWRpbmdJbWFnZSkgew0KLQkJdGhpcy5oZWFkaW5nSW1hZ2UgPSBoZWFkaW5nSW1hZ2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jc2V0SGVhZGluZ1Zpc2libGUoYm9vbGVhbikNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdWaXNpYmxlKGJvb2xlYW4gbmV3SGVhZGluZ1Zpc2libGUpIHsNCi0JCXRoaXMuaGVhZGluZ1Zpc2libGUgPSBuZXdIZWFkaW5nVmlzaWJsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNzZXRIZWFkaW5nKFN0cmluZykNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdUZXh0KFN0cmluZyBoZWFkaW5nVGV4dCkgew0KLQkJdGhpcy5oZWFkaW5nVGV4dCA9IGhlYWRpbmdUZXh0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI3VwZGF0ZSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7DQotCX0NCi0NCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUGVyZm9ybURpcmVjdGx5KFN0cmluZyBpZCwgQ29udHJvbCBjb250cm9sKSB7DQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsNCi0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY29udHJvbDsNCi0JCQlpZiAoaWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCkpKSB7DQotCQkJCXRleHQuY3V0KCk7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQlpZiAoaWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpKSkgew0KLQkJCQl0ZXh0LmNvcHkoKTsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJCWlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpKSkgew0KLQkJCQl0ZXh0LnBhc3RlKCk7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQlpZiAoaWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpKSkgew0KLQkJCQl0ZXh0LnNlbGVjdEFsbCgpOw0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKSkgew0KLQkJCQlpbnQgY291bnQgPSB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk7DQotCQkJCWlmIChjb3VudCA9PSAwKSB7DQotCQkJCQlpbnQgY2FyZXRQb3MgPSB0ZXh0LmdldENhcmV0UG9zaXRpb24oKTsNCi0JCQkJCXRleHQuc2V0U2VsZWN0aW9uKGNhcmV0UG9zLCBjYXJldFBvcyArIDEpOw0KLQkJCQl9DQotCQkJCXRleHQuaW5zZXJ0KCIiKTsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9BYnN0cmFjdFNlY3Rpb25Gb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RTZWN0aW9uRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjkwM2NhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9BYnN0cmFjdFNlY3Rpb25Gb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLQ0KLS8qKg0KLSAqIFRoaXMgZm9ybSBjbGFzcyB1bmRlcnN0YW5kcyBmb3JtIHNlY3Rpb25zLg0KLSAqIEl0IGFzc3VtZXMgdGhhdCB0aGV5IGFyZSBwYXJ0IG9mIHRoZSBmb3JtDQotICogYW5kIGl0IG9mZmVycyBsaWZlIGN5Y2xlIGhhbmRsaW5nIG9mIHNlY3Rpb25zDQotICogb25jZSB0aGV5IGFyZSByZWdpc3RlcmVkLg0KLSAqLw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlY3Rpb25Gb3JtIGV4dGVuZHMgQWJzdHJhY3RGb3JtIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSF9TQ1JPTExfSU5DUkVNRU5UID0gNTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVl9TQ1JPTExfSU5DUkVNRU5UID0gNjQ7DQotCXByb3RlY3RlZCBWZWN0b3Igc2VjdGlvbnMgPSBudWxsOw0KLQ0KLQlwdWJsaWMgdm9pZCByZWdpc3RlclNlY3Rpb24oRm9ybVNlY3Rpb24gc2VjdGlvbikgew0KLQkJaWYgKHNlY3Rpb25zID09IG51bGwpDQotCQkJc2VjdGlvbnMgPSBuZXcgVmVjdG9yKCk7DQotCQlpZiAoIXNlY3Rpb25zLmNvbnRhaW5zKHNlY3Rpb24pKQ0KLQkJCXNlY3Rpb25zLmFkZChzZWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyU2VjdGlvbihGb3JtU2VjdGlvbiBzZWN0aW9uKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCAmJiBzZWN0aW9ucy5jb250YWlucyhzZWN0aW9uKSkNCi0JCQlzZWN0aW9ucy5yZW1vdmUoc2VjdGlvbik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbW9kZWwpIHsNCi0JCWlmIChzZWN0aW9ucyAhPSBudWxsKSB7DQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJCUZvcm1TZWN0aW9uIHNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIGl0ZXIubmV4dCgpOw0KLQkJCQlzZWN0aW9uLmluaXRpYWxpemUobW9kZWwpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsNCi0JCWlmIChzZWN0aW9ucyAhPSBudWxsICYmIHNlY3Rpb25zLnNpemUoKSA+IDApIHsNCi0JCQlGb3JtU2VjdGlvbiBmaXJzdFNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIHNlY3Rpb25zLmZpcnN0RWxlbWVudCgpOw0KLQkJCWZpcnN0U2VjdGlvbi5zZXRGb2N1cygpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsNCi0JCWlmIChzZWN0aW9ucyAhPSBudWxsKSB7DQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJCUZvcm1TZWN0aW9uIHNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIGl0ZXIubmV4dCgpOw0KLQkJCQlzZWN0aW9uLnVwZGF0ZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBjb21taXRDaGFuZ2VzKGJvb2xlYW4gb25TYXZlKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCkgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCQlGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJaWYgKHNlY3Rpb24uaXNEaXJ0eSgpKQ0KLQkJCQkJc2VjdGlvbi5jb21taXRDaGFuZ2VzKG9uU2F2ZSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGRvR2xvYmFsQWN0aW9uKFN0cmluZyBhY3Rpb25JZCkgew0KLQkJQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXRGb2N1c0NvbnRyb2woKTsNCi0JCWlmIChmb2N1c0NvbnRyb2wgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlpZiAoY2FuUGVyZm9ybURpcmVjdGx5KGFjdGlvbklkLCBmb2N1c0NvbnRyb2wpKQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IGZvY3VzQ29udHJvbC5nZXRQYXJlbnQoKTsNCi0JCUZvcm1TZWN0aW9uIHRhcmdldFNlY3Rpb24gPSBudWxsOw0KLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7DQotCQkJT2JqZWN0IGRhdGEgPSBwYXJlbnQuZ2V0RGF0YSgpOw0KLQkJCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YSBpbnN0YW5jZW9mIEZvcm1TZWN0aW9uKSB7DQotCQkJCXRhcmdldFNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIGRhdGE7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7DQotCQl9DQotCQlpZiAodGFyZ2V0U2VjdGlvbiAhPSBudWxsKSB7DQotCQkJcmV0dXJuIHRhcmdldFNlY3Rpb24uZG9HbG9iYWxBY3Rpb24oYWN0aW9uSWQpOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXByb3RlY3RlZCBDb250cm9sIGdldEZvY3VzQ29udHJvbCgpIHsNCi0JCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsNCi0JCWlmIChjb250cm9sID09IG51bGwgfHwgY29udHJvbC5pc0Rpc3Bvc2VkKCkpDQotCQkJcmV0dXJuIG51bGw7DQotCQlEaXNwbGF5IGRpc3BsYXkgPSBjb250cm9sLmdldERpc3BsYXkoKTsNCi0JCUNvbnRyb2wgZm9jdXNDb250cm9sID0gZGlzcGxheS5nZXRGb2N1c0NvbnRyb2woKTsNCi0JCWlmIChmb2N1c0NvbnRyb2wgPT0gbnVsbCB8fCBmb2N1c0NvbnRyb2wuaXNEaXNwb3NlZCgpKQ0KLQkJCXJldHVybiBudWxsOw0KLQkJcmV0dXJuIGZvY3VzQ29udHJvbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYXN0ZShDbGlwYm9hcmQgY2xpcGJvYXJkKSB7DQotCQlDb250cm9sIGZvY3VzQ29udHJvbCA9IGdldEZvY3VzQ29udHJvbCgpOw0KLQkJaWYgKGZvY3VzQ29udHJvbCA9PSBudWxsKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBmb2N1c0NvbnRyb2wuZ2V0UGFyZW50KCk7DQotCQlGb3JtU2VjdGlvbiB0YXJnZXRTZWN0aW9uID0gbnVsbDsNCi0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgew0KLQkJCU9iamVjdCBkYXRhID0gcGFyZW50LmdldERhdGEoKTsNCi0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEgaW5zdGFuY2VvZiBGb3JtU2VjdGlvbikgew0KLQkJCQl0YXJnZXRTZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBkYXRhOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOw0KLQkJfQ0KLQkJaWYgKHRhcmdldFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCXJldHVybiB0YXJnZXRTZWN0aW9uLmNhblBhc3RlKGNsaXBib2FyZCk7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCWlmIChzZWN0aW9ucyAhPSBudWxsKSB7DQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJCUZvcm1TZWN0aW9uIHNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIGl0ZXIubmV4dCgpOw0KLQkJCQlzZWN0aW9uLmRpc3Bvc2UoKTsNCi0JCQl9DQotCQl9DQotCQlzdXBlci5kaXNwb3NlKCk7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZVZpc2libGUoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAsIENvbnRyb2wgY29udHJvbCkgew0KLQkJUG9pbnQgY29udHJvbFNpemUgPSBjb250cm9sLmdldFNpemUoKTsNCi0JCVBvaW50IGNvbnRyb2xPcmlnaW4gPSBnZXRDb250cm9sTG9jYXRpb24oc2NvbXAsIGNvbnRyb2wpOw0KLQkJZW5zdXJlVmlzaWJsZShzY29tcCwgY29udHJvbE9yaWdpbiwgY29udHJvbFNpemUpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVWaXNpYmxlKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBQb2ludCBjb250cm9sT3JpZ2luLCBQb2ludCBjb250cm9sU2l6ZSkgew0KLQkJUG9pbnQgYXJlYSA9IHNjb21wLmdldENvbnRlbnQoKS5nZXRTaXplKCk7DQotCQlQb2ludCBzY29tcE9yaWdpbiA9IHNjb21wLmdldE9yaWdpbigpOw0KLQ0KLQkJaW50IHggPSBzY29tcE9yaWdpbi54Ow0KLQkJaW50IHkgPSBzY29tcE9yaWdpbi55Ow0KLQ0KLQkJaWYgKGNvbnRyb2xPcmlnaW4ueCArIGNvbnRyb2xTaXplLnggPiBzY29tcE9yaWdpbi54ICsgYXJlYS54KSB7DQotCQkJeCA9IGNvbnRyb2xPcmlnaW4ueCArIGNvbnRyb2xTaXplLnggLSBhcmVhLng7DQotCQl9CQkNCi0JCWlmIChjb250cm9sT3JpZ2luLnggPCB4ICkgew0KLQkJCSB4ID0gY29udHJvbE9yaWdpbi54Ow0KLQkJIH0gICAgICAgICANCi0JCQ0KLQkJaWYgKGNvbnRyb2xPcmlnaW4ueSArIGNvbnRyb2xTaXplLnkgPiBzY29tcE9yaWdpbi55ICsgYXJlYS55KSB7DQotCQkJeSA9IGNvbnRyb2xPcmlnaW4ueSArIGNvbnRyb2xTaXplLnkgLSBhcmVhLnk7DQotCQl9DQotCQlpZiAoY29udHJvbE9yaWdpbi55IDwgeSApIHsNCi0JCQkgeSA9IGNvbnRyb2xPcmlnaW4ueTsNCi0JCSB9ICAgICAgICAgDQotCQlzY29tcC5zZXRPcmlnaW4oeCwgeSk7DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgZ2V0Q29udHJvbExvY2F0aW9uKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBDb250cm9sIGNvbnRyb2wpIHsNCi0JCWludCB4ID0gMDsNCi0JCWludCB5ID0gMDsNCi0JCUNvbnRyb2wgY3VycmVudENvbnRyb2wgPSBjb250cm9sOw0KLQkJZm9yICg7Oykgew0KLQkJCWlmIChjdXJyZW50Q29udHJvbCA9PSBzY29tcCkNCi0JCQkJYnJlYWs7DQotCQkJaWYgKGN1cnJlbnRDb250cm9sLmdldExvY2F0aW9uKCkueCA+IDApDQotCQkJCXggKz0gY3VycmVudENvbnRyb2wuZ2V0TG9jYXRpb24oKS54Ow0KLQkJCWlmIChjdXJyZW50Q29udHJvbC5nZXRMb2NhdGlvbigpLnkgPiAwKQ0KLQkJCQl5ICs9IGN1cnJlbnRDb250cm9sLmdldExvY2F0aW9uKCkueTsNCi0JCQljdXJyZW50Q29udHJvbCA9IGN1cnJlbnRDb250cm9sLmdldFBhcmVudCgpOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBQb2ludCh4LCB5KTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIHNjcm9sbFZlcnRpY2FsKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBib29sZWFuIHVwKSB7DQotCQlzY3JvbGwoc2NvbXAsIDAsIHVwID8gLVZfU0NST0xMX0lOQ1JFTUVOVCA6IFZfU0NST0xMX0lOQ1JFTUVOVCk7DQotCX0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHNjcm9sbEhvcml6b250YWwoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAsIGJvb2xlYW4gbGVmdCkgew0KLQkJc2Nyb2xsKHNjb21wLCBsZWZ0ID8gLUhfU0NST0xMX0lOQ1JFTUVOVCA6IEhfU0NST0xMX0lOQ1JFTUVOVCwgMCk7DQotCX0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHNjcm9sbFBhZ2UoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAsIGJvb2xlYW4gdXApIHsNCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gc2NvbXAuZ2V0Q2xpZW50QXJlYSgpOw0KLQkJaW50IGluY3JlbWVudCA9IHVwID8gLWNsaWVudEFyZWEuaGVpZ2h0IDogY2xpZW50QXJlYS5oZWlnaHQ7DQotCQlzY3JvbGwoc2NvbXAsIDAsIGluY3JlbWVudCk7DQotCX0NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzY3JvbGwoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAsIGludCB4b2Zmc2V0LCBpbnQgeW9mZnNldCkgew0KLQkJUG9pbnQgb3JpZ2luID0gc2NvbXAuZ2V0T3JpZ2luKCk7DQotCQlQb2ludCBjb250ZW50U2l6ZSA9IHNjb21wLmdldENvbnRlbnQoKS5nZXRTaXplKCk7DQotCQlpbnQgeG9yaWdpbiA9IG9yaWdpbi54ICsgeG9mZnNldDsNCi0JCWludCB5b3JpZ2luID0gb3JpZ2luLnkgKyB5b2Zmc2V0Ow0KLQkJeG9yaWdpbiA9IE1hdGgubWF4KHhvcmlnaW4sIDApOw0KLQkJeG9yaWdpbiA9IE1hdGgubWluKHhvcmlnaW4sIGNvbnRlbnRTaXplLnggLSAxKTsNCi0JCXlvcmlnaW4gPSBNYXRoLm1heCh5b3JpZ2luLCAwKTsNCi0JCXlvcmlnaW4gPSBNYXRoLm1pbih5b3JpZ2luLCBjb250ZW50U2l6ZS55IC0gMSk7DQotCQlzY29tcC5zZXRPcmlnaW4oeG9yaWdpbiwgeW9yaWdpbik7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVBhZ2VJbmNyZW1lbnQoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXApIHsNCi0JCVNjcm9sbEJhciB2YmFyID0gc2NvbXAuZ2V0VmVydGljYWxCYXIoKTsNCi0JCWlmICh2YmFyICE9IG51bGwpIHsNCi0JCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHNjb21wLmdldENsaWVudEFyZWEoKTsNCi0JCQlpbnQgaW5jcmVtZW50ID0gY2xpZW50QXJlYS5oZWlnaHQgLSA1Ow0KLQkJCXZiYXIuc2V0UGFnZUluY3JlbWVudChpbmNyZW1lbnQpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9DdXN0b21Xb3JrYm9vay5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0N1c3RvbVdvcmtib29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OGViY2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0N1c3RvbVdvcmtib29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQ3VzdG9tV29ya2Jvb2sgaW1wbGVtZW50cyBJRm9ybVdvcmtib29rIHsNCi0JcHJpdmF0ZSBIYXNodGFibGUgcGFnZXM7DQotCXByaXZhdGUgYm9vbGVhbiBmaXJzdFBhZ2VTZWxlY3RlZD10cnVlOw0KLQlwcml2YXRlIENUYWJGb2xkZXIgdGFiRm9sZGVyOw0KLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnM9bmV3IFZlY3RvcigpOw0KLQlwcml2YXRlIElGb3JtUGFnZSBjdXJyZW50UGFnZTsNCi0NCi1wdWJsaWMgQ3VzdG9tV29ya2Jvb2soKSB7DQotCXBhZ2VzID0gbmV3IEhhc2h0YWJsZSgpOw0KLX0NCi1wdWJsaWMgdm9pZCBhZGRGb3JtU2VsZWN0aW9uTGlzdGVuZXIoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQlsaXN0ZW5lcnMuYWRkRWxlbWVudChsaXN0ZW5lcik7DQotfQ0KLXB1YmxpYyB2b2lkIGFkZFBhZ2UoSUZvcm1QYWdlIHBhZ2UpIHsNCi0JQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMKTsNCi0JaXRlbS5zZXRUZXh0KHBhZ2UuZ2V0TGFiZWwoKSk7DQotCWl0ZW0uc2V0VG9vbFRpcFRleHQocGFnZS5nZXRUaXRsZSgpKTsNCi0JaXRlbS5zZXREYXRhKHBhZ2UpOw0KLQlwYWdlcy5wdXQocGFnZSwgaXRlbSk7DQotCQ0KLQlpZiAoZmlyc3RQYWdlU2VsZWN0ZWQgJiYgY3VycmVudFBhZ2UgPT0gbnVsbCkNCi0JCXNlbGVjdFBhZ2UocGFnZSwgdHJ1ZSk7DQotfQ0KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KLQl0YWJGb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihwYXJlbnQsIFNXVC5CT1RUT00pOw0KLQl0YWJGb2xkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJQ1RhYkl0ZW0gaXRlbSA9IChDVGFiSXRlbSkgZS5pdGVtOw0KLQkJCUlGb3JtUGFnZSBwYWdlID0gKElGb3JtUGFnZSkgaXRlbS5nZXREYXRhKCk7DQotCQkJaWYgKHBhZ2UgIT0gbnVsbCkNCi0JCQkJc2VsZWN0UGFnZShwYWdlLCB0cnVlKTsNCi0JCX0NCi0JfSk7DQotCS8vIGxpc3RlbmVyIHRvIHJlc2l6ZSB2aXNpYmxlIGNvbXBvbmVudHMNCi0JdGFiRm9sZGVyLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsNCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsNCi0JCQlpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkNCi0JCQkJc2V0Q29udHJvbFNpemUoY3VycmVudFBhZ2UuZ2V0Q29udHJvbCgpKTsNCi0JCX0NCi0JfSk7DQotfQ0KLXByaXZhdGUgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZChJRm9ybVBhZ2UgcGFnZSwgYm9vbGVhbiBzZXRGb2N1cykgew0KLQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQlJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKElGb3JtU2VsZWN0aW9uTGlzdGVuZXIpIGl0ZXIubmV4dCgpOw0KLQkJbGlzdGVuZXIuZm9ybVNlbGVjdGVkKHBhZ2UsIHNldEZvY3VzKTsNCi0JfQ0KLX0NCi1wdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgew0KLQlyZXR1cm4gdGFiRm9sZGVyOw0KLX0NCi1wdWJsaWMgSUZvcm1QYWdlIGdldEN1cnJlbnRQYWdlKCkgew0KLQlyZXR1cm4gY3VycmVudFBhZ2U7DQotfQ0KLXB1YmxpYyBib29sZWFuIGlzRmlyc3RQYWdlU2VsZWN0ZWQoKSB7DQotCXJldHVybiBmaXJzdFBhZ2VTZWxlY3RlZDsNCi19DQotcHVibGljIHZvaWQgcmVtb3ZlRm9ybVNlbGVjdGlvbkxpc3RlbmVyKElGb3JtU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JbGlzdGVuZXJzLnJlbW92ZUVsZW1lbnQobGlzdGVuZXIpOw0KLX0NCi1wdWJsaWMgdm9pZCByZW1vdmVQYWdlKElGb3JtUGFnZSBwYWdlKSB7DQotCUNUYWJJdGVtIGl0ZW0gPSAoQ1RhYkl0ZW0pIHBhZ2VzLmdldChwYWdlKTsNCi0JaWYgKGl0ZW0gIT0gbnVsbCkNCi0JCWl0ZW0uZGlzcG9zZSgpOw0KLX0NCi1wcml2YXRlIHZvaWQgcmVzZWxlY3RQYWdlKGZpbmFsIElGb3JtUGFnZSBwYWdlKSB7DQotCXRhYkZvbGRlci5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsNCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsNCi0JCXNlbGVjdFBhZ2UocGFnZSwgdHJ1ZSk7DQotCQl9DQotCX0pOw0KLX0NCi1wdWJsaWMgdm9pZCBzZWxlY3RQYWdlKGZpbmFsIElGb3JtUGFnZSBwYWdlLCBmaW5hbCBib29sZWFuIHNldEZvY3VzKSB7DQotCWZpbmFsIElGb3JtUGFnZSBvbGRQYWdlID0gY3VycmVudFBhZ2U7DQotCWN1cnJlbnRQYWdlID0gcGFnZTsNCi0NCi0JLy8gSXQgbWF5IHRha2UgYSB3aGlsZQ0KLQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSh0YWJGb2xkZXIuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7DQotCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJc3dpdGNoUGFnZXMob2xkUGFnZSwgcGFnZSwgc2V0Rm9jdXMpOw0KLQkJfQ0KLQl9KTsNCi19DQotcHJpdmF0ZSB2b2lkIHNldENvbnRyb2xTaXplKENvbnRyb2wgY29udHJvbCkgew0KLQlSZWN0YW5nbGUgYm91bmRzID0gdGFiRm9sZGVyLmdldEJvdW5kcygpOw0KLQlSZWN0YW5nbGUgb2Zmc2V0ID0gdGFiRm9sZGVyLmdldENsaWVudEFyZWEoKTsNCi0JYm91bmRzLnggKz0gb2Zmc2V0Lng7DQotCWJvdW5kcy55ICs9IG9mZnNldC55Ow0KLQlib3VuZHMud2lkdGggPSBvZmZzZXQud2lkdGg7DQotCWJvdW5kcy5oZWlnaHQgPSBvZmZzZXQuaGVpZ2h0Ow0KLQljb250cm9sLnNldEJvdW5kcyhib3VuZHMpOw0KLQljb250cm9sLm1vdmVBYm92ZSh0YWJGb2xkZXIpOw0KLX0NCi1wcml2YXRlIHZvaWQgc2V0Q29udHJvbFZpc2libGUoQ29udHJvbCBjb250cm9sKSB7DQotCWlmIChjb250cm9sID09IG51bGwpDQotCQlyZXR1cm47DQotCXNldENvbnRyb2xTaXplKGNvbnRyb2wpOw0KLQljb250cm9sLnNldFZpc2libGUodHJ1ZSk7DQotfQ0KLXB1YmxpYyB2b2lkIHNldEZpcnN0UGFnZVNlbGVjdGVkKGJvb2xlYW4gbmV3Rmlyc3RQYWdlU2VsZWN0ZWQpIHsNCi0JZmlyc3RQYWdlU2VsZWN0ZWQgPSBuZXdGaXJzdFBhZ2VTZWxlY3RlZDsNCi19DQotcHJpdmF0ZSB2b2lkIHN3aXRjaFBhZ2VzKElGb3JtUGFnZSBvbGRQYWdlLCBJRm9ybVBhZ2UgbmV3UGFnZSwgYm9vbGVhbiBzZXRGb2N1cykgew0KLQlpZiAob2xkUGFnZSAhPSBudWxsICYmIG9sZFBhZ2UhPW5ld1BhZ2UpIHsNCi0JCWJvb2xlYW4gb2tUb1N3aXRjaCA9IG9sZFBhZ2UuYmVjb21lc0ludmlzaWJsZShuZXdQYWdlKTsNCi0JCWlmICghb2tUb1N3aXRjaCkgew0KLQkJCS8vIFdlIG11c3QgdHJ5IHRvIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBwYWdlDQotCQkJcmVzZWxlY3RQYWdlKG9sZFBhZ2UpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JfQ0KLQlpZiAobmV3UGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCkNCi0JCW5ld1BhZ2UuY3JlYXRlQ29udHJvbCh0YWJGb2xkZXIpOw0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKChDVGFiSXRlbSkgcGFnZXMuZ2V0KG5ld1BhZ2UpKTsNCi0JaWYgKG9sZFBhZ2UgIT0gbnVsbCAmJiBvbGRQYWdlICE9IG5ld1BhZ2UpIHsNCi0JCUNvbnRyb2wgb2xkQ29udHJvbCA9IG9sZFBhZ2UuZ2V0Q29udHJvbCgpOw0KLQkJaWYgKG9sZENvbnRyb2whPW51bGwpIG9sZENvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7DQotCX0NCi0JQ29udHJvbCBuZXdDb250cm9sID0gbmV3UGFnZS5nZXRDb250cm9sKCk7DQotCW5ld1BhZ2UuYmVjb21lc1Zpc2libGUob2xkUGFnZSk7DQotCXNldENvbnRyb2xWaXNpYmxlKG5ld0NvbnRyb2wpOw0KLQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChuZXdQYWdlLCBzZXRGb2N1cyk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRXhwYW5kYWJsZUdyb3VwLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRXhwYW5kYWJsZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjVmOGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0V4cGFuZGFibGVHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBhbmRhYmxlR3JvdXAgew0KLQlwcml2YXRlIFN0cmluZyB0ZXh0Ow0KLQlwcml2YXRlIGJvb2xlYW4gZXhwYW5kZWQ7DQotCXByaXZhdGUgQ29tcG9zaXRlIGV4cGFuc2lvbjsNCi0JcHJvdGVjdGVkIFNlbGVjdGFibGVGb3JtTGFiZWwgdGV4dExhYmVsOw0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sOw0KLQlwcml2YXRlIGJvb2xlYW4gZXhwYW5kYWJsZT10cnVlOw0KLQkNCi1jbGFzcyBFeHBhbmRhYmxlTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsNCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOw0KLQkJUG9pbnQgc2l6ZSA9IHRleHRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOw0KLQkJaW50IHggPSAwOw0KLQkJaW50IHkgPSAxOw0KLQkJDQotCQlpZiAoZXhwYW5kYWJsZSkgew0KLQkJCXggPSA4ICsgODsNCi0JCX0NCi0JCXRleHRMYWJlbC5zZXRCb3VuZHMoeCwgeSwgc2l6ZS54LCBzaXplLnkpOw0KLQkNCi0JCWlmIChleHBhbmRhYmxlKQ0KLQkJICAgeSA9IE1hdGgubWF4KHNpemUueSwgOCkgKyAyICsgMjsNCi0JCWVsc2UNCi0JCSAgIHkgPSBzaXplLnkgKyAyOw0KLQkJaWYgKGV4cGFuZGVkKSB7DQotCQkJaW50IGFyZWFXaWR0aCA9IGNsaWVudEFyZWEud2lkdGggLSB4Ow0KLQkJCXNpemUgPSBleHBhbnNpb24uY29tcHV0ZVNpemUoYXJlYVdpZHRoLCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7DQotCQkJZXhwYW5zaW9uLnNldEJvdW5kcyh4LCB5LCBzaXplLngsIHNpemUueSk7DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7DQotCQlQb2ludCBzaXplID0gdGV4dExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7DQotCQl3aWR0aCA9IHNpemUueDsNCi0JCWhlaWdodCA9IHNpemUueSArIDIgKyAyOw0KLQkJaWYgKGV4cGFuZGVkKSB7DQotCQkJc2l6ZSA9IGV4cGFuc2lvbi5jb21wdXRlU2l6ZSh3SGludCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOw0KLQkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIHNpemUueCk7DQotCQkJaGVpZ2h0ICs9IHNpemUueTsNCi0JCX0NCi0JCWlmIChleHBhbmRhYmxlKSB7DQotCQkJaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCA4KTsNCi0JCQl3aWR0aCArPSA4ICsgODsNCi0JCX0NCi0JCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7DQotCX0NCi19DQotDQotCXB1YmxpYyBFeHBhbmRhYmxlR3JvdXAoKSB7DQotCX0NCi0JDQotCXB1YmxpYyBFeHBhbmRhYmxlR3JvdXAoaW50IHN0eWxlKSB7DQotCQkvL3RoaXMuc3R5bGUgPSBzdHlsZTsNCi0JfQ0KLQkNCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsNCi0JCXJldHVybiBjb250cm9sOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsNCi0JCWZpbmFsIENhbnZhcyBjb250YWluZXIgPSBuZXcgQ2FudmFzKHBhcmVudCwgU1dULk5VTEwpOw0KLQkJY29udGFpbmVyLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7DQotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBFeHBhbmRhYmxlTGF5b3V0KCkpOw0KLQkJY29udGFpbmVyLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgew0KLQkJCQlpZiAoZXhwYW5kYWJsZSkgcmVwYWludChlKTsNCi0JCQl9DQotCQl9KTsNCi0JCWNvbnRhaW5lci5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsNCi0JCQkJUmVjdGFuZ2xlIGJveCA9IGdldEJveEJvdW5kcyhudWxsKTsNCi0JCQkJaWYgKGJveC5jb250YWlucyhlLngsIGUueSkpIHsNCi0JCQkJCWNvbnRhaW5lci5zZXRDdXJzb3IoZmFjdG9yeS5nZXRCdXN5Q3Vyc29yKCkpOw0KLQkJCQkJc2V0RXhwYW5kZWQoIWlzRXhwYW5kZWQoKSk7DQotCQkJCQljb250YWluZXIuc2V0Q3Vyc29yKG51bGwpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQl0ZXh0TGFiZWwgPSBjcmVhdGVUZXh0TGFiZWwoY29udGFpbmVyLCBmYWN0b3J5KTsNCi0JCWdldEh5cGVybGlua0hhbmRsZXIoZmFjdG9yeSkucmVnaXN0ZXJIeXBlcmxpbmsodGV4dExhYmVsLCBuZXcgSHlwZXJsaW5rQWRhcHRlciAoKSB7DQotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChDb250cm9sIGxpbmspIHsNCi0JCQkJRXhwYW5kYWJsZUdyb3VwLnRoaXMubGlua0FjdGl2YXRlZCgpOw0KLQkJCQlpZiAoZXhwYW5kYWJsZSkgc2V0RXhwYW5kZWQoIWlzRXhwYW5kZWQoKSk7DQotCQkJfQ0KLQkJfSk7DQotCQl0ZXh0TGFiZWwuYWRkRm9jdXNMaXN0ZW5lcihmYWN0b3J5LnZpc2liaWxpdHlIYW5kbGVyKTsNCi0JCXRleHRMYWJlbC5hZGRLZXlMaXN0ZW5lcihmYWN0b3J5LmtleWJvYXJkSGFuZGxlcik7CQkNCi0JCWlmICh0ZXh0IT1udWxsKSB0ZXh0TGFiZWwuc2V0VGV4dCh0ZXh0KTsNCi0JCWV4cGFuc2lvbiA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbnRhaW5lcik7DQotCQlmaWxsRXhwYW5zaW9uKGV4cGFuc2lvbiwgZmFjdG9yeSk7DQotCQl0aGlzLmNvbnRyb2wgPSBjb250YWluZXI7DQotCX0NCi0JDQotCXByb3RlY3RlZCBTZWxlY3RhYmxlRm9ybUxhYmVsIGNyZWF0ZVRleHRMYWJlbChDb21wb3NpdGUgcGFyZW50LCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotCQlTZWxlY3RhYmxlRm9ybUxhYmVsIHRleHQgPSBuZXcgU2VsZWN0YWJsZUZvcm1MYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsNCi0JCXRleHQuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsNCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSHlwZXJsaW5rSGFuZGxlciBnZXRIeXBlcmxpbmtIYW5kbGVyKEZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsNCi0JCXJldHVybiBmYWN0b3J5LmdldEh5cGVybGlua0hhbmRsZXIoKTsNCi0JfQ0KLQkNCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZmlsbEV4cGFuc2lvbihDb21wb3NpdGUgZXhwYW5zaW9uLCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KTsNCi0JDQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsNCi0JCXRoaXMudGV4dCA9IHRleHQ7DQotCQlpZiAodGV4dExhYmVsIT1udWxsKQ0KLQkJICAgdGV4dExhYmVsLnNldFRleHQodGV4dCk7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkgew0KLQkJcmV0dXJuIGV4cGFuZGVkOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRhYmxlKGJvb2xlYW4gZXhwYW5kYWJsZSkgew0KLQkJdGhpcy5leHBhbmRhYmxlID0gZXhwYW5kYWJsZTsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNFeHBhbmRhYmxlKCkgew0KLQkJcmV0dXJuIGV4cGFuZGFibGU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKGJvb2xlYW4gZXhwYW5kZWQpIHsNCi0JCWlmICh0aGlzLmV4cGFuZGVkICE9IGV4cGFuZGVkKSB7DQotCQkJaWYgKGV4cGFuZGVkKSB7DQotCQkJCWFib3V0VG9FeHBhbmQoKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCWFib3V0VG9Db2xsYXBzZSgpOw0KLQkJCX0NCi0JCQl0aGlzLmV4cGFuZGVkID0gZXhwYW5kZWQ7DQotCQkJZXhwYW5zaW9uLnNldFZpc2libGUoZXhwYW5kZWQpOw0KLQkJCWNvbnRyb2wubGF5b3V0KCk7DQotCQkJaWYgKGV4cGFuZGVkKSB7DQotCQkJCXRoaXMuZXhwYW5kZWQoKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCWNvbGxhcHNlZCgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHJlcGFpbnQoUGFpbnRFdmVudCBlKSB7DQotCQlHQyBnYyA9IGUuZ2M7DQotCQlSZWN0YW5nbGUgYm94ID0gZ2V0Qm94Qm91bmRzKGdjKTsNCi0JCWdjLnNldEZvcmVncm91bmQoY29udHJvbC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XKSk7DQotCQlnYy5kcmF3UmVjdGFuZ2xlKGJveCk7DQotCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbnRyb2wuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpKTsNCi0JCWdjLmRyYXdMaW5lKGJveC54KzIsIGJveC55KzQsIGJveC54KzYsIGJveC55KzQpOw0KLQkJaWYgKCFpc0V4cGFuZGVkKCkpIHsNCi0JCQlnYy5kcmF3TGluZShib3gueCs0LCBib3gueSsyLCBib3gueCs0LCBib3gueSs2KTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0Qm94Qm91bmRzKEdDIGdjKSB7DQotCQlpbnQgeCA9IDA7DQotCQlpbnQgeSA9IDA7DQotCQlib29sZWFuIG5vR0MgPSBmYWxzZTsNCi0JDQotCQlpZiAoZ2M9PW51bGwpIHsNCi0JCQlnYyA9IG5ldyBHQyhjb250cm9sKTsNCi0JCQlub0dDID0gdHJ1ZTsNCi0JCX0NCi0JCWdjLnNldEZvbnQodGV4dExhYmVsLmdldEZvbnQoKSk7DQotCQlpbnQgaGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsNCi0JCXkgPSBoZWlnaHQvMiAtIDQgKzE7DQotCQl5ID0gTWF0aC5tYXgoeSwgMCk7DQotCQlpZiAobm9HQykgZ2MuZGlzcG9zZSgpOw0KLQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoeCwgeSwgOCwgOCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxheW91dCgpIHsNCi0JCWNvbnRyb2wubGF5b3V0KCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGFib3V0VG9FeHBhbmQoKSB7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGFib3V0VG9Db2xsYXBzZSgpIHsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgZXhwYW5kZWQoKSB7DQotCX0NCi0JcHJvdGVjdGVkIHZvaWQgY29sbGFwc2VkKCkgew0KLQl9DQotCXByb3RlY3RlZCB2b2lkIGxpbmtBY3RpdmF0ZWQoKSB7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1CdXR0b24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMDdlZGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1CdXR0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi0NCi1wdWJsaWMgY2xhc3MgRm9ybUJ1dHRvbiB7DQotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbjsNCi0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsNCi0JcHJpdmF0ZSBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5Ow0KLQlwcml2YXRlIEltYWdlIGhvdmVySW1hZ2U7DQotCXByaXZhdGUgYm9vbGVhbiBpbnNpZGU7DQotCXByaXZhdGUgSW1hZ2UgZGlzYWJsZWRJbWFnZTsNCi0NCi1wdWJsaWMgRm9ybUJ1dHRvbihCdXR0b24gYnV0dG9uLCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotCXRoaXMuYnV0dG9uID0gYnV0dG9uOw0KLQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5Ow0KLQlidXR0b24uYWRkTW91c2VUcmFja0xpc3RlbmVyKG5ldyBNb3VzZVRyYWNrQWRhcHRlcigpIHsNCi0JCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7DQotCQkJaW5zaWRlPXRydWU7DQotCQkJdXBkYXRlSW1hZ2UoKTsNCi0JCX0NCi0JCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsNCi0JCQlpbnNpZGU9ZmFsc2U7DQotCQkJdXBkYXRlSW1hZ2UoKTsNCi0JCX0NCi0JfSk7DQotfQ0KLXB1YmxpYyBCdXR0b24gZ2V0QnV0dG9uKCkgew0KLQlyZXR1cm4gYnV0dG9uOw0KLX0NCi1wdWJsaWMgSW1hZ2UgZ2V0RGlzYWJsZWRJbWFnZSgpIHsNCi0JcmV0dXJuIGRpc2FibGVkSW1hZ2U7DQotfQ0KLXB1YmxpYyBJbWFnZSBnZXRIb3ZlckltYWdlKCkgew0KLQlyZXR1cm4gaG92ZXJJbWFnZTsNCi19DQotcHVibGljIEltYWdlIGdldEltYWdlKCkgew0KLQlyZXR1cm4gaW1hZ2U7DQotfQ0KLXB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2UoSW1hZ2UgbmV3RGlzYWJsZWRJbWFnZSkgew0KLQlkaXNhYmxlZEltYWdlID0gbmV3RGlzYWJsZWRJbWFnZTsNCi19DQotcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsNCi0JYnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7DQotCXVwZGF0ZUltYWdlKCk7DQotfQ0KLXB1YmxpYyB2b2lkIHNldEhvdmVySW1hZ2UoSW1hZ2UgbmV3SG92ZXJJbWFnZSkgew0KLQlob3ZlckltYWdlID0gbmV3SG92ZXJJbWFnZTsNCi19DQotcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgbmV3SW1hZ2UpIHsNCi0JaW1hZ2UgPSBuZXdJbWFnZTsNCi0JaWYgKGhvdmVySW1hZ2U9PW51bGwpIGhvdmVySW1hZ2UgPSBpbWFnZTsNCi0JaWYgKGRpc2FibGVkSW1hZ2U9PW51bGwpIGRpc2FibGVkSW1hZ2UgPSBpbWFnZTsNCi0JdXBkYXRlSW1hZ2UoKTsNCi19DQotcHVibGljIHZvaWQgdXBkYXRlSW1hZ2UoKSB7DQotCWJvb2xlYW4gZW5hYmxlZCA9IGJ1dHRvbi5pc0VuYWJsZWQoKTsNCi0JaWYgKGVuYWJsZWQgPT0gZmFsc2UpIHsNCi0JCWJ1dHRvbi5zZXRJbWFnZShkaXNhYmxlZEltYWdlKTsNCi0JfSBlbHNlIHsNCi0JCWlmIChpbnNpZGUpIHsNCi0JCQlidXR0b24uc2V0Q3Vyc29yKGZhY3RvcnkuZ2V0SHlwZXJsaW5rQ3Vyc29yKCkpOw0KLQkJCWJ1dHRvbi5zZXRJbWFnZShob3ZlckltYWdlKTsNCi0JCX0gZWxzZSB7DQotCQkJYnV0dG9uLnNldEN1cnNvcihudWxsKTsNCi0JCQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOw0KLQkJfQ0KLQl9DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybUVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTdlMTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1wdWJsaWMgY2xhc3MgRm9ybUVudHJ5IHsNCi0JcHJpdmF0ZSBUZXh0IHRleHQ7DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQlwcml2YXRlIGJvb2xlYW4gZGlydHk7DQotCXByaXZhdGUgVmVjdG9yIGxpc3RlbmVycz1uZXcgVmVjdG9yKCk7DQotCWJvb2xlYW4gaWdub3JlTW9kaWZ5PWZhbHNlOw0KLQ0KLXB1YmxpYyBGb3JtRW50cnkoVGV4dCB0ZXh0KSB7DQotCXRoaXMudGV4dCA9IHRleHQ7DQotCXRoaXMudmFsdWUgPSB0ZXh0LmdldFRleHQoKTsNCi0JYWRkTGlzdGVuZXJzKCk7DQotfQ0KLXB1YmxpYyB2b2lkIGFkZEZvcm1UZXh0TGlzdGVuZXIoSUZvcm1UZXh0TGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JbGlzdGVuZXJzLmFkZEVsZW1lbnQobGlzdGVuZXIpOw0KLX0NCi1wcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgew0KLQl0ZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgew0KLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgew0KLQkJCWtleVJlbGVhc2VPY2N1cmVkKGUpOw0KLQkJfQ0KLQl9KTsNCi0JdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7DQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsNCi0JCQllZGl0T2NjdXJlZChlKTsNCi0JCX0NCi0JfSk7DQotCXRleHQuYWRkRm9jdXNMaXN0ZW5lciAobmV3IEZvY3VzQWRhcHRlcigpIHsNCi0JCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsNCi0JCQlpZiAoZGlydHkpIGNvbW1pdCgpOw0KLQkJfQ0KLQl9KTsNCi19DQotcHVibGljIHZvaWQgY29tbWl0KCkgew0KLQlpZiAoZGlydHkpIHsNCi0JCXZhbHVlID0gdGV4dC5nZXRUZXh0KCk7DQotCQkvL25vdGlmeQ0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCSgoSUZvcm1UZXh0TGlzdGVuZXIpIGl0ZXIubmV4dCgpKS50ZXh0VmFsdWVDaGFuZ2VkKHRoaXMpOw0KLQkJfQ0KLQl9DQotCWRpcnR5ID0gZmFsc2U7DQotfQ0KLXByb3RlY3RlZCB2b2lkIGVkaXRPY2N1cmVkKE1vZGlmeUV2ZW50IGUpIHsNCi0JaWYgKGlnbm9yZU1vZGlmeSkgcmV0dXJuOw0KLQlkaXJ0eSA9IHRydWU7DQotCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0JCSgoSUZvcm1UZXh0TGlzdGVuZXIpIGl0ZXIubmV4dCgpKS50ZXh0RGlydHkodGhpcyk7DQotCX0NCi19DQotDQotcHVibGljIFRleHQgZ2V0Q29udHJvbCgpIHsNCi0JcmV0dXJuIHRleHQ7DQotfQ0KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkgew0KLQlyZXR1cm4gdmFsdWU7DQotfQ0KLXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7DQotCXJldHVybiBkaXJ0eTsNCi19DQotcHJvdGVjdGVkIHZvaWQga2V5UmVsZWFzZU9jY3VyZWQoS2V5RXZlbnQgZSkgew0KLQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xyJykgew0KLQkJLy8gY29tbWl0IHZhbHVlDQotCQlpZiAoZGlydHkpIGNvbW1pdCgpOw0KLQl9DQotCWVsc2UgaWYgKGUuY2hhcmFjdGVyID09ICdcdTAwMWInKSB7IC8vIEVzY2FwZSBjaGFyYWN0ZXINCi0JCXRleHQuc2V0VGV4dCh2YWx1ZSE9bnVsbD92YWx1ZToiIik7IC8vIHJlc3RvcmUgb2xkDQotCQlkaXJ0eT0gZmFsc2U7DQotCX0NCi19DQotcHVibGljIHZvaWQgcmVtb3ZlRm9ybVRleHRMaXN0ZW5lcihJRm9ybVRleHRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQlsaXN0ZW5lcnMucmVtb3ZlRWxlbWVudChsaXN0ZW5lcik7DQotfQ0KLXB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gbmV3RGlydHkpIHsNCi0JZGlydHkgPSBuZXdEaXJ0eTsNCi19DQotcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7DQotCWlmICh0ZXh0IT1udWxsKSB0ZXh0LnNldFRleHQodmFsdWUhPW51bGw/dmFsdWU6IiIpOw0KLQl0aGlzLnZhbHVlID0gdmFsdWU7DQotfQ0KLQ0KLXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBibG9ja05vdGlmaWNhdGlvbikgew0KLQlpZ25vcmVNb2RpZnkgPSBibG9ja05vdGlmaWNhdGlvbjsNCi0Jc2V0VmFsdWUodmFsdWUpOw0KLQlpZ25vcmVNb2RpZnkgPSBmYWxzZTsNCi19DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtTGFiZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1ZTFlOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuQnJlYWtJdGVyYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi0NCi0vKioNCi0gKiBGb3JtVGV4dCBpcyBhIHdpbmRvd2xlc3MgY29udHJvbCB0aGF0DQotICogZHJhd3MgdGV4dCBpbiB0aGUgcHJvdmlkZWQgY29udGV4dC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRm9ybUxhYmVsIGV4dGVuZHMgQ2FudmFzIHsNCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dCA9ICIiOw0KLQlwcm90ZWN0ZWQgaW50IHRleHRNYXJnaW5XaWR0aCA9IDU7DQotCXByb3RlY3RlZCBpbnQgdGV4dE1hcmdpbkhlaWdodCA9IDU7DQotCXByaXZhdGUgYm9vbGVhbiB1bmRlcmxpbmVkOw0KLQ0KLQlwdWJsaWMgRm9ybUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgew0KLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7DQotCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsNCi0JCQkJcGFpbnQoZSk7DQotCQkJfQ0KLQkJfSk7DQotCQlpbml0QWNjZXNzaWJsZSgpOw0KLQl9DQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsNCi0JCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJdGhpcy50ZXh0ID0gdGV4dDsNCi0JCWVsc2UNCi0JCQl0ZXh0ID0gIiI7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFjY2Vzc2libGUoKSB7DQotCQlBY2Nlc3NpYmxlIGFjY2Vzc2libGUgPSBnZXRBY2Nlc3NpYmxlKCk7DQotCQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgew0KLQkJCQllLnJlc3VsdCA9IGdldFRleHQoKTsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgew0KLQkJCQllLnJlc3VsdCA9IGdldFRvb2xUaXBUZXh0KCk7DQotCQkJfQ0KLQkJfSk7DQotDQotCQlhY2Nlc3NpYmxlDQotCQkJLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZEF0UG9pbnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCVBvaW50IHB0ID0gdG9Db250cm9sKG5ldyBQb2ludChlLngsIGUueSkpOw0KLQkJCQllLmNoaWxkSUQgPQ0KLQkJCQkJKGdldEJvdW5kcygpLmNvbnRhaW5zKHB0KSkNCi0JCQkJCQk/IEFDQy5DSElMRElEX1NFTEYNCi0JCQkJCQk6IEFDQy5DSElMRElEX05PTkU7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldExvY2F0aW9uKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQlSZWN0YW5nbGUgbG9jYXRpb24gPSBnZXRCb3VuZHMoKTsNCi0JCQkJUG9pbnQgcHQgPSB0b0Rpc3BsYXkobmV3IFBvaW50KGxvY2F0aW9uLngsIGxvY2F0aW9uLnkpKTsNCi0JCQkJZS54ID0gcHQueDsNCi0JCQkJZS55ID0gcHQueTsNCi0JCQkJZS53aWR0aCA9IGxvY2F0aW9uLndpZHRoOw0KLQkJCQllLmhlaWdodCA9IGxvY2F0aW9uLmhlaWdodDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRDb3VudChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSAwOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRSb2xlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IEFDQy5ST0xFX0xBQkVMOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSBBQ0MuU1RBVEVfUkVBRE9OTFk7DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0VW5kZXJsaW5lZChib29sZWFuIHVuZGVybGluZWQpIHsNCi0JCXRoaXMudW5kZXJsaW5lZCA9IHVuZGVybGluZWQ7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNVbmRlcmxpbmVkKCkgew0KLQkJcmV0dXJuIHVuZGVybGluZWQ7DQotCX0NCi0NCi0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWNoZWNrV2lkZ2V0KCk7DQotCQlpbnQgaW5uZXJXaWR0aCA9IHdIaW50Ow0KLQkJaWYgKGlubmVyV2lkdGggIT0gU1dULkRFRkFVTFQpDQotCQkJaW5uZXJXaWR0aCAtPSB0ZXh0TWFyZ2luV2lkdGggKiAyOw0KLQkJUG9pbnQgdGV4dFNpemUgPSBjb21wdXRlVGV4dFNpemUoaW5uZXJXaWR0aCwgaEhpbnQpOw0KLQkJaW50IHRleHRXaWR0aCA9IHRleHRTaXplLnggKyAyICogdGV4dE1hcmdpbldpZHRoOw0KLQkJaW50IHRleHRIZWlnaHQgPSB0ZXh0U2l6ZS55ICsgMiAqIHRleHRNYXJnaW5IZWlnaHQ7DQotCQlyZXR1cm4gbmV3IFBvaW50KHRleHRXaWR0aCwgdGV4dEhlaWdodCk7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVdyYXBIZWlnaHQoR0MgZ2MsIFN0cmluZyB0ZXh0LCBpbnQgd2lkdGgpIHsNCi0JCUJyZWFrSXRlcmF0b3Igd2IgPSBCcmVha0l0ZXJhdG9yLmdldFdvcmRJbnN0YW5jZSgpOw0KLQkJd2Iuc2V0VGV4dCh0ZXh0KTsNCi0JCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsNCi0JCWludCBsaW5lSGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7DQotDQotCQlpbnQgc2F2ZWQgPSAwOw0KLQkJaW50IGxhc3QgPSAwOw0KLQkJaW50IGhlaWdodCA9IGxpbmVIZWlnaHQ7DQotDQotCQlmb3IgKGludCBsb2MgPSB3Yi5maXJzdCgpOw0KLQkJCWxvYyAhPSBCcmVha0l0ZXJhdG9yLkRPTkU7DQotCQkJbG9jID0gd2IubmV4dCgpKSB7DQotCQkJU3RyaW5nIHdvcmQgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbG9jKTsNCi0JCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KHdvcmQpOw0KLQkJCWlmIChleHRlbnQueCA+IHdpZHRoKSB7DQotCQkJCS8vIG92ZXJmbG93DQotCQkJCXNhdmVkID0gbGFzdDsNCi0JCQkJaGVpZ2h0ICs9IGV4dGVudC55Ow0KLQkJCX0NCi0JCQlsYXN0ID0gbG9jOw0KLQkJfQ0KLQkJcmV0dXJuIGhlaWdodDsNCi0JfQ0KLQ0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVUZXh0U2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgew0KLQkJUG9pbnQgZXh0ZW50Ow0KLQkJR0MgZ2MgPSBuZXcgR0ModGhpcyk7DQotDQotCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotCQlpZiAoKGdldFN0eWxlKCkgJiBTV1QuV1JBUCkgIT0gMCAmJiB3SGludCAhPSBTV1QuREVGQVVMVCkgew0KLQkJCWludCBoZWlnaHQgPSBjb21wdXRlV3JhcEhlaWdodChnYywgdGV4dCwgd0hpbnQpOw0KLQkJCWV4dGVudCA9IG5ldyBQb2ludCh3SGludCwgaGVpZ2h0KTsNCi0JCX0gZWxzZSB7DQotCQkJZXh0ZW50ID0gZ2MudGV4dEV4dGVudChnZXRUZXh0KCkpOw0KLQkJfQ0KLQkJZ2MuZGlzcG9zZSgpOw0KLQkJcmV0dXJuIGV4dGVudDsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFpbnRXcmFwVGV4dCgNCi0JCUdDIGdjLA0KLQkJUG9pbnQgc2l6ZSwNCi0JCVN0cmluZyB0ZXh0LA0KLQkJaW50IG1hcmdpbldpZHRoLA0KLQkJaW50IG1hcmdpbkhlaWdodCkgew0KLQkJcGFpbnRXcmFwVGV4dChnYywgc2l6ZSwgdGV4dCwgbWFyZ2luV2lkdGgsIG1hcmdpbkhlaWdodCwgZmFsc2UpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWludFdyYXBUZXh0KA0KLQkJR0MgZ2MsDQotCQlQb2ludCBzaXplLA0KLQkJU3RyaW5nIHRleHQsDQotCQlpbnQgbWFyZ2luV2lkdGgsDQotCQlpbnQgbWFyZ2luSGVpZ2h0LA0KLQkJYm9vbGVhbiB1bmRlcmxpbmUpIHsNCi0JCUJyZWFrSXRlcmF0b3Igd2IgPSBCcmVha0l0ZXJhdG9yLmdldFdvcmRJbnN0YW5jZSgpOw0KLQkJd2Iuc2V0VGV4dCh0ZXh0KTsNCi0JCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsNCi0JCWludCBsaW5lSGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7DQotCQlpbnQgZGVzY2VudCA9IGZtLmdldERlc2NlbnQoKTsNCi0NCi0JCWludCBzYXZlZCA9IDA7DQotCQlpbnQgbGFzdCA9IDA7DQotCQlpbnQgeSA9IG1hcmdpbkhlaWdodDsNCi0JCWludCB3aWR0aCA9IHNpemUueCAtIG1hcmdpbldpZHRoICogMjsNCi0NCi0JCWZvciAoaW50IGxvYyA9IHdiLmZpcnN0KCk7DQotCQkJbG9jICE9IEJyZWFrSXRlcmF0b3IuRE9ORTsNCi0JCQlsb2MgPSB3Yi5uZXh0KCkpIHsNCi0JCQlTdHJpbmcgbGluZSA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsb2MpOw0KLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQobGluZSk7DQotCQkJaWYgKGV4dGVudC54ID4gd2lkdGgpIHsNCi0JCQkJLy8gb3ZlcmZsb3cNCi0JCQkJU3RyaW5nIHByZXZMaW5lID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxhc3QpOw0KLQkJCQlnYy5kcmF3U3RyaW5nKHByZXZMaW5lLCBtYXJnaW5XaWR0aCwgeSwgdHJ1ZSk7DQotCQkJCWlmICh1bmRlcmxpbmUpIHsNCi0JCQkJCVBvaW50IHByZXZFeHRlbnQgPSBnYy50ZXh0RXh0ZW50KHByZXZMaW5lKTsNCi0JCQkJCWludCBsaW5lWSA9IHkgKyBsaW5lSGVpZ2h0IC0gZGVzY2VudCArIDE7DQotCQkJCQlnYy5kcmF3TGluZShtYXJnaW5XaWR0aCwgbGluZVksIHByZXZFeHRlbnQueCwgbGluZVkpOw0KLQkJCQl9DQotDQotCQkJCXNhdmVkID0gbGFzdDsNCi0JCQkJeSArPSBsaW5lSGVpZ2h0Ow0KLQkJCX0NCi0JCQlsYXN0ID0gbG9jOw0KLQkJfQ0KLQkJLy8gcGFpbnQgdGhlIGxhc3QgbGluZQ0KLQkJU3RyaW5nIGxhc3RMaW5lID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxhc3QpOw0KLQkJZ2MuZHJhd1N0cmluZyhsYXN0TGluZSwgbWFyZ2luV2lkdGgsIHksIHRydWUpOw0KLQkJaWYgKHVuZGVybGluZSkgew0KLQkJCWludCBsaW5lWSA9IHkgKyBsaW5lSGVpZ2h0IC0gZGVzY2VudCArIDE7DQotCQkJUG9pbnQgbGFzdEV4dGVudCA9IGdjLnRleHRFeHRlbnQobGFzdExpbmUpOw0KLQkJCWdjLmRyYXdMaW5lKG1hcmdpbldpZHRoLCBsaW5lWSwgbWFyZ2luV2lkdGggKyBsYXN0RXh0ZW50LngsIGxpbmVZKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludChQYWludEV2ZW50IGUpIHsNCi0JCUdDIGdjID0gZS5nYzsNCi0JCVBvaW50IHNpemUgPSBnZXRTaXplKCk7DQotCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotCQlnYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7DQotCQlpZiAoKGdldFN0eWxlKCkgJiBTV1QuV1JBUCkgIT0gMCkgew0KLQkJCXBhaW50V3JhcFRleHQoDQotCQkJCWdjLA0KLQkJCQlzaXplLA0KLQkJCQl0ZXh0LA0KLQkJCQl0ZXh0TWFyZ2luV2lkdGgsDQotCQkJCXRleHRNYXJnaW5IZWlnaHQsDQotCQkJCXVuZGVybGluZWQpOw0KLQkJfSBlbHNlIHsNCi0JCQlnYy5kcmF3VGV4dChnZXRUZXh0KCksIHRleHRNYXJnaW5XaWR0aCwgdGV4dE1hcmdpbkhlaWdodCwgdHJ1ZSk7DQotCQkJaWYgKHVuZGVybGluZWQpIHsNCi0JCQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOw0KLQkJCQlpbnQgZGVzY2VudCA9IGZtLmdldERlc2NlbnQoKTsNCi0JCQkJaW50IGxpbmVZID0gc2l6ZS55IC0gdGV4dE1hcmdpbkhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCQlnYy5kcmF3TGluZSgNCi0JCQkJCXRleHRNYXJnaW5XaWR0aCwNCi0JCQkJCWxpbmVZLA0KLQkJCQkJc2l6ZS54IC0gdGV4dE1hcmdpbldpZHRoLA0KLQkJCQkJbGluZVkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybVNlY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDIyMzFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZvcm1TZWN0aW9uIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT04gPSAxOw0KLQlwcml2YXRlIFN0cmluZyBoZWFkZXJDb2xvcktleSA9IEZvcm1XaWRnZXRGYWN0b3J5LkRFRkFVTFRfSEVBREVSX0NPTE9SOw0KLQlwcml2YXRlIFN0cmluZyBoZWFkZXJUZXh0Ow0KLQlwcml2YXRlIENvbnRyb2wgY2xpZW50Ow0KLQlwcm90ZWN0ZWQgTGFiZWwgaGVhZGVyOw0KLQlwcm90ZWN0ZWQgQ29udHJvbCBzZXBhcmF0b3I7DQotCXByaXZhdGUgU2VjdGlvbkNoYW5nZU1hbmFnZXIgc2VjdGlvbk1hbmFnZXI7DQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOw0KLQlwcml2YXRlIGJvb2xlYW4gZGlydHk7DQotCXByb3RlY3RlZCBMYWJlbCBkZXNjcmlwdGlvbkxhYmVsOw0KLQlwcml2YXRlIFRvZ2dsZUNvbnRyb2wgdG9nZ2xlOw0KLQlwcml2YXRlIGJvb2xlYW4gcmVhZE9ubHk7DQotCXByaXZhdGUgYm9vbGVhbiBhZGRTZXBhcmF0b3IgPSB0cnVlOw0KLQlwcml2YXRlIGJvb2xlYW4gZGVzY3JpcHRpb25QYWludGVkID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGhlYWRlclBhaW50ZWQgPSB0cnVlOw0KLQlwcml2YXRlIGJvb2xlYW4gY29sbGFwc2FibGUgPSBmYWxzZTsNCi0JcHJpdmF0ZSBib29sZWFuIGNvbGxhcHNlZCA9IGZhbHNlOw0KLQlwcml2YXRlIGludCB3aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsNCi0JcHJpdmF0ZSBpbnQgaGVpZ2h0SGludCA9IFNXVC5ERUZBVUxUOw0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sOw0KLQlwdWJsaWMgYm9vbGVhbiBjb21wYWN0TW9kZT1mYWxzZTsNCi0NCi0JLyoNCi0JICogVGhpcyBpcyBhIHNwZWNpYWwgbGF5b3V0IGZvciB0aGUgc2VjdGlvbi4gQm90aCB0aGUNCi0JICogaGVhZGVyIGFuZCB0aGUgZGVzY3JpcHRpb24gbGFiZWxzIHdpbGwgd3JhcCBhbmQNCi0JICogdGhleSB3aWxsIHVzZSBjbGllbnQncyBzaXplIHRvIGNhbGN1bGF0ZSBuZWVkZWQNCi0JICogaGVpZ2h0LiBUaGlzIGtpbmQgb2YgYmVoYXZpb3VyIGlzIG5vdCBwb3NzaWJsZQ0KLQkgKiB3aXRoIHN0b2NrIGdyaWQgbGF5b3V0Lg0KLQkgKi8NCi0JY2xhc3MgU2VjdGlvbkxheW91dCBleHRlbmRzIExheW91dCBpbXBsZW1lbnRzIElMYXlvdXRFeHRlbnNpb24gew0KLQkJaW50IHZzcGFjaW5nID0gMzsNCi0JCWludCBzZXBIZWlnaHQgPSAyOw0KLQ0KLQkJcHVibGljIGludCBnZXRNaW5pbXVtV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBmbHVzaCkgew0KLQkJCXJldHVybiAzMDsNCi0JCX0NCi0NCi0JCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gZmx1c2gpIHsNCi0JCQlpbnQgbWF4V2lkdGggPSAwOw0KLQkJCWlmIChjbGllbnQgIT0gbnVsbCkgew0KLQkJCQlpZiAoY2xpZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7DQotCQkJCQlMYXlvdXQgY2wgPSAoKENvbXBvc2l0ZSkgY2xpZW50KS5nZXRMYXlvdXQoKTsNCi0JCQkJCWlmIChjbCBpbnN0YW5jZW9mIElMYXlvdXRFeHRlbnNpb24pDQotCQkJCQkJbWF4V2lkdGggPQ0KLQkJCQkJCQkoKElMYXlvdXRFeHRlbnNpb24pIGNsKS5nZXRNYXhpbXVtV2lkdGgoDQotCQkJCQkJCQkoQ29tcG9zaXRlKSBjbGllbnQsDQotCQkJCQkJCQlmbHVzaCk7DQotCQkJCX0NCi0JCQkJaWYgKG1heFdpZHRoID09IDApIHsNCi0JCQkJCVBvaW50IGNzaXplID0NCi0JCQkJCQljbGllbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotCQkJCQltYXhXaWR0aCA9IGNzaXplLng7DQotCQkJCX0NCi0JCQl9DQotCQkJaWYgKGhlYWRlclBhaW50ZWQgJiYgaGVhZGVyICE9IG51bGwpIHsNCi0JCQkJUG9pbnQgaHNpemUgPQ0KLQkJCQkJaGVhZGVyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQkJCQltYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBoc2l6ZS54KTsNCi0JCQl9DQotCQkJaWYgKGRlc2NyaXB0aW9uUGFpbnRlZCAmJiBkZXNjcmlwdGlvbkxhYmVsICE9IG51bGwpIHsNCi0JCQkJUG9pbnQgZHNpemUgPQ0KLQkJCQkJZGVzY3JpcHRpb25MYWJlbC5jb21wdXRlU2l6ZSgNCi0JCQkJCQlTV1QuREVGQVVMVCwNCi0JCQkJCQlTV1QuREVGQVVMVCwNCi0JCQkJCQlmbHVzaCk7DQotCQkJCW1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGRzaXplLngpOw0KLQkJCX0NCi0JCQlyZXR1cm4gbWF4V2lkdGg7DQotCQl9DQotDQotCQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoDQotCQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCQlpbnQgd0hpbnQsDQotCQkJaW50IGhIaW50LA0KLQkJCWJvb2xlYW4gZmx1c2gpIHsNCi0JCQlpbnQgd2lkdGggPSAwOw0KLQkJCWludCBoZWlnaHQgPSAwOw0KLQkJCWludCBjd2lkdGggPSAwOw0KLQkJCWludCBjb2xsYXBzZWRIZWlnaHQgPSAwOw0KLQ0KLQkJCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkNCi0JCQkJd2lkdGggPSB3SGludDsNCi0JCQlpZiAoaEhpbnQgIT0gU1dULkRFRkFVTFQpDQotCQkJCWhlaWdodCA9IGhIaW50Ow0KLQ0KLQkJCWN3aWR0aCA9IHdpZHRoOw0KLQ0KLQkJCWlmIChjbGllbnQgIT0gbnVsbCAmJiAhY2xpZW50LmlzRGlzcG9zZWQoKSkgew0KLQkJCQlpZiAodG9nZ2xlICE9IG51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpICYmIGNvbXBhY3RNb2RlKSB7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCS8vUG9pbnQgY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotCQkJCVBvaW50IGNzaXplID0gY2xpZW50LmNvbXB1dGVTaXplKHdIaW50LCBTV1QuREVGQVVMVCk7DQotCQkJCWlmICh3aWR0aCA9PSAwKSB7DQotCQkJCQl3aWR0aCA9IGNzaXplLng7DQotCQkJCQljd2lkdGggPSB3aWR0aDsNCi0JCQkJfQ0KLQkJCQlpZiAoaGVpZ2h0ID09IDApDQotCQkJCQloZWlnaHQgPSBjc2l6ZS55Ow0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCVBvaW50IHRvZ2dsZVNpemUgPSBudWxsOw0KLQ0KLQkJCWlmIChjb2xsYXBzYWJsZSAmJiB0b2dnbGUgIT0gbnVsbCkNCi0JCQkJdG9nZ2xlU2l6ZSA9DQotCQkJCQl0b2dnbGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotDQotCQkJaWYgKGhIaW50ID09IFNXVC5ERUZBVUxUICYmIGhlYWRlclBhaW50ZWQgJiYgaGVhZGVyICE9IG51bGwpIHsNCi0JCQkJaW50IGh3aWR0aCA9IGN3aWR0aDsNCi0JCQkJaWYgKHRvZ2dsZVNpemUgIT0gbnVsbCkNCi0JCQkJCWh3aWR0aCA9IGN3aWR0aCAtIHRvZ2dsZVNpemUueCAtIDU7DQotCQkJCVBvaW50IGhzaXplID0gaGVhZGVyLmNvbXB1dGVTaXplKGh3aWR0aCwgU1dULkRFRkFVTFQsIGZsdXNoKTsNCi0JCQkJaGVpZ2h0ICs9IGhzaXplLnk7DQotCQkJCWNvbGxhcHNlZEhlaWdodCA9IGhzaXplLnk7DQotCQkJCWhlaWdodCArPSB2c3BhY2luZzsNCi0JCQl9DQotDQotCQkJaWYgKGhIaW50ID09IFNXVC5ERUZBVUxUICYmIGFkZFNlcGFyYXRvcikgew0KLQkJCQloZWlnaHQgKz0gc2VwSGVpZ2h0Ow0KLQkJCQloZWlnaHQgKz0gdnNwYWNpbmc7DQotCQkJCWNvbGxhcHNlZEhlaWdodCArPSB2c3BhY2luZyArIHNlcEhlaWdodDsNCi0JCQl9DQotCQkJaWYgKGhIaW50ID09IFNXVC5ERUZBVUxUDQotCQkJCSYmIGRlc2NyaXB0aW9uUGFpbnRlZA0KLQkJCQkmJiBkZXNjcmlwdGlvbkxhYmVsICE9IG51bGwpIHsNCi0JCQkJUG9pbnQgZHNpemUgPQ0KLQkJCQkJZGVzY3JpcHRpb25MYWJlbC5jb21wdXRlU2l6ZShjd2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotCQkJCWhlaWdodCArPSBkc2l6ZS55Ow0KLQkJCQloZWlnaHQgKz0gdnNwYWNpbmc7DQotCQkJfQ0KLQkJCWlmICh0b2dnbGUgIT0gbnVsbCAmJiB0b2dnbGUuZ2V0U2VsZWN0aW9uKCkpIHsNCi0JCQkJLy8gY29sbGFwc2VkIHN0YXRlDQotCQkJCWhlaWdodCA9IGNvbGxhcHNlZEhlaWdodDsNCi0JCQl9DQotCQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsNCi0JCX0NCi0JCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGZsdXNoKSB7DQotCQkJaW50IHdpZHRoID0gcGFyZW50LmdldENsaWVudEFyZWEoKS53aWR0aDsNCi0JCQlpbnQgaGVpZ2h0ID0gcGFyZW50LmdldENsaWVudEFyZWEoKS5oZWlnaHQ7DQotCQkJaW50IHkgPSAwOw0KLQkJCVBvaW50IHRvZ2dsZVNpemUgPSBudWxsOw0KLQ0KLQkJCWlmIChjb2xsYXBzYWJsZSkgew0KLQkJCQl0b2dnbGVTaXplID0NCi0JCQkJCXRvZ2dsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoKTsNCi0JCQl9DQotCQkJaWYgKGhlYWRlclBhaW50ZWQgJiYgaGVhZGVyICE9IG51bGwpIHsNCi0JCQkJUG9pbnQgaHNpemU7DQotDQotCQkJCWludCBhdmFpbGFibGVXaWR0aCA9IHdpZHRoOw0KLQkJCQlpZiAodG9nZ2xlU2l6ZSAhPSBudWxsKQ0KLQkJCQkJYXZhaWxhYmxlV2lkdGggPSB3aWR0aCAtIHRvZ2dsZVNpemUueCAtIDU7DQotCQkJCWhzaXplID0gaGVhZGVyLmNvbXB1dGVTaXplKGF2YWlsYWJsZVdpZHRoLCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQkJCQlpbnQgaHggPSAwOw0KLQkJCQlpZiAodG9nZ2xlICE9IG51bGwpIHsNCi0JCQkJCWludCB0eSA9IHkgKyBoc2l6ZS55IC0gdG9nZ2xlU2l6ZS55Ow0KLQkJCQkJdG9nZ2xlLnNldEJvdW5kcygwLCB0eSwgdG9nZ2xlU2l6ZS54LCB0b2dnbGVTaXplLnkpOw0KLQkJCQkJaHggPSB0b2dnbGVTaXplLng7IC8vICsgNTsNCi0JCQkJfQ0KLQkJCQloZWFkZXIuc2V0Qm91bmRzKGh4LCB5LCBhdmFpbGFibGVXaWR0aCwgaHNpemUueSk7DQotDQotCQkJCXkgKz0gaHNpemUueSArIHZzcGFjaW5nOw0KLQkJCX0NCi0JCQlpZiAoYWRkU2VwYXJhdG9yICYmIHNlcGFyYXRvciAhPSBudWxsKSB7DQotCQkJCXNlcGFyYXRvci5zZXRCb3VuZHMoMCwgeSwgd2lkdGgsIDIpOw0KLQkJCQl5ICs9IHNlcEhlaWdodCArIHZzcGFjaW5nOw0KLQkJCX0NCi0JCQlpZiAodG9nZ2xlICE9IG51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJaWYgKGRlc2NyaXB0aW9uUGFpbnRlZCAmJiBkZXNjcmlwdGlvbkxhYmVsICE9IG51bGwpIHsNCi0JCQkJUG9pbnQgZHNpemUgPQ0KLQkJCQkJZGVzY3JpcHRpb25MYWJlbC5jb21wdXRlU2l6ZSh3aWR0aCwgU1dULkRFRkFVTFQsIGZsdXNoKTsNCi0JCQkJZGVzY3JpcHRpb25MYWJlbC5zZXRCb3VuZHMoMCwgeSwgd2lkdGgsIGRzaXplLnkpOw0KLQkJCQl5ICs9IGRzaXplLnkgKyB2c3BhY2luZzsNCi0JCQl9DQotCQkJaWYgKGNsaWVudCAhPSBudWxsKSB7DQotCQkJCWNsaWVudC5zZXRCb3VuZHMoMCwgeSwgd2lkdGgsIGhlaWdodCAtIHkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNDb21wYWN0TW9kZSgpIHsNCi0JCXJldHVybiBjb21wYWN0TW9kZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHBhcmFtIGNvbXBhY3RNb2RlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRDb21wYWN0TW9kZShib29sZWFuIGNvbXBhY3RNb2RlKSB7DQotCQl0aGlzLmNvbXBhY3RNb2RlID0gY29tcGFjdE1vZGU7DQotCX0NCi0NCi0JcHVibGljIEZvcm1TZWN0aW9uKCkgew0KLQkJLyoNCi0JCS8vIERlc2NyaXB0aW9uIGNhdXNlcyBwcm9ibGVtcyByZSB3b3JkIHdyYXBwaW5nDQotCQkvLyBhbmQgY2F1c2VzIGJhZCBsYXlvdXQgaW4gc2NoZW1hIGFuZA0KLQkJLy8gZmVhdHVyZSBlZGl0b3JzIHdoZW4gaW4gTW90aWYgLSB0dXJuaW5nIG9mZg0KLQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygibW90aWYiKSkgew0KLQkJCWRlc2NyaXB0aW9uUGFpbnRlZCA9IGZhbHNlOw0KLQkJfQ0KLQkJKi8NCi0JCUpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmFkZExpc3RlbmVyKHRoaXMpOw0KLQl9DQotCXB1YmxpYyB2b2lkIGNvbW1pdENoYW5nZXMoYm9vbGVhbiBvblNhdmUpIHsNCi0JfQ0KLQlwdWJsaWMgYWJzdHJhY3QgQ29tcG9zaXRlIGNyZWF0ZUNsaWVudCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KTsNCi0JcHVibGljIGZpbmFsIENvbnRyb2wgY3JlYXRlQ29udHJvbCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlmaW5hbCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotCQlDb21wb3NpdGUgc2VjdGlvbiA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7DQotCQlTZWN0aW9uTGF5b3V0IHNsYXlvdXQgPSBuZXcgU2VjdGlvbkxheW91dCgpOw0KLQkJc2VjdGlvbi5zZXRMYXlvdXQoc2xheW91dCk7DQotCQlzZWN0aW9uLnNldERhdGEodGhpcyk7DQotDQotCQlpZiAoaGVhZGVyUGFpbnRlZCkgew0KLQkJCUNvbG9yIGhlYWRlckNvbG9yID0gZmFjdG9yeS5nZXRDb2xvcihnZXRIZWFkZXJDb2xvcktleSgpKTsNCi0JCQloZWFkZXIgPQ0KLQkJCQlmYWN0b3J5LmNyZWF0ZUhlYWRpbmdMYWJlbCgNCi0JCQkJCXNlY3Rpb24sDQotCQkJCQlnZXRIZWFkZXJUZXh0KCksDQotCQkJCQloZWFkZXJDb2xvciwNCi0JCQkJCVNXVC5XUkFQKTsNCi0JCQlpZiAoY29sbGFwc2FibGUpIHsNCi0JCQkJdG9nZ2xlID0gbmV3IFRvZ2dsZUNvbnRyb2woc2VjdGlvbiwgU1dULk5VTEwpOw0KLQkJCQl0b2dnbGUuc2V0U2VsZWN0aW9uKGNvbGxhcHNlZCk7DQotCQkJCXRvZ2dsZS5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOw0KLQkJCQl0b2dnbGUuc2V0QWN0aXZlRGVjb3JhdGlvbkNvbG9yKGZhY3RvcnkuZ2V0SHlwZXJsaW5rQ29sb3IoKSk7DQotCQkJCXRvZ2dsZS5zZXREZWNvcmF0aW9uQ29sb3IoDQotCQkJCQlmYWN0b3J5LmdldENvbG9yKA0KLQkJCQkJCUZvcm1XaWRnZXRGYWN0b3J5LkNPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IpKTsNCi0JCQkJdG9nZ2xlLnNldEFjdGl2ZUN1cnNvcihmYWN0b3J5LmdldEh5cGVybGlua0N1cnNvcigpKTsNCi0JCQkJdG9nZ2xlLmFkZEZvY3VzTGlzdGVuZXIoZmFjdG9yeS52aXNpYmlsaXR5SGFuZGxlcik7DQotCQkJCXRvZ2dsZS5hZGRLZXlMaXN0ZW5lcihmYWN0b3J5LmtleWJvYXJkSGFuZGxlcik7DQotCQkJCXRvZ2dsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJCQlkb1RvZ2dsZSgpOw0KLQkJCQkJfQ0KLQkJCQl9KTsNCi0JCQkJaGVhZGVyLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsNCi0JCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsNCi0JCQkJCQl0b2dnbGUuc2V0U2VsZWN0aW9uKCF0b2dnbGUuZ2V0U2VsZWN0aW9uKCkpOw0KLQkJCQkJCXRvZ2dsZS5yZWRyYXcoKTsNCi0JCQkJCQlkb1RvZ2dsZSgpOw0KLQkJCQkJfQ0KLQkJCQl9KTsNCi0JCQkJaGVhZGVyLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0FkYXB0ZXIoKSB7DQotCQkJCQlwdWJsaWMgdm9pZCBtb3VzZUVudGVyKE1vdXNlRXZlbnQgZSkgew0KLQkJCQkJCWhlYWRlci5zZXRDdXJzb3IoZmFjdG9yeS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7DQotCQkJCQl9DQotCQkJCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7DQotCQkJCQkJaGVhZGVyLnNldEN1cnNvcihudWxsKTsNCi0JCQkJCX0NCi0JCQkJfSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGFkZFNlcGFyYXRvcikgew0KLQkJCS8vc2VwYXJhdG9yID0gZmFjdG9yeS5jcmVhdGVTZXBhcmF0b3Ioc2VjdGlvbiwgU1dULkhPUklaT05UQUwpOw0KLQkJCXNlcGFyYXRvciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKHNlY3Rpb24pOw0KLQkJfQ0KLQ0KLQkJaWYgKGRlc2NyaXB0aW9uUGFpbnRlZCAmJiBkZXNjcmlwdGlvbiAhPSBudWxsKSB7DQotCQkJZGVzY3JpcHRpb25MYWJlbCA9DQotCQkJCWZhY3RvcnkuY3JlYXRlTGFiZWwoc2VjdGlvbiwgZGVzY3JpcHRpb24sIFNXVC5XUkFQKTsNCi0JCX0NCi0JCWNsaWVudCA9IGNyZWF0ZUNsaWVudChzZWN0aW9uLCBmYWN0b3J5KTsNCi0JCXNlY3Rpb24uc2V0RGF0YSh0aGlzKTsNCi0JCWNvbnRyb2wgPSBzZWN0aW9uOw0KLQkJcmV0dXJuIHNlY3Rpb247DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGRvVG9nZ2xlKCkgew0KLQkJY29sbGFwc2VkID0gdG9nZ2xlLmdldFNlbGVjdGlvbigpOw0KLQkJcmVmbG93KCk7DQotCQlpZiAoZGVzY3JpcHRpb25MYWJlbCAhPSBudWxsKQ0KLQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0VmlzaWJsZSghY29sbGFwc2VkKTsNCi0JCWlmIChjbGllbnQgIT0gbnVsbCkNCi0JCQljbGllbnQuc2V0VmlzaWJsZSghY29sbGFwc2VkKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsb3coKSB7DQotCQljb250cm9sLnNldFJlZHJhdyhmYWxzZSk7DQotCQljb250cm9sLmdldFBhcmVudCgpLnNldFJlZHJhdyhmYWxzZSk7DQotCQljb250cm9sLmxheW91dCh0cnVlKTsNCi0JCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOw0KLQkJY29udHJvbC5zZXRSZWRyYXcodHJ1ZSk7DQotCQljb250cm9sLmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCVN0cmluZyBsYWJlbCwNCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsNCi0JCXJldHVybiBjcmVhdGVUZXh0KHBhcmVudCwgbGFiZWwsIGZhY3RvcnksIDEpOw0KLQl9DQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJU3RyaW5nIGxhYmVsLA0KLQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSwNCi0JCWludCBzcGFuKSB7DQotCQlmYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgbGFiZWwpOw0KLQkJVGV4dCB0ZXh0ID0gZmFjdG9yeS5jcmVhdGVUZXh0KHBhcmVudCwgIiIpOw0KLQkJaW50IGhmaWxsID0NCi0JCQlzcGFuID09IDENCi0JCQkJPyBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwNCi0JCQkJOiBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7DQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShoZmlsbCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47DQotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOw0KLQkJcmV0dXJuIHRleHQ7DQotCX0NCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgbGFiZWwsDQotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5LA0KLQkJaW50IHNwYW4sDQotCQlpbnQgc3R5bGUpIHsNCi0JCUxhYmVsIGwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgbGFiZWwpOw0KLQkJaWYgKChzdHlsZSAmIFNXVC5NVUxUSSkgIT0gMCkgew0KLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7DQotCQkJbC5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCX0NCi0JCVRleHQgdGV4dCA9IGZhY3RvcnkuY3JlYXRlVGV4dChwYXJlbnQsICIiLCBzdHlsZSk7DQotCQlpbnQgaGZpbGwgPQ0KLQkJCXNwYW4gPT0gMQ0KLQkJCQk/IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTA0KLQkJCQk6IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsNCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGhmaWxsIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsNCi0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnksDQotCQlpbnQgc3Bhbikgew0KLQkJVGV4dCB0ZXh0ID0gZmFjdG9yeS5jcmVhdGVUZXh0KHBhcmVudCwgIiIpOw0KLQkJaW50IGhmaWxsID0NCi0JCQlzcGFuID09IDENCi0JCQkJPyBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwNCi0JCQkJOiBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7DQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShoZmlsbCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7DQotCQkvL2dkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOw0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOw0KLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBkb0dsb2JhbEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBleHBhbmRUbyhPYmplY3Qgb2JqZWN0KSB7DQotCX0NCi0JcHVibGljIGZpbmFsIHZvaWQgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbigNCi0JCWludCBjaGFuZ2VUeXBlLA0KLQkJT2JqZWN0IGNoYW5nZU9iamVjdCkgew0KLQkJaWYgKHNlY3Rpb25NYW5hZ2VyID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJc2VjdGlvbk1hbmFnZXIuZGlzcGF0Y2hOb3RpZmljYXRpb24odGhpcywgY2hhbmdlVHlwZSwgY2hhbmdlT2JqZWN0KTsNCi0JfQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBmaXJlU2VsZWN0aW9uTm90aWZpY2F0aW9uKE9iamVjdCBjaGFuZ2VPYmplY3QpIHsNCi0JCWZpcmVDaGFuZ2VOb3RpZmljYXRpb24oU0VMRUNUSU9OLCBjaGFuZ2VPYmplY3QpOw0KLQl9DQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgew0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uOw0KLQl9DQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhlYWRlckNvbG9yS2V5KCkgew0KLQkJcmV0dXJuIGhlYWRlckNvbG9yS2V5Ow0KLQl9DQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEhlYWRlclRleHQoKSB7DQotCQlyZXR1cm4gaGVhZGVyVGV4dDsNCi0JfQ0KLQlwdWJsaWMgaW50IGdldEhlaWdodEhpbnQoKSB7DQotCQlyZXR1cm4gaGVpZ2h0SGludDsNCi0JfQ0KLQlwdWJsaWMgaW50IGdldFdpZHRoSGludCgpIHsNCi0JCXJldHVybiB3aWR0aEhpbnQ7DQotCX0NCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgaW5wdXQpIHsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkZFNlcGFyYXRvcigpIHsNCi0JCXJldHVybiBhZGRTZXBhcmF0b3I7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gaXNEZXNjcmlwdGlvblBhaW50ZWQoKSB7DQotCQlyZXR1cm4gZGVzY3JpcHRpb25QYWludGVkOw0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7DQotCQlyZXR1cm4gZGlydHk7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gaXNIZWFkZXJQYWludGVkKCkgew0KLQkJcmV0dXJuIGhlYWRlclBhaW50ZWQ7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsNCi0JCXJldHVybiByZWFkT25seTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZWN0aW9uQ2hhbmdlZCgNCi0JCUZvcm1TZWN0aW9uIHNvdXJjZSwNCi0JCWludCBjaGFuZ2VUeXBlLA0KLQkJT2JqZWN0IGNoYW5nZU9iamVjdCkgew0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEFkZFNlcGFyYXRvcihib29sZWFuIG5ld0FkZFNlcGFyYXRvcikgew0KLQkJYWRkU2VwYXJhdG9yID0gbmV3QWRkU2VwYXJhdG9yOw0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIHRyaW1OZXdMaW5lcyhTdHJpbmcgdGV4dCkgew0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgew0KLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOw0KLQkJCWlmIChjID09ICdcbicpDQotCQkJCWJ1ZmYuYXBwZW5kKCcgJyk7DQotCQkJZWxzZQ0KLQkJCQlidWZmLmFwcGVuZChjKTsNCi0JCX0NCi0JCXJldHVybiBidWZmLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZyBuZXdEZXNjcmlwdGlvbikgew0KLQkJLy8gd2Ugd2lsbCB0cmltIHRoZSBuZXcgbGluZXMgc28gdGhhdCB3ZSBjYW4NCi0JCS8vIHVzZSBsYXlvdXQtYmFzZWQgd29yZCB3cmFwcGluZyBpbnN0ZWFkDQotCQkvLyBvZiBoYXJkLWNvZGVkIG9uZQ0KLQkJZGVzY3JpcHRpb24gPSB0cmltTmV3TGluZXMobmV3RGVzY3JpcHRpb24pOw0KLQkJLy9kZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOw0KLQkJaWYgKGRlc2NyaXB0aW9uTGFiZWwgIT0gbnVsbCkNCi0JCQlkZXNjcmlwdGlvbkxhYmVsLnNldFRleHQobmV3RGVzY3JpcHRpb24pOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uUGFpbnRlZChib29sZWFuIG5ld0Rlc2NyaXB0aW9uUGFpbnRlZCkgew0KLQkJZGVzY3JpcHRpb25QYWludGVkID0gbmV3RGVzY3JpcHRpb25QYWludGVkOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gbmV3RGlydHkpIHsNCi0JCWRpcnR5ID0gbmV3RGlydHk7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7DQotCQlpZiAodG9nZ2xlICE9IG51bGwpDQotCQkJdG9nZ2xlLnNldEZvY3VzKCk7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SGVhZGVyQ29sb3JLZXkoamF2YS5sYW5nLlN0cmluZyBuZXdIZWFkZXJDb2xvcktleSkgew0KLQkJaGVhZGVyQ29sb3JLZXkgPSBuZXdIZWFkZXJDb2xvcktleTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkZXJQYWludGVkKGJvb2xlYW4gbmV3SGVhZGVyUGFpbnRlZCkgew0KLQkJaGVhZGVyUGFpbnRlZCA9IG5ld0hlYWRlclBhaW50ZWQ7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SGVhZGVyVGV4dChqYXZhLmxhbmcuU3RyaW5nIG5ld0hlYWRlclRleHQpIHsNCi0JCWhlYWRlclRleHQgPSBuZXdIZWFkZXJUZXh0Ow0KLQkJaWYgKGhlYWRlciAhPSBudWxsKQ0KLQkJCWhlYWRlci5zZXRUZXh0KGhlYWRlclRleHQpOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEhlaWdodEhpbnQoaW50IG5ld0hlaWdodEhpbnQpIHsNCi0JCWhlaWdodEhpbnQgPSBuZXdIZWlnaHRIaW50Ow0KLQl9DQotCXZvaWQgc2V0TWFuYWdlcihTZWN0aW9uQ2hhbmdlTWFuYWdlciBtYW5hZ2VyKSB7DQotCQl0aGlzLnNlY3Rpb25NYW5hZ2VyID0gbWFuYWdlcjsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIG5ld1JlYWRPbmx5KSB7DQotCQlyZWFkT25seSA9IG5ld1JlYWRPbmx5Ow0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFdpZHRoSGludChpbnQgbmV3V2lkdGhIaW50KSB7DQotCQl3aWR0aEhpbnQgPSBuZXdXaWR0aEhpbnQ7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgew0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgYXJnMCkgew0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiBoZWFkZXIgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkgJiYgIWhlYWRlci5pc0Rpc3Bvc2VkKCkpIHsNCi0JCQloZWFkZXIuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOw0KLQkJCWNvbnRyb2wubGF5b3V0KHRydWUpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBjb2xsYXBzYWJsZS4NCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29sbGFwc2FibGUoKSB7DQotCQlyZXR1cm4gY29sbGFwc2FibGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGNvbGxhcHNhYmxlLg0KLQkgKiBAcGFyYW0gY29sbGFwc2FibGUgVGhlIGNvbGxhcHNhYmxlIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Q29sbGFwc2FibGUoYm9vbGVhbiBjb2xsYXBzYWJsZSkgew0KLQkJdGhpcy5jb2xsYXBzYWJsZSA9IGNvbGxhcHNhYmxlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldENvbGxhcHNlZChib29sZWFuIGNvbGxhcHNlZCkgew0KLQkJdGhpcy5jb2xsYXBzZWQgPSBjb2xsYXBzZWQ7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzQ29sbGFwc2VkKCkgew0KLQkJcmV0dXJuIGNvbGxhcHNlZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYXN0ZShDbGlwYm9hcmQgY2xpcGJvYXJkKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybVdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiOWNkNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybVdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmUuRm9ybUVuZ2luZTsNCi0NCi1wdWJsaWMgY2xhc3MgRm9ybVdpZGdldEZhY3Rvcnkgew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRFJBV19CT1JERVIgPSAiRm9ybVdpZGdldEZhY3RvcnkuZHJhd0JvcmRlciI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVfQk9SREVSID0gInRyZWVCb3JkZXIiOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0hFQURFUl9DT0xPUiA9ICJfX2RlZmF1bHRfX2hlYWRlcl9fIjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQk9SREVSID0gIl9fYm9yZGVyIjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQ09NUE9TSVRFX1NFUEFSQVRPUiA9ICJfX2NvbXBTZXAiOw0KLQ0KLQlwcml2YXRlIEhhc2h0YWJsZSBjb2xvclJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZSgpOw0KLQlwcml2YXRlIENvbG9yIGJhY2tncm91bmRDb2xvcjsNCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBkZWxldGVMaXN0ZW5lcjsNCi0JcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kQ29sb3I7DQotCXByaXZhdGUgRGlzcGxheSBkaXNwbGF5Ow0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1JERVJfU1RZTEUgPSBTV1QuTk9ORTsgLy9TV1QuQk9SREVSOw0KLQlwcml2YXRlIEJvcmRlclBhaW50ZXIgYm9yZGVyUGFpbnRlcjsNCi0JcHJpdmF0ZSBDb2xvciBib3JkZXJDb2xvcjsNCi0JcHJpdmF0ZSBIeXBlcmxpbmtIYW5kbGVyIGh5cGVybGlua0hhbmRsZXI7DQotCS8qIGRlZmF1bHQgKi8gVmlzaWJpbGl0eUhhbmRsZXIgdmlzaWJpbGl0eUhhbmRsZXI7DQotCS8qIGRlZmF1bHQgKi8gS2V5Ym9hcmRIYW5kbGVyIGtleWJvYXJkSGFuZGxlcjsNCi0NCi0JY2xhc3MgQm9yZGVyUGFpbnRlciBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIgew0KLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsNCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZXZlbnQud2lkZ2V0Ow0KLQkJCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCi0JCQkJQ29udHJvbCBjID0gY2hpbGRyZW5baV07DQotCQkJCWJvb2xlYW4gaW5hY3RpdmVCb3JkZXI9ZmFsc2U7DQotCQkJCWlmIChjLmdldEVuYWJsZWQoKSA9PSBmYWxzZSAmJiAhKGMgaW5zdGFuY2VvZiBDQ29tYm8pKQ0KLQkJCQkJY29udGludWU7DQotCQkJCWlmIChjIGluc3RhbmNlb2YgU2VsZWN0YWJsZUZvcm1MYWJlbCkNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQlPYmplY3QgZmxhZyA9IGMuZ2V0RGF0YShLRVlfRFJBV19CT1JERVIpOw0KLQkJCQlpZiAoZmxhZyE9bnVsbCkgew0KLQkJCQkJaWYgKGZsYWcuZXF1YWxzKEJvb2xlYW4uRkFMU0UpKSBjb250aW51ZTsNCi0JCQkJCWlmIChmbGFnLmVxdWFscyhUUkVFX0JPUkRFUikpIGluYWN0aXZlQm9yZGVyPXRydWU7DQotCQkJCX0NCi0JCQkJIA0KLQkJCQlpZiAoIWluYWN0aXZlQm9yZGVyICYmIChjIGluc3RhbmNlb2YgVGV4dCB8fCBjIGluc3RhbmNlb2YgQ2FudmFzIHx8IGMgaW5zdGFuY2VvZiBDQ29tYm8pKSB7DQotCQkJCQlSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7DQotCQkJCQlHQyBnYyA9IGV2ZW50LmdjOw0KLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChjLmdldEJhY2tncm91bmQoKSk7DQotCQkJCQlnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDEsIGIueSAtIDEsIGIud2lkdGggKyAxLCBiLmhlaWdodCArIDEpOw0KLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJCQkJaWYgKGMgaW5zdGFuY2VvZiBDQ29tYm8pDQotCQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsNCi0JCQkJCWVsc2UgDQotCQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAyLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAzKTsNCi0JCQkJfSBlbHNlIGlmIChpbmFjdGl2ZUJvcmRlciB8fGMgaW5zdGFuY2VvZiBUYWJsZSB8fCBjIGluc3RhbmNlb2YgVHJlZSB8fCBjIGluc3RhbmNlb2YgVGFibGVUcmVlKSB7DQotCQkJCQlSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7DQotCQkJCQlHQyBnYyA9IGV2ZW50LmdjOw0KLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChib3JkZXJDb2xvcik7DQotCQkJCQkvL2djLmRyYXdSZWN0YW5nbGUoYi54IC0gMiwgYi55IC0gMiwgYi53aWR0aCArIDMsIGIuaGVpZ2h0ICsgMyk7DQotCQkJCQlnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDEsIGIueSAtIDEsIGIud2lkdGggKyAyLCBiLmhlaWdodCArIDIpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCWNsYXNzIFZpc2liaWxpdHlIYW5kbGVyIGV4dGVuZHMgRm9jdXNBZGFwdGVyIHsNCi0JCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgew0KLQkJCVdpZGdldCB3ID0gZS53aWRnZXQ7DQotCQkJaWYgKHcgaW5zdGFuY2VvZiBDb250cm9sKSB7DQotCQkJCWVuc3VyZVZpc2libGUoKENvbnRyb2wpIHcpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQljbGFzcyBLZXlib2FyZEhhbmRsZXIgZXh0ZW5kcyBLZXlBZGFwdGVyIHsNCi0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgew0KLQkJCVdpZGdldCB3ID0gZS53aWRnZXQ7DQotCQkJaWYgKHcgaW5zdGFuY2VvZiBDb250cm9sKSB7DQotCQkJCXByb2Nlc3NLZXkoZS5rZXlDb2RlLCAoQ29udHJvbCkgdyk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBGb3JtV2lkZ2V0RmFjdG9yeSgpIHsNCi0JCXRoaXMoRGlzcGxheS5nZXRDdXJyZW50KCkpOw0KLQl9DQotDQotCXB1YmxpYyBGb3JtV2lkZ2V0RmFjdG9yeShEaXNwbGF5IGRpc3BsYXkpIHsNCi0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7DQotCQlpbml0aWFsaXplKCk7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBTY3JvbGxlZENvbXBvc2l0ZSBnZXRTY3JvbGxlZENvbXBvc2l0ZShDb250cm9sIGMpIHsNCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBjLmdldFBhcmVudCgpOw0KLQ0KLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7DQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7DQotCQkJCXJldHVybiAoU2Nyb2xsZWRDb21wb3NpdGUpIHBhcmVudDsNCi0JCQl9DQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZVZpc2libGUoQ29udHJvbCBjKSB7DQotCQlTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCA9IGdldFNjcm9sbGVkQ29tcG9zaXRlKGMpOw0KLQkJaWYgKHNjb21wICE9IG51bGwpIHsNCi0JCQlBYnN0cmFjdFNlY3Rpb25Gb3JtLmVuc3VyZVZpc2libGUoc2NvbXAsIGMpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzS2V5KGludCBrZXlDb2RlLCBDb250cm9sIGMpIHsNCi0JCVNjcm9sbGVkQ29tcG9zaXRlIHNjb21wID0gZ2V0U2Nyb2xsZWRDb21wb3NpdGUoYyk7DQotCQlpZiAoc2NvbXAgIT0gbnVsbCkgew0KLQkJCXN3aXRjaCAoa2V5Q29kZSkgew0KLQkJCQljYXNlIFNXVC5BUlJPV19ET1dOIDoNCi0JCQkJCUFic3RyYWN0U2VjdGlvbkZvcm0uc2Nyb2xsVmVydGljYWwoc2NvbXAsIGZhbHNlKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFNXVC5BUlJPV19VUCA6DQotCQkJCQlBYnN0cmFjdFNlY3Rpb25Gb3JtLnNjcm9sbFZlcnRpY2FsKHNjb21wLCB0cnVlKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFNXVC5BUlJPV19MRUZUIDoNCi0JCQkJCUFic3RyYWN0U2VjdGlvbkZvcm0uc2Nyb2xsSG9yaXpvbnRhbChzY29tcCwgdHJ1ZSk7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBTV1QuQVJST1dfUklHSFQgOg0KLQkJCQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5zY3JvbGxIb3Jpem9udGFsKHNjb21wLCBmYWxzZSk7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBTV1QuUEFHRV9VUCA6DQotCQkJCQlBYnN0cmFjdFNlY3Rpb25Gb3JtLnNjcm9sbFBhZ2Uoc2NvbXAsIHRydWUpOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgU1dULlBBR0VfRE9XTiA6DQotCQkJCQlBYnN0cmFjdFNlY3Rpb25Gb3JtLnNjcm9sbFBhZ2Uoc2NvbXAsIGZhbHNlKTsNCi0JCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7DQotCQlpbnQgZmxhdFN0eWxlID0gQk9SREVSX1NUWUxFID09IFNXVC5CT1JERVIgPyBTV1QuTlVMTCA6IFNXVC5GTEFUOw0KLQkJLy9pbnQgZmxhdFN0eWxlID0gU1dULk5VTEw7DQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlKTsNCi0JCWJ1dHRvbi5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQlidXR0b24uc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJaWYgKHRleHQgIT0gbnVsbCkNCi0JCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsNCi0JCWJ1dHRvbi5hZGRGb2N1c0xpc3RlbmVyKHZpc2liaWxpdHlIYW5kbGVyKTsNCi0JCXJldHVybiBidXR0b247DQotCX0NCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsNCi0JfQ0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgc3R5bGUpOw0KLQkJY29tcG9zaXRlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCWNvbXBvc2l0ZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZSkgew0KLQkJCQkoKENvbnRyb2wpIGUud2lkZ2V0KS5zZXRGb2N1cygpOw0KLQkJCX0NCi0JCX0pOw0KLQkJY29tcG9zaXRlLnNldE1lbnUocGFyZW50LmdldE1lbnUoKSk7DQotCQlyZXR1cm4gY29tcG9zaXRlOw0KLQl9DQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLQkJY29tcG9zaXRlLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsNCi0JCQkJaWYgKGNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsNCi0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbXBvc2l0ZS5nZXRCb3VuZHMoKTsNCi0JCQkJR0MgZ2MgPSBlLmdjOw0KLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGdldENvbG9yKENPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IpKTsNCi0JCQkJZ2Muc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kQ29sb3IoKSk7DQotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIGZhbHNlKTsJDQotCQkJfQ0KLQkJfSk7DQotCQlyZXR1cm4gY29tcG9zaXRlOw0KLQl9DQotDQotCXB1YmxpYyBMYWJlbCBjcmVhdGVIZWFkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsNCi0JCXJldHVybiBjcmVhdGVIZWFkaW5nTGFiZWwocGFyZW50LCB0ZXh0LCBudWxsLCBTV1QuTk9ORSk7DQotCX0NCi0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7DQotCQlyZXR1cm4gY3JlYXRlSGVhZGluZ0xhYmVsKHBhcmVudCwgdGV4dCwgbnVsbCwgc3R5bGUpOw0KLQl9DQotDQotCXB1YmxpYyBMYWJlbCBjcmVhdGVIZWFkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIENvbG9yIGJnKSB7DQotCQlyZXR1cm4gY3JlYXRlSGVhZGluZ0xhYmVsKHBhcmVudCwgdGV4dCwgYmcsIFNXVC5OT05FKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGFiZWwgY3JlYXRlSGVhZGluZ0xhYmVsKA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCVN0cmluZyB0ZXh0LA0KLQkJQ29sb3IgYmcsDQotCQlpbnQgc3R5bGUpIHsNCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUpOw0KLQkJaWYgKHRleHQgIT0gbnVsbCkNCi0JCQlsYWJlbC5zZXRUZXh0KHRleHQpOw0KLQkJbGFiZWwuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOw0KLQkJbGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJbGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoSkZhY2VSZXNvdXJjZXMuQkFOTkVSX0ZPTlQpKTsNCi0JCXJldHVybiBsYWJlbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGFiZWwgY3JlYXRlSHlwZXJsaW5rTGFiZWwoDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJU3RyaW5nIHRleHQsDQotCQlJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCXJldHVybiBjcmVhdGVIeXBlcmxpbmtMYWJlbChwYXJlbnQsIHRleHQsIGxpc3RlbmVyLCBTV1QuTlVMTCk7DQotCX0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUh5cGVybGlua0xhYmVsKA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCVN0cmluZyB0ZXh0LA0KLQkJSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyLA0KLQkJaW50IHN0eWxlKSB7DQotCQlMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgc3R5bGUpOw0KLQkJdHVybkludG9IeXBlcmxpbmsobGFiZWwsIGxpc3RlbmVyKTsNCi0JCXJldHVybiBsYWJlbDsNCi0JfQ0KLQlwdWJsaWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsNCi0JCXJldHVybiBjcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5OT05FKTsNCi0JfQ0KLQlwdWJsaWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgew0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBzdHlsZSk7DQotCQlpZiAodGV4dCAhPSBudWxsKQ0KLQkJCWxhYmVsLnNldFRleHQodGV4dCk7DQotCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7DQotCQlyZXR1cm4gbGFiZWw7DQotCX0NCi0NCi0JcHVibGljIFNlbGVjdGFibGVGb3JtTGFiZWwgY3JlYXRlU2VsZWN0YWJsZUxhYmVsKA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCVN0cmluZyB0ZXh0KSB7DQotCQlyZXR1cm4gY3JlYXRlU2VsZWN0YWJsZUxhYmVsKHBhcmVudCwgdGV4dCwgU1dULk5PTkUpOw0KLQl9DQotDQotCXB1YmxpYyBTZWxlY3RhYmxlRm9ybUxhYmVsIGNyZWF0ZVNlbGVjdGFibGVMYWJlbCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgdGV4dCwNCi0JCWludCBzdHlsZSkgew0KLQkJU2VsZWN0YWJsZUZvcm1MYWJlbCBsYWJlbCA9IG5ldyBTZWxlY3RhYmxlRm9ybUxhYmVsKHBhcmVudCwgc3R5bGUpOw0KLQkJaWYgKHRleHQgIT0gbnVsbCkNCi0JCQlsYWJlbC5zZXRUZXh0KHRleHQpOw0KLQkJbGFiZWwuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOw0KLQkJbGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJbGFiZWwuYWRkRm9jdXNMaXN0ZW5lcih2aXNpYmlsaXR5SGFuZGxlcik7DQotCQlsYWJlbC5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOw0KLQkJcmV0dXJuIGxhYmVsOw0KLQl9DQotDQotCXB1YmxpYyBGb3JtRW5naW5lIGNyZWF0ZUZvcm1FbmdpbmUoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJcmV0dXJuIGNyZWF0ZUZvcm1FbmdpbmUocGFyZW50LCBmYWxzZSk7DQotCX0NCi0JDQotCXB1YmxpYyBGb3JtRW5naW5lIGNyZWF0ZUZvcm1FbmdpbmUoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiB0cmFja0ZvY3VzKSB7DQotCQlGb3JtRW5naW5lIGVuZ2luZSA9IG5ldyBGb3JtRW5naW5lKHBhcmVudCwgU1dULldSQVApOw0KLQkJZW5naW5lLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCWVuZ2luZS5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7DQotCQllbmdpbmUubWFyZ2luV2lkdGggPSAxOw0KLQkJZW5naW5lLm1hcmdpbkhlaWdodCA9IDA7DQotCQllbmdpbmUuc2V0SHlwZXJsaW5rU2V0dGluZ3MoZ2V0SHlwZXJsaW5rSGFuZGxlcigpKTsNCi0JCWlmICh0cmFja0ZvY3VzKSBlbmdpbmUuYWRkRm9jdXNMaXN0ZW5lcih2aXNpYmlsaXR5SGFuZGxlcik7DQotCQllbmdpbmUuYWRkS2V5TGlzdGVuZXIoa2V5Ym9hcmRIYW5kbGVyKTsNCi0JCWVuZ2luZS5zZXRNZW51KHBhcmVudC5nZXRNZW51KCkpOw0KLQkJcmV0dXJuIGVuZ2luZTsNCi0JfQ0KLQkNCi0JcHVibGljIExhYmVsIGNyZWF0ZVNlcGFyYXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IHN0eWxlKTsNCi0JCWxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCWxhYmVsLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IpOw0KLQkJcmV0dXJuIGxhYmVsOw0KLQl9DQotCXB1YmxpYyBUYWJsZSBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgQk9SREVSX1NUWUxFIHwgc3R5bGUpOw0KLQkJdGFibGUuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOw0KLQkJdGFibGUuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJaG9va0RlbGV0ZUxpc3RlbmVyKHRhYmxlKTsNCi0JCXJldHVybiB0YWJsZTsNCi0JfQ0KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB2YWx1ZSkgew0KLQkJcmV0dXJuIGNyZWF0ZVRleHQocGFyZW50LCB2YWx1ZSwgQk9SREVSX1NUWUxFIHwgU1dULlNJTkdMRSk7DQotCX0NCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdmFsdWUsIGludCBzdHlsZSkgew0KLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBzdHlsZSk7DQotCQlpZiAodmFsdWUgIT0gbnVsbCkNCi0JCQl0ZXh0LnNldFRleHQodmFsdWUpOw0KLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQl0ZXh0LnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCXRleHQuYWRkRm9jdXNMaXN0ZW5lcih2aXNpYmlsaXR5SGFuZGxlcik7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQlwdWJsaWMgVHJlZSBjcmVhdGVUcmVlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgew0KLQkJVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LCBCT1JERVJfU1RZTEUgfCBzdHlsZSk7DQotCQl0cmVlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCXRyZWUuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJaG9va0RlbGV0ZUxpc3RlbmVyKHRyZWUpOw0KLQkJcmV0dXJuIHRyZWU7DQotCX0NCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUtleVByZXNzZWQoV2lkZ2V0IHdpZGdldCkgew0KLQkJaWYgKCEod2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCkpDQotCQkJcmV0dXJuOw0KLQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHdpZGdldDsNCi0JCWZvciAoQ29udHJvbCBwYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpOw0KLQkJCXBhcmVudCAhPSBudWxsOw0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkgew0KLQkJCWlmIChwYXJlbnQuZ2V0RGF0YSgpIGluc3RhbmNlb2YgRm9ybVNlY3Rpb24pIHsNCi0JCQkJRm9ybVNlY3Rpb24gc2VjdGlvbiA9IChGb3JtU2VjdGlvbikgcGFyZW50LmdldERhdGEoKTsNCi0JCQkJc2VjdGlvbi5kb0dsb2JhbEFjdGlvbihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlFbnVtZXJhdGlvbiBjb2xvcnMgPSBjb2xvclJlZ2lzdHJ5LmVsZW1lbnRzKCk7DQotCQl3aGlsZSAoY29sb3JzLmhhc01vcmVFbGVtZW50cygpKSB7DQotCQkJQ29sb3IgYyA9IChDb2xvcikgY29sb3JzLm5leHRFbGVtZW50KCk7DQotCQkJYy5kaXNwb3NlKCk7DQotCQl9DQotCQloeXBlcmxpbmtIYW5kbGVyLmRpc3Bvc2UoKTsNCi0JCWNvbG9yUmVnaXN0cnkgPSBudWxsOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7DQotCQlyZXR1cm4gYmFja2dyb3VuZENvbG9yOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRCb3JkZXJDb2xvcigpIHsNCi0JCXJldHVybiBib3JkZXJDb2xvcjsNCi0JfQ0KLQlwdWJsaWMgQ3Vyc29yIGdldEJ1c3lDdXJzb3IoKSB7DQotCQlyZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRCdXN5Q3Vyc29yKCk7DQotCX0NCi0JcHVibGljIENvbG9yIGdldENvbG9yKFN0cmluZyBrZXkpIHsNCi0JCXJldHVybiAoQ29sb3IpIGNvbG9yUmVnaXN0cnkuZ2V0KGtleSk7DQotCX0NCi0JcHVibGljIENvbG9yIGdldEZvcmVncm91bmRDb2xvcigpIHsNCi0JCXJldHVybiBmb3JlZ3JvdW5kQ29sb3I7DQotCX0NCi0JcHVibGljIEh5cGVybGlua0hhbmRsZXIgZ2V0SHlwZXJsaW5rSGFuZGxlcigpIHsNCi0JCXJldHVybiBoeXBlcmxpbmtIYW5kbGVyOw0KLQl9DQotCXB1YmxpYyBDdXJzb3IgZ2V0SHlwZXJsaW5rQ3Vyc29yKCkgew0KLQkJcmV0dXJuIGh5cGVybGlua0hhbmRsZXIuZ2V0SHlwZXJsaW5rQ3Vyc29yKCk7DQotCX0NCi0JcHVibGljIENvbG9yIGdldEh5cGVybGlua0NvbG9yKCkgew0KLQkJcmV0dXJuIGh5cGVybGlua0hhbmRsZXIuZ2V0Rm9yZWdyb3VuZCgpOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRIeXBlcmxpbmtIb3ZlckNvbG9yKCkgew0KLQkJcmV0dXJuIGh5cGVybGlua0hhbmRsZXIuZ2V0QWN0aXZlRm9yZWdyb3VuZCgpOw0KLQl9DQotCXB1YmxpYyBpbnQgZ2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSgpIHsNCi0JCXJldHVybiBoeXBlcmxpbmtIYW5kbGVyLmdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBob29rRGVsZXRlTGlzdGVuZXIoQ29udHJvbCBjb250cm9sKSB7DQotCQlpZiAoZGVsZXRlTGlzdGVuZXIgPT0gbnVsbCkgew0KLQkJCWRlbGV0ZUxpc3RlbmVyID0gbmV3IEtleUFkYXB0ZXIoKSB7DQotCQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsNCi0JCQkJCWlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkRFTCAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMCkgew0KLQkJCQkJCWRlbGV0ZUtleVByZXNzZWQoZXZlbnQud2lkZ2V0KTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX07DQotCQl9DQotCQljb250cm9sLmFkZEtleUxpc3RlbmVyKGRlbGV0ZUxpc3RlbmVyKTsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsNCi0JCWJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7DQotCQlyZWdpc3RlckNvbG9yKENPTE9SX0JPUkRFUiwgMTk1LCAxOTEsIDE3OSk7DQotCQlyZWdpc3RlckNvbG9yKENPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IsIDE1MiwgMTcwLCAyMDMpOw0KLQkJcmVnaXN0ZXJDb2xvcihERUZBVUxUX0hFQURFUl9DT0xPUiwgMHg0OCwgMHg3MCwgMHg5OCk7DQotCQlpZiAoaXNXaGl0ZUJhY2tncm91bmQoKSkNCi0JCQlib3JkZXJDb2xvciA9IGdldENvbG9yKENPTE9SX0JPUkRFUik7DQotCQllbHNlDQotCQkJYm9yZGVyQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCk7DQotCQlmb3JlZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOw0KLQkJaHlwZXJsaW5rSGFuZGxlciA9IG5ldyBIeXBlcmxpbmtIYW5kbGVyKCk7DQotCQloeXBlcmxpbmtIYW5kbGVyLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCXVwZGF0ZUh5cGVybGlua0NvbG9ycygpOw0KLQkJdmlzaWJpbGl0eUhhbmRsZXIgPSBuZXcgVmlzaWJpbGl0eUhhbmRsZXIoKTsNCi0JCWtleWJvYXJkSGFuZGxlciA9IG5ldyBLZXlib2FyZEhhbmRsZXIoKTsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZUJhY2tncm91bmQoKSB7DQotCQlyZXR1cm4gYmFja2dyb3VuZENvbG9yLmdldFJlZCgpPT0yNTUgJiYgYmFja2dyb3VuZENvbG9yLmdldEdyZWVuKCk9PTI1NSAmJg0KLQkJCWJhY2tncm91bmRDb2xvci5nZXRCbHVlKCk9PTI1NTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB1cGRhdGVIeXBlcmxpbmtDb2xvcnMoKSB7DQotCQlDb2xvciBoeXBlcmxpbmtDb2xvciA9IEpGYWNlQ29sb3JzLmdldEh5cGVybGlua1RleHQoZGlzcGxheSk7DQotCQlDb2xvciBhY3RpdmVIeXBlcmxpbmtDb2xvciA9IEpGYWNlQ29sb3JzLmdldEFjdGl2ZUh5cGVybGlua1RleHQoZGlzcGxheSk7DQotCQloeXBlcmxpbmtIYW5kbGVyLnNldEZvcmVncm91bmQoaHlwZXJsaW5rQ29sb3IpOw0KLQkJaHlwZXJsaW5rSGFuZGxlci5zZXRBY3RpdmVGb3JlZ3JvdW5kKGFjdGl2ZUh5cGVybGlua0NvbG9yKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBwYWludEJvcmRlcnNGb3IoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJaWYgKEJPUkRFUl9TVFlMRSA9PSBTV1QuQk9SREVSKQ0KLQkJCXJldHVybjsNCi0JCWlmIChib3JkZXJQYWludGVyID09IG51bGwpDQotCQkJYm9yZGVyUGFpbnRlciA9IG5ldyBCb3JkZXJQYWludGVyKCk7DQotCQlwYXJlbnQuYWRkUGFpbnRMaXN0ZW5lcihib3JkZXJQYWludGVyKTsNCi0JfQ0KLQlwdWJsaWMgQ29sb3IgcmVnaXN0ZXJDb2xvcihTdHJpbmcga2V5LCBpbnQgciwgaW50IGcsIGludCBiKSB7DQotCQlDb2xvciBjID0gbmV3IENvbG9yKGRpc3BsYXksIHIsIGcsIGIpOw0KLQkJY29sb3JSZWdpc3RyeS5wdXQoa2V5LCBjKTsNCi0JCXJldHVybiBjOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBjb2xvcikgew0KLQkJYmFja2dyb3VuZENvbG9yID0gY29sb3I7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQ29sb3IoQ29sb3IgY29sb3IpIHsNCi0JCWh5cGVybGlua0hhbmRsZXIuc2V0Rm9yZWdyb3VuZChjb2xvcik7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rSG92ZXJDb2xvcihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgaG92ZXJDb2xvcikgew0KLQkJaHlwZXJsaW5rSGFuZGxlci5zZXRBY3RpdmVGb3JlZ3JvdW5kKGhvdmVyQ29sb3IpOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1VuZGVybGluZU1vZGUoaW50IG5ld0h5cGVybGlua1VuZGVybGluZU1vZGUpIHsNCi0JCWh5cGVybGlua0hhbmRsZXIuc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZShuZXdIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCB0dXJuSW50b0h5cGVybGluayhDb250cm9sIGNvbnRyb2wsIElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJaHlwZXJsaW5rSGFuZGxlci5yZWdpc3Rlckh5cGVybGluayhjb250cm9sLCBsaXN0ZW5lcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1zUGx1Z2luLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybXNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0ODA5My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybXNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBGb3Jtc1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIEZvcm1zUGx1Z2luIGluc3RhbmNlOwotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRm9ybXNQbHVnaW4uCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgRm9ybXNQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcihkZXNjcmlwdG9yKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPQotCQkJCVJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgKLQkJCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5Gb3Jtc1BsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlGb3Jtc1BsdWdpbiBpbnN0ID0gRm9ybXNQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlpZiAoaW5zdD09bnVsbCkgcmV0dXJuIGtleTsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gRm9ybXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgdGV4dCA9IGdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwgYXJncyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkTWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQkJcmV0dXJuIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZXh0LCBuZXcgT2JqZWN0W10geyBhcmcgfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRm9ybXNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5pbnRlcm5hbEdldEFjdGl2ZVBhZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGludGVybmFsR2V0QWN0aXZlUGFnZSgpIHsKLQkJcmV0dXJuIGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkgewotCQlyZXR1cm4gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQlsb2dFeGNlcHRpb24oZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSwgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQllID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQkJbWVzc2FnZSA9IGUudG9TdHJpbmcoKTsKLQkJCXN0YXR1cyA9Ci0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJZ2V0UGx1Z2luSWQoKSwKLQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJbWVzc2FnZSwKLQkJCQkJZSk7Ci0JCX0KLQkJbG9nKHN0YXR1cywgc2hvd0Vycm9yRGlhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgewotCQlpZiAoc2hvd0Vycm9yRGlhbG9nKQotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQludWxsLAotCQkJCXN0YXR1cyk7Ci0JCVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIikuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3Jtc1BsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1zUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNDVlMDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1zUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Gb3JtRWdpbmUubGlua1BvcHVwLm9wZW4gPSAmT3BlbgotRm9ybUVnaW5lLmxpbmtQb3B1cC5jb3B5U2hvcnRjdXQgPSAmQ29weSBhcyBTaG9ydGN1dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IVE1MVGFibGVMYXlvdXQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IVE1MVGFibGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkMjEyNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSFRNTFRhYmxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi0NCi0vKioNCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsYXlvdXQgYWxnb3JpdGhtIGF0dGVtcHRzIHRvIHBvc2l0aW9uIGNvbnRyb2xzIGluDQotICogdGhlIGNvbXBvc2l0ZSB1c2luZyBhIHR3by1wYXNzIGF1dG9sYXlvdXQgSFRNTCB0YWJsZSBhbHRvcml0aG0gcmVjb21tZWRlZCBieQ0KLSAqIEhUTUwgNC4wMSBXM0Mgc3BlY2lmaWNhdGlvbi4gVGhlIG1haW4gZGlmZmVyZW5jZXMgd2l0aCBHcmlkTGF5b3V0IGlzIHRoYXQgaXQNCi0gKiBoYXMgdHdvIHBhc3NlcyBhbmQgdGhhdCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBub3QgY2FsY3VsYXRlZCBpbiB0aGUgc2FtZQ0KLSAqIHBhc3MuDQotICogPHA+DQotICogVGhlIGFkdmFudGFnZSBvZiB0aGUgYWxnb3JpdGhtIG92ZXIgR3JpZExheW91dCBpcyB0aGF0IGl0IGlzIGNhcGFibGUgb2YNCi0gKiBmbG93aW5nIHRleHQgY29udHJvbHMgY2FwYWJsZSBvZiBsaW5lIHdyYXAuIFRoZXNlIGNvbnRyb2xzIGRvIG5vdCBoYXZlDQotICogbmF0dXJhbCAncHJlZmVycmVkIHNpemUnLiBJbnN0ZWFkLCB0aGV5IGFyZSBjYXBhYmxlIG9mIHByb3ZpZGluZyB0aGUNCi0gKiByZXF1aXJlZCBoZWlnaHQgaWYgdGhlIHdpZHRoIGlzIHNldC4gQ29uc2VxdWVudGx5LCB0aGlzIGFsZ29yaXRobSBmaXJzdA0KLSAqIGNhbGN1bGF0ZXMgdGhlIHdpZHRocyB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gY29sdW1ucywgYW5kIHRoZW4gcGFzc2VzDQotICogdGhvc2Ugd2lkdGhzIHRvIHRoZSBjb250cm9scyB0byBjYWxjdWxhdGUgdGhlIGhlaWdodC4gV2hlbiBhIGNvbXBvc2l0ZSB3aXRoDQotICogdGhpcyBsYXlvdXQgaXMgYSBjaGlsZCBvZiB0aGUgc2Nyb2xsaW5nIGNvbXBvc2l0ZSwgdGhleSBzaG91bGQgaW50ZXJhY3QgaW4NCi0gKiBzdWNoIGEgd2F5IHRoYXQgcmVkdWN0aW9uIGluIHRoZSBzY3JvbGxpbmcgY29tcG9zaXRlIHdpZHRoIHJlc3VsdHMgaW4gdGhlDQotICogcmVmbG93IGFuZCBpbmNyZWFzZSBvZiB0aGUgb3ZlcmFsbCBoZWlnaHQuDQotICogPHA+DQotICogSWYgbm9uZSBvZiB0aGUgY29sdW1ucyBjb250YWluIGV4cGFuZGFibGUgYW5kIHdyYXBwYWJsZSBjb250cm9scywgdGhlDQotICogZW5kLXJlc3VsdCB3aWxsIGJlIHNpbWlsYXIgdG8gdGhlIG9uZSBwcm92aWRlZCBieSBHcmlkTGF5b3V0LiBUaGUgZGlmZmVyZW5jZQ0KLSAqIHdpbGwgc2hvdyB1cCBmb3IgbGF5b3V0cyB0aGF0IGNvbnRhaW4gY29udHJvbHMgd2hvc2UgbWluaW11bSBhbmQgbWF4aW11bQ0KLSAqIHdpZHRocyBhcmUgbm90IHRoZSBzYW1lLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBIVE1MVGFibGVMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgaW1wbGVtZW50cyBJTGF5b3V0RXh0ZW5zaW9uIHsNCi0JcHVibGljIGludCBudW1Db2x1bW5zID0gMTsNCi0JcHVibGljIGludCBsZWZ0TWFyZ2luID0gNTsNCi0JcHVibGljIGludCByaWdodE1hcmdpbiA9IDU7DQotCXB1YmxpYyBpbnQgdG9wTWFyZ2luID0gNTsNCi0JcHVibGljIGludCBib3R0b21NYXJnaW4gPSA1Ow0KLQlwdWJsaWMgaW50IGhvcml6b250YWxTcGFjaW5nID0gNTsNCi0JcHVibGljIGludCB2ZXJ0aWNhbFNwYWNpbmcgPSA1Ow0KLQlwdWJsaWMgYm9vbGVhbiBtYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsNCi0NCi0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxMYXlvdXQgPSB0cnVlOw0KLQlwcml2YXRlIFZlY3RvciBncmlkID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnRbXSBtaW5Db2x1bW5XaWR0aHMsIG1heENvbHVtbldpZHRoczsNCi0JcHJpdmF0ZSBpbnQgd2lkZXN0Q29sdW1uV2lkdGg7DQotCXByaXZhdGUgaW50W10gZ3Jvd2luZ0NvbHVtbnM7DQotDQotCXB1YmxpYyBpbnQgZ2V0TWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJY2hhbmdlZCA9IHRydWU7DQotCQlpbml0aWFsaXplSWZOZWVkZWQocGFyZW50LCBjaGFuZ2VkKTsNCi0JCWlmIChpbml0aWFsTGF5b3V0KSB7DQotCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJaW5pdGlhbExheW91dCA9IGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdyaWQgPT0gbnVsbCB8fCBjaGFuZ2VkKSB7DQotCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJZ3JpZCA9IG5ldyBWZWN0b3IoKTsNCi0JCQljcmVhdGVHcmlkKHBhcmVudCk7DQotCQl9DQotCQlpZiAobWluQ29sdW1uV2lkdGhzID09IG51bGwpDQotCQkJbWluQ29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJbWluQ29sdW1uV2lkdGhzW2ldID0gMDsNCi0JCX0NCi0JCXJldHVybiBpbnRlcm5hbEdldE1pbmltdW1XaWR0aChwYXJlbnQsIGNoYW5nZWQpOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJY2hhbmdlZCA9IHRydWU7DQotCQlpbml0aWFsaXplSWZOZWVkZWQocGFyZW50LCBjaGFuZ2VkKTsNCi0JCWlmIChpbml0aWFsTGF5b3V0KSB7DQotCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJaW5pdGlhbExheW91dCA9IGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdyaWQgPT0gbnVsbCB8fCBjaGFuZ2VkKSB7DQotCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJZ3JpZCA9IG5ldyBWZWN0b3IoKTsNCi0JCQljcmVhdGVHcmlkKHBhcmVudCk7DQotCQl9DQotCQlpZiAobWF4Q29sdW1uV2lkdGhzID09IG51bGwpDQotCQkJbWF4Q29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJbWF4Q29sdW1uV2lkdGhzW2ldID0gMDsNCi0JCX0NCi0JCXJldHVybiBpbnRlcm5hbEdldE1heGltdW1XaWR0aChwYXJlbnQsIGNoYW5nZWQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIExheW91dCNsYXlvdXQoQ29tcG9zaXRlLCBib29sZWFuKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOw0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7DQotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDApDQotCQkJcmV0dXJuOw0KLQkJaW50IHBhcmVudFdpZHRoID0gY2xpZW50QXJlYS53aWR0aDsNCi0JCWNoYW5nZWQgPSB0cnVlOw0KLQkJaW5pdGlhbGl6ZUlmTmVlZGVkKHBhcmVudCwgY2hhbmdlZCk7DQotCQlpZiAoaW5pdGlhbExheW91dCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWluaXRpYWxMYXlvdXQgPSBmYWxzZTsNCi0JCX0NCi0JCWlmIChncmlkID09IG51bGwgfHwgY2hhbmdlZCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWdyaWQgPSBuZXcgVmVjdG9yKCk7DQotCQkJY3JlYXRlR3JpZChwYXJlbnQpOw0KLQkJfQ0KLQkJcmVzZXRDb2x1bW5XaWR0aHMoKTsNCi0JCWludCBtaW5XaWR0aCA9IGludGVybmFsR2V0TWluaW11bVdpZHRoKHBhcmVudCwgY2hhbmdlZCk7DQotCQlpbnQgbWF4V2lkdGggPSBpbnRlcm5hbEdldE1heGltdW1XaWR0aChwYXJlbnQsIGNoYW5nZWQpOw0KLQ0KLQkJaW50IHRhYmxlV2lkdGggPSBwYXJlbnRXaWR0aDsNCi0NCi0JCWludFtdIGNvbHVtbldpZHRoczsNCi0NCi0JCWlmIChwYXJlbnRXaWR0aCA8IG1pbldpZHRoKSB7DQotCQkJdGFibGVXaWR0aCA9IG1pbldpZHRoOw0KLQkJCWlmIChtYWtlQ29sdW1uc0VxdWFsV2lkdGgpIHsNCi0JCQkJY29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQkJCWNvbHVtbldpZHRoc1tpXSA9IHdpZGVzdENvbHVtbldpZHRoOw0KLQkJCQl9DQotCQkJfSBlbHNlDQotCQkJCWNvbHVtbldpZHRocyA9IG1pbkNvbHVtbldpZHRoczsNCi0JCX0gZWxzZSBpZiAocGFyZW50V2lkdGggPiBtYXhXaWR0aCkgew0KLQkJCWlmIChncm93aW5nQ29sdW1ucy5sZW5ndGggPT0gMCkgew0KLQkJCQl0YWJsZVdpZHRoID0gbWF4V2lkdGg7DQotCQkJCWNvbHVtbldpZHRocyA9IG1heENvbHVtbldpZHRoczsNCi0JCQl9IGVsc2Ugew0KLQkJCQljb2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJCQlpbnQgY29sU3BhY2UgPSB0YWJsZVdpZHRoIC0gbGVmdE1hcmdpbiAtIHJpZ2h0TWFyZ2luOw0KLQkJCQljb2xTcGFjZSAtPSAobnVtQ29sdW1ucyAtIDEpICogaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJCWludCBleHRyYSA9IHBhcmVudFdpZHRoIC0gbWF4V2lkdGg7DQotCQkJCWludCBjb2xFeHRyYSA9IGV4dHJhIC8gZ3Jvd2luZ0NvbHVtbnMubGVuZ3RoOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gbWF4Q29sdW1uV2lkdGhzW2ldOw0KLQ0KLQkJCQkJaWYgKGlzR3Jvd2luZ0NvbHVtbihpKSkgew0KLQkJCQkJCWNvbHVtbldpZHRoc1tpXSArPSBjb2xFeHRyYTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0gZWxzZSB7DQotCQkJY29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsNCi0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7DQotCQkJCWludCBjb2xTcGFjZSA9IHRhYmxlV2lkdGggLSBsZWZ0TWFyZ2luIC0gcmlnaHRNYXJnaW47DQotCQkJCWNvbFNwYWNlIC09IChudW1Db2x1bW5zIC0gMSkgKiBob3Jpem9udGFsU3BhY2luZzsNCi0JCQkJaW50IGNvbCA9IGNvbFNwYWNlIC8gbnVtQ29sdW1uczsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQkJCWNvbHVtbldpZHRoc1tpXSA9IGNvbDsNCi0JCQkJfQ0KLQkJCX0gZWxzZSB7DQotCQkJCWludFtdIGV4dHJhU3BhY2UgPQ0KLQkJCQkJY2FsY3VsYXRlRXh0cmFTcGFjZSh0YWJsZVdpZHRoLCBtYXhXaWR0aCwgbWluV2lkdGgpOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCQkJaW50IG1pbkNXaWR0aCA9IG1pbkNvbHVtbldpZHRoc1tpXTsNCi0JCQkJCWNvbHVtbldpZHRoc1tpXSA9IG1pbkNXaWR0aCArIGV4dHJhU3BhY2VbaV07DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlpbnQgeCA9IDA7DQotCQlpbnQgeSA9IHRvcE1hcmdpbjsNCi0JCS8vIGFzc2lnbiB3aWR0aHMNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZC5zaXplKCk7IGkrKykgew0KLQkJCVRhYmxlRGF0YVtdIHJvdyA9IChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQoaSk7DQotCQkJLy8gYXNzaWduIHdpZHRocywgY2FsY3VsYXRlIGhlaWdodHMNCi0JCQlpbnQgcm93SGVpZ2h0ID0gMDsNCi0JCQl4ID0gbGVmdE1hcmdpbjsNCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IG51bUNvbHVtbnM7IGorKykgew0KLQkJCQlUYWJsZURhdGEgdGQgPSByb3dbal07DQotCQkJCWlmICh0ZC5pc0l0ZW1EYXRhID09IGZhbHNlKSB7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5bdGQuY2hpbGRJbmRleF07DQotCQkJCWludCBzcGFuID0gdGQuY29sc3BhbjsNCi0JCQkJaW50IGN3aWR0aCA9IDA7DQotCQkJCWZvciAoaW50IGsgPSBqOyBrIDwgaiArIHNwYW47IGsrKykgew0KLQkJCQkJY3dpZHRoICs9IGNvbHVtbldpZHRoc1trXTsNCi0JCQkJCWlmIChrIDwgaiArIHNwYW4gLSAxKQ0KLQkJCQkJCWN3aWR0aCArPSBob3Jpem9udGFsU3BhY2luZzsNCi0JCQkJfQ0KLQkJCQlQb2ludCBzaXplID0gY29tcHV0ZVNpemUoY2hpbGQsIGN3aWR0aCwgY2hhbmdlZCk7DQotCQkJCXRkLmNvbXBXaWR0aCA9IGN3aWR0aDsNCi0JCQkJaWYgKHRkLmhlaWdodEhpbnQgIT0gU1dULkRFRkFVTFQpIHsNCi0JCQkJCXNpemUgPSBuZXcgUG9pbnQoc2l6ZS54LCB0ZC5oZWlnaHRIaW50KTsNCi0JCQkJfQ0KLQkJCQl0ZC5jb21wU2l6ZSA9IHNpemU7DQotCQkJCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgc2l6ZS55KTsNCi0JCQl9DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1Db2x1bW5zOyBqKyspIHsNCi0JCQkJVGFibGVEYXRhIHRkID0gcm93W2pdOw0KLQkJCQlpZiAodGQuaXNJdGVtRGF0YSA9PSBmYWxzZSkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW3RkLmNoaWxkSW5kZXhdOw0KLQkJCQlwbGFjZUNvbnRyb2woY2hpbGQsIHRkLCB4LCB5LCByb3dIZWlnaHQpOw0KLQkJCQl4ICs9IHRkLmNvbXBXaWR0aDsNCi0JCQkJaWYgKGogPCBudW1Db2x1bW5zIC0gMSkNCi0JCQkJCXggKz0gaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJfQ0KLQkJCXkgKz0gcm93SGVpZ2h0ICsgdmVydGljYWxTcGFjaW5nOw0KLQkJfQ0KLQl9DQotDQotCWJvb2xlYW4gaXNHcm93aW5nQ29sdW1uKGludCBjb2wpIHsNCi0JCWlmIChncm93aW5nQ29sdW1ucyA9PSBudWxsKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3Jvd2luZ0NvbHVtbnMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoY29sID09IGdyb3dpbmdDb2x1bW5zW2ldKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlpbnRbXSBjYWxjdWxhdGVFeHRyYVNwYWNlKGludCB0YWJsZVdpZHRoLCBpbnQgbWF4V2lkdGgsIGludCBtaW5XaWR0aCkgew0KLQkJaW50IGZpeGVkUGFydCA9DQotCQkJbGVmdE1hcmdpbiArIHJpZ2h0TWFyZ2luICsgKG51bUNvbHVtbnMgLSAxKSAqIGhvcml6b250YWxTcGFjaW5nOw0KLQkJaW50IEQgPSBtYXhXaWR0aCAtIG1pbldpZHRoOw0KLQ0KLQkJaW50IFcgPSB0YWJsZVdpZHRoIC0gZml4ZWRQYXJ0IC0gbWluV2lkdGg7DQotDQotCQlpbnQgZXh0cmFTcGFjZVtdID0gbmV3IGludFtudW1Db2x1bW5zXTsNCi0NCi0JCWludCByZW0gPSAwOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQlpbnQgY21pbiA9IG1pbkNvbHVtbldpZHRoc1tpXTsNCi0JCQlpbnQgY21heCA9IG1heENvbHVtbldpZHRoc1tpXTsNCi0JCQlpbnQgZCA9IGNtYXggLSBjbWluOw0KLQkJCWludCBleHRyYSA9IEQgIT0gMCA/IChkICogVykgLyBEIDogMDsNCi0JCQlpZiAoaSA8IG51bUNvbHVtbnMgLSAxKSB7DQotCQkJCWV4dHJhU3BhY2VbaV0gPSBleHRyYTsNCi0JCQkJcmVtICs9IGV4dHJhOw0KLQkJCX0gZWxzZSB7DQotCQkJCWV4dHJhU3BhY2VbaV0gPSBXIC0gcmVtOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBleHRyYVNwYWNlOw0KLQl9DQotDQotCVBvaW50IGNvbXB1dGVTaXplKENvbnRyb2wgY2hpbGQsIGludCB3aWR0aCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlpbnQgd2lkdGhBcmcgPSB3aWR0aDsNCi0JCWlmICghaXNXcmFwKGNoaWxkKSkNCi0JCQl3aWR0aEFyZyA9IFNXVC5ERUZBVUxUOw0KLQkJUG9pbnQgc2l6ZSA9IGNoaWxkLmNvbXB1dGVTaXplKHdpZHRoQXJnLCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7DQotCQlyZXR1cm4gc2l6ZTsNCi0JfQ0KLQ0KLQl2b2lkIHBsYWNlQ29udHJvbCgNCi0JCUNvbnRyb2wgY29udHJvbCwNCi0JCVRhYmxlRGF0YSB0ZCwNCi0JCWludCB4LA0KLQkJaW50IHksDQotCQlpbnQgcm93SGVpZ2h0KSB7DQotCQlpbnQgeGxvYyA9IHggKyB0ZC5pbmRlbnQ7DQotCQlpbnQgeWxvYyA9IHk7DQotCQlpbnQgd2lkdGggPSB0ZC5jb21wU2l6ZS54Ow0KLQkJaW50IGhlaWdodCA9IHRkLmNvbXBTaXplLnk7DQotCQlpbnQgY29sV2lkdGggPSB0ZC5jb21wV2lkdGg7DQotDQotCQkvLyBhbGlnbiBob3Jpem9udGFsbHkNCi0JCWlmICh0ZC5hbGlnbiA9PSBUYWJsZURhdGEuQ0VOVEVSKSB7DQotCQkJeGxvYyA9IHggKyBjb2xXaWR0aCAvIDIgLSB3aWR0aCAvIDI7DQotCQl9IGVsc2UgaWYgKHRkLmFsaWduID09IFRhYmxlRGF0YS5SSUdIVCkgew0KLQkJCXhsb2MgPSB4ICsgY29sV2lkdGggLSB3aWR0aDsNCi0JCX0gZWxzZSBpZiAodGQuYWxpZ24gPT0gVGFibGVEYXRhLkZJTEwpIHsNCi0JCQl3aWR0aCA9IGNvbFdpZHRoOw0KLQkJfQ0KLQkJLy8gYWxpZ24gdmVydGljYWxseQ0KLQkJaWYgKHRkLnZhbGlnbiA9PSBUYWJsZURhdGEuTUlERExFKSB7DQotCQkJeWxvYyA9IHkgKyByb3dIZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMjsNCi0JCX0gZWxzZSBpZiAodGQudmFsaWduID09IFRhYmxlRGF0YS5CT1RUT00pIHsNCi0JCQl5bG9jID0geSArIHJvd0hlaWdodCAtIGhlaWdodDsNCi0JCX0gZWxzZSBpZiAodGQudmFsaWduID09IFRhYmxlRGF0YS5GSUxMKSB7DQotCQkJaGVpZ2h0ID0gcm93SGVpZ2h0Ow0KLQkJfQ0KLQkJY29udHJvbC5zZXRCb3VuZHMoeGxvYywgeWxvYywgd2lkdGgsIGhlaWdodCk7DQotCX0NCi0NCi0Jdm9pZCBjcmVhdGVHcmlkKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsNCi0JCWludCByb3csIGNvbHVtbiwgcm93RmlsbCwgY29sdW1uRmlsbDsNCi0JCUNvbnRyb2xbXSBjaGlsZHJlbjsNCi0JCVRhYmxlRGF0YSBzcGFjZXJTcGVjOw0KLQkJVmVjdG9yIGdyb3dpbmdDb2xzID0gbmV3IFZlY3RvcigpOw0KLQ0KLQkJLy8gDQotCQljaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOw0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybjsNCi0NCi0JCS8vIA0KLQkJZ3JpZC5hZGRFbGVtZW50KGNyZWF0ZUVtcHR5Um93KCkpOw0KLQkJcm93ID0gMDsNCi0JCWNvbHVtbiA9IDA7DQotDQotCQkvLyBMb29wIHRocm91Z2ggdGhlIGNoaWxkcmVuIGFuZCBwbGFjZSB0aGVpciBhc3NvY2lhdGVkIGxheW91dCBzcGVjcyBpbg0KLQkJLy8gdGhlDQotCQkvLyBncmlkLiBQbGFjZW1lbnQgb2NjdXJzIGxlZnQgdG8gcmlnaHQsIHRvcCB0byBib3R0b20gKGkuZS4sIGJ5IHJvdykuDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJLy8gRmluZCB0aGUgZmlyc3QgYXZhaWxhYmxlIHNwb3QgaW4gdGhlIGdyaWQuDQotCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KLQkJCVRhYmxlRGF0YSBzcGVjID0gKFRhYmxlRGF0YSkgY2hpbGQuZ2V0TGF5b3V0RGF0YSgpOw0KLQkJCXdoaWxlICgoKFRhYmxlRGF0YVtdKSBncmlkLmVsZW1lbnRBdChyb3cpKVtjb2x1bW5dICE9IG51bGwpIHsNCi0JCQkJY29sdW1uID0gY29sdW1uICsgMTsNCi0JCQkJaWYgKGNvbHVtbiA+PSBudW1Db2x1bW5zKSB7DQotCQkJCQlyb3cgPSByb3cgKyAxOw0KLQkJCQkJY29sdW1uID0gMDsNCi0JCQkJCWlmIChyb3cgPj0gZ3JpZC5zaXplKCkpIHsNCi0JCQkJCQlncmlkLmFkZEVsZW1lbnQoY3JlYXRlRW1wdHlSb3coKSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQkJLy8gU2VlIGlmIHRoZSBwbGFjZSB3aWxsIHN1cHBvcnQgdGhlIHdpZGdldCdzIGhvcml6b250YWwgc3Bhbi4gSWYNCi0JCQkvLyBub3QsIGdvIHRvIHRoZQ0KLQkJCS8vIG5leHQgcm93Lg0KLQkJCWlmIChjb2x1bW4gKyBzcGVjLmNvbHNwYW4gLSAxID49IG51bUNvbHVtbnMpIHsNCi0JCQkJZ3JpZC5hZGRFbGVtZW50KGNyZWF0ZUVtcHR5Um93KCkpOw0KLQkJCQlyb3cgPSByb3cgKyAxOw0KLQkJCQljb2x1bW4gPSAwOw0KLQkJCX0NCi0NCi0JCQkvLyBUaGUgdmVydGljYWwgc3BhbiBmb3IgdGhlIGl0ZW0gd2lsbCBiZSBhdCBsZWFzdCAxLiBJZiBpdCBpcyA+IDEsDQotCQkJLy8gYWRkIG90aGVyIHJvd3MgdG8gdGhlIGdyaWQuDQotCQkJZm9yIChpbnQgaiA9IDI7IGogPD0gc3BlYy5yb3dzcGFuOyBqKyspIHsNCi0JCQkJaWYgKHJvdyArIGogPiBncmlkLnNpemUoKSkgew0KLQkJCQkJZ3JpZC5hZGRFbGVtZW50KGNyZWF0ZUVtcHR5Um93KCkpOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIFN0b3JlIHRoZSBsYXlvdXQgc3BlYy4gQWxzbyBjYWNoZSB0aGUgY2hpbGRJbmRleC4gTk9URTogVGhhdCB3ZQ0KLQkJCS8vIGFzc3VtZSB0aGUgY2hpbGRyZW4gb2YgYQ0KLQkJCS8vIGNvbXBvc2l0ZSBhcmUgbWFpbnRhaW5lZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgY3JlYXRlZA0KLQkJCS8vIGFuZCBhZGRlZCB0byB0aGUgY29tcG9zaXRlLg0KLQkJCSAoKFRhYmxlRGF0YVtdKSBncmlkLmVsZW1lbnRBdChyb3cpKVtjb2x1bW5dID0gc3BlYzsNCi0JCQlzcGVjLmNoaWxkSW5kZXggPSBpOw0KLQ0KLQkJCWlmIChzcGVjLmdyYWJIb3Jpem9udGFsKSB7DQotCQkJCXVwZGF0ZUdyb3dpbmdDb2x1bW5zKGdyb3dpbmdDb2xzLCBzcGVjLCBjb2x1bW4pOw0KLQkJCX0NCi0NCi0JCQkvLyBQdXQgc3BhY2VycyBpbiB0aGUgZ3JpZCB0byBhY2NvdW50IGZvciB0aGUgaXRlbSdzIHZlcnRpY2FsIGFuZA0KLQkJCS8vIGhvcml6b250YWwNCi0JCQkvLyBzcGFuLg0KLQkJCXJvd0ZpbGwgPSBzcGVjLnJvd3NwYW4gLSAxOw0KLQkJCWNvbHVtbkZpbGwgPSBzcGVjLmNvbHNwYW4gLSAxOw0KLQkJCWZvciAoaW50IHIgPSAxOyByIDw9IHJvd0ZpbGw7IHIrKykgew0KLQkJCQlmb3IgKGludCBjID0gMDsgYyA8IHNwZWMuY29sc3BhbjsgYysrKSB7DQotCQkJCQlzcGFjZXJTcGVjID0gbmV3IFRhYmxlRGF0YSgpOw0KLQkJCQkJc3BhY2VyU3BlYy5pc0l0ZW1EYXRhID0gZmFsc2U7DQotCQkJCQkoKFRhYmxlRGF0YVtdKSBncmlkLmVsZW1lbnRBdChyb3cgKyByKSlbY29sdW1uICsgY10gPQ0KLQkJCQkJCXNwYWNlclNwZWM7DQotCQkJCX0NCi0JCQl9DQotCQkJZm9yIChpbnQgYyA9IDE7IGMgPD0gY29sdW1uRmlsbDsgYysrKSB7DQotCQkJCWZvciAoaW50IHIgPSAwOyByIDwgc3BlYy5yb3dzcGFuOyByKyspIHsNCi0JCQkJCXNwYWNlclNwZWMgPSBuZXcgVGFibGVEYXRhKCk7DQotCQkJCQlzcGFjZXJTcGVjLmlzSXRlbURhdGEgPSBmYWxzZTsNCi0JCQkJCSgoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KHJvdyArIHIpKVtjb2x1bW4gKyBjXSA9DQotCQkJCQkJc3BhY2VyU3BlYzsNCi0JCQkJfQ0KLQkJCX0NCi0JCQljb2x1bW4gPSBjb2x1bW4gKyBzcGVjLmNvbHNwYW4gLSAxOw0KLQkJfQ0KLQ0KLQkJLy8gRmlsbCBvdXQgZW1wdHkgZ3JpZCBjZWxscyB3aXRoIHNwYWNlcnMuDQotCQlmb3IgKGludCBrID0gY29sdW1uICsgMTsgayA8IG51bUNvbHVtbnM7IGsrKykgew0KLQkJCXNwYWNlclNwZWMgPSBuZXcgVGFibGVEYXRhKCk7DQotCQkJc3BhY2VyU3BlYy5pc0l0ZW1EYXRhID0gZmFsc2U7DQotCQkJKChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQocm93KSlba10gPSBzcGFjZXJTcGVjOw0KLQkJfQ0KLQkJZm9yIChpbnQgayA9IHJvdyArIDE7IGsgPCBncmlkLnNpemUoKTsgaysrKSB7DQotCQkJc3BhY2VyU3BlYyA9IG5ldyBUYWJsZURhdGEoKTsNCi0JCQlzcGFjZXJTcGVjLmlzSXRlbURhdGEgPSBmYWxzZTsNCi0JCQkoKFRhYmxlRGF0YVtdKSBncmlkLmVsZW1lbnRBdChrKSlbY29sdW1uXSA9IHNwYWNlclNwZWM7DQotCQl9DQotCQlncm93aW5nQ29sdW1ucyA9IG5ldyBpbnRbZ3Jvd2luZ0NvbHMuc2l6ZSgpXTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3Jvd2luZ0NvbHMuc2l6ZSgpOyBpKyspIHsNCi0JCQlncm93aW5nQ29sdW1uc1tpXSA9ICgoSW50ZWdlcikgZ3Jvd2luZ0NvbHMuZ2V0KGkpKS5pbnRWYWx1ZSgpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcm93aW5nQ29sdW1ucygNCi0JCVZlY3RvciBncm93aW5nQ29sdW1ucywNCi0JCVRhYmxlRGF0YSBzcGVjLA0KLQkJaW50IGNvbHVtbikgew0KLQkJaW50IGFmZmVjdGVkQ29sdW1uID0gY29sdW1uICsgc3BlYy5jb2xzcGFuIC0gMTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3Jvd2luZ0NvbHVtbnMuc2l6ZSgpOyBpKyspIHsNCi0JCQlJbnRlZ2VyIGNvbCA9IChJbnRlZ2VyKSBncm93aW5nQ29sdW1ucy5nZXQoaSk7DQotCQkJaWYgKGNvbC5pbnRWYWx1ZSgpID09IGFmZmVjdGVkQ29sdW1uKQ0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlncm93aW5nQ29sdW1ucy5hZGQobmV3IEludGVnZXIoYWZmZWN0ZWRDb2x1bW4pKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFRhYmxlRGF0YVtdIGNyZWF0ZUVtcHR5Um93KCkgew0KLQkJVGFibGVEYXRhW10gcm93ID0gbmV3IFRhYmxlRGF0YVtudW1Db2x1bW5zXTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKQ0KLQkJCXJvd1tpXSA9IG51bGw7DQotCQlyZXR1cm4gcm93Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIExheW91dCNjb21wdXRlU2l6ZShDb21wb3NpdGUsIGludCwgaW50LCBib29sZWFuKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCWludCB3SGludCwNCi0JCWludCBoSGludCwNCi0JCWJvb2xlYW4gY2hhbmdlZCkgew0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7DQotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDApIHsNCi0JCQlyZXR1cm4gbmV3IFBvaW50KDAsIDApOw0KLQkJfQ0KLQkJaW50IHBhcmVudFdpZHRoID0gd0hpbnQ7DQotCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCWluaXRpYWxpemVJZk5lZWRlZChwYXJlbnQsIGNoYW5nZWQpOw0KLQkJaWYgKGluaXRpYWxMYXlvdXQpIHsNCi0JCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQlpbml0aWFsTGF5b3V0ID0gZmFsc2U7DQotCQl9DQotCQlpZiAoZ3JpZCA9PSBudWxsIHx8IGNoYW5nZWQpIHsNCi0JCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQlncmlkID0gbmV3IFZlY3RvcigpOw0KLQkJCWNyZWF0ZUdyaWQocGFyZW50KTsNCi0JCX0NCi0JCXJlc2V0Q29sdW1uV2lkdGhzKCk7DQotCQlpbnQgbWluV2lkdGggPSBpbnRlcm5hbEdldE1pbmltdW1XaWR0aChwYXJlbnQsIGNoYW5nZWQpOw0KLQkJaW50IG1heFdpZHRoID0gaW50ZXJuYWxHZXRNYXhpbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsNCi0NCi0JCWludCB0YWJsZVdpZHRoID0gcGFyZW50V2lkdGg7DQotDQotCQlpbnRbXSBjb2x1bW5XaWR0aHM7DQotDQotCQlpZiAocGFyZW50V2lkdGggPCBtaW5XaWR0aCkgew0KLQkJCXRhYmxlV2lkdGggPSBtaW5XaWR0aDsNCi0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7DQotCQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSB3aWRlc3RDb2x1bW5XaWR0aDsNCi0JCQkJfQ0KLQkJCX0gZWxzZQ0KLQkJCQljb2x1bW5XaWR0aHMgPSBtaW5Db2x1bW5XaWR0aHM7DQotCQl9IGVsc2UgaWYgKHBhcmVudFdpZHRoID4gbWF4V2lkdGgpIHsNCi0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7DQotCQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQkJCWludCBjb2xTcGFjZSA9IHBhcmVudFdpZHRoIC0gbGVmdE1hcmdpbiAtIHJpZ2h0TWFyZ2luOw0KLQkJCQljb2xTcGFjZSAtPSAobnVtQ29sdW1ucyAtIDEpICogaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJCWludCBjb2wgPSBjb2xTcGFjZSAvIG51bUNvbHVtbnM7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBjb2w7DQotCQkJCX0NCi0JCQl9IGVsc2Ugew0KLQkJCQl0YWJsZVdpZHRoID0gbWF4V2lkdGg7DQotCQkJCWNvbHVtbldpZHRocyA9IG1heENvbHVtbldpZHRoczsNCi0JCQl9DQotCQl9IGVsc2Ugew0KLQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgew0KLQkJCQlpbnQgY29sU3BhY2UgPSB0YWJsZVdpZHRoIC0gbGVmdE1hcmdpbiAtIHJpZ2h0TWFyZ2luOw0KLQkJCQljb2xTcGFjZSAtPSAobnVtQ29sdW1ucyAtIDEpICogaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJCWludCBjb2wgPSBjb2xTcGFjZSAvIG51bUNvbHVtbnM7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBjb2w7DQotCQkJCX0NCi0JCQl9IGVsc2Ugew0KLQkJCQlpbnRbXSBleHRyYVNwYWNlID0NCi0JCQkJCWNhbGN1bGF0ZUV4dHJhU3BhY2UodGFibGVXaWR0aCwgbWF4V2lkdGgsIG1pbldpZHRoKTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQkJCWludCBtaW5DV2lkdGggPSBtaW5Db2x1bW5XaWR0aHNbaV07DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBtaW5DV2lkdGggKyBleHRyYVNwYWNlW2ldOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJaW50IHRvdGFsSGVpZ2h0ID0gMDsNCi0JCWludCB5ID0gdG9wTWFyZ2luOw0KLQkJLy8gY29tcHV0ZSB3aWR0aHMNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZC5zaXplKCk7IGkrKykgew0KLQkJCVRhYmxlRGF0YVtdIHJvdyA9IChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQoaSk7DQotCQkJLy8gYXNzaWduIHdpZHRocywgY2FsY3VsYXRlIGhlaWdodHMNCi0JCQlpbnQgcm93SGVpZ2h0ID0gMDsNCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IG51bUNvbHVtbnM7IGorKykgew0KLQkJCQlUYWJsZURhdGEgdGQgPSByb3dbal07DQotCQkJCWlmICh0ZC5pc0l0ZW1EYXRhID09IGZhbHNlKSB7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5bdGQuY2hpbGRJbmRleF07DQotCQkJCWludCBzcGFuID0gdGQuY29sc3BhbjsNCi0JCQkJaW50IGN3aWR0aCA9IDA7DQotCQkJCWZvciAoaW50IGsgPSBqOyBrIDwgaiArIHNwYW47IGsrKykgew0KLQkJCQkJaWYgKGsgPiBqKQ0KLQkJCQkJCWN3aWR0aCArPSBob3Jpem9udGFsU3BhY2luZzsNCi0JCQkJCWN3aWR0aCArPSBjb2x1bW5XaWR0aHNba107DQotCQkJCX0NCi0JCQkJaW50IGN5ID0gdGQuaGVpZ2h0SGludDsNCi0JCQkJaWYgKGN5ID09IFNXVC5ERUZBVUxUKSB7DQotCQkJCQlQb2ludCBzaXplID0gY29tcHV0ZVNpemUoY2hpbGQsIGN3aWR0aCwgY2hhbmdlZCk7DQotCQkJCQljeSA9IHNpemUueTsNCi0JCQkJfQ0KLQkJCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIGN5KTsNCi0JCQl9DQotCQkJeSArPSByb3dIZWlnaHQgKyB2ZXJ0aWNhbFNwYWNpbmc7DQotCQl9DQotCQl0b3RhbEhlaWdodCA9IHkgKyBib3R0b21NYXJnaW47DQotCQlyZXR1cm4gbmV3IFBvaW50KHRhYmxlV2lkdGgsIHRvdGFsSGVpZ2h0KTsNCi0JfQ0KLQ0KLQlpbnQgaW50ZXJuYWxHZXRNaW5pbXVtV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlpZiAoY2hhbmdlZCkNCi0JCQljYWxjdWxhdGVNaW5pbXVtQ29sdW1uV2lkdGhzKHBhcmVudCwgdHJ1ZSk7DQotCQlpbnQgbWluaW11bVdpZHRoID0gMDsNCi0NCi0JCXdpZGVzdENvbHVtbldpZHRoID0gMDsNCi0NCi0JCWlmIChtYWtlQ29sdW1uc0VxdWFsV2lkdGgpIHsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCQl3aWRlc3RDb2x1bW5XaWR0aCA9DQotCQkJCQlNYXRoLm1heCh3aWRlc3RDb2x1bW5XaWR0aCwgbWluQ29sdW1uV2lkdGhzW2ldKTsNCi0JCQl9DQotCQl9DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCWlmIChpID4gMCkNCi0JCQkJbWluaW11bVdpZHRoICs9IGhvcml6b250YWxTcGFjaW5nOw0KLQkJCWlmIChtYWtlQ29sdW1uc0VxdWFsV2lkdGgpDQotCQkJCW1pbmltdW1XaWR0aCArPSB3aWRlc3RDb2x1bW5XaWR0aDsNCi0JCQllbHNlDQotCQkJCW1pbmltdW1XaWR0aCArPSBtaW5Db2x1bW5XaWR0aHNbaV07DQotCQl9DQotCQkvLyBhZGQgbWFyZ2lucw0KLQkJbWluaW11bVdpZHRoICs9IGxlZnRNYXJnaW4gKyByaWdodE1hcmdpbjsNCi0JCXJldHVybiBtaW5pbXVtV2lkdGg7DQotCX0NCi0NCi0JaW50IGludGVybmFsR2V0TWF4aW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJaWYgKGNoYW5nZWQpDQotCQkJY2FsY3VsYXRlTWF4aW11bUNvbHVtbldpZHRocyhwYXJlbnQsIHRydWUpOw0KLQkJaW50IG1heGltdW1XaWR0aCA9IDA7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCWlmIChpID4gMCkNCi0JCQkJbWF4aW11bVdpZHRoICs9IGhvcml6b250YWxTcGFjaW5nOw0KLQkJCW1heGltdW1XaWR0aCArPSBtYXhDb2x1bW5XaWR0aHNbaV07DQotCQl9DQotCQkvLyBhZGQgbWFyZ2lucw0KLQkJbWF4aW11bVdpZHRoICs9IGxlZnRNYXJnaW4gKyByaWdodE1hcmdpbjsNCi0JCXJldHVybiBtYXhpbXVtV2lkdGg7DQotCX0NCi0NCi0Jdm9pZCByZXNldENvbHVtbldpZHRocygpIHsNCi0JCWlmIChtaW5Db2x1bW5XaWR0aHMgPT0gbnVsbCkNCi0JCQltaW5Db2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJaWYgKG1heENvbHVtbldpZHRocyA9PSBudWxsKQ0KLQkJCW1heENvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCW1pbkNvbHVtbldpZHRoc1tpXSA9IDA7DQotCQl9DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCW1heENvbHVtbldpZHRoc1tpXSA9IDA7DQotCQl9DQotCX0NCi0NCi0Jdm9pZCBjYWxjdWxhdGVNaW5pbXVtQ29sdW1uV2lkdGhzKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyaWQuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWJsZURhdGFbXSByb3cgPSAoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KGkpOw0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtQ29sdW1uczsgaisrKSB7DQotCQkJCVRhYmxlRGF0YSB0ZCA9IHJvd1tqXTsNCi0JCQkJaWYgKHRkLmlzSXRlbURhdGEgPT0gZmFsc2UpDQotCQkJCQljb250aW51ZTsNCi0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW3RkLmNoaWxkSW5kZXhdOw0KLQkJCQlpbnQgbWluV2lkdGggPSAtMTsNCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7DQotCQkJCQlDb21wb3NpdGUgY2MgPSAoQ29tcG9zaXRlKSBjaGlsZDsNCi0JCQkJCUxheW91dCBsID0gY2MuZ2V0TGF5b3V0KCk7DQotCQkJCQlpZiAobCBpbnN0YW5jZW9mIElMYXlvdXRFeHRlbnNpb24pIHsNCi0JCQkJCQltaW5XaWR0aCA9DQotCQkJCQkJCSgoSUxheW91dEV4dGVuc2lvbikgbCkuZ2V0TWluaW11bVdpZHRoKGNjLCBjaGFuZ2VkKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAobWluV2lkdGggPT0gLTEpIHsNCi0JCQkJCWlmIChpc1dyYXAoY2hpbGQpKSB7DQotCQkJCQkJLy8gU2hvdWxkIGJlIHRoZSB3aWR0aCBvZiB0aGUNCi0JCQkJCQkvLyBsb25nZXN0IHdvcmQsIHdlJ2xsIHBpY2sNCi0JCQkJCQkvLyBzb21lIHNtYWxsIG51bWJlciBpbnN0ZWFkDQotCQkJCQkJbWluV2lkdGggPSAzMDsNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJUG9pbnQgc2l6ZSA9DQotCQkJCQkJCWNoaWxkLmNvbXB1dGVTaXplKA0KLQkJCQkJCQkJU1dULkRFRkFVTFQsDQotCQkJCQkJCQlTV1QuREVGQVVMVCwNCi0JCQkJCQkJCWNoYW5nZWQpOw0KLQkJCQkJCW1pbldpZHRoID0gc2l6ZS54Ow0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCW1pbldpZHRoICs9IHRkLmluZGVudDsNCi0JCQkJbWluQ29sdW1uV2lkdGhzW2pdID0gTWF0aC5tYXgobWluQ29sdW1uV2lkdGhzW2pdLCBtaW5XaWR0aCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCWJvb2xlYW4gaXNXcmFwKENvbnRyb2wgY29udHJvbCkgew0KLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUNCi0JCQkmJiAoKENvbXBvc2l0ZSkgY29udHJvbCkuZ2V0TGF5b3V0KCkgaW5zdGFuY2VvZiBJTGF5b3V0RXh0ZW5zaW9uKQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJcmV0dXJuIChjb250cm9sLmdldFN0eWxlKCkgJiBTV1QuV1JBUCkgIT0gMDsNCi0JfQ0KLQ0KLQl2b2lkIGNhbGN1bGF0ZU1heGltdW1Db2x1bW5XaWR0aHMoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJbWF4Q29sdW1uV2lkdGhzW2ldID0gMDsNCi0JCX0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JpZC5zaXplKCk7IGkrKykgew0KLQkJCVRhYmxlRGF0YVtdIHJvdyA9IChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQoaSk7DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1Db2x1bW5zOyBqKyspIHsNCi0JCQkJVGFibGVEYXRhIHRkID0gcm93W2pdOw0KLQkJCQlpZiAodGQuaXNJdGVtRGF0YSA9PSBmYWxzZSkNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5bdGQuY2hpbGRJbmRleF07DQotCQkJCWludCBtYXhXaWR0aCA9IC0xOw0KLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsNCi0JCQkJCUNvbXBvc2l0ZSBjYyA9IChDb21wb3NpdGUpIGNoaWxkOw0KLQkJCQkJTGF5b3V0IGwgPSBjYy5nZXRMYXlvdXQoKTsNCi0JCQkJCWlmIChsIGluc3RhbmNlb2YgSUxheW91dEV4dGVuc2lvbikgew0KLQkJCQkJCW1heFdpZHRoID0NCi0JCQkJCQkJKChJTGF5b3V0RXh0ZW5zaW9uKSBsKS5nZXRNYXhpbXVtV2lkdGgoY2MsIGNoYW5nZWQpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWlmIChtYXhXaWR0aCA9PSAtMSkgew0KLQkJCQkJUG9pbnQgc2l6ZSA9DQotCQkJCQkJY2hpbGQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsNCi0JCQkJCW1heFdpZHRoID0gc2l6ZS54Ow0KLQkJCQl9DQotCQkJCW1heFdpZHRoICs9IHRkLmluZGVudDsNCi0JCQkJaWYgKHRkLmNvbHNwYW4gPT0gMSkNCi0JCQkJCW1heENvbHVtbldpZHRoc1tqXSA9IE1hdGgubWF4KG1heENvbHVtbldpZHRoc1tqXSwgbWF4V2lkdGgpOw0KLQkJCQllbHNlIHsNCi0JCQkJCS8vIGdyb3cgdGhlIGxhc3QgY29sdW1uDQotCQkJCQlpbnQgbGFzdCA9IGogKyB0ZC5jb2xzcGFuIC0gMTsNCi0JCQkJCWludCByZW0gPSAwOw0KLQkJCQkJZm9yIChpbnQgayA9IGo7IGsgPCBqICsgdGQuY29sc3BhbiAtIDE7IGsrKykgew0KLQkJCQkJCXJlbSArPSBtYXhDb2x1bW5XaWR0aHNba107DQotCQkJCQl9DQotCQkJCQlpbnQgcmVkdWNlZCA9IG1heFdpZHRoIC0gcmVtOw0KLQkJCQkJbWF4Q29sdW1uV2lkdGhzW2xhc3RdID0NCi0JCQkJCQlNYXRoLm1heChtYXhDb2x1bW5XaWR0aHNbbGFzdF0sIHJlZHVjZWQpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSWZOZWVkZWQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlpZiAoY2hhbmdlZCkNCi0JCQlpbml0aWFsTGF5b3V0ID0gdHJ1ZTsNCi0JCWlmIChpbml0aWFsTGF5b3V0KSB7DQotCQkJaW5pdGlhbGl6ZUxheW91dERhdGEocGFyZW50KTsNCi0JCQlpbml0aWFsTGF5b3V0ID0gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0Jdm9pZCBpbml0aWFsaXplTGF5b3V0RGF0YShDb21wb3NpdGUgY29tcG9zaXRlKSB7DQotCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCi0JCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07DQotCQkJaWYgKGNoaWxkLmdldExheW91dERhdGEoKSA9PSBudWxsKSB7DQotCQkJCWNoaWxkLnNldExheW91dERhdGEobmV3IFRhYmxlRGF0YSgpKTsNCi0JCQl9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0h5cGVybGlua0FkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODBhMmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0h5cGVybGlua0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1wdWJsaWMgY2xhc3MgSHlwZXJsaW5rQWRhcHRlciBpbXBsZW1lbnRzIElIeXBlcmxpbmtMaXN0ZW5lciB7DQotDQotcHVibGljIEh5cGVybGlua0FkYXB0ZXIoKSB7DQotCXN1cGVyKCk7DQotfQ0KLXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCBsaW5rTGFiZWwpIHt9DQotcHVibGljIHZvaWQgbGlua0VudGVyZWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCBsaW5rTGFiZWwpIHt9DQotcHVibGljIHZvaWQgbGlua0V4aXRlZChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sIGxpbmtMYWJlbCkge30NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0h5cGVybGlua0hhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMWFlZjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0h5cGVybGlua0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0xpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCi0NCi1wdWJsaWMgY2xhc3MgSHlwZXJsaW5rSGFuZGxlcg0KLQlleHRlbmRzIEh5cGVybGlua1NldHRpbmdzDQotCWltcGxlbWVudHMgTW91c2VMaXN0ZW5lciwgTW91c2VUcmFja0xpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciwgUGFpbnRMaXN0ZW5lciB7DQotCXByaXZhdGUgSGFzaHRhYmxlIGh5cGVybGlua0xpc3RlbmVyczsNCi0JcHJpdmF0ZSBDb250cm9sIGxhc3RBY3RpdmF0ZWQ7DQotCXByaXZhdGUgQ29udHJvbCBsYXN0RW50ZXJlZDsNCi0NCi0JcHVibGljIEh5cGVybGlua0hhbmRsZXIoKSB7DQotCQloeXBlcmxpbmtMaXN0ZW5lcnMgPSBuZXcgSGFzaHRhYmxlKCk7DQotCX0NCi0NCi0JcHVibGljIENvbnRyb2wgZ2V0TGFzdExpbmsoKSB7DQotCQlyZXR1cm4gbGFzdEFjdGl2YXRlZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgew0KLQl9DQotDQotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsNCi0JCWlmIChlLmJ1dHRvbiA9PSAxKQ0KLQkJCXJldHVybjsNCi0JCWxhc3RBY3RpdmF0ZWQgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCX0NCi0JcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsNCi0JCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBlLndpZGdldDsNCi0JCWxpbmtFbnRlcmVkKGNvbnRyb2wpOw0KLQl9DQotCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsNCi0JCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBlLndpZGdldDsNCi0JCWxpbmtFeGl0ZWQoY29udHJvbCk7DQotCX0NCi0JcHVibGljIHZvaWQgbW91c2VIb3ZlcihNb3VzZUV2ZW50IGUpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgew0KLQkJaWYgKGUuYnV0dG9uICE9IDEpDQotCQkJcmV0dXJuOw0KLQkJQ29udHJvbCBsaW5rQ29udHJvbCA9IChDb250cm9sKSBlLndpZGdldDsNCi0JCVBvaW50IHNpemUgPSBsaW5rQ29udHJvbC5nZXRTaXplKCk7DQotCQkvLyBGaWx0ZXIgb3V0IG1vdXNlIHVwIGV2ZW50cyBvdXRzaWRlDQotCQkvLyB0aGUgbGluay4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gbW91c2UgaXMNCi0JCS8vIGNsaWNrZWQsIGRyYWdnZWQgb3V0c2lkZSB0aGUgbGluaywgdGhlbg0KLQkJLy8gcmVsZWFzZWQuDQotCQlpZiAoZS54IDwgMCkNCi0JCQlyZXR1cm47DQotCQlpZiAoZS55IDwgMCkNCi0JCQlyZXR1cm47DQotCQlpZiAoZS54ID49IHNpemUueCkNCi0JCQlyZXR1cm47DQotCQlpZiAoZS55ID49IHNpemUueSkNCi0JCQlyZXR1cm47DQotCQlsaW5rQWN0aXZhdGVkKGxpbmtDb250cm9sKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJQ29udHJvbCBsaW5rID0gKENvbnRyb2wpIGUud2lkZ2V0Ow0KLQkJbGlua0FjdGl2YXRlZChsaW5rKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQlDb250cm9sIGxpbmsgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCQlTZWxlY3RhYmxlRm9ybUxhYmVsIGwgPSAoU2VsZWN0YWJsZUZvcm1MYWJlbCkgbGluazsNCi0JCWlmIChsLmdldFNlbGVjdGlvbigpKQ0KLQkJCWxpbmtFbnRlcmVkKGxpbmspOw0KLQkJZWxzZQ0KLQkJCWxpbmtFeGl0ZWQobGluayk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7DQotCQlJSHlwZXJsaW5rTGlzdGVuZXIgYWN0aW9uID0NCi0JCQkoSUh5cGVybGlua0xpc3RlbmVyKSBoeXBlcmxpbmtMaXN0ZW5lcnMuZ2V0KGxpbmspOw0KLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7DQotCQkJbGluay5zZXRDdXJzb3IoZ2V0QnVzeUN1cnNvcigpKTsNCi0JCQlhY3Rpb24ubGlua0FjdGl2YXRlZChsaW5rKTsNCi0JCQlpZiAoIWxpbmsuaXNEaXNwb3NlZCgpKQ0KLQkJCQlsaW5rLnNldEN1cnNvcigNCi0JCQkJCWlzSHlwZXJsaW5rQ3Vyc29yVXNlZCgpID8gZ2V0SHlwZXJsaW5rQ3Vyc29yKCkgOiBudWxsKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgbGlua0VudGVyZWQoQ29udHJvbCBsaW5rKSB7DQotCQlpZiAobGFzdEVudGVyZWQgIT0gbnVsbA0KLQkJCSYmIGxhc3RFbnRlcmVkIGluc3RhbmNlb2YgU2VsZWN0YWJsZUZvcm1MYWJlbCkgew0KLQkJCVNlbGVjdGFibGVGb3JtTGFiZWwgZmwgPSAoU2VsZWN0YWJsZUZvcm1MYWJlbCkgbGFzdEVudGVyZWQ7DQotCQkJbGlua0V4aXRlZChmbCk7DQotCQl9DQotCQlpZiAoaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkpDQotCQkJbGluay5zZXRDdXJzb3IoZ2V0SHlwZXJsaW5rQ3Vyc29yKCkpOw0KLQkJaWYgKGFjdGl2ZUJhY2tncm91bmQgIT0gbnVsbCkNCi0JCQlsaW5rLnNldEJhY2tncm91bmQoYWN0aXZlQmFja2dyb3VuZCk7DQotCQlpZiAoYWN0aXZlRm9yZWdyb3VuZCAhPSBudWxsKQ0KLQkJCWxpbmsuc2V0Rm9yZWdyb3VuZChhY3RpdmVGb3JlZ3JvdW5kKTsNCi0JCWlmIChoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID09IFVOREVSTElORV9ST0xMT1ZFUikNCi0JCQl1bmRlcmxpbmUobGluaywgdHJ1ZSk7DQotDQotCQlJSHlwZXJsaW5rTGlzdGVuZXIgYWN0aW9uID0NCi0JCQkoSUh5cGVybGlua0xpc3RlbmVyKSBoeXBlcmxpbmtMaXN0ZW5lcnMuZ2V0KGxpbmspOw0KLQkJaWYgKGFjdGlvbiAhPSBudWxsKQ0KLQkJCWFjdGlvbi5saW5rRW50ZXJlZChsaW5rKTsNCi0JCWxhc3RFbnRlcmVkID0gbGluazsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgbGlua0V4aXRlZChDb250cm9sIGxpbmspIHsNCi0JCWlmIChpc0h5cGVybGlua0N1cnNvclVzZWQoKSkNCi0JCQlsaW5rLnNldEN1cnNvcihudWxsKTsNCi0JCWlmIChoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID09IFVOREVSTElORV9ST0xMT1ZFUikNCi0JCQl1bmRlcmxpbmUobGluaywgZmFsc2UpOw0KLQkJaWYgKGJhY2tncm91bmQgIT0gbnVsbCkNCi0JCQlsaW5rLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7DQotCQlpZiAoZm9yZWdyb3VuZCAhPSBudWxsKQ0KLQkJCWxpbmsuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsNCi0JCUlIeXBlcmxpbmtMaXN0ZW5lciBhY3Rpb24gPQ0KLQkJCShJSHlwZXJsaW5rTGlzdGVuZXIpIGh5cGVybGlua0xpc3RlbmVycy5nZXQobGluayk7DQotCQlpZiAoYWN0aW9uICE9IG51bGwpDQotCQkJYWN0aW9uLmxpbmtFeGl0ZWQobGluayk7DQotCQlpZiAobGFzdEVudGVyZWQgPT0gbGluaykNCi0JCQlsYXN0RW50ZXJlZCA9IG51bGw7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgew0KLQkJQ29udHJvbCBsYWJlbCA9IChDb250cm9sKSBlLndpZGdldDsNCi0JCWlmIChoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID09IFVOREVSTElORV9BTFdBWVMpDQotCQkJSHlwZXJsaW5rSGFuZGxlci51bmRlcmxpbmUobGFiZWwsIHRydWUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVySHlwZXJsaW5rKA0KLQkJQ29udHJvbCBjb250cm9sLA0KLQkJSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlpZiAoYmFja2dyb3VuZCAhPSBudWxsKQ0KLQkJCWNvbnRyb2wuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsNCi0JCWlmIChmb3JlZ3JvdW5kICE9IG51bGwpDQotCQkJY29udHJvbC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOw0KLQkJY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOw0KLQkJY29udHJvbC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIodGhpcyk7DQotDQotCQlpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfQUxXQVlTDQotCQkJJiYgY29udHJvbCBpbnN0YW5jZW9mIExhYmVsKQ0KLQkJCWNvbnRyb2wuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsNCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgU2VsZWN0YWJsZUZvcm1MYWJlbCkgew0KLQkJCVNlbGVjdGFibGVGb3JtTGFiZWwgc2wgPSAoU2VsZWN0YWJsZUZvcm1MYWJlbCkgY29udHJvbDsNCi0JCQlzbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsNCi0JCQlpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfQUxXQVlTKQ0KLQkJCQlzbC5zZXRVbmRlcmxpbmVkKHRydWUpOw0KLQkJfQ0KLQkJaHlwZXJsaW5rTGlzdGVuZXJzLnB1dChjb250cm9sLCBsaXN0ZW5lcik7DQotCQlyZW1vdmVEaXNwb3NlZExpbmtzKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZURpc3Bvc2VkTGlua3MoKSB7DQotCQlmb3IgKEVudW1lcmF0aW9uIGtleXMgPSBoeXBlcmxpbmtMaXN0ZW5lcnMua2V5cygpOw0KLQkJCWtleXMuaGFzTW9yZUVsZW1lbnRzKCk7DQotCQkJKSB7DQotCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIGtleXMubmV4dEVsZW1lbnQoKTsNCi0JCQlpZiAoY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsNCi0JCQkJaHlwZXJsaW5rTGlzdGVuZXJzLnJlbW92ZShjb250cm9sKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7DQotCQloeXBlcmxpbmtMaXN0ZW5lcnMuY2xlYXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZXJsaW5lKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBpbnNpZGUpIHsNCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgU2VsZWN0YWJsZUZvcm1MYWJlbCkgew0KLQkJCVNlbGVjdGFibGVGb3JtTGFiZWwgbCA9IChTZWxlY3RhYmxlRm9ybUxhYmVsKSBjb250cm9sOw0KLQkJCWwuc2V0VW5kZXJsaW5lZChpbnNpZGUpOw0KLQkJCWwucmVkcmF3KCk7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJaWYgKCEoY29udHJvbCBpbnN0YW5jZW9mIExhYmVsKSkNCi0JCQlyZXR1cm47DQotCQlDb21wb3NpdGUgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsNCi0JCVJlY3RhbmdsZSBib3VuZHMgPSBjb250cm9sLmdldEJvdW5kcygpOw0KLQkJR0MgZ2MgPSBuZXcgR0MocGFyZW50KTsNCi0JCUNvbG9yIGNvbG9yID0NCi0JCQlpbnNpZGUgPyBjb250cm9sLmdldEZvcmVncm91bmQoKSA6IGNvbnRyb2wuZ2V0QmFja2dyb3VuZCgpOw0KLQkJZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7DQotCQlpbnQgeSA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDsNCi0JCWdjLmRyYXdMaW5lKGJvdW5kcy54LCB5LCBib3VuZHMueCArIGJvdW5kcy53aWR0aCwgeSk7DQotCQlnYy5kaXNwb3NlKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChDb2xvciBjb2xvcikgew0KLQkJc3VwZXIuc2V0Rm9yZWdyb3VuZChjb2xvcik7DQotCQlyZW1vdmVEaXNwb3NlZExpbmtzKCk7DQotCQlmb3IgKEVudW1lcmF0aW9uIGxpbmtzID0gaHlwZXJsaW5rTGlzdGVuZXJzLmtleXMoKTsNCi0JCQlsaW5rcy5oYXNNb3JlRWxlbWVudHMoKTsNCi0JCQkpIHsNCi0JCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgbGlua3MubmV4dEVsZW1lbnQoKTsNCi0JCQljb250cm9sLnNldEZvcmVncm91bmQoY29sb3IpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtTZXR0aW5ncy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0h5cGVybGlua1NldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMWM2YTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0h5cGVybGlua1NldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7DQotDQotcHVibGljIGNsYXNzIEh5cGVybGlua1NldHRpbmdzIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FX05FVkVSID0gMTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FX1JPTExPVkVSID0gMjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FX0FMV0FZUyA9IDM7DQotDQotCXByb3RlY3RlZCBib29sZWFuIGh5cGVybGlua0N1cnNvclVzZWQgPSB0cnVlOw0KLQlwcm90ZWN0ZWQgaW50IGh5cGVybGlua1VuZGVybGluZU1vZGUgPSBVTkRFUkxJTkVfQUxXQVlTOw0KLQlwcm90ZWN0ZWQgQ29sb3IgYmFja2dyb3VuZDsNCi0JcHJvdGVjdGVkIENvbG9yIGZvcmVncm91bmQ7DQotCXByb3RlY3RlZCBDb2xvciBhY3RpdmVCYWNrZ3JvdW5kOw0KLQlwcm90ZWN0ZWQgQ29sb3IgYWN0aXZlRm9yZWdyb3VuZDsNCi0JcHJvdGVjdGVkIHN0YXRpYyBDdXJzb3JzIGN1cnNvcnMgPSBuZXcgQ3Vyc29ycygpOw0KLQ0KLQlzdGF0aWMgY2xhc3MgQ3Vyc29ycyB7DQotCQlDdXJzb3IgaHlwZXJsaW5rQ3Vyc29yOw0KLQkJQ3Vyc29yIGJ1c3lDdXJzb3I7DQotCQlDdXJzb3IgdGV4dEN1cnNvcjsNCi0JCWludCBjb3VudGVyID0gMDsNCi0NCi0JCXB1YmxpYyB2b2lkIGFsbG9jYXRlKCkgew0KLQkJCWlmIChjb3VudGVyID09IDApIHsNCi0JCQkJaHlwZXJsaW5rQ3Vyc29yID0NCi0JCQkJCW5ldyBDdXJzb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIFNXVC5DVVJTT1JfSEFORCk7DQotCQkJCWJ1c3lDdXJzb3IgPSBuZXcgQ3Vyc29yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBTV1QuQ1VSU09SX1dBSVQpOw0KLQkJCQl0ZXh0Q3Vyc29yID0gbmV3IEN1cnNvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgU1dULkNVUlNPUl9JQkVBTSk7DQotCQkJfQ0KLQkJCWNvdW50ZXIrKzsNCi0JCX0NCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkJY291bnRlci0tOw0KLQkJCWlmIChjb3VudGVyID09IDApIHsNCi0JCQkJaHlwZXJsaW5rQ3Vyc29yLmRpc3Bvc2UoKTsNCi0JCQkJYnVzeUN1cnNvci5kaXNwb3NlKCk7DQotCQkJCXRleHRDdXJzb3IuZGlzcG9zZSgpOw0KLQkJCQloeXBlcmxpbmtDdXJzb3IgPSBudWxsOw0KLQkJCQlidXN5Q3Vyc29yID0gbnVsbDsNCi0JCQkJdGV4dEN1cnNvciA9IG51bGw7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBIeXBlcmxpbmtTZXR0aW5ncygpIHsNCi0JCWN1cnNvcnMuYWxsb2NhdGUoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJaWYgKGN1cnNvcnMgIT0gbnVsbCkNCi0JCQljdXJzb3JzLmRpc3Bvc2UoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgQ29sb3IgZ2V0QWN0aXZlQmFja2dyb3VuZCgpIHsNCi0JCXJldHVybiBhY3RpdmVCYWNrZ3JvdW5kOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRBY3RpdmVGb3JlZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGFjdGl2ZUZvcmVncm91bmQ7DQotCX0NCi0JcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoKSB7DQotCQlyZXR1cm4gYmFja2dyb3VuZDsNCi0JfQ0KLQlwdWJsaWMgQ3Vyc29yIGdldEJ1c3lDdXJzb3IoKSB7DQotCQlyZXR1cm4gY3Vyc29ycy5idXN5Q3Vyc29yOw0KLQl9DQotCXB1YmxpYyBDdXJzb3IgZ2V0VGV4dEN1cnNvcigpIHsNCi0JCXJldHVybiBjdXJzb3JzLnRleHRDdXJzb3I7DQotCX0NCi0JcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoKSB7DQotCQlyZXR1cm4gZm9yZWdyb3VuZDsNCi0JfQ0KLQlwdWJsaWMgQ3Vyc29yIGdldEh5cGVybGlua0N1cnNvcigpIHsNCi0JCXJldHVybiBjdXJzb3JzLmh5cGVybGlua0N1cnNvcjsNCi0JfQ0KLQlwdWJsaWMgaW50IGdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKSB7DQotCQlyZXR1cm4gaHlwZXJsaW5rVW5kZXJsaW5lTW9kZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0h5cGVybGlua0N1cnNvclVzZWQoKSB7DQotCQlyZXR1cm4gaHlwZXJsaW5rQ3Vyc29yVXNlZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVCYWNrZ3JvdW5kKENvbG9yIG5ld0FjdGl2ZUJhY2tncm91bmQpIHsNCi0JCWFjdGl2ZUJhY2tncm91bmQgPSBuZXdBY3RpdmVCYWNrZ3JvdW5kOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUZvcmVncm91bmQoQ29sb3IgbmV3QWN0aXZlRm9yZWdyb3VuZCkgew0KLQkJYWN0aXZlRm9yZWdyb3VuZCA9IG5ld0FjdGl2ZUZvcmVncm91bmQ7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChDb2xvciBuZXdCYWNrZ3JvdW5kKSB7DQotCQliYWNrZ3JvdW5kID0gbmV3QmFja2dyb3VuZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kKENvbG9yIG5ld0ZvcmVncm91bmQpIHsNCi0JCWZvcmVncm91bmQgPSBuZXdGb3JlZ3JvdW5kOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0N1cnNvclVzZWQoYm9vbGVhbiBuZXdIeXBlcmxpbmtDdXJzb3JVc2VkKSB7DQotCQloeXBlcmxpbmtDdXJzb3JVc2VkID0gbmV3SHlwZXJsaW5rQ3Vyc29yVXNlZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKGludCBuZXdIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKSB7DQotCQloeXBlcmxpbmtVbmRlcmxpbmVNb2RlID0gbmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjYxNDg1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtIHsNCi1wdWJsaWMgdm9pZCBjb21taXRDaGFuZ2VzKGJvb2xlYW4gb25TYXZlKTsNCi1wdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpOw0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsNCi1wdWJsaWMgYm9vbGVhbiBkb0dsb2JhbEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpOw0KLXB1YmxpYyB2b2lkIGV4cGFuZFRvKE9iamVjdCBvYmplY3QpOw0KLXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKTsNCi1wdWJsaWMgRm9ybVdpZGdldEZhY3RvcnkgZ2V0RmFjdG9yeSgpOw0KLXB1YmxpYyBDb2xvciBnZXRIZWFkaW5nQmFja2dyb3VuZCgpOw0KLXB1YmxpYyBDb2xvciBnZXRIZWFkaW5nRm9yZWdyb3VuZCgpOw0KLXB1YmxpYyBJbWFnZSBnZXRIZWFkaW5nSW1hZ2UoKTsNCi1wdWJsaWMgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCk7DQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbW9kZWwpOw0KLXB1YmxpYyBib29sZWFuIGlzSGVhZGluZ1Zpc2libGUoKTsNCi1wdWJsaWMgdm9pZCByZWdpc3RlclNlY3Rpb24oRm9ybVNlY3Rpb24gc2VjdGlvbik7DQotcHVibGljIHZvaWQgc2V0Rm9jdXMoKTsNCi1wdWJsaWMgdm9pZCBzZXRIZWFkaW5nQmFja2dyb3VuZChDb2xvciBuZXdIZWFkaW5nQmFja2dyb3VuZCk7DQotcHVibGljIHZvaWQgc2V0SGVhZGluZ0ZvcmVncm91bmQoQ29sb3IgbmV3SGVhZGluZ0ZvcmVncm91bmQpOw0KLXB1YmxpYyB2b2lkIHNldEhlYWRpbmdJbWFnZShJbWFnZSBoZWFkaW5nSW1hZ2UpOw0KLXB1YmxpYyB2b2lkIHNldEhlYWRpbmdWaXNpYmxlKGJvb2xlYW4gbmV3SGVhZGluZ1Zpc2libGUpOw0KLXB1YmxpYyB2b2lkIHNldEhlYWRpbmdUZXh0KFN0cmluZyBoZWFkaW5nKTsNCi1wdWJsaWMgdm9pZCB1cGRhdGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM5NTk4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtUGFnZSB7DQotDQotYm9vbGVhbiBiZWNvbWVzSW52aXNpYmxlKElGb3JtUGFnZSBuZXdQYWdlKTsNCi12b2lkIGJlY29tZXNWaXNpYmxlKElGb3JtUGFnZSBwcmV2aW91c1BhZ2UpOw0KLXZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsNCi1Db250cm9sIGdldENvbnRyb2woKTsNCi1TdHJpbmcgZ2V0TGFiZWwoKTsNCi1TdHJpbmcgZ2V0VGl0bGUoKTsNCi1ib29sZWFuIGlzU291cmNlKCk7DQotYm9vbGVhbiBpc1Zpc2libGUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVNlbGVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMzRkNDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtU2VsZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtU2VsZWN0aW9uTGlzdGVuZXIgew0KLQlwdWJsaWMgdm9pZCBmb3JtU2VsZWN0ZWQoSUZvcm1QYWdlIHBhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1UZXh0TGlzdGVuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVRleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzdmNzE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVRleHRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUZvcm1UZXh0TGlzdGVuZXIgew0KLQlwdWJsaWMgdm9pZCB0ZXh0VmFsdWVDaGFuZ2VkKEZvcm1FbnRyeSB0ZXh0KTsNCi0JcHVibGljIHZvaWQgdGV4dERpcnR5KEZvcm1FbnRyeSB0ZXh0KTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtV29ya2Jvb2suamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVdvcmtib29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTc4YWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtV29ya2Jvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtV29ya2Jvb2sgew0KLQ0KLQl2b2lkIGFkZEZvcm1TZWxlY3Rpb25MaXN0ZW5lcihJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsNCi0JcHVibGljIHZvaWQgYWRkUGFnZShJRm9ybVBhZ2UgcGFnZSk7DQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7DQotCUNvbnRyb2wgZ2V0Q29udHJvbCgpOw0KLQlwdWJsaWMgSUZvcm1QYWdlIGdldEN1cnJlbnRQYWdlKCk7DQotCWJvb2xlYW4gaXNGaXJzdFBhZ2VTZWxlY3RlZCgpOw0KLQl2b2lkIHJlbW92ZUZvcm1TZWxlY3Rpb25MaXN0ZW5lcihJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsNCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFnZShJRm9ybVBhZ2UgcGFnZSk7DQotCXB1YmxpYyB2b2lkIHNlbGVjdFBhZ2UoZmluYWwgSUZvcm1QYWdlIHBhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpOw0KLQl2b2lkIHNldEZpcnN0UGFnZVNlbGVjdGVkKGJvb2xlYW4gc2VsZWN0ZWQpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUh5cGVybGlua0xpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUh5cGVybGlua0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OWFmMzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lIeXBlcmxpbmtMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUh5cGVybGlua0xpc3RlbmVyIHsNCi0NCi1wdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGlua0xhYmVsKTsNCi1wdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChDb250cm9sIGxpbmtMYWJlbCk7DQotcHVibGljIHZvaWQgbGlua0V4aXRlZChDb250cm9sIGxpbmtMYWJlbCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JTGF5b3V0RXh0ZW5zaW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUxheW91dEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQ5NDdiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JTGF5b3V0RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBDbGFzc2VzIHRoYXQgZXh0ZW5kIGFic3RyYWN0IGNsYXNzIExheW91dCBhbmQgaW1wbGVtZW50Ci0gKiB0aGlzIGludGVyZmFjZSBjYW4gdGFrZSBwYXJ0IGluIGxheW91dCBjb21wdXRhdGlvbiBvZgotICogdGhlIEhUTUxUYWJsZUxheW91dCBtYW5hZ2VyLiBUaGUgc2FpZCBsYXlvdXQgdXNlcwotICogYWx0ZXJuYXRpdmUgYWxnb3JpdGhtIHRoYXQgY29tcHV0ZXMgY29sdW1ucyBiZWZvcmUgcm93cy4KLSAqIEl0IGFsbG93cyBpdCB0byAnZmxvdycgd3JhcHBlZCB0ZXh0IHByb3BvcnRpb25hbGx5Ci0gKiAoYXMgaW4gdGhlIHBvcHVsYXIgd2ViIGJyb3dzZXJzKS4gQ3VzdG9tIGxheW91dCBtYW5hZ2VycwotICogdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgYWxsb3cgcmVjdXJzaXZlIHJlZmxvdwotICogdG8gYmUgcGVyZm9ybWVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMYXlvdXRFeHRlbnNpb24gewotCXB1YmxpYyBpbnQgZ2V0TWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCk7Ci0JcHVibGljIGludCBnZXRNYXhpbXVtV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKTsgCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvTm9UYWJzV29ya2Jvb2suamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Ob1RhYnNXb3JrYm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzU1NTAxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Ob1RhYnNXb3JrYm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsNCi0NCi1wdWJsaWMgY2xhc3MgTm9UYWJzV29ya2Jvb2sgaW1wbGVtZW50cyBJRm9ybVdvcmtib29rIHsNCi0JcHJpdmF0ZSBWZWN0b3IgcGFnZXM7DQotCXByaXZhdGUgYm9vbGVhbiBmaXJzdFBhZ2VTZWxlY3RlZCA9IHRydWU7DQotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7DQotCXByaXZhdGUgVmVjdG9yIGxpc3RlbmVycyA9IG5ldyBWZWN0b3IoKTsNCi0JcHJpdmF0ZSBJRm9ybVBhZ2UgY3VycmVudFBhZ2U7DQotDQotCXB1YmxpYyBOb1RhYnNXb3JrYm9vaygpIHsNCi0JCXBhZ2VzID0gbmV3IFZlY3RvcigpOw0KLQl9DQotCXB1YmxpYyB2b2lkIGFkZEZvcm1TZWxlY3Rpb25MaXN0ZW5lcihJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlsaXN0ZW5lcnMuYWRkRWxlbWVudChsaXN0ZW5lcik7DQotCX0NCi0JcHVibGljIHZvaWQgYWRkUGFnZShJRm9ybVBhZ2UgcGFnZSkgew0KLQkJcGFnZXMuYWRkKHBhZ2UpOw0KLQ0KLQkJaWYgKGZpcnN0UGFnZVNlbGVjdGVkICYmIGN1cnJlbnRQYWdlID09IG51bGwpDQotCQkJc2VsZWN0UGFnZShwYWdlLCB0cnVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5VTEwpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZChJRm9ybVBhZ2UgcGFnZSwgYm9vbGVhbiBzZXRGb2N1cykgew0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCUlGb3JtU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lcikgaXRlci5uZXh0KCk7DQotCQkJbGlzdGVuZXIuZm9ybVNlbGVjdGVkKHBhZ2UsIHNldEZvY3VzKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIElGb3JtUGFnZSBbXSBnZXRQYWdlcygpIHsNCi0JCXJldHVybiAoSUZvcm1QYWdlW10pcGFnZXMudG9BcnJheShuZXcgSUZvcm1QYWdlW3BhZ2VzLnNpemUoKV0pOw0KLQl9DQotDQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7DQotCQlyZXR1cm4gcGFnZUJvb2s7DQotCX0NCi0NCi0JcHVibGljIElGb3JtUGFnZSBnZXRDdXJyZW50UGFnZSgpIHsNCi0JCXJldHVybiBjdXJyZW50UGFnZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0UGFnZVNlbGVjdGVkKCkgew0KLQkJcmV0dXJuIGZpcnN0UGFnZVNlbGVjdGVkOw0KLQl9DQotCXB1YmxpYyB2b2lkIHJlbW92ZUZvcm1TZWxlY3Rpb25MaXN0ZW5lcihJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlsaXN0ZW5lcnMucmVtb3ZlRWxlbWVudChsaXN0ZW5lcik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcmVtb3ZlUGFnZShJRm9ybVBhZ2UgcGFnZSkgew0KLQkJaWYgKHBhZ2VzLmNvbnRhaW5zKHBhZ2UpKSB7DQotCQkJQ29udHJvbCBjID0gcGFnZS5nZXRDb250cm9sKCk7DQotCQkJaWYgKGMhPW51bGwgJiYgIWMuaXNEaXNwb3NlZCgpKQ0KLQkJCQljLmRpc3Bvc2UoKTsNCi0JCQlwYWdlcy5yZW1vdmUocGFnZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2VsZWN0UGFnZShmaW5hbCBJRm9ybVBhZ2UgcGFnZSwgZmluYWwgYm9vbGVhbiBzZXRGb2N1cykgew0KLQkJZmluYWwgSUZvcm1QYWdlIG9sZFBhZ2UgPSBjdXJyZW50UGFnZTsNCi0JCWN1cnJlbnRQYWdlID0gcGFnZTsNCi0NCi0JCWlmIChwYWdlQm9vayAhPSBudWxsKSB7DQotDQotCQkJLy8gSXQgbWF5IHRha2UgYSB3aGlsZQ0KLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHBhZ2VCb29rLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgew0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCQlzd2l0Y2hQYWdlcyhvbGRQYWdlLCBwYWdlLCBzZXRGb2N1cyk7DQotCQkJCX0NCi0JCQl9KTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRGaXJzdFBhZ2VTZWxlY3RlZChib29sZWFuIG5ld0ZpcnN0UGFnZVNlbGVjdGVkKSB7DQotCQlmaXJzdFBhZ2VTZWxlY3RlZCA9IG5ld0ZpcnN0UGFnZVNlbGVjdGVkOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzd2l0Y2hQYWdlcyhJRm9ybVBhZ2Ugb2xkUGFnZSwgSUZvcm1QYWdlIG5ld1BhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpIHsNCi0JCWlmIChvbGRQYWdlICE9IG51bGwgJiYgb2xkUGFnZSAhPSBuZXdQYWdlKSB7DQotCQkJb2xkUGFnZS5iZWNvbWVzSW52aXNpYmxlKG5ld1BhZ2UpOw0KLQkJfQ0KLQkJaWYgKG5ld1BhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwpDQotCQkJbmV3UGFnZS5jcmVhdGVDb250cm9sKHBhZ2VCb29rKTsNCi0JCXBhZ2VCb29rLnNob3dQYWdlKG5ld1BhZ2UuZ2V0Q29udHJvbCgpKTsNCi0NCi0JCW5ld1BhZ2UuYmVjb21lc1Zpc2libGUob2xkUGFnZSk7DQotCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChuZXdQYWdlLCBzZXRGb2N1cyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1Njcm9sbGFibGVTZWN0aW9uRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1Njcm9sbGFibGVTZWN0aW9uRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWJkMWZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TY3JvbGxhYmxlU2VjdGlvbkZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7DQotDQotLyoqDQotICogVGhpcyB2ZXJzaW9uIG9mIHRoZSBzZWN0aW9uIGZvcm0gYWRkcyBzY3JvbGxpbmcNCi0gKiBjYXBhYmlsaXR5LiBIb3dldmVyLCBzY3JvbGxpbmcgY2FuIGJlIGRpc2FibGVkDQotICogdXNpbmcgJ3NldFNjcm9sbGFibGUnIG1ldGhvZC4gRm9yIHRoaXMgcmVhc29uLA0KLSAqIHRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgU2VjdGlvbkZvcm0uDQotICovDQotDQotcHVibGljIGNsYXNzIFNjcm9sbGFibGVTZWN0aW9uRm9ybSBleHRlbmRzIFNlY3Rpb25Gb3JtIHsNCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOw0KLQlwcml2YXRlIGJvb2xlYW4gdmVydGljYWxGaXQ7DQotCXByaXZhdGUgYm9vbGVhbiBzY3JvbGxhYmxlID0gdHJ1ZTsNCi0NCi0JcHVibGljIFNjcm9sbGFibGVTZWN0aW9uRm9ybSgpIHsNCi0JfQ0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCWNvbnRhaW5lciA9IGNyZWF0ZVBhcmVudChwYXJlbnQpOw0KLQkJQ29udHJvbCBmb3JtQ29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRyb2woY29udGFpbmVyKTsNCi0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgew0KLQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb250YWluZXI7DQotCQkJc2Muc2V0Q29udGVudChmb3JtQ29udHJvbCk7DQotCQl9DQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOw0KLQkJZm9ybUNvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7DQotCQljb250YWluZXIuc2V0QmFja2dyb3VuZChmb3JtQ29udHJvbC5nZXRCYWNrZ3JvdW5kKCkpOw0KLQkJcmV0dXJuIGNvbnRhaW5lcjsNCi0JfQ0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVBhcmVudChDb21wb3NpdGUgcGFyZW50KSB7DQotCQlDb21wb3NpdGUgcmVzdWx0ID0gbnVsbDsNCi0JCWlmIChpc1Njcm9sbGFibGUoKSkgew0KLQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjb21wID0NCi0JCQkJbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsNCi0JCQlpZiAoaXNWZXJ0aWNhbEZpdCgpKSB7DQotCQkJCXNjb21wLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7DQotCQkJCXNjb21wLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOw0KLQkJCX0NCi0JCQlpbml0aWFsaXplU2Nyb2xsQmFycyhzY29tcCk7DQotCQkJcmVzdWx0ID0gc2NvbXA7DQotCQl9IGVsc2Ugew0KLQkJCXJlc3VsdCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOw0KLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7DQotCQkJcmVzdWx0LnNldExheW91dChsYXlvdXQpOw0KLQkJfQ0KLQkJcmVzdWx0LnNldE1lbnUocGFyZW50LmdldE1lbnUoKSk7DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzU2Nyb2xsYWJsZSgpIHsNCi0JCXJldHVybiBzY3JvbGxhYmxlOw0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzVmVydGljYWxGaXQoKSB7DQotCQlyZXR1cm4gdmVydGljYWxGaXQ7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0U2Nyb2xsYWJsZShib29sZWFuIG5ld1Njcm9sbGFibGUpIHsNCi0JCXNjcm9sbGFibGUgPSBuZXdTY3JvbGxhYmxlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFZlcnRpY2FsRml0KGJvb2xlYW4gbmV3VmVydGljYWxGaXQpIHsNCi0JCXZlcnRpY2FsRml0ID0gbmV3VmVydGljYWxGaXQ7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTY3JvbGxCYXJzKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wKSB7DQotCQlTY3JvbGxCYXIgaGJhciA9IHNjb21wLmdldEhvcml6b250YWxCYXIoKTsNCi0JCWlmIChoYmFyICE9IG51bGwpIHsNCi0JCQloYmFyLnNldEluY3JlbWVudChIX1NDUk9MTF9JTkNSRU1FTlQpOw0KLQkJfQ0KLQkJU2Nyb2xsQmFyIHZiYXIgPSBzY29tcC5nZXRWZXJ0aWNhbEJhcigpOw0KLQkJaWYgKHZiYXIgIT0gbnVsbCkgew0KLQkJCXZiYXIuc2V0SW5jcmVtZW50KFZfU0NST0xMX0lOQ1JFTUVOVCk7DQotCQl9DQotCQl1cGRhdGVQYWdlSW5jcmVtZW50KHNjb21wKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7DQotCQlzdXBlci51cGRhdGUoKTsNCi0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgew0KLQkJCXVwZGF0ZVNjcm9sbGVkQ29tcG9zaXRlKCk7DQotCQl9IGVsc2Ugew0KLQkJCWNvbnRhaW5lci5sYXlvdXQodHJ1ZSk7DQotCQl9DQotCX0NCi0JcHVibGljIHZvaWQgdXBkYXRlU2Nyb2xsQmFycygpIHsNCi0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgew0KLQkJCXVwZGF0ZVNjcm9sbGVkQ29tcG9zaXRlKCk7DQotCQl9DQotCX0NCi0JcHVibGljIHZvaWQgdXBkYXRlU2Nyb2xsZWRDb21wb3NpdGUoKSB7DQotCQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IChTY3JvbGxlZENvbXBvc2l0ZSkgY29udGFpbmVyOw0KLQkJQ29udHJvbCBmb3JtQ29udHJvbCA9IGdldENvbnRyb2woKTsNCi0JCVBvaW50IG5ld1NpemUgPSBmb3JtQ29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOw0KLQkJZm9ybUNvbnRyb2wuc2V0U2l6ZShuZXdTaXplKTsNCi0JCXNjLnNldE1pblNpemUobmV3U2l6ZSk7DQotCQl1cGRhdGVQYWdlSW5jcmVtZW50KHNjKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VjdGlvbkNoYW5nZU1hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWN0aW9uQ2hhbmdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQzMDFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWN0aW9uQ2hhbmdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkNoYW5nZU1hbmFnZXIgew0KLQlIYXNodGFibGUgc291cmNlcyA9IG5ldyBIYXNodGFibGUoKTsNCi0NCi0JcHVibGljIFNlY3Rpb25DaGFuZ2VNYW5hZ2VyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBkaXNwYXRjaE5vdGlmaWNhdGlvbigNCi0JCUZvcm1TZWN0aW9uIHNvdXJjZSwNCi0JCWludCB0eXBlLA0KLQkJT2JqZWN0IGNoYW5nZU9iamVjdCkgew0KLQkJVmVjdG9yIHRhcmdldHMgPSAoVmVjdG9yKSBzb3VyY2VzLmdldChzb3VyY2UpOw0KLQkJaWYgKHRhcmdldHMgIT0gbnVsbCkgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJCUZvcm1TZWN0aW9uIHNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIGl0ZXIubmV4dCgpOw0KLQkJCQlzZWN0aW9uLnNlY3Rpb25DaGFuZ2VkKHNvdXJjZSwgdHlwZSwgY2hhbmdlT2JqZWN0KTsNCi0JCQl9DQotCQl9DQotCX0NCi0JcHVibGljIHZvaWQgbGlua1NlY3Rpb25zKEZvcm1TZWN0aW9uIHNvdXJjZSwgRm9ybVNlY3Rpb24gdGFyZ2V0KSB7DQotCQlzb3VyY2Uuc2V0TWFuYWdlcih0aGlzKTsNCi0JCVZlY3RvciB0YXJnZXRzID0gbnVsbDsNCi0NCi0JCXRhcmdldHMgPSAoVmVjdG9yKSBzb3VyY2VzLmdldChzb3VyY2UpOw0KLQkJaWYgKHRhcmdldHMgPT0gbnVsbCkgew0KLQkJCXRhcmdldHMgPSBuZXcgVmVjdG9yKCk7DQotCQkJc291cmNlcy5wdXQoc291cmNlLCB0YXJnZXRzKTsNCi0JCX0NCi0JCXRhcmdldHMuYWRkRWxlbWVudCh0YXJnZXQpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWN0aW9uRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlY3Rpb25Gb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjhiNmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlY3Rpb25Gb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgZm9ybSBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgaXQgY29udGFpbnMNCi0gKiBmb3JtIHNlY3Rpb25zIGFuZCB0aGF0IHRoZXkgZmlsbCB1cCB0aGUgc2NyZWVuLg0KLSAqIFR5cGljYWxseSwgdGhlIGZvcm0gY2xpZW50IHdpbGwgdXNlIHVwIHRoZSBlbnRpcmUNCi0gKiBwYXJlbnQgYXJlYSBiZWxvdyB0aGUgaGVhZGluZy4gU2VjdGlvbnMgbXVzdA0KLSAqIGJlIGFibGUgdG8gcmV0dXJuIHRoZWlyIHByZWZlcnJlZCBzaXplIGluIGJvdGgNCi0gKiBkaW1lbnNpb25zLiBJZiB0aGV5IGNvbnRhaW4gd3JhcHBhYmxlIHRleHQsDQotICogV2ViRm9ybSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBTZWN0aW9uRm9ybSBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkZvcm0gaW1wbGVtZW50cyBQYWludExpc3RlbmVyIHsNCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsNCi0JcHJpdmF0ZSBpbnQgVElUTEVfSE1BUkdJTiA9IDEwOw0KLQlwcml2YXRlIGludCBUSVRMRV9WTUFSR0lOID0gNTsNCi0NCi0JY2xhc3MgRm9ybUxheW91dCBleHRlbmRzIExheW91dCB7DQotCQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoDQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSwNCi0JCQlpbnQgd0hpbnQsDQotCQkJaW50IGhIaW50LA0KLQkJCWJvb2xlYW4gZmx1c2hDYWNoZSkgew0KLQkJCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCAmJiBoSGludCAhPSBTV1QuREVGQVVMVCkNCi0JCQkJcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOw0KLQkJCUNvbnRyb2wgY2xpZW50ID0gY29tcG9zaXRlLmdldENoaWxkcmVuKClbMF07DQotCQkJUG9pbnQgY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUod2lkdGhIaW50LCBoZWlnaHRIaW50LCBmbHVzaENhY2hlKTsNCi0JCQlpZiAoaGVhZGluZ1Zpc2libGUpDQotCQkJCWNzaXplLnkgKz0gZ2V0VGl0bGVIZWlnaHQoKTsNCi0JCQlyZXR1cm4gY3NpemU7DQotCQl9DQotCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7DQotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOw0KLQkJCUNvbnRyb2wgY2xpZW50ID0gY29tcG9zaXRlLmdldENoaWxkcmVuKClbMF07DQotCQkJaWYgKGNsaWVudCAhPSBudWxsICYmICFjbGllbnQuaXNEaXNwb3NlZCgpKSB7DQotCQkJCWludCB0aGVpZ2h0ID0gaGVhZGluZ1Zpc2libGUgPyBnZXRUaXRsZUhlaWdodCgpIDogMDsNCi0JCQkJY2xpZW50LnNldEJvdW5kcygNCi0JCQkJCWNsaWVudEFyZWEueCwNCi0JCQkJCWNsaWVudEFyZWEueSArIHRoZWlnaHQsDQotCQkJCQljbGllbnRBcmVhLndpZHRoLA0KLQkJCQkJY2xpZW50QXJlYS5oZWlnaHQgLSB0aGVpZ2h0KTsNCi0JCQl9DQotCQl9DQotCX0NCi0JcHJpdmF0ZSBpbnQgd2lkdGhIaW50ID0gU1dULkRFRkFVTFQ7DQotCXByaXZhdGUgaW50IGhlaWdodEhpbnQgPSBTV1QuREVGQVVMVDsNCi0NCi0JcHVibGljIFNlY3Rpb25Gb3JtKCkgew0KLQl9DQotDQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJQ29tcG9zaXRlIGNhbnZhcyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQotCQljYW52YXMuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsNCi0JCWNhbnZhcy5zZXRGb3JlZ3JvdW5kKGZhY3RvcnkuZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOw0KLQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIodGhpcyk7DQotCQljYW52YXMuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOw0KLQkJY2FudmFzLnNldE1lbnUocGFyZW50LmdldE1lbnUoKSk7DQotCQlDb21wb3NpdGUgZm9ybVBhcmVudCA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNhbnZhcyk7DQotCQljcmVhdGVGb3JtQ2xpZW50KGZvcm1QYXJlbnQpOw0KLQkJdGhpcy5jb250cm9sID0gY2FudmFzOw0KLQkJLy9jYW52YXMuc2V0Rm9jdXMoKTsNCi0JCXJldHVybiBjYW52YXM7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNsaWVudChDb21wb3NpdGUgcGFyZW50KSB7DQotCQlmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOw0KLQl9DQotDQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7DQotCQlyZXR1cm4gY29udHJvbDsNCi0JfQ0KLQ0KLQlwcml2YXRlIGludCBnZXRUaXRsZUhlaWdodCgpIHsNCi0JCWludCBpbWFnZUhlaWdodCA9IDA7DQotCQlpZiAoaGVhZGluZ0ltYWdlICE9IG51bGwNCi0JCQkmJiBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIm1vdGlmIikgPT0gZmFsc2UpIHsNCi0JCQlpbWFnZUhlaWdodCA9IGhlYWRpbmdJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQ7DQotCQl9DQotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsNCi0JCWdjLnNldEZvbnQodGl0bGVGb250KTsNCi0JCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsNCi0JCWludCBmb250SGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7DQotCQlnYy5kaXNwb3NlKCk7DQotDQotCQlpbnQgaGVpZ2h0ID0gZm9udEhlaWdodCArIFRJVExFX1ZNQVJHSU4gKyBUSVRMRV9WTUFSR0lOOw0KLQkJcmV0dXJuIE1hdGgubWF4KGhlaWdodCwgaW1hZ2VIZWlnaHQpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwYWludChDb250cm9sIGZvcm0sIEdDIGdjKSB7DQotCQlSZWN0YW5nbGUgYm91bmRzID0gZm9ybS5nZXRCb3VuZHMoKTsNCi0JCWludCBoZWlnaHQgPSBnZXRUaXRsZUhlaWdodCgpOw0KLQkJaWYgKGhlYWRpbmdJbWFnZSAhPSBudWxsKSB7DQotCQkJUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaGVhZGluZ0ltYWdlLmdldEJvdW5kcygpOw0KLQkJCWludCB4ID0gYm91bmRzLndpZHRoIC0gaW1hZ2VCb3VuZHMud2lkdGg7DQotCQkJaW50IHkgPSAwOw0KLQkJCS8veCA9IE1hdGgubWF4KHgsIDApOw0KLQkJCXggPSAwOw0KLQkJCWlmIChoZWFkaW5nQmFja2dyb3VuZCAhPSBudWxsKSB7DQotCQkJCWdjLnNldEJhY2tncm91bmQoaGVhZGluZ0JhY2tncm91bmQpOw0KLQkJCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGJvdW5kcy53aWR0aCwgaGVpZ2h0KTsNCi0JCQl9DQotCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygibW90aWYiKSA9PSBmYWxzZSkgew0KLQkJCQlnYy5kcmF3SW1hZ2UoaGVhZGluZ0ltYWdlLCB4LCB5KTsNCi0JCQl9DQotCQkJaWYgKGhlYWRpbmdGb3JlZ3JvdW5kICE9IG51bGwpDQotCQkJCWdjLnNldEZvcmVncm91bmQoaGVhZGluZ0ZvcmVncm91bmQpOw0KLQkJCWVsc2UNCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldEZvcmVncm91bmRDb2xvcigpKTsNCi0JCQlnYy5zZXRGb250KHRpdGxlRm9udCk7DQotCQkJZ2MuZHJhd1RleHQoZ2V0SGVhZGluZ1RleHQoKSwgVElUTEVfSE1BUkdJTiwgVElUTEVfVk1BUkdJTiwgdHJ1ZSk7DQotCQl9IGVsc2Ugew0KLQkJCWdjLnNldEZvbnQodGl0bGVGb250KTsNCi0JCQlnYy5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0Q29sb3IoRm9ybVdpZGdldEZhY3RvcnkuREVGQVVMVF9IRUFERVJfQ09MT1IpKTsNCi0JCQkvL2djLmZpbGxSZWN0YW5nbGUoVElUTEVfSE1BUkdJTiwgVElUTEVfVk1BUkdJTiwgYm91bmRzLndpZHRoLVRJVExFX0hNQVJHSU4qMiwgaGVpZ2h0LVRJVExFX1ZNQVJHSU4qMik7DQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldEZvcmVncm91bmRDb2xvcigpKTsNCi0JCQlnYy5kcmF3VGV4dChnZXRIZWFkaW5nVGV4dCgpLCBUSVRMRV9ITUFSR0lOLCBUSVRMRV9WTUFSR0lOLCB0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgew0KLQkJaWYgKCFoZWFkaW5nVmlzaWJsZSkNCi0JCQlyZXR1cm47DQotCQlHQyBnYyA9IGV2ZW50LmdjOw0KLQkJQ29udHJvbCBmb3JtID0gKENvbnRyb2wpIGV2ZW50LndpZGdldDsNCi0JCXBhaW50KGZvcm0sIGdjKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVmlzaWJsZShib29sZWFuIG5ld0hlYWRpbmdWaXNpYmxlKSB7DQotCQlzdXBlci5zZXRIZWFkaW5nVmlzaWJsZShuZXdIZWFkaW5nVmlzaWJsZSk7DQotCQlpZiAoY29udHJvbCAhPSBudWxsKQ0KLQkJCWNvbnRyb2wubGF5b3V0KHRydWUpOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdUZXh0KFN0cmluZyBoZWFkaW5nVGV4dCkgew0KLQkJc3VwZXIuc2V0SGVhZGluZ1RleHQoaGVhZGluZ1RleHQpOw0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgew0KLQkJCWNvbnRyb2wubGF5b3V0KHRydWUpOw0KLQkJCWNvbnRyb2wucmVkcmF3KCk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgew0KLQkJdGl0bGVGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpOw0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsNCi0JCQljb250cm9sLmxheW91dCh0cnVlKTsNCi0JCQljb250cm9sLnJlZHJhdygpOw0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWxlY3RhYmxlQ29udHJvbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlbGVjdGFibGVDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NzkxMzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlbGVjdGFibGVDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLQ0KLS8qKg0KLSAqIEZvcm1UZXh0IGlzIGEgd2luZG93bGVzcyBjb250cm9sIHRoYXQNCi0gKiBkcmF3cyB0ZXh0IGluIHRoZSBwcm92aWRlZCBjb250ZXh0Lg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3RhYmxlQ29udHJvbCBleHRlbmRzIENhbnZhcyB7DQotCXByaXZhdGUgYm9vbGVhbiBoYXNGb2N1czsNCi0NCi0JcHVibGljIFNlbGVjdGFibGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgew0KLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7DQotCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsNCi0JCQkJcGFpbnQoZSk7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIgKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7DQotCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uKTsNCi0JCQl9DQotCQl9KTsNCi0JCWFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgew0KLQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xyJykgew0KLQkJCQkJLy8gQWN0aXZhdGlvbg0KLQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24pOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lciAoKSB7DQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgew0KLQkJCQlpZiAoZS5kZXRhaWwgIT0gU1dULlRSQVZFUlNFX1JFVFVSTikNCi0JCQkJCWUuZG9pdCA9IHRydWU7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgew0KLQkJCQlpZiAoIWhhc0ZvY3VzKSB7DQotCQkJCSAgIGhhc0ZvY3VzPXRydWU7DQotCQkJCSAgIHJlZHJhdygpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsNCi0JCQkJaWYgKGhhc0ZvY3VzKSB7DQotCQkJCQloYXNGb2N1cz1mYWxzZTsNCi0JCQkJCXJlZHJhdygpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7DQotCQlHQyBnYyA9IGUuZ2M7DQotCQlQb2ludCBzaXplID0gZ2V0U2l6ZSgpOw0KLQkgICAJZ2Muc2V0Rm9udChnZXRGb250KCkpOw0KLQkgICAJcGFpbnQoZ2MpOw0KLQkJaWYgKGhhc0ZvY3VzKSB7DQotCSAgIAkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOw0KLQkgICAJCWdjLmRyYXdGb2N1cygwLCAwLCBzaXplLngsIHNpemUueSk7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBhaW50KEdDIGdjKTsNCi0JDQotCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoaW50IGV2ZW50VHlwZSkgew0KLQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsNCi0JCWV2ZW50LnR5cGUgPSBldmVudFR5cGU7DQotCQlldmVudC53aWRnZXQgPSB0aGlzOw0KLQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50VHlwZSwgZXZlbnQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJY2hlY2tXaWRnZXQgKCk7DQotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgcmV0dXJuOw0KLQkJVHlwZWRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFR5cGVkTGlzdGVuZXIgKGxpc3RlbmVyKTsNCi0JCWFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLHR5cGVkTGlzdGVuZXIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJY2hlY2tXaWRnZXQgKCk7DQotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgcmV0dXJuOw0KLQkJcmVtb3ZlTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VsZWN0YWJsZUZvcm1MYWJlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlbGVjdGFibGVGb3JtTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1ZDVjNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VsZWN0YWJsZUZvcm1MYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi0NCi1wdWJsaWMgY2xhc3MgU2VsZWN0YWJsZUZvcm1MYWJlbCBleHRlbmRzIEZvcm1MYWJlbCB7DQotCXByaXZhdGUgYm9vbGVhbiBoYXNGb2N1czsNCi0NCi0JcHVibGljIGJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkgew0KLQkJcmV0dXJuIGhhc0ZvY3VzOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFNlbGVjdGFibGVGb3JtTGFiZWwNCi0JICovDQotCXB1YmxpYyBTZWxlY3RhYmxlRm9ybUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgew0KLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7DQotCQlhZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsNCi0JCQkJaWYgKGUuY2hhcmFjdGVyID09ICdccicpIHsNCi0JCQkJCS8vIEFjdGl2YXRpb24NCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuRGVmYXVsdFNlbGVjdGlvbik7DQotCQkJCX0NCi0JCQl9DQotCQl9KTsNCi0JCWFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyICgpIHsNCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsNCi0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfTkVYVDoNCi0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfUFJFVklPVVM6DQotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUOg0KLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVM6DQotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46DQotCQkJCQllLmRvaXQgPSBmYWxzZTsNCi0JCQkJCXJldHVybjsNCi0JCQkJfQ0KLQkJCQllLmRvaXQgPSB0cnVlOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsNCi0JCQkJaWYgKCFoYXNGb2N1cykgew0KLQkJCQkgICBoYXNGb2N1cz10cnVlOw0KLQkJCQkgICBub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbik7DQotCQkJCSAgIHJlZHJhdygpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsNCi0JCQkJaWYgKGhhc0ZvY3VzKSB7DQotCQkJCQloYXNGb2N1cz1mYWxzZTsNCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uKTsNCi0JCQkJCXJlZHJhdygpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQl0ZXh0TWFyZ2luV2lkdGggPSAxOw0KLQkJdGV4dE1hcmdpbkhlaWdodCA9IDE7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGluaXRBY2Nlc3NpYmxlKCkgew0KLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gZ2V0QWNjZXNzaWJsZSgpOw0KLQkJYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRUZXh0KCk7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRUb29sVGlwVGV4dCgpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJYWNjZXNzaWJsZQ0KLQkJCS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQlQb2ludCBwdCA9IHRvQ29udHJvbChuZXcgUG9pbnQoZS54LCBlLnkpKTsNCi0JCQkJZS5jaGlsZElEID0NCi0JCQkJCShnZXRCb3VuZHMoKS5jb250YWlucyhwdCkpDQotCQkJCQkJPyBBQ0MuQ0hJTERJRF9TRUxGDQotCQkJCQkJOiBBQ0MuQ0hJTERJRF9OT05FOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7DQotCQkJCVBvaW50IHB0ID0gdG9EaXNwbGF5KG5ldyBQb2ludChsb2NhdGlvbi54LCBsb2NhdGlvbi55KSk7DQotCQkJCWUueCA9IHB0Lng7DQotCQkJCWUueSA9IHB0Lnk7DQotCQkJCWUud2lkdGggPSBsb2NhdGlvbi53aWR0aDsNCi0JCQkJZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gMDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSBBQ0MuUk9MRV9QVVNIQlVUVE9OOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSBTZWxlY3RhYmxlRm9ybUxhYmVsLnRoaXMuZ2V0U2VsZWN0aW9uKCk/QUNDLlNUQVRFX1NFTEVDVEVEOkFDQy5TVEFURV9OT1JNQUw7DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoaW50IGV2ZW50VHlwZSkgew0KLQkJRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsNCi0JCWV2ZW50LnR5cGUgPSBldmVudFR5cGU7DQotCQlldmVudC53aWRnZXQgPSB0aGlzOw0KLQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50VHlwZSwgZXZlbnQpOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIHBhaW50KFBhaW50RXZlbnQgZSkgew0KLQkJc3VwZXIucGFpbnQoZSk7DQotCSAgIAlpZiAoaGFzRm9jdXMpIHsNCi0JICAgCQlHQyBnYyA9IGUuZ2M7DQotCSAgIAkJUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsNCi0JICAgCQlnYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7DQotCSAgIAkJZ2MuZHJhd0ZvY3VzKDAsIDAsIHNpemUueCwgc2l6ZS55KTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJY2hlY2tXaWRnZXQgKCk7DQotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgcmV0dXJuOw0KLQkJVHlwZWRMaXN0ZW5lciB0eXBlZExpc3RlbmVyID0gbmV3IFR5cGVkTGlzdGVuZXIgKGxpc3RlbmVyKTsNCi0JCWFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLHR5cGVkTGlzdGVuZXIpOw0KLQkJYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLHR5cGVkTGlzdGVuZXIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJY2hlY2tXaWRnZXQgKCk7DQotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgcmV0dXJuOw0KLQkJcmVtb3ZlTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsNCi0JCXJlbW92ZUxpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbGlzdGVuZXIpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9UYWJsZURhdGEuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9UYWJsZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzY2ZjNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvVGFibGVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi0NCi0vKioNCi0gKiANCi0gKiBAYXV0aG9yIGRlamFuDQotICoNCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8NCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cw0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBUYWJsZURhdGEgew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUID0gMTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VOVEVSID0gMjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFQgPSAzOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1AgPSA0Ow0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSURETEUgPSA1Ow0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT00gPSA2Ow0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMID0gNzsNCi0JcHVibGljIGludCBjb2xzcGFuPTE7DQotCXB1YmxpYyBpbnQgcm93c3Bhbj0xOw0KLQlwdWJsaWMgaW50IGFsaWduID0gTEVGVDsNCi0JcHVibGljIGludCB2YWxpZ24gPSBUT1A7DQotCXB1YmxpYyBpbnQgaW5kZW50ID0gMDsNCi0JcHVibGljIGludCBtYXhXaWR0aCA9IFNXVC5ERUZBVUxUOw0KLQlwdWJsaWMgaW50IG1heEhlaWdodCA9IFNXVC5ERUZBVUxUOw0KLQlwdWJsaWMgaW50IGhlaWdodEhpbnQgPSBTV1QuREVGQVVMVDsNCi0JcHVibGljIGJvb2xlYW4gZ3JhYkhvcml6b250YWw9ZmFsc2U7DQotCQ0KLQkvL3ByaXZhdGUNCi0JaW50IGNoaWxkSW5kZXg7DQotCWJvb2xlYW4gaXNJdGVtRGF0YT10cnVlOyANCi0JaW50IGNvbXBXaWR0aDsNCi0JUG9pbnQgY29tcFNpemU7DQotCQkNCi0JcHVibGljIFRhYmxlRGF0YSgpIHsNCi0JfQ0KLQkNCi0JcHVibGljIFRhYmxlRGF0YShpbnQgYWxpZ24sIGludCB2YWxpZ24pIHsNCi0JCXRoaXMoYWxpZ24sIHZhbGlnbiwgMSwgMSk7DQotCX0NCi0JDQotCXB1YmxpYyBUYWJsZURhdGEoaW50IGFsaWduLCBpbnQgdmFsaWduLCBpbnQgcm93c3BhbiwgaW50IGNvbHNwYW4pIHsNCi0JCXRoaXMuYWxpZ24gPSBhbGlnbjsNCi0JCXRoaXMudmFsaWduID0gdmFsaWduOw0KLQkJdGhpcy5yb3dzcGFuID0gcm93c3BhbjsNCi0JCXRoaXMuY29sc3BhbiA9IGNvbHNwYW47DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1RhYmxlTGF5b3V0VGVzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1RhYmxlTGF5b3V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTdlNGUyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9UYWJsZUxheW91dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdGF0dXNMaW5lTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7DQotDQotcHVibGljIGNsYXNzIFRhYmxlTGF5b3V0VGVzdCB7DQotDQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7DQotICAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsNCi0gICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsNCi0gICAgIHNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsNCi0gICAgIGZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOw0KLSAgICAvLyBzYy5zZXRBbHdheXNTaG93U2Nyb2xsQmFycyh0cnVlKTsNCi0gICAgIHNjLnNldEJhY2tncm91bmQoc2MuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOw0KLSAgICAgZmluYWwgQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNjLCBTV1QuTk9ORSk7DQotICAgICAvL2Muc2V0QmFja2dyb3VuZChjLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7DQotICAgICBzYy5zZXRDb250ZW50KGMpOw0KLSAgICAgc2MuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsICBuZXcgTGlzdGVuZXIgKCkgew0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsNCi0JCQlSZWN0YW5nbGUgc3NpemUgPSBzYy5nZXRDbGllbnRBcmVhKCk7DQotCQkJaW50IHN3aWR0aCA9IHNzaXplLndpZHRoOw0KLQkJCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSAoSFRNTFRhYmxlTGF5b3V0KWMuZ2V0TGF5b3V0KCk7DQotCQkJUG9pbnQgc2l6ZSA9IGxheW91dC5jb21wdXRlU2l6ZShjLCBzd2lkdGgsIFNXVC5ERUZBVUxULCB0cnVlKTsNCi0JCQkvL2lmIChzaXplLnggPCBzd2lkdGgpIHNpemUueCA9IHN3aWR0aDsNCi0JCQlSZWN0YW5nbGUgdHJpbSA9IGMuY29tcHV0ZVRyaW0oMCwgMCwgc2l6ZS54LCBzaXplLnkpOw0KLQkJCXNpemUgPSBuZXcgUG9pbnQodHJpbS53aWR0aCwgdHJpbS5oZWlnaHQpOw0KLQkJCS8qDQotCQkJUG9pbnQgc2l6ZSA9IGMuY29tcHV0ZVNpemUoc3dpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7DQotCQkJKi8NCi0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiaW46ICIrc3dpZHRoKyIsIG91dDogIitzaXplLngpOw0KLQkJCWMuc2V0U2l6ZShzaXplKTsNCi0JCX0NCi0JfSk7DQotICAgICBjLnNldEJhY2tncm91bmQoYy5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7DQotICAgICBIVE1MVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IEhUTUxUYWJsZUxheW91dCgpOw0KLSAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOw0KLSAgICAgLy9sYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOw0KLSAgICAgbGF5b3V0LmxlZnRNYXJnaW4gPSAwOw0KLSAgICAgbGF5b3V0LnJpZ2h0TWFyZ2luID0gMDsNCi0gICAgIGxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGg9ZmFsc2U7DQotICAgICAvL2xheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOw0KLSAgICAgLy9sYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOw0KLSAgICAgYy5zZXRMYXlvdXQobGF5b3V0KTsNCi0gICAgIA0KLSAgICAgTGFiZWwgbGFiZWw7DQotICAgICBCdXR0b24gYjsNCi0gICAgIFRhYmxlRGF0YSB0ZDsNCi0vKiAgICAgDQotICAgICBsYWJlbCA9IG5ldyBMYWJlbChjLCBTV1QuTlVMTCk7DQotICAgICBsYWJlbC5zZXRUZXh0KCJTaW5nbGUgbGluZTEiKTsNCi0gICAgIA0KLSAgICAgLy9sYWJlbCA9IG5ldyBMYWJlbChjLCBTV1QuV1JBUCk7DQotICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChjLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7DQotICAgICB0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsNCi0gICAgIHRleHQuc2V0VGV4dCgiVGhpcyBpcyBhIG11Y2ggbG9uZ2VyIHRleHQgdGhhdCBJIHdhbnQgd3JhcHBlZCwiKw0KLSAgICAgIiBidXQgZGVwZW5kaW5nIG9uIHRoZSB3aW5kb3cgc2l6ZSBpdCBjYW4gYmUgcmVuZGVyZWQgY29tcGxldGVseS4iKTsNCi0gICAgIA0KLSAgICAgYiA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOw0KLSAgICAgYi5zZXRUZXh0KCJTaW1wbGUgYnV0dG9uIik7DQotICAgICANCi0gICAgIGxhYmVsID0gbmV3IExhYmVsKGMsIFNXVC5XUkFQKTsNCi0gICAgIGxhYmVsLnNldFRleHQoIkFub3RoZXIgdGV4dCB0aGF0IG1heSBvciBtYXkgbm90IGJlIHdyYXBwZWQiKTsNCi0NCi0gICAgIGxhYmVsID0gbmV3IExhYmVsKGMsIFNXVC5OVUxMKTsNCi0gICAgIHRkID0gbmV3IFRhYmxlRGF0YShUYWJsZURhdGEuUklHSFQsIFRhYmxlRGF0YS5CT1RUT00pOw0KLSAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YSh0ZCk7DQotICAgICBsYWJlbC5zZXRUZXh0KCJGaXhlZCBsYWJlbCIpOw0KLSAgICAgDQotICAgICBDb21wb3NpdGUgbmVzdGVkID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuTlVMTCk7DQotICAgICBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7DQotICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7DQotICAgICBuZXN0ZWQuc2V0TGF5b3V0KGxheW91dCk7DQotICAgICBiID0gbmV3IEJ1dHRvbihuZXN0ZWQsIFNXVC5QVVNIKTsNCi0gICAgIGIuc2V0VGV4dCgiQnV0dG9uMiIpOw0KLSAgICAgbGFiZWwgPSBuZXcgTGFiZWwobmVzdGVkLCBTV1QuV1JBUCk7DQotICAgICB0ZCA9IG5ldyBUYWJsZURhdGEoVGFibGVEYXRhLkxFRlQsIFRhYmxlRGF0YS5NSURETEUpOw0KLSAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YSh0ZCk7DQotICAgICBsYWJlbC5zZXRUZXh0KCJTb21lIHRleHQgaW4gdGhlIG5lc3RlZCBsYWJlbCB0aGF0IGNhbiBiZSB3cmFwcGVkIik7DQotKi8gICAgIA0KLSAgICAgbGFiZWwgPSBuZXcgTGFiZWwoYywgU1dULk5VTEwpOw0KLSAgICAgbGFiZWwuc2V0VGV4dCgiVGV4dCBpbiB0aGUgbGVmdCBjb2x1bW4iKTsNCi0gICAgIA0KLSAgICAgYiA9IG5ldyBCdXR0b24oYywgU1dULkNIRUNLKTsNCi0gICAgIGIuc2V0VGV4dCgiQ2hlY2tib3ggaW4gdGhlIHJpZ2h0IGNvbHVtbiIpOw0KLQ0KLSAgICAgDQotICAgICBsYWJlbCA9IG5ldyBMYWJlbChjLCBTV1QuV1JBUCk7DQotICAgICBsYWJlbC5zZXRUZXh0KCJUaGlzIGFzc2lnbm1lbnQgc3RlcCBpcyB0aGVuIHJlcGVhdGVkIGZvciBuZXN0ZWQgdGFibGVzIHVzaW5nIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHdpZHRocyBkZXJpdmVkIGZvciBhbGwgc3VjaCB0YWJsZXMgaW4gdGhlIGZpcnN0IHBhc3MuIEluIHRoaXMgY2FzZSwgdGhlIHdpZHRoIG9mIHRoZSBwYXJlbnQgdGFibGUgY2VsbCBwbGF5cyB0aGUgcm9sZSBvZiB0aGUgY3VycmVudCB3aW5kb3cgc2l6ZSBpbiB0aGUgYWJvdmUgZGVzY3JpcHRpb24uIFRoaXMgcHJvY2VzcyBpcyByZXBlYXRlZCByZWN1cnNpdmVseSBmb3IgYWxsIG5lc3RlZCB0YWJsZXMuIFRoZSB0b3Btb3N0IHRhYmxlIGlzIHRoZW4gcmVuZGVyZWQgdXNpbmcgdGhlIGFzc2lnbmVkIHdpZHRocy4gTmVzdGVkIHRhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHJlbmRlcmVkIGFzIHBhcnQgb2YgdGhlIHBhcmVudCB0YWJsZSdzIGNlbGwgY29udGVudHMuIik7DQotICAgICB0ZCA9IG5ldyBUYWJsZURhdGEoKTsNCi0gICAgIHRkLmNvbHNwYW4gPSAyOw0KLSAgICAgdGQuYWxpZ24gPSBUYWJsZURhdGEuRklMTDsNCi0gICAgIGxhYmVsLnNldExheW91dERhdGEodGQpOw0KLSAgICAgDQotICAgICBFeHBhbmRhYmxlR3JvdXAgZXhwID0gbmV3IEV4cGFuZGFibGVHcm91cCAoU1dULldSQVApIHsNCi0gICAgIAlwdWJsaWMgdm9pZCBmaWxsRXhwYW5zaW9uKENvbXBvc2l0ZSBjb250YWluZXIsIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsNCi0gICAgIAkJSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsNCi0gICAgIAkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOw0KLSAgICAgCQlsYXlvdXQubGVmdE1hcmdpbiA9IGxheW91dC5yaWdodE1hcmdpbiA9IDA7DQotICAgICAJCUJ1dHRvbiBidXR0b24gPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb250YWluZXIsIG51bGwsIFNXVC5QVVNIKTsNCi0gICAgIAkJYnV0dG9uLnNldFRleHQoIkJ1dHRvbiIpOw0KLSAgICAJfQ0KLSAgICAgCXB1YmxpYyB2b2lkIGV4cGFuZGVkKCkgew0KLSAgICAgCQljLmxheW91dCh0cnVlKTsNCi0gICAgIAkJdXBkYXRlU2l6ZShzYywgYyk7DQotICAgICAJfQ0KLSAgICAgCXB1YmxpYyB2b2lkIGNvbGxhcHNlZCgpIHsNCi0gICAgIAkJYy5sYXlvdXQodHJ1ZSk7DQotICAgICAJCXVwZGF0ZVNpemUoc2MsIGMpOw0KLSAgICAgCX0NCi0gICAgIH07DQotICAgICBleHAuc2V0VGV4dCgiRXhwYW5kYWJsZSBTZWN0aW9uIik7DQotICAgICAvL2V4cC5zZXRFeHBhbmRhYmxlKGZhbHNlKTsNCi0gICAgIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRm9ybVdpZGdldEZhY3RvcnkoKTsNCi0gICAgIGV4cC5jcmVhdGVDb250cm9sKGMsIGZhY3RvcnkpOw0KLSAgICAgLy9leHAuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQobGFiZWwuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOw0KLSAgICAgdGQgPSBuZXcgVGFibGVEYXRhKCk7DQotICAgICB0ZC5jb2xzcGFuID0gMjsNCi0gICAgIHRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7DQotICAgICBleHAuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEodGQpOw0KLSAgICAgDQotCSBTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyID0gbmV3IFN0YXR1c0xpbmVNYW5hZ2VyKCk7DQotICAgICAvL2FkZEZvcm1FbmdpbmUoYywgZmFjdG9yeSwgbWFuYWdlcik7DQotICAgICAvL2FkZEZvcm1FbmdpbmUoYywgZmFjdG9yeSwgbWFuYWdlcik7DQotICAgICAvL2FkZEZvcm1FbmdpbmUoYywgZmFjdG9yeSwgbWFuYWdlcik7DQotICAgICANCi0gICAgIGFkZFJvdyhjKTsNCi0gDQotICAgICBDb250cm9sIG1jb250cm9sID0gbWFuYWdlci5jcmVhdGVDb250cm9sKGMpOw0KLSAgICAgdGQgPSBuZXcgVGFibGVEYXRhKCk7DQotICAgICB0ZC5jb2xzcGFuID0gMjsNCi0gICAgIHRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7DQotICAgICBtY29udHJvbC5zZXRMYXlvdXREYXRhKHRkKTsNCi0gICAgIA0KLSAgICAgZmFjdG9yeS5zZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKEh5cGVybGlua0hhbmRsZXIuVU5ERVJMSU5FX1JPTExPVkVSKTsNCi0gICAgIA0KLSAgICAgU2VsZWN0YWJsZUZvcm1MYWJlbCBmdCA9IG5ldyBTZWxlY3RhYmxlRm9ybUxhYmVsKGMsIFNXVC5XUkFQKTsNCi0gICAgIGZ0LnNldFRleHQoIlNvbWUgdGV4dCBpbiB0aGUgZm9ybSB0ZXh0IHRoYXQgc2hvdWxkIGFsc28gd3JhcCIpOw0KLSAgICAgZmFjdG9yeS50dXJuSW50b0h5cGVybGluayhmdCwgbmV3IElIeXBlcmxpbmtMaXN0ZW5lcigpIHsNCi0gICAgIAlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChDb250cm9sIGxpbmspIHsNCi0gICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJMaW5rIGVudGVyZWQiKTsNCi0gICAgIAl9DQotICAgICAJcHVibGljIHZvaWQgbGlua0V4aXRlZChDb250cm9sIGxpbmspIHsNCi0gICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmsgZXhpdGVkIik7DQotICAgICAJfQ0KLSAgICAgCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7DQotICAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiTGluayBhY3RpdmF0ZWQiKTsNCi0gICAgIAl9DQotICAgICB9KTsNCi0NCi0gICAgIGZ0ID0gbmV3IFNlbGVjdGFibGVGb3JtTGFiZWwoYywgU1dULldSQVApOw0KLSAgICAgZnQuc2V0VGV4dCgiU29tZSBtb3JlIGZvcm0gdGV4dCBoZXJlIik7DQotICAgICBmYWN0b3J5LnR1cm5JbnRvSHlwZXJsaW5rKGZ0LCBuZXcgSUh5cGVybGlua0xpc3RlbmVyKCkgew0KLSAgICAgCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKENvbnRyb2wgbGluaykgew0KLSAgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmsgZW50ZXJlZCIpOw0KLSAgICAgCX0NCi0gICAgIAlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKENvbnRyb2wgbGluaykgew0KLSAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiTGluayBleGl0ZWQiKTsNCi0gICAgIAl9DQotICAgICAJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChDb250cm9sIGxpbmspIHsNCi0gICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJMaW5rIGFjdGl2YXRlZCIpOw0KLSAgICAgCX0NCi0gICAgIH0pOw0KLSAgIA0KLSAgICAgc2hlbGwub3BlbiAoKTsNCi0gICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgew0KLSAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOw0KLSAgICAgfQ0KLSAgICAgZGlzcGxheS5kaXNwb3NlICgpOw0KLX0NCi0NCi0vKg0KLQ0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGb3JtRW5naW5lKENvbXBvc2l0ZSBjLCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5LCBJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgew0KLSAgICAgbmV3IExhYmVsKGMsIFNXVC5OVUxMKTsNCi0gICAgIFJpY2hUZXh0IGh0bWwgPSBuZXcgUmljaFRleHQoYywgU1dULldSQVApOw0KLSAgICAgaHRtbC5zZXRIeXBlcmxpbmtTZXR0aW5ncyhmYWN0b3J5LmdldEh5cGVybGlua0hhbmRsZXIoKSk7DQotICAgICBSaWNoVGV4dEhUVFBBY3Rpb24gYWN0aW9uID0gbmV3IFJpY2hUZXh0SFRUUEFjdGlvbihtYW5hZ2VyKTsNCi0gICAgIFVSTCBpMVVSTCA9IFRhYmxlTGF5b3V0VGVzdC5jbGFzcy5nZXRSZXNvdXJjZSgiaW1hZ2UxLmdpZiIpOw0KLSAgICAgSW1hZ2VEZXNjcmlwdG9yIGlkMSA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGkxVVJMKTsNCi0gICAgIGh0bWwucmVnaXN0ZXJUZXh0T2JqZWN0KCJ1cmxIYW5kbGVyIiwgYWN0aW9uKTsNCi0gICAgIGh0bWwucmVnaXN0ZXJUZXh0T2JqZWN0KCJpbWFnZTEiLCBpZDEuY3JlYXRlSW1hZ2UoKSk7DQotICAgICAvL2h0bWwuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsNCi0gICAgIGh0bWwuc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldEZvcmVncm91bmRDb2xvcigpKTsNCi0gICAgIElucHV0U3RyZWFtIGlzID0gVGFibGVMYXlvdXRUZXN0LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImluZGV4LnhtbCIpOw0KLSAgICAgLy9odG1sLnNldFBhcmFncmFwaHNTZXBhcmF0ZWQoZmFsc2UpOw0KLSAgICAgaHRtbC5zZXRDb250ZW50cyhpcywgdHJ1ZSk7DQotICAgICBUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7DQotICAgICB0ZC5jb2xzcGFuID0gMTsNCi0gICAgIHRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7DQotICAgICBodG1sLnNldExheW91dERhdGEodGQpOw0KLX0NCi0qLw0KLQ0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSb3coQ29tcG9zaXRlIGMpIHsNCi0JQ29tcG9zaXRlIHJvdyA9IG5ldyBDb21wb3NpdGUoYywgU1dULldSQVApOw0KLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dCgpOw0KLQlsYXlvdXQud3JhcCA9IHRydWU7DQotCXJvdy5zZXRMYXlvdXQobGF5b3V0KTsNCi0JDQotCWZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7DQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihyb3csIFNXVC5QVVNIKTsNCi0JCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24gdGhhdCBzaG91bGQgYmUgd3JhcHBlZCIpOw0KLQl9DQotCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoKTsNCi0JdGQuY29sc3BhbiA9IDI7DQotCXRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7DQotCXRkLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsNCi0Jcm93LnNldExheW91dERhdGEodGQpOw0KLX0NCi0NCi1wcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVNpemUoU2Nyb2xsZWRDb21wb3NpdGUgc2MsIENvbXBvc2l0ZSBjKSB7DQotCVJlY3RhbmdsZSBzc2l6ZSA9IHNjLmdldENsaWVudEFyZWEoKTsNCi0JaW50IHN3aWR0aCA9IHNzaXplLndpZHRoOw0KLQlIVE1MVGFibGVMYXlvdXQgbGF5b3V0ID0gKEhUTUxUYWJsZUxheW91dCljLmdldExheW91dCgpOw0KLQlQb2ludCBzaXplID0gbGF5b3V0LmNvbXB1dGVTaXplKGMsIHN3aWR0aCwgU1dULkRFRkFVTFQsIHRydWUpOw0KLQlSZWN0YW5nbGUgdHJpbSA9IGMuY29tcHV0ZVRyaW0oMCwgMCwgc2l6ZS54LCBzaXplLnkpOw0KLQlzaXplID0gbmV3IFBvaW50KHRyaW0ud2lkdGgsIHRyaW0uaGVpZ2h0KTsNCi0JYy5zZXRTaXplKHNpemUpOw0KLX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1RvZ2dsZUNvbnRyb2wuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Ub2dnbGVDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YTEyN2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1RvZ2dsZUNvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgVG9nZ2xlQ29udHJvbCBleHRlbmRzIFNlbGVjdGFibGVDb250cm9sIHsNCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdGlvbjsNCi0JcHJpdmF0ZSBDb2xvciBkZWNvcmF0aW9uQ29sb3I7DQotCXByaXZhdGUgQ29sb3IgYWN0aXZlQ29sb3I7DQotCXByaXZhdGUgQ3Vyc29yIGFjdGl2ZUN1cnNvcjsNCi0JcHJpdmF0ZSBib29sZWFuIGhvdmVyPWZhbHNlOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbWFyZ2luV2lkdGggPSAyOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbWFyZ2luSGVpZ2h0ID0gMjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRFRIID0gOTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFSUdIVCA9IDk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBvZmZQb2ludHMgPSB7IDAsMiwgOCwyLCA0LDYgfTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIG9uUG9pbnRzID0geyAyLCAtMSwgMiw4LCA2LDQgfTsJDQotDQotCXB1YmxpYyBUb2dnbGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgew0KLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7DQotCQlhZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJCXNlbGVjdGlvbiA9ICFzZWxlY3Rpb247DQotCQkJCXJlZHJhdygpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJYWRkTW91c2VUcmFja0xpc3RlbmVyKG5ldyBNb3VzZVRyYWNrQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBtb3VzZUVudGVyKE1vdXNlRXZlbnQgZSkgew0KLQkJCQlob3ZlciA9IHRydWU7DQotCQkJCWlmIChhY3RpdmVDdXJzb3IhPW51bGwpDQotCQkJCSAgIHNldEN1cnNvcihhY3RpdmVDdXJzb3IpOw0KLQkJCQlyZWRyYXcoKTsNCi0JCQl9DQotCQkJcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgew0KLQkJCQlob3ZlciA9IGZhbHNlOw0KLQkJCQlpZiAoYWN0aXZlQ3Vyc29yIT1udWxsKQ0KLQkJCQkgICBzZXRDdXJzb3IobnVsbCk7DQotCQkJCXJlZHJhdygpOw0KLQkJCX0NCi0JCX0pOw0KLQkJaW5pdEFjY2Vzc2libGUoKTsNCi0JfQ0KLQl2b2lkIGluaXRBY2Nlc3NpYmxlKCkgew0KLQkJZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZ2V0SGVscChBY2Nlc3NpYmxlRXZlbnQgZSkgew0KLQkJCQllLnJlc3VsdCA9IGdldFRvb2xUaXBUZXh0KCk7DQotCQkJfQ0KLQkJfSk7DQotCQkNCi0JCWdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQlQb2ludCB0ZXN0UG9pbnQgPSB0b0NvbnRyb2wobmV3IFBvaW50KGUueCwgZS55KSk7DQotCQkJCWlmIChnZXRCb3VuZHMoKS5jb250YWlucyh0ZXN0UG9pbnQpKSB7DQotCQkJCQllLmNoaWxkSUQgPSBBQ0MuQ0hJTERJRF9TRUxGOw0KLQkJCQl9DQotCQkJfQ0KLQkJDQotCQkJcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCVJlY3RhbmdsZSBsb2NhdGlvbiA9IGdldEJvdW5kcygpOw0KLQkJCQlQb2ludCBwdCA9IHRvRGlzcGxheShuZXcgUG9pbnQobG9jYXRpb24ueCwgbG9jYXRpb24ueSkpOw0KLQkJCQllLnggPSBwdC54Ow0KLQkJCQllLnkgPSBwdC55Ow0KLQkJCQllLndpZHRoID0gbG9jYXRpb24ud2lkdGg7DQotCQkJCWUuaGVpZ2h0ID0gbG9jYXRpb24uaGVpZ2h0Ow0KLQkJCX0NCi0JCQ0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gMDsNCi0JCQl9DQotCQkNCi0JCQlwdWJsaWMgdm9pZCBnZXRSb2xlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IEFDQy5ST0xFX1RSRUU7DQotCQkJfQ0KLQkJDQotCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gVG9nZ2xlQ29udHJvbC50aGlzLmdldFNlbGVjdGlvbigpP0FDQy5TVEFURV9FWFBBTkRFRDpBQ0MuU1RBVEVfQ09MTEFQU0VEOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRWYWx1ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBUb2dnbGVDb250cm9sLnRoaXMuZ2V0U2VsZWN0aW9uKCk/IjEiOiIwIjsNCi0JCQl9DQotCQl9KTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0RGVjb3JhdGlvbkNvbG9yKENvbG9yIGRlY29yYXRpb25Db2xvcikgew0KLQkJdGhpcy5kZWNvcmF0aW9uQ29sb3IgPSBkZWNvcmF0aW9uQ29sb3I7DQotCX0NCi0JDQotCXB1YmxpYyBDb2xvciBnZXREZWNvcmF0aW9uQ29sb3IoKSB7DQotCQlyZXR1cm4gZGVjb3JhdGlvbkNvbG9yOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVEZWNvcmF0aW9uQ29sb3IoQ29sb3IgYWN0aXZlQ29sb3IpIHsNCi0JCXRoaXMuYWN0aXZlQ29sb3IgPSBhY3RpdmVDb2xvcjsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlQ3Vyc29yKEN1cnNvciBhY3RpdmVDdXJzb3IpIHsNCi0JCXRoaXMuYWN0aXZlQ3Vyc29yID0gYWN0aXZlQ3Vyc29yOw0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sb3IgZ2V0QWN0aXZlRGVjb3JhdGlvbkNvbG9yKCkgew0KLQkJcmV0dXJuIGFjdGl2ZUNvbG9yOw0KLQl9DQotCQ0KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJaW50IHdpZHRoLCBoZWlnaHQ7DQotCQkNCi0JCWlmICh3SGludCE9U1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7IA0KLQkJZWxzZSANCi0JCSAgIHdpZHRoID0gV0lEVEggKyAyKm1hcmdpbldpZHRoOw0KLQkJaWYgKGhIaW50IT1TV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7DQotCQllbHNlIGhlaWdodCA9IEhFSUdIVCArIDIqbWFyZ2luSGVpZ2h0Ow0KLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIFNlbGVjdGFibGVDb250cm9sI3BhaW50KEdDKQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnQoR0MgZ2MpIHsNCi0JCWlmIChob3ZlciAmJiBhY3RpdmVDb2xvciE9bnVsbCkNCi0JCQlnYy5zZXRCYWNrZ3JvdW5kKGFjdGl2ZUNvbG9yKTsNCi0JCWVsc2UgaWYgKGRlY29yYXRpb25Db2xvciE9bnVsbCkNCi0JICAgCSAgIGdjLnNldEJhY2tncm91bmQoZGVjb3JhdGlvbkNvbG9yKTsNCi0JICAgCWVsc2UNCi0JICAgCQkJZ2Muc2V0QmFja2dyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOw0KLQkJaW50IFtdIGRhdGE7DQotCQlQb2ludCBzaXplID0gZ2V0U2l6ZSgpOw0KLQkJaW50IHggPSAoc2l6ZS54IC0gOSkvMjsNCi0JCWludCB5ID0gKHNpemUueSAtIDkpLzI7DQotCQlpZiAoc2VsZWN0aW9uKQ0KLQkJCWRhdGEgPSB0cmFuc2xhdGUob25Qb2ludHMsIHgsIHkpOw0KLQkJZWxzZSANCi0JCQlkYXRhID0gdHJhbnNsYXRlKG9mZlBvaW50cywgeCwgeSk7DQotCQlnYy5maWxsUG9seWdvbihkYXRhKTsNCi0JCWdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBpbnQgW10gdHJhbnNsYXRlKGludCBbXSBkYXRhLCBpbnQgeCwgaW50IHkpIHsNCi0JCWludCBbXSB0YXJnZXQgPSBuZXcgaW50IFtkYXRhLmxlbmd0aF07DQotCQlmb3IgKGludCBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrPTIpIHsNCi0JCQl0YXJnZXRbaV0gPSBkYXRhW2ldKyB4Ow0KLQkJfQ0KLQkJZm9yIChpbnQgaT0xOyBpPGRhdGEubGVuZ3RoOyBpKz0yKSB7DQotCQkJdGFyZ2V0W2ldID0gZGF0YVtpXSt5Ow0KLQkJfQ0KLQkJcmV0dXJuIHRhcmdldDsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBnZXRTZWxlY3Rpb24oKSB7DQotCQlyZXR1cm4gc2VsZWN0aW9uOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oYm9vbGVhbiBzZWxlY3Rpb24pIHsNCi0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9XZWJGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvV2ViRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTZjNzZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9XZWJGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOw0KLQ0KLS8qKg0KLSAqIFRoaXMgZm9ybSBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgaXQgY29udGFpbnMNCi0gKiBjaGlsZHJlbiB0aGF0IGRvIG5vdCBoYXZlIGluZGVwZW5kZW50IGRpbWVuc2lvbnMuDQotICogSW4gb3RoZXIgd29yZHMsIHRoZXNlIHdpZGdldHMgYXJlIG5vdCBjYXBhYmxlDQotICogb2YgYW5zd2VyaW5nIHRoZWlyIHByZWZlcnJlZCBzaXplLiBJbnN0ZWFkLA0KLSAqIGRlc2lyZWQgd2lkdGggbXVzdCBiZSBzdXBwbGllZCB0byBnZXQgdGhlDQotICogcHJlZmVycmVkIGhlaWdodC4gVGhlc2UgZm9ybXMgYXJlIGxheWVkIG91dA0KLSAqIHRvcCB0byBib3R0b20sIGxlZnQgdG8gcmlnaHQgYW5kIHVzZQ0KLSAqIGEgbGF5b3V0IGFsZ29yaXRobSB2ZXJ5IHNpbWlsYXIgdG8NCi0gKiBIVE1MIHRhYmxlcy4gU2Nyb2xsaW5nIGlzIG5vdCBvcHRpb25hbA0KLSAqIGZvciB0aGlzIHR5cGUgb2YgcHJlc2VudGF0aW9uIC0gDQotICogc2Nyb2xsIGJhcnMgd2lsbCBzaG93IHVwIHdoZW4gbmVlZGVkLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBXZWJGb3JtIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRm9ybSB7DQotCXByb3RlY3RlZCBTY3JvbGxlZENvbXBvc2l0ZSBzY3JvbGxDb21wb3NpdGU7DQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRyb2w7DQotCXByaXZhdGUgQ29tcG9zaXRlIGNsaWVudDsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEhNQVJHSU4gPSA1Ow0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVk1BUkdJTiA9IDU7DQotCXByaXZhdGUgSW1hZ2UgaGVhZGluZ1VuZGVybGluZUltYWdlOw0KLQ0KLQljbGFzcyBXZWJGb3JtTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsNCi0NCi0JCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsNCi0JCQlpbnQgeCA9IDA7DQotCQkJaW50IHkgPSAwOw0KLQkJCWlmIChpc0hlYWRpbmdWaXNpYmxlKCkpIHsNCi0JCQkJeSA9IGdldEhlYWRpbmdIZWlnaHQocGFyZW50KTsNCi0JCQl9DQotCQkJUG9pbnQgY3NpemU7DQotDQotCQkJTGF5b3V0IGxheW91dCA9IGNsaWVudC5nZXRMYXlvdXQoKTsNCi0JCQlpZiAobGF5b3V0ICE9IG51bGwgJiYgbGF5b3V0IGluc3RhbmNlb2YgSFRNTFRhYmxlTGF5b3V0KSB7DQotCQkJCUhUTUxUYWJsZUxheW91dCBobGF5b3V0ID0gKEhUTUxUYWJsZUxheW91dCkgbGF5b3V0Ow0KLQkJCQljc2l6ZSA9IGhsYXlvdXQuY29tcHV0ZVNpemUoY2xpZW50LCBib3VuZHMud2lkdGgsIFNXVC5ERUZBVUxULCB0cnVlKTsNCi0JCQkJaWYgKGNzaXplLnggPCBib3VuZHMud2lkdGgpDQotCQkJCQljc2l6ZS54ID0gYm91bmRzLndpZHRoOw0KLQkJCQlSZWN0YW5nbGUgdHJpbSA9IGNvbnRyb2wuY29tcHV0ZVRyaW0oMCwgMCwgY3NpemUueCwgY3NpemUueSk7DQotCQkJCWNzaXplID0gbmV3IFBvaW50KHRyaW0ud2lkdGgsIHRyaW0uaGVpZ2h0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCQljc2l6ZSA9IGNsaWVudC5jb21wdXRlU2l6ZShib3VuZHMud2lkdGgsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsNCi0JCQl9DQotCQkJY2xpZW50LnNldEJvdW5kcyh4LCB5LCBjc2l6ZS54LCBjc2l6ZS55KTsNCi0JCX0NCi0NCi0JCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZSgNCi0JCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJCWludCB3SGludCwNCi0JCQlpbnQgaEhpbnQsDQotCQkJYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQkJaW50IHdpZHRoID0gd0hpbnQ7DQotCQkJaW50IGhlaWdodCA9IDA7DQotCQkJaWYgKGlzSGVhZGluZ1Zpc2libGUoKSkgew0KLQkJCQloZWlnaHQgPSBnZXRIZWFkaW5nSGVpZ2h0KHBhcmVudCk7DQotCQkJfQ0KLQkJCVBvaW50IGNzaXplOw0KLQkJCUxheW91dCBsYXlvdXQgPSBjbGllbnQuZ2V0TGF5b3V0KCk7DQotDQotCQkJaWYgKGxheW91dCAhPSBudWxsICYmIGxheW91dCBpbnN0YW5jZW9mIEhUTUxUYWJsZUxheW91dCkgew0KLQkJCQlIVE1MVGFibGVMYXlvdXQgaGxheW91dCA9IChIVE1MVGFibGVMYXlvdXQpIGxheW91dDsNCi0JCQkJY3NpemUgPSBobGF5b3V0LmNvbXB1dGVTaXplKGNsaWVudCwgd2lkdGgsIFNXVC5ERUZBVUxULCB0cnVlKTsNCi0JCQkJaWYgKGNzaXplLnggPCB3aWR0aCkNCi0JCQkJCWNzaXplLnggPSB3aWR0aDsNCi0JCQkJUmVjdGFuZ2xlIHRyaW0gPSBjb250cm9sLmNvbXB1dGVUcmltKDAsIDAsIGNzaXplLngsIGNzaXplLnkpOw0KLQkJCQljc2l6ZSA9IG5ldyBQb2ludCh0cmltLndpZHRoLCB0cmltLmhlaWdodCk7DQotCQkJfSBlbHNlIHsNCi0JCQkJY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUod2lkdGgsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsNCi0JCQl9DQotCQkJd2lkdGggPSBjc2l6ZS54Ow0KLQkJCWhlaWdodCArPSBjc2l6ZS55Ow0KLQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIFdlYkZvcm0oKSB7DQotCX0NCi0NCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQotCQlzY3JvbGxDb21wb3NpdGUgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOw0KLQkJc2Nyb2xsQ29tcG9zaXRlLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7DQotCQlzY3JvbGxDb21wb3NpdGUuc2V0TWVudShwYXJlbnQuZ2V0TWVudSgpKTsNCi0JCWZpbmFsIENvbXBvc2l0ZSBmb3JtID0gZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUoc2Nyb2xsQ29tcG9zaXRlKTsNCi0NCi0JCXNjcm9sbENvbXBvc2l0ZS5zZXRDb250ZW50KGZvcm0pOw0KLQkJc2Nyb2xsQ29tcG9zaXRlLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJCXVwZGF0ZVNpemUoKTsNCi0JCQl9DQotCQl9KTsNCi0JCVdlYkZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IFdlYkZvcm1MYXlvdXQoKTsNCi0JCWZvcm0uc2V0TGF5b3V0KGxheW91dCk7DQotCQlmb3JtLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgew0KLQkJCQlwYWludChlKTsNCi0JCQl9DQotCQl9KTsNCi0JCXRoaXMuY29udHJvbCA9IGZvcm07DQotCQljbGllbnQgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShmb3JtKTsNCi0JCWNyZWF0ZUNvbnRlbnRzKGNsaWVudCk7DQotCQlpbml0aWFsaXplU2Nyb2xsQmFycyhzY3JvbGxDb21wb3NpdGUpOw0KLQkJLy9mb3JtLnNldEZvY3VzKCk7DQotCQlyZXR1cm4gc2Nyb2xsQ29tcG9zaXRlOw0KLQl9DQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2Nyb2xsQmFycyhTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCkgew0KLQkJU2Nyb2xsQmFyIGhiYXIgPSBzY29tcC5nZXRIb3Jpem9udGFsQmFyKCk7DQotCQlpZiAoaGJhciAhPSBudWxsKSB7DQotCQkJaGJhci5zZXRJbmNyZW1lbnQoSF9TQ1JPTExfSU5DUkVNRU5UKTsNCi0JCX0NCi0JCVNjcm9sbEJhciB2YmFyID0gc2NvbXAuZ2V0VmVydGljYWxCYXIoKTsNCi0JCWlmICh2YmFyICE9IG51bGwpIHsNCi0JCQl2YmFyLnNldEluY3JlbWVudChWX1NDUk9MTF9JTkNSRU1FTlQpOw0KLQkJfQ0KLQkJdXBkYXRlUGFnZUluY3JlbWVudChzY29tcCk7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRIZWFkaW5nSGVpZ2h0KENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCWludCB3aWR0aCA9IHBhcmVudC5nZXRTaXplKCkueDsNCi0JCWludCBoZWlnaHQgPSAwOw0KLQkJaW50IGltYWdlSGVpZ2h0ID0gMDsNCi0JCWlmIChnZXRIZWFkaW5nSW1hZ2UoKSAhPSBudWxsKSB7DQotCQkJUmVjdGFuZ2xlIGlib3VuZHMgPSBnZXRIZWFkaW5nSW1hZ2UoKS5nZXRCb3VuZHMoKTsNCi0JCQlpbWFnZUhlaWdodCA9IGlib3VuZHMuaGVpZ2h0Ow0KLQkJfQ0KLQkJR0MgZ2MgPSBuZXcgR0MocGFyZW50KTsNCi0JCWdjLnNldEZvbnQodGl0bGVGb250KTsNCi0JCWludCB0ZXh0V2lkdGggPSB3aWR0aCAtIDIgKiBITUFSR0lOOw0KLQkJaGVpZ2h0ID0gRm9ybUxhYmVsLmNvbXB1dGVXcmFwSGVpZ2h0KGdjLCBnZXRIZWFkaW5nVGV4dCgpLCB0ZXh0V2lkdGgpOw0KLQkJaGVpZ2h0ICs9IDIgKiBWTUFSR0lOOw0KLQkJaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBpbWFnZUhlaWdodCk7DQotCQlpZiAoaGVhZGluZ1VuZGVybGluZUltYWdlICE9IG51bGwpIHsNCi0JCQlSZWN0YW5nbGUgaWJvdW5kcyA9IGhlYWRpbmdVbmRlcmxpbmVJbWFnZS5nZXRCb3VuZHMoKTsNCi0JCQloZWlnaHQgKz0gaWJvdW5kcy5oZWlnaHQ7DQotCQl9DQotCQlnYy5kaXNwb3NlKCk7DQotCQlyZXR1cm4gaGVpZ2h0Ow0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgew0KLQkJcmV0dXJuIGNvbnRyb2w7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0SGVhZGluZ1Zpc2libGUoYm9vbGVhbiBuZXdIZWFkaW5nVmlzaWJsZSkgew0KLQkJc3VwZXIuc2V0SGVhZGluZ1Zpc2libGUobmV3SGVhZGluZ1Zpc2libGUpOw0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkNCi0JCQljb250cm9sLmxheW91dCgpOw0KLQl9DQotDQotCXB1YmxpYyBJbWFnZSBnZXRIZWFkaW5nVW5kZXJsaW5lSW1hZ2UoKSB7DQotCQlyZXR1cm4gaGVhZGluZ1VuZGVybGluZUltYWdlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdVbmRlcmxpbmVJbWFnZShJbWFnZSBpbWFnZSkgew0KLQkJdGhpcy5oZWFkaW5nVW5kZXJsaW5lSW1hZ2UgPSBpbWFnZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7DQotCQl0aXRsZUZvbnQgPSBKRmFjZVJlc291cmNlcy5nZXRIZWFkZXJGb250KCk7DQotCQlpZiAoY29udHJvbCAhPSBudWxsICYmICFjb250cm9sLmlzRGlzcG9zZWQoKSkgew0KLQkJCWNvbnRyb2wubGF5b3V0KCk7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUh5cGVybGlua0NvbG9ycygpIHsNCi0JCWZhY3RvcnkudXBkYXRlSHlwZXJsaW5rQ29sb3JzKCk7DQotCQlpZiAoY29udHJvbCAhPSBudWxsICYmICFjb250cm9sLmlzRGlzcG9zZWQoKSkgew0KLQkJCWNvbnRyb2wucmVkcmF3KCk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdXBkYXRlU2l6ZSgpIHsNCi0JCVJlY3RhbmdsZSBzc2l6ZSA9IHNjcm9sbENvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7DQotCQlpbnQgc3dpZHRoID0gc3NpemUud2lkdGg7DQotCQlXZWJGb3JtTGF5b3V0IGxheW91dCA9IChXZWJGb3JtTGF5b3V0KSBjb250cm9sLmdldExheW91dCgpOw0KLQkJUG9pbnQgc2l6ZSA9IGxheW91dC5jb21wdXRlU2l6ZShjb250cm9sLCBzd2lkdGgsIFNXVC5ERUZBVUxULCB0cnVlKTsNCi0JCWlmIChzaXplLnggPCBzd2lkdGgpDQotCQkJc2l6ZS54ID0gc3dpZHRoOw0KLQkJUmVjdGFuZ2xlIHRyaW0gPSBjb250cm9sLmNvbXB1dGVUcmltKDAsIDAsIHNpemUueCwgc2l6ZS55KTsNCi0JCXNpemUgPSBuZXcgUG9pbnQodHJpbS53aWR0aCwgdHJpbS5oZWlnaHQpOw0KLQkJY29udHJvbC5zZXRTaXplKHNpemUpOw0KLQkJdXBkYXRlUGFnZUluY3JlbWVudChzY3JvbGxDb21wb3NpdGUpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwYWludChQYWludEV2ZW50IGUpIHsNCi0JCWlmIChpc0hlYWRpbmdWaXNpYmxlKCkgPT0gZmFsc2UpDQotCQkJcmV0dXJuOw0KLQkJR0MgZ2MgPSBlLmdjOw0KLQkJaWYgKGhlYWRpbmdJbWFnZSAhPSBudWxsKSB7DQotCQkJZ2MuZHJhd0ltYWdlKGhlYWRpbmdJbWFnZSwgMCwgMCk7DQotCQl9DQotCQlQb2ludCBzaXplID0gY29udHJvbC5nZXRTaXplKCk7DQotCQlpZiAoZ2V0SGVhZGluZ0JhY2tncm91bmQoKSAhPSBudWxsKQ0KLQkJCWdjLnNldEJhY2tncm91bmQoZ2V0SGVhZGluZ0JhY2tncm91bmQoKSk7DQotCQlpZiAoZ2V0SGVhZGluZ0ZvcmVncm91bmQoKSAhPSBudWxsKQ0KLQkJCWdjLnNldEZvcmVncm91bmQoZ2V0SGVhZGluZ0ZvcmVncm91bmQoKSk7DQotCQlnYy5zZXRGb250KHRpdGxlRm9udCk7DQotCQlGb3JtTGFiZWwucGFpbnRXcmFwVGV4dChnYywgc2l6ZSwgZ2V0SGVhZGluZ1RleHQoKSwgSE1BUkdJTiwgVk1BUkdJTik7DQotCQlpZiAoaGVhZGluZ1VuZGVybGluZUltYWdlICE9IG51bGwpIHsNCi0JCQlpbnQgeSA9DQotCQkJCWdldEhlYWRpbmdIZWlnaHQoY29udHJvbCkNCi0JCQkJCS0gaGVhZGluZ1VuZGVybGluZUltYWdlLmdldEJvdW5kcygpLmhlaWdodDsNCi0JCQlnYy5kcmF3SW1hZ2UoaGVhZGluZ1VuZGVybGluZUltYWdlLCAwLCB5KTsNCi0JCX0NCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVGV4dChTdHJpbmcgaGVhZGluZ1RleHQpIHsNCi0JCXN1cGVyLnNldEhlYWRpbmdUZXh0KGhlYWRpbmdUZXh0KTsNCi0JCWlmIChjb250cm9sIT1udWxsKQ0KLQkJCWNvbnRyb2wucmVkcmF3KCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9CdWxsZXRQYXJhZ3JhcGguamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvQnVsbGV0UGFyYWdyYXBoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlM2Y4MzguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9CdWxsZXRQYXJhZ3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi1wdWJsaWMgY2xhc3MgQnVsbGV0UGFyYWdyYXBoIGV4dGVuZHMgUGFyYWdyYXBoIGltcGxlbWVudHMgSUJ1bGxldFBhcmFncmFwaCB7Ci0JcHJpdmF0ZSBpbnQgc3R5bGUgPSBDSVJDTEU7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQlwcml2YXRlIGludCBDSVJDTEVfRElBTSA9IDU7Ci0JcHJpdmF0ZSBpbnQgU1BBQ0lORyA9IDEwOwotCXByaXZhdGUgaW50IGluZGVudCA9IC0xOwotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCdWxsZXRQYXJhZ3JhcGguCi0JICogQHBhcmFtIGFkZFZlcnRpY2FsU3BhY2UKLQkgKi8KLQlwdWJsaWMgQnVsbGV0UGFyYWdyYXBoKGJvb2xlYW4gYWRkVmVydGljYWxTcGFjZSkgewotCQlzdXBlcihhZGRWZXJ0aWNhbFNwYWNlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEluZGVudCgpIHsKLQkJaWYgKGluZGVudCAhPSAtMSkKLQkJCXJldHVybiBpbmRlbnQ7Ci0JCXN3aXRjaCAoc3R5bGUpIHsKLQkJCWNhc2UgQ0lSQ0xFIDoKLQkJCQlyZXR1cm4gQ0lSQ0xFX0RJQU0gKyBTUEFDSU5HOwotCQl9Ci0JCXJldHVybiAyMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUJ1bGxldFBhcmFncmFwaCNnZXRCdWxsZXRTdHlsZSgpCi0JICovCi0JcHVibGljIGludCBnZXRCdWxsZXRTdHlsZSgpIHsKLQkJcmV0dXJuIHN0eWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bGxldFN0eWxlKGludCBzdHlsZSkgewotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnVsbGV0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLnRleHQgPSB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZGVudChpbnQgaW5kZW50KSB7Ci0JCXRoaXMuaW5kZW50ID0gaW5kZW50OwotCX0KLQotCS8qCi0JICogQHNlZSBJQnVsbGV0UGFyYWdyYXBoI2dldEJ1bGxldFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnVsbGV0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnQoCi0JCUdDIGdjLAotCQlpbnQgd2lkdGgsCi0JCUxvY2F0b3IgbG9jLAotCQlpbnQgbGluZUhlaWdodCwKLQkJSGFzaHRhYmxlIG9iamVjdFRhYmxlLAotCQlJSHlwZXJsaW5rU2VnbWVudCBzZWxlY3RlZExpbmspIHsKLQkJcGFpbnRCdWxsZXQoZ2MsIGxvYywgbGluZUhlaWdodCwgb2JqZWN0VGFibGUpOwotCQlzdXBlci5wYWludChnYywgd2lkdGgsIGxvYywgbGluZUhlaWdodCwgb2JqZWN0VGFibGUsIHNlbGVjdGVkTGluayk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnRCdWxsZXQoCi0JCUdDIGdjLAotCQlMb2NhdG9yIGxvYywKLQkJaW50IGxpbmVIZWlnaHQsCi0JCUhhc2h0YWJsZSBvYmplY3RUYWJsZSkgewotCQlpbnQgeCA9IGxvYy54IC0gZ2V0SW5kZW50KCk7Ci0JCWlmIChzdHlsZSA9PSBDSVJDTEUpIHsKLQkJCWludCB5ID0gbG9jLnkgKyBsaW5lSGVpZ2h0IC8gMiAtIENJUkNMRV9ESUFNIC8gMjsKLQkJCUNvbG9yIGJnID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJQ29sb3IgZmcgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGZnKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUoeCwgeSArIDEsIDUsIDMpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZSh4ICsgMSwgeSwgMywgNSk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGJnKTsKLQkJfSBlbHNlIGlmIChzdHlsZSA9PSBURVhUICYmIHRleHQgIT0gbnVsbCkgewotCQkJZ2MuZHJhd1RleHQodGV4dCwgeCwgbG9jLnkpOwotCQl9IGVsc2UgaWYgKHN0eWxlID09IElNQUdFICYmIHRleHQgIT0gbnVsbCkgewotCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIG9iamVjdFRhYmxlLmdldCh0ZXh0KTsKLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJaW50IHkgPSBsb2MueSArIGxpbmVIZWlnaHQgLyAyIC0gaW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gMjsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIHkpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9Gb3JtRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYzhjN2YuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9Gb3JtRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsNCi0NCi1wdWJsaWMgY2xhc3MgRm9ybUVuZ2luZSBleHRlbmRzIENhbnZhcyB7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9IQU5ETEVSX0lEID0gInVybEhhbmRsZXIiOw0KLQlib29sZWFuIGhhc0ZvY3VzOw0KLQlib29sZWFuIHBhcmFncmFwaHNTZXBhcmF0ZWQgPSB0cnVlOw0KLQlUZXh0TW9kZWwgbW9kZWw7DQotCUhhc2h0YWJsZSBvYmplY3RUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsNCi0JcHVibGljIGludCBtYXJnaW5XaWR0aCA9IDA7DQotCXB1YmxpYyBpbnQgbWFyZ2luSGVpZ2h0ID0gMTsNCi0JSUh5cGVybGlua1NlZ21lbnQgZW50ZXJlZDsNCi0JYm9vbGVhbiBtb3VzZURvd24gPSBmYWxzZTsNCi0JUG9pbnQgZHJhZ09yaWdpbjsNCi0JcHJpdmF0ZSBBY3Rpb24gb3BlbkFjdGlvbjsNCi0JcHJpdmF0ZSBBY3Rpb24gY29weVNob3J0Y3V0QWN0aW9uOw0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZGluZz10cnVlOw0KLQlwcml2YXRlIFN0cmluZyBsb2FkaW5nVGV4dD0iTG9hZGluZy4uLiI7DQotDQotCXB1YmxpYyBib29sZWFuIGdldEZvY3VzKCkgew0KLQkJcmV0dXJuIGhhc0ZvY3VzOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRpbmcoKSB7DQotCQlyZXR1cm4gbG9hZGluZzsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRMb2FkaW5nVGV4dCgpIHsNCi0JCXJldHVybiBsb2FkaW5nVGV4dDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0TG9hZGluZ1RleHQoU3RyaW5nIGxvYWRpbmdUZXh0KSB7DQotCQl0aGlzLmxvYWRpbmdUZXh0ID0gbG9hZGluZ1RleHQ7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRQYXJhZ3JhcGhTcGFjaW5nKGludCBsaW5lSGVpZ2h0KSB7DQotCQlyZXR1cm4gbGluZUhlaWdodCAvIDI7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0UGFyYWdyYXBoc1NlcGFyYXRlZChib29sZWFuIHZhbHVlKSB7DQotCQlwYXJhZ3JhcGhzU2VwYXJhdGVkID0gdmFsdWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBTZWxlY3RhYmxlRm9ybUxhYmVsDQotCSAqLw0KLQlwdWJsaWMgRm9ybUVuZ2luZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJc2V0TGF5b3V0KG5ldyBGb3JtRW5naW5lTGF5b3V0KCkpOw0KLQkJbW9kZWwgPSBuZXcgVGV4dE1vZGVsKCk7DQotDQotCQlhZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgew0KLQkJCQltb2RlbC5kaXNwb3NlKCk7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsNCi0JCQkJcGFpbnQoZSk7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgbmV3IExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsNCi0JCQkJaWYgKGUuY2hhcmFjdGVyID09ICdccicpIHsNCi0JCQkJCWFjdGl2YXRlU2VsZWN0ZWRMaW5rKCk7DQotCQkJCQlyZXR1cm47DQotCQkJCX0NCi0JCQl9DQotCQl9KTsNCi0JCWFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsNCi0JCQkJc3dpdGNoIChlLmRldGFpbCkgew0KLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9ORVhUIDoNCi0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfUFJFVklPVVMgOg0KLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCA6DQotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19QUkVWSU9VUyA6DQotCQkJCQkJZS5kb2l0ID0gZmFsc2U7DQotCQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCWlmICghbW9kZWwuaGFzRm9jdXNTZWdtZW50cygpKSB7DQotCQkJCQllLmRvaXQgPSB0cnVlOw0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpDQotCQkJCQllLmRvaXQgPSBhZHZhbmNlKHRydWUpOw0KLQkJCQllbHNlIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKQ0KLQkJCQkJZS5kb2l0ID0gYWR2YW5jZShmYWxzZSk7DQotCQkJCWVsc2UgaWYgKGUuZGV0YWlsICE9IFNXVC5UUkFWRVJTRV9SRVRVUk4pDQotCQkJCQllLmRvaXQgPSB0cnVlOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsNCi0JCQkJaWYgKCFoYXNGb2N1cykgew0KLQkJCQkJaGFzRm9jdXMgPSB0cnVlOw0KLQkJCQkJaGFuZGxlRm9jdXNDaGFuZ2UoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7DQotCQkJCWlmIChoYXNGb2N1cykgew0KLQkJCQkJaGFzRm9jdXMgPSBmYWxzZTsNCi0JCQkJCWhhbmRsZUZvY3VzQ2hhbmdlKCk7DQotCQkJCX0NCi0JCQl9DQotCQl9KTsNCi0JCWFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsNCi0JCQl9DQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgew0KLQkJCQkvLyBzZWxlY3QgYSBsaW5rDQotCQkJCWhhbmRsZU1vdXNlQ2xpY2soZSwgdHJ1ZSk7DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7DQotCQkJCS8vIGFjdGl2YXRlIGEgbGluaw0KLQkJCQloYW5kbGVNb3VzZUNsaWNrKGUsIGZhbHNlKTsNCi0JCQl9DQotCQl9KTsNCi0JCWFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0xpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7DQotCQkJCWhhbmRsZU1vdXNlTW92ZShlKTsNCi0JCQl9DQotCQkJcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgew0KLQkJCQlpZiAoZW50ZXJlZCAhPSBudWxsKSB7DQotCQkJCQlleGl0TGluayhlbnRlcmVkKTsNCi0JCQkJCXBhaW50TGlua0hvdmVyKGVudGVyZWQsIGZhbHNlKTsNCi0JCQkJCWVudGVyZWQgPSBudWxsOw0KLQkJCQkJc2V0Q3Vyc29yKG51bGwpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7DQotCQkJCWhhbmRsZU1vdXNlSG92ZXIoZSk7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgew0KLQkJCQloYW5kbGVNb3VzZU1vdmUoZSk7DQotCQkJfQ0KLQkJfSk7DQotCQlpbml0QWNjZXNzaWJsZSgpOw0KLQkJbWFrZUFjdGlvbnMoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7DQotCQlvcGVuQWN0aW9uID0gbmV3IEFjdGlvbigpIHsNCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCWFjdGl2YXRlU2VsZWN0ZWRMaW5rKCk7DQotCQkJfQ0KLQkJfTsNCi0JCW9wZW5BY3Rpb24uc2V0VGV4dCgNCi0JCQlGb3Jtc1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiRm9ybUVnaW5lLmxpbmtQb3B1cC5vcGVuIikpOw0KLQkJY29weVNob3J0Y3V0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsNCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCWNvcHlTaG9ydGN1dChnZXRTZWxlY3RlZExpbmsoKSk7DQotCQkJfQ0KLQkJfTsNCi0JCWNvcHlTaG9ydGN1dEFjdGlvbi5zZXRUZXh0KA0KLQkJCUZvcm1zUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJGb3JtRWdpbmUubGlua1BvcHVwLmNvcHlTaG9ydGN1dCIpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBnZXRBY2Vzc2libGVUZXh0KCkgew0KLQkJcmV0dXJuIG1vZGVsLmdldEFjY2Vzc2libGVUZXh0KCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGluaXRBY2Nlc3NpYmxlKCkgew0KLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gZ2V0QWNjZXNzaWJsZSgpOw0KLQkJYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRBY2Vzc2libGVUZXh0KCk7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRUb29sVGlwVGV4dCgpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJYWNjZXNzaWJsZQ0KLQkJCS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQlQb2ludCBwdCA9IHRvQ29udHJvbChuZXcgUG9pbnQoZS54LCBlLnkpKTsNCi0JCQkJZS5jaGlsZElEID0NCi0JCQkJCShnZXRCb3VuZHMoKS5jb250YWlucyhwdCkpDQotCQkJCQkJPyBBQ0MuQ0hJTERJRF9TRUxGDQotCQkJCQkJOiBBQ0MuQ0hJTERJRF9OT05FOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7DQotCQkJCVBvaW50IHB0ID0gdG9EaXNwbGF5KG5ldyBQb2ludChsb2NhdGlvbi54LCBsb2NhdGlvbi55KSk7DQotCQkJCWUueCA9IHB0Lng7DQotCQkJCWUueSA9IHB0Lnk7DQotCQkJCWUud2lkdGggPSBsb2NhdGlvbi53aWR0aDsNCi0JCQkJZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gMDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSBBQ0MuUk9MRV9URVhUOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSBBQ0MuU1RBVEVfUkVBRE9OTFk7DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU1vdXNlQ2xpY2soTW91c2VFdmVudCBlLCBib29sZWFuIGRvd24pIHsNCi0JCWlmIChkb3duKSB7DQotCQkJLy8gc2VsZWN0IGEgaHlwZXJsaW5rDQotCQkJSUh5cGVybGlua1NlZ21lbnQgc2VnbWVudFVuZGVyID0gbW9kZWwuZmluZEh5cGVybGlua0F0KGUueCwgZS55KTsNCi0JCQlpZiAoc2VnbWVudFVuZGVyICE9IG51bGwpIHsNCi0JCQkJSUh5cGVybGlua1NlZ21lbnQgb2xkTGluayA9IG1vZGVsLmdldFNlbGVjdGVkTGluaygpOw0KLQkJCQltb2RlbC5zZWxlY3RMaW5rKHNlZ21lbnRVbmRlcik7DQotCQkJCWVudGVyTGluayhzZWdtZW50VW5kZXIpOw0KLQkJCQlwYWludEZvY3VzVHJhbnNmZXIob2xkTGluaywgc2VnbWVudFVuZGVyKTsNCi0JCQl9DQotCQkJbW91c2VEb3duID0gdHJ1ZTsNCi0JCQlkcmFnT3JpZ2luID0gbmV3IFBvaW50KGUueCwgZS55KTsNCi0JCX0gZWxzZSB7DQotCQkJaWYgKGUuYnV0dG9uID09IDEpIHsNCi0JCQkJSUh5cGVybGlua1NlZ21lbnQgc2VnbWVudFVuZGVyID0NCi0JCQkJCW1vZGVsLmZpbmRIeXBlcmxpbmtBdChlLngsIGUueSk7DQotCQkJCWlmIChzZWdtZW50VW5kZXIgIT0gbnVsbCkgew0KLQkJCQkJYWN0aXZhdGVMaW5rKHNlZ21lbnRVbmRlcik7DQotCQkJCX0NCi0JCQl9DQotCQkJbW91c2VEb3duID0gZmFsc2U7DQotCQl9DQotCX0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7DQotCX0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsNCi0JCWlmIChtb3VzZURvd24pIHsNCi0JCQloYW5kbGVEcmFnKGUpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JCUlUZXh0U2VnbWVudCBzZWdtZW50VW5kZXIgPSBtb2RlbC5maW5kU2VnbWVudEF0KGUueCwgZS55KTsNCi0NCi0JCWlmIChzZWdtZW50VW5kZXIgPT0gbnVsbCkgew0KLQkJCWlmIChlbnRlcmVkICE9IG51bGwpIHsNCi0JCQkJZXhpdExpbmsoZW50ZXJlZCk7DQotCQkJCXBhaW50TGlua0hvdmVyKGVudGVyZWQsIGZhbHNlKTsNCi0JCQkJZW50ZXJlZCA9IG51bGw7DQotCQkJfQ0KLQkJCXNldEN1cnNvcihudWxsKTsNCi0JCX0gZWxzZSB7DQotCQkJaWYgKHNlZ21lbnRVbmRlciBpbnN0YW5jZW9mIElIeXBlcmxpbmtTZWdtZW50KSB7DQotCQkJCUlIeXBlcmxpbmtTZWdtZW50IGxpbmtVbmRlciA9IChJSHlwZXJsaW5rU2VnbWVudCkgc2VnbWVudFVuZGVyOw0KLQkJCQlpZiAoZW50ZXJlZCA9PSBudWxsKSB7DQotCQkJCQllbnRlcmVkID0gbGlua1VuZGVyOw0KLQkJCQkJZW50ZXJMaW5rKGxpbmtVbmRlcik7DQotCQkJCQlwYWludExpbmtIb3ZlcihlbnRlcmVkLCB0cnVlKTsNCi0JCQkJCXNldEN1cnNvcigNCi0JCQkJCQltb2RlbC5nZXRIeXBlcmxpbmtTZXR0aW5ncygpLmdldEh5cGVybGlua0N1cnNvcigpKTsNCi0JCQkJfQ0KLQkJCX0gZWxzZSB7DQotCQkJCWlmIChlbnRlcmVkICE9IG51bGwpIHsNCi0JCQkJCWV4aXRMaW5rKGVudGVyZWQpOw0KLQkJCQkJcGFpbnRMaW5rSG92ZXIoZW50ZXJlZCwgZmFsc2UpOw0KLQkJCQkJZW50ZXJlZCA9IG51bGw7DQotCQkJCX0NCi0JCQkJc2V0Q3Vyc29yKG1vZGVsLmdldEh5cGVybGlua1NldHRpbmdzKCkuZ2V0VGV4dEN1cnNvcigpKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURyYWcoTW91c2VFdmVudCBlKSB7DQotCX0NCi0NCi0JcHVibGljIEh5cGVybGlua1NldHRpbmdzIGdldEh5cGVybGlua1NldHRpbmdzKCkgew0KLQkJcmV0dXJuIG1vZGVsLmdldEh5cGVybGlua1NldHRpbmdzKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rU2V0dGluZ3MoSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MpIHsNCi0JCW1vZGVsLnNldEh5cGVybGlua1NldHRpbmdzKHNldHRpbmdzKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gYWR2YW5jZShib29sZWFuIG5leHQpIHsNCi0JCUlIeXBlcmxpbmtTZWdtZW50IGN1cnJlbnQgPSBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0JCWlmIChjdXJyZW50ICE9IG51bGwpDQotCQkJZXhpdExpbmsoY3VycmVudCk7DQotDQotCQlib29sZWFuIHZhbGlkID0gbW9kZWwudHJhdmVyc2VMaW5rcyhuZXh0KTsNCi0JCQ0KLQkJSUh5cGVybGlua1NlZ21lbnQgbmV3TGluayA9IG1vZGVsLmdldFNlbGVjdGVkTGluaygpOw0KLQ0KLQkJaWYgKHZhbGlkKQ0KLQkJCWVudGVyTGluayhuZXdMaW5rKTsNCi0JCXBhaW50Rm9jdXNUcmFuc2ZlcihjdXJyZW50LCBuZXdMaW5rKTsNCi0JCWlmIChuZXdMaW5rIT1udWxsKSBlbnN1cmVWaXNpYmxlKG5ld0xpbmspOw0KLQkJcmV0dXJuICF2YWxpZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUh5cGVybGlua1NlZ21lbnQgZ2V0U2VsZWN0ZWRMaW5rKCkgew0KLQkJcmV0dXJuIG1vZGVsLmdldFNlbGVjdGVkTGluaygpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVGb2N1c0NoYW5nZSgpIHsNCi0JCWlmIChoYXNGb2N1cykgew0KLQkJCW1vZGVsLnRyYXZlcnNlTGlua3ModHJ1ZSk7DQotCQkJZW50ZXJMaW5rKG1vZGVsLmdldFNlbGVjdGVkTGluaygpKTsNCi0JCQlwYWludEZvY3VzVHJhbnNmZXIobnVsbCwgbW9kZWwuZ2V0U2VsZWN0ZWRMaW5rKCkpOw0KLQkJfSBlbHNlIHsNCi0JCQlwYWludEZvY3VzVHJhbnNmZXIobW9kZWwuZ2V0U2VsZWN0ZWRMaW5rKCksIG51bGwpOw0KLQkJCW1vZGVsLnNlbGVjdExpbmsobnVsbCk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGVudGVyTGluayhJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlpZiAobGluayA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCUh5cGVybGlua0FjdGlvbiBhY3Rpb24gPSBsaW5rLmdldEFjdGlvbihvYmplY3RUYWJsZSk7DQotCQlpZiAoYWN0aW9uICE9IG51bGwpDQotCQkJYWN0aW9uLmxpbmtFbnRlcmVkKGxpbmspOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBleGl0TGluayhJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlpZiAobGluayA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCUh5cGVybGlua0FjdGlvbiBhY3Rpb24gPSBsaW5rLmdldEFjdGlvbihvYmplY3RUYWJsZSk7DQotCQlpZiAoYWN0aW9uICE9IG51bGwpDQotCQkJYWN0aW9uLmxpbmtFeGl0ZWQobGluayk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHBhaW50TGlua0hvdmVyKElIeXBlcmxpbmtTZWdtZW50IGxpbmssIGJvb2xlYW4gaG92ZXIpIHsNCi0JCUdDIGdjID0gbmV3IEdDKHRoaXMpOw0KLQ0KLQkJSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRIeXBlcmxpbmtTZXR0aW5ncygpOw0KLQ0KLQkJZ2Muc2V0Rm9yZWdyb3VuZCgNCi0JCQlob3ZlciA/IHNldHRpbmdzLmdldEFjdGl2ZUZvcmVncm91bmQoKSA6IHNldHRpbmdzLmdldEZvcmVncm91bmQoKSk7DQotCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7DQotCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotCQlib29sZWFuIHNlbGVjdGVkID0gKGxpbmsgPT0gZ2V0U2VsZWN0ZWRMaW5rKCkpOw0KLQkJbGluay5yZXBhaW50KGdjLCBob3Zlcik7DQotCQlpZiAoc2VsZWN0ZWQpIHsNCi0JCQlsaW5rLnBhaW50Rm9jdXMoZ2MsIGdldEJhY2tncm91bmQoKSwgZ2V0Rm9yZWdyb3VuZCgpLCBmYWxzZSk7DQotCQkJbGluay5wYWludEZvY3VzKGdjLCBnZXRCYWNrZ3JvdW5kKCksIGdldEZvcmVncm91bmQoKSwgdHJ1ZSk7DQotCQl9DQotCQlnYy5kaXNwb3NlKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlU2VsZWN0ZWRMaW5rKCkgew0KLQkJSUh5cGVybGlua1NlZ21lbnQgbGluayA9IG1vZGVsLmdldFNlbGVjdGVkTGluaygpOw0KLQkJaWYgKGxpbmsgIT0gbnVsbCkNCi0JCQlhY3RpdmF0ZUxpbmsobGluayk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlTGluayhJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlzZXRDdXJzb3IobW9kZWwuZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKS5nZXRCdXN5Q3Vyc29yKCkpOw0KLQkJSHlwZXJsaW5rQWN0aW9uIGFjdGlvbiA9IGxpbmsuZ2V0QWN0aW9uKG9iamVjdFRhYmxlKTsNCi0JCWlmIChhY3Rpb24gIT0gbnVsbCkNCi0JCQlhY3Rpb24ubGlua0FjdGl2YXRlZChsaW5rKTsNCi0JCWlmICghaXNEaXNwb3NlZCgpKQ0KLQkJCXNldEN1cnNvcihtb2RlbC5nZXRIeXBlcmxpbmtTZXR0aW5ncygpLmdldEh5cGVybGlua0N1cnNvcigpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludChQYWludEV2ZW50IGUpIHsNCi0JCWludCB3aWR0aCA9IGdldENsaWVudEFyZWEoKS53aWR0aDsNCi0NCi0JCUdDIGdjID0gZS5nYzsNCi0JCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsNCi0JCWdjLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsNCi0JCWdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsNCi0NCi0JCUxvY2F0b3IgbG9jID0gbmV3IExvY2F0b3IoKTsNCi0JCWxvYy5tYXJnaW5XaWR0aCA9IG1hcmdpbldpZHRoOw0KLQkJbG9jLm1hcmdpbkhlaWdodCA9IG1hcmdpbkhlaWdodDsNCi0JCWxvYy54ID0gbWFyZ2luV2lkdGg7DQotCQlsb2MueSA9IG1hcmdpbkhlaWdodDsNCi0NCi0JCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsNCi0JCWludCBsaW5lSGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7DQotCQkNCi0JCWlmIChsb2FkaW5nKSB7DQotCQkJaW50IHRleHRXaWR0aCA9IGdjLnRleHRFeHRlbnQobG9hZGluZ1RleHQpLng7DQotCQkJZ2MuZHJhd1RleHQobG9hZGluZ1RleHQsIHdpZHRoLzItdGV4dFdpZHRoLzIsIGdldENsaWVudEFyZWEoKS5oZWlnaHQvMi1saW5lSGVpZ2h0LzIpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJSVBhcmFncmFwaFtdIHBhcmFncmFwaHMgPSBtb2RlbC5nZXRQYXJhZ3JhcGhzKCk7DQotDQotCQlJSHlwZXJsaW5rU2VnbWVudCBzZWxlY3RlZExpbmsgPSBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5sZW5ndGg7IGkrKykgew0KLQkJCUlQYXJhZ3JhcGggcCA9IHBhcmFncmFwaHNbaV07DQotDQotCQkJaWYgKGkgPiAwICYmIHBhcmFncmFwaHNTZXBhcmF0ZWQgJiYgcC5nZXRBZGRWZXJ0aWNhbFNwYWNlKCkpDQotCQkJCWxvYy55ICs9IGdldFBhcmFncmFwaFNwYWNpbmcobGluZUhlaWdodCk7DQotDQotCQkJbG9jLmluZGVudCA9IHAuZ2V0SW5kZW50KCk7DQotCQkJbG9jLnJlc2V0Q2FyZXQoKTsNCi0JCQlsb2Mucm93SGVpZ2h0ID0gMDsNCi0JCQlwLnBhaW50KGdjLCB3aWR0aCwgbG9jLCBsaW5lSGVpZ2h0LCBvYmplY3RUYWJsZSwgc2VsZWN0ZWRMaW5rKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCByZWdpc3RlclRleHRPYmplY3QoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7DQotCQlvYmplY3RUYWJsZS5wdXQoa2V5LCB2YWx1ZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9hZChTdHJpbmcgdGV4dCwgYm9vbGVhbiBwYXJzZVRhZ3MsIGJvb2xlYW4gZXhwYW5kVVJMcykgew0KLQkJdHJ5IHsNCi0JCQlpZiAocGFyc2VUYWdzKQ0KLQkJCQltb2RlbC5wYXJzZVRhZ2dlZFRleHQodGV4dCwgZXhwYW5kVVJMcyk7DQotCQkJZWxzZQ0KLQkJCQltb2RlbC5wYXJzZVJlZ3VsYXJUZXh0KHRleHQsIGV4cGFuZFVSTHMpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJRm9ybXNQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOw0KLQkJfQ0KLQkJZmluYWxseSB7DQotCQkJbG9hZGluZyA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotCXB1YmxpYyB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaXMsIGJvb2xlYW4gZXhwYW5kVVJMcykgew0KLQkJdHJ5IHsNCi0JCQltb2RlbC5wYXJzZUlucHV0U3RyZWFtKGlzLCBleHBhbmRVUkxzKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCUZvcm1zUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCX0NCi0JCWZpbmFsbHkgew0KLQkJCWxvYWRpbmcgPSBmYWxzZTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsNCi0JCS8qDQotCQlpZiAoIW1vZGVsLmhhc0ZvY3VzU2VnbWVudHMoKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQkqLw0KLQkJcmV0dXJuIHN1cGVyLnNldEZvY3VzKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHBhaW50Rm9jdXNUcmFuc2ZlcigNCi0JCUlIeXBlcmxpbmtTZWdtZW50IG9sZExpbmssDQotCQlJSHlwZXJsaW5rU2VnbWVudCBuZXdMaW5rKSB7DQotCQlHQyBnYyA9IG5ldyBHQyh0aGlzKTsNCi0JCUNvbG9yIGJnID0gZ2V0QmFja2dyb3VuZCgpOw0KLQkJQ29sb3IgZmcgPSBnZXRGb3JlZ3JvdW5kKCk7DQotDQotCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotDQotCQlpZiAob2xkTGluayAhPSBudWxsKSB7DQotCQkJZ2Muc2V0QmFja2dyb3VuZChiZyk7DQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmZyk7DQotCQkJb2xkTGluay5wYWludEZvY3VzKGdjLCBiZywgZmcsIGZhbHNlKTsNCi0JCX0NCi0JCWlmIChuZXdMaW5rICE9IG51bGwpIHsNCi0JCQkvL2Vuc3VyZVZpc2libGUobmV3TGluayk7DQotCQkJZ2Muc2V0QmFja2dyb3VuZChiZyk7DQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmZyk7DQotCQkJbmV3TGluay5wYWludEZvY3VzKGdjLCBiZywgZmcsIHRydWUpOw0KLQkJfQ0KLQkJZ2MuZGlzcG9zZSgpOw0KLQl9DQotCS8qKg0KLQkgKiBHZXRzIHRoZSBtYXJnaW5XaWR0aC4NCi0JICogQHJldHVybiBSZXR1cm5zIGEgaW50DQotCSAqLw0KLQlwdWJsaWMgaW50IGdldE1hcmdpbldpZHRoKCkgew0KLQkJcmV0dXJuIG1hcmdpbldpZHRoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBtYXJnaW5XaWR0aC4NCi0JICogQHBhcmFtIG1hcmdpbldpZHRoIFRoZSBtYXJnaW5XaWR0aCB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE1hcmdpbldpZHRoKGludCBtYXJnaW5XaWR0aCkgew0KLQkJdGhpcy5tYXJnaW5XaWR0aCA9IG1hcmdpbldpZHRoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBtYXJnaW5IZWlnaHQuDQotCSAqIEByZXR1cm4gUmV0dXJucyBhIGludA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRNYXJnaW5IZWlnaHQoKSB7DQotCQlyZXR1cm4gbWFyZ2luSGVpZ2h0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBtYXJnaW5IZWlnaHQuDQotCSAqIEBwYXJhbSBtYXJnaW5IZWlnaHQgVGhlIG1hcmdpbkhlaWdodCB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE1hcmdpbkhlaWdodChpbnQgbWFyZ2luSGVpZ2h0KSB7DQotCQl0aGlzLm1hcmdpbkhlaWdodCA9IG1hcmdpbkhlaWdodDsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBjb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7DQotCQlJSHlwZXJsaW5rU2VnbWVudCBsaW5rID0gZ2V0U2VsZWN0ZWRMaW5rKCk7DQotCQlpZiAobGluayAhPSBudWxsKQ0KLQkJCWNvbnRyaWJ1dGVMaW5rQWN0aW9ucyhtYW5hZ2VyLCBsaW5rKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY29udHJpYnV0ZUxpbmtBY3Rpb25zKA0KLQkJSU1lbnVNYW5hZ2VyIG1hbmFnZXIsDQotCQlJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQltYW5hZ2VyLmFkZChvcGVuQWN0aW9uKTsNCi0JCW1hbmFnZXIuYWRkKGNvcHlTaG9ydGN1dEFjdGlvbik7DQotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBjb3B5U2hvcnRjdXQoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJU3RyaW5nIHRleHQgPSBsaW5rLmdldFRleHQoKTsNCi0JCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGdldERpc3BsYXkoKSk7DQotCQljbGlwYm9hcmQuc2V0Q29udGVudHMoDQotCQkJbmV3IE9iamVjdFtdIHsgdGV4dCB9LA0KLQkJCW5ldyBUcmFuc2ZlcltdIHsgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZW5zdXJlVmlzaWJsZShJSHlwZXJsaW5rU2VnbWVudCBzZWdtZW50KSB7DQotCQlSZWN0YW5nbGUgYm91bmRzID0gc2VnbWVudC5nZXRCb3VuZHMoKTsNCi0JCVNjcm9sbGVkQ29tcG9zaXRlIHNjb21wID0gZ2V0U2Nyb2xsZWRDb21wb3NpdGUoKTsNCi0JCWlmIChzY29tcCA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCVBvaW50IG9yaWdpbiA9IEFic3RyYWN0U2VjdGlvbkZvcm0uZ2V0Q29udHJvbExvY2F0aW9uKHNjb21wLCB0aGlzKTsNCi0JCW9yaWdpbi54ICs9IGJvdW5kcy54Ow0KLQkJb3JpZ2luLnkgKz0gYm91bmRzLnk7DQotCQlBYnN0cmFjdFNlY3Rpb25Gb3JtLmVuc3VyZVZpc2libGUoDQotCQkJc2NvbXAsDQotCQkJb3JpZ2luLA0KLQkJCW5ldyBQb2ludChib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpKTsNCi0JfQ0KLQlTY3JvbGxlZENvbXBvc2l0ZSBnZXRTY3JvbGxlZENvbXBvc2l0ZSgpIHsNCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBnZXRQYXJlbnQoKTsNCi0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgew0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkNCi0JCQkJcmV0dXJuIChTY3JvbGxlZENvbXBvc2l0ZSkgcGFyZW50Ow0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZUxheW91dC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9Gb3JtRW5naW5lTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYWVlNGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9Gb3JtRW5naW5lTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5JTGF5b3V0RXh0ZW5zaW9uOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIEZvcm1FbmdpbmVMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgaW1wbGVtZW50cyBJTGF5b3V0RXh0ZW5zaW9uIHsNCi0NCi0JcHVibGljIGludCBnZXRNYXhpbXVtV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlyZXR1cm4gY29tcHV0ZVNpemUocGFyZW50LCBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpLng7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRNaW5pbXVtV2lkdGgoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlyZXR1cm4gMzA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBMYXlvdXQjY29tcHV0ZVNpemUoQ29tcG9zaXRlLCBpbnQsIGludCwgYm9vbGVhbikNCi0JICovDQotDQotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZSgNCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUsDQotCQlpbnQgd0hpbnQsDQotCQlpbnQgaEhpbnQsDQotCQlib29sZWFuIGNoYW5nZWQpIHsNCi0JCUZvcm1FbmdpbmUgZW5naW5lID0gKEZvcm1FbmdpbmUpIGNvbXBvc2l0ZTsNCi0JCWludCBpbm5lcldpZHRoID0gd0hpbnQ7DQotCQlpZiAoZW5naW5lLmlzTG9hZGluZygpKSB7DQotCQkJcmV0dXJuIGNvbXB1dGVMb2FkaW5nKGVuZ2luZSk7DQotCQl9DQotCQlpZiAoaW5uZXJXaWR0aCAhPSBTV1QuREVGQVVMVCkNCi0JCQlpbm5lcldpZHRoIC09IGVuZ2luZS5tYXJnaW5XaWR0aCAqIDI7DQotCQlQb2ludCB0ZXh0U2l6ZSA9IGNvbXB1dGVUZXh0U2l6ZShlbmdpbmUsIGlubmVyV2lkdGgpOw0KLQkJaW50IHRleHRXaWR0aCA9IHRleHRTaXplLnggKyAyICogZW5naW5lLm1hcmdpbldpZHRoOw0KLQkJaW50IHRleHRIZWlnaHQgPSB0ZXh0U2l6ZS55ICsgMiAqIGVuZ2luZS5tYXJnaW5IZWlnaHQ7DQotCQlQb2ludCByZXN1bHQgPSBuZXcgUG9pbnQodGV4dFdpZHRoLCB0ZXh0SGVpZ2h0KTsNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0JDQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZUxvYWRpbmcoRm9ybUVuZ2luZSBlbmdpbmUpIHsNCi0JCUdDIGdjID0gbmV3IEdDKGVuZ2luZSk7DQotCQlnYy5zZXRGb250KGVuZ2luZS5nZXRGb250KCkpOw0KLQkJU3RyaW5nIGxvYWRpbmdUZXh0ID0gZW5naW5lLmdldExvYWRpbmdUZXh0KCk7DQotCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsb2FkaW5nVGV4dCk7DQotCQlnYy5kaXNwb3NlKCk7DQotCQlzaXplLnggKz0gMiAqIGVuZ2luZS5tYXJnaW5XaWR0aDsNCi0JCXNpemUueSArPSAyICogZW5naW5lLm1hcmdpbkhlaWdodDsNCi0JCXJldHVybiBzaXplOw0KLQl9DQotDQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZVRleHRTaXplKEZvcm1FbmdpbmUgZW5naW5lLCBpbnQgd0hpbnQpIHsNCi0JCUlQYXJhZ3JhcGhbXSBwYXJhZ3JhcGhzID0gZW5naW5lLm1vZGVsLmdldFBhcmFncmFwaHMoKTsNCi0NCi0JCUdDIGdjID0gbmV3IEdDKGVuZ2luZSk7DQotCQlnYy5zZXRGb250KGVuZ2luZS5nZXRGb250KCkpOw0KLQ0KLQkJTG9jYXRvciBsb2MgPSBuZXcgTG9jYXRvcigpOw0KLQ0KLQkJaW50IHdpZHRoID0gd0hpbnQgIT0gU1dULkRFRkFVTFQgPyB3SGludCA6IDA7DQotDQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7DQotCQkJSVBhcmFncmFwaCBwID0gcGFyYWdyYXBoc1tpXTsNCi0NCi0JCQlpZiAoaSA+IDAgJiYgZW5naW5lLnBhcmFncmFwaHNTZXBhcmF0ZWQgJiYgcC5nZXRBZGRWZXJ0aWNhbFNwYWNlKCkpDQotCQkJCWxvYy55ICs9IGVuZ2luZS5nZXRQYXJhZ3JhcGhTcGFjaW5nKGxpbmVIZWlnaHQpOw0KLQ0KLQkJCWxvYy5yb3dIZWlnaHQgPSAwOw0KLQkJCWxvYy5pbmRlbnQgPSBwLmdldEluZGVudCgpOw0KLQkJCWxvYy54ID0gcC5nZXRJbmRlbnQoKTsNCi0NCi0JCQlJUGFyYWdyYXBoU2VnbWVudFtdIHNlZ21lbnRzID0gcC5nZXRTZWdtZW50cygpOw0KLQkJCWlmIChzZWdtZW50cy5sZW5ndGggPiAwKSB7DQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudHMubGVuZ3RoOyBqKyspIHsNCi0JCQkJCUlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQgPSBzZWdtZW50c1tqXTsNCi0JCQkJCXNlZ21lbnQuYWR2YW5jZUxvY2F0b3IoZ2MsIHdIaW50LCBsb2MsIGVuZ2luZS5vYmplY3RUYWJsZSk7DQotCQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBsb2Mud2lkdGgpOw0KLQkJCQl9DQotCQkJCWxvYy55ICs9IGxvYy5yb3dIZWlnaHQ7DQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gZW1wdHkgbmV3IGxpbmUNCi0JCQkJbG9jLnkgKz0gbGluZUhlaWdodDsNCi0JCQl9DQotCQl9DQotCQlnYy5kaXNwb3NlKCk7DQotCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBsb2MueSk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBMYXlvdXQjbGF5b3V0KENvbXBvc2l0ZSwgYm9vbGVhbikNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0hUVFBBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSFRUUEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDNkMGI1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSFRUUEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbTsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIVFRQQWN0aW9uIGV4dGVuZHMgSHlwZXJsaW5rQWN0aW9uIHsNCi0JcHVibGljIEhUVFBBY3Rpb24gKCkgew0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsNCi0JCVByb2dyYW0ubGF1bmNoKGxpbmsuZ2V0VGV4dCgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgbGlua0VudGVyZWQoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJc2V0RGVzY3JpcHRpb24obGluay5nZXRUZXh0KCkpOw0KLQkJc3VwZXIubGlua0VudGVyZWQobGluayk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9IeXBlcmxpbmtBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSHlwZXJsaW5rQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTFhNjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9IeXBlcmxpbmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgSHlwZXJsaW5rQWN0aW9uIHsNCi0JSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXI7DQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOw0KLQkNCi0JcHVibGljIEh5cGVybGlua0FjdGlvbigpIHsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChmaW5hbCBJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsNCi0JCWlmIChtYW5hZ2VyIT1udWxsICYmIGRlc2NyaXB0aW9uIT1udWxsKSB7DQotCQkJbWFuYWdlci5zZXRNZXNzYWdlKGRlc2NyaXB0aW9uKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsNCi0JCWlmIChtYW5hZ2VyIT1udWxsICYmIGRlc2NyaXB0aW9uIT1udWxsKSB7DQotCQkJbWFuYWdlci5zZXRNZXNzYWdlKG51bGwpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lTWFuYWdlcihJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgew0KLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCi0JCXJldHVybiBkZXNjcmlwdGlvbjsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsNCi0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0h5cGVybGlua1NlZ21lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSHlwZXJsaW5rU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQxNTg3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSHlwZXJsaW5rU2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIEh5cGVybGlua1NlZ21lbnQNCi0JZXh0ZW5kcyBUZXh0U2VnbWVudA0KLQlpbXBsZW1lbnRzIElIeXBlcmxpbmtTZWdtZW50IHsNCi0JcHJpdmF0ZSBTdHJpbmcgYWN0aW9uSWQ7DQotCXByaXZhdGUgU3RyaW5nIGFyZzsNCi0JcHJpdmF0ZSBIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5nczsNCi0JDQotCXB1YmxpYyBIeXBlcmxpbmtTZWdtZW50KFN0cmluZyB0ZXh0LCBIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5ncywgU3RyaW5nIGZvbnRJZCkgew0KLQkJc3VwZXIodGV4dCwgZm9udElkKTsNCi0JCXRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsNCi0JCXVuZGVybGluZSA9IHNldHRpbmdzLmdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKT09SHlwZXJsaW5rU2V0dGluZ3MuVU5ERVJMSU5FX0FMV0FZUzsNCi0JfQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJSHlwZXJsaW5rU2VnbWVudCNnZXRMaXN0ZW5lcihIYXNodGFibGUpDQotCSAqLw0KLQlwdWJsaWMgSHlwZXJsaW5rQWN0aW9uIGdldEFjdGlvbihIYXNodGFibGUgb2JqZWN0VGFibGUpIHsNCi0JCWlmIChhY3Rpb25JZD09bnVsbCkgcmV0dXJuIG51bGw7DQotCQlPYmplY3Qgb2JqID0gb2JqZWN0VGFibGUuZ2V0KGFjdGlvbklkKTsNCi0JCWlmIChvYmo9PW51bGwpIHJldHVybiBudWxsOw0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEh5cGVybGlua0FjdGlvbikgcmV0dXJuIChIeXBlcmxpbmtBY3Rpb24pb2JqOw0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSU9iamVjdFJlZmVyZW5jZSNnZXRPYmplY3RJZCgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdElkKCkgew0KLQkJcmV0dXJuIGFjdGlvbklkOw0KLQl9DQotCQ0KLQl2b2lkIHNldEFjdGlvbklkKFN0cmluZyBpZCkgew0KLQkJdGhpcy5hY3Rpb25JZCA9IGlkOw0KLQl9DQotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIExvY2F0b3IgbG9jYXRvciwgSGFzaHRhYmxlIG9iamVjdFRhYmxlLCBib29sZWFuIHNlbGVjdGVkKSB7DQotCQlzZXRDb2xvcihzZXR0aW5ncy5nZXRGb3JlZ3JvdW5kKCkpOw0KLQkJc3VwZXIucGFpbnQoZ2MsIHdpZHRoLCBsb2NhdG9yLCBvYmplY3RUYWJsZSwgc2VsZWN0ZWQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZXBhaW50KEdDIGdjLCBib29sZWFuIGhvdmVyKSB7DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQkJaW50IGRlc2NlbnQgPSBmbS5nZXREZXNjZW50KCk7DQotCQlib29sZWFuIHJvbGxvdmVyTW9kZSA9IHNldHRpbmdzLmdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKT09SHlwZXJsaW5rU2V0dGluZ3MuVU5ERVJMSU5FX1JPTExPVkVSOw0KLQkJZm9yIChpbnQgaT0wOyBpPGFyZWFSZWN0YW5nbGVzLnNpemUoKTsgaSsrKSB7DQotCQkJQXJlYVJlY3RhbmdsZSBhcmVhUmVjdGFuZ2xlID0gKEFyZWFSZWN0YW5nbGUpYXJlYVJlY3RhbmdsZXMuZ2V0KGkpOw0KLQkJCVJlY3RhbmdsZSByZWN0ID0gYXJlYVJlY3RhbmdsZS5yZWN0Ow0KLQkJCVN0cmluZyB0ZXh0ID0gYXJlYVJlY3RhbmdsZS5nZXRUZXh0KCk7DQotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh0ZXh0KTsNCi0JCQlpbnQgdGV4dFggPSByZWN0LnggKyAxOw0KLQkJCWdjLmRyYXdTdHJpbmcodGV4dCwgdGV4dFgsIHJlY3QueSwgdHJ1ZSk7DQotCQkJaWYgKHVuZGVybGluZSB8fCBob3ZlciB8fCByb2xsb3Zlck1vZGUpIHsNCi0JCQkJaW50IGxpbmVZID0gcmVjdC55ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCQlDb2xvciBzYXZlZD1udWxsOw0KLQkJCQlpZiAocm9sbG92ZXJNb2RlICYmICFob3Zlcikgew0KLQkJCQkJc2F2ZWQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7DQotCQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGdjLmdldEJhY2tncm91bmQoKSk7DQotCQkJCX0NCi0JCQkJZ2MuZHJhd0xpbmUodGV4dFgsIGxpbmVZLCB0ZXh0WCtleHRlbnQueCwgbGluZVkpOw0KLQkJCQlpZiAoc2F2ZWQhPW51bGwpDQotCQkJCQlnYy5zZXRGb3JlZ3JvdW5kKHNhdmVkKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JLyoqDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJnKCkgew0KLQkJcmV0dXJuIGFyZzsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHN0cmluZw0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QXJnKFN0cmluZyBzdHJpbmcpIHsNCi0JCWFyZyA9IHN0cmluZzsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lCdWxsZXRQYXJhZ3JhcGguamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSUJ1bGxldFBhcmFncmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWYzMzgzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSUJ1bGxldFBhcmFncmFwaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGludGVyZmFjZSBJQnVsbGV0UGFyYWdyYXBoIGV4dGVuZHMgSVBhcmFncmFwaCB7Ci0JaW50IENJUkNMRSA9IDA7Ci0JaW50IFRFWFQgPSAxOwotCWludCBJTUFHRSA9IDI7Ci0JcHVibGljIGludCBnZXRCdWxsZXRTdHlsZSgpOwotCXB1YmxpYyBTdHJpbmcgZ2V0QnVsbGV0VGV4dCgpOwotCi0JcHVibGljIHZvaWQgcGFpbnRCdWxsZXQoR0MgZ2MsIExvY2F0b3IgbG9jLCBpbnQgbGluZUhlaWdodCwgSGFzaHRhYmxlIG9iamVjdFRhYmxlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lIeXBlcmxpbmtTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lIeXBlcmxpbmtTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWI1OGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JSHlwZXJsaW5rU2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGludGVyZmFjZSBJSHlwZXJsaW5rU2VnbWVudCBleHRlbmRzIElUZXh0U2VnbWVudCwgSU9iamVjdFJlZmVyZW5jZSB7DQotCUh5cGVybGlua0FjdGlvbiBnZXRBY3Rpb24oSGFzaHRhYmxlIG9iamVjdFRhYmxlKTsNCi0JDQotCWJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KTsNCi0JDQotCVN0cmluZyBnZXRBcmcoKTsNCi0JDQotCXB1YmxpYyB2b2lkIHJlcGFpbnQoR0MgZ2MsIGJvb2xlYW4gaG92ZXIpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lJbWFnZVNlZ21lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSUltYWdlU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTliZDU2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSUltYWdlU2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGludGVyZmFjZSBJSW1hZ2VTZWdtZW50IGV4dGVuZHMgSVBhcmFncmFwaFNlZ21lbnQsIElPYmplY3RSZWZlcmVuY2Ugew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1AgPSAxOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSURETEUgPSAyOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT00gPSAzOw0KLQkNCi0JcHVibGljIGludCBnZXRWZXJ0aWNhbEFsaWdubWVudCgpOw0KLQ0KLQlJbWFnZSBnZXRJbWFnZShIYXNodGFibGUgb2JqZWN0VGFibGUpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lPYmplY3RSZWZlcmVuY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSU9iamVjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTJhN2ViLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSU9iamVjdFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSU9iamVjdFJlZmVyZW5jZSB7DQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0SWQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lQYXJhZ3JhcGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzMzZlYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lQYXJhZ3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVBhcmFncmFwaCB7DQotCXB1YmxpYyBpbnQgZ2V0SW5kZW50KCk7DQotCXB1YmxpYyBJUGFyYWdyYXBoU2VnbWVudCBbXSBnZXRTZWdtZW50cygpOw0KLQlwdWJsaWMgdm9pZCBhZGRTZWdtZW50KElQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQpOw0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBZGRWZXJ0aWNhbFNwYWNlKCk7DQotCXB1YmxpYyBJVGV4dFNlZ21lbnQgZmluZFNlZ21lbnRBdChpbnQgeCwgaW50IHkpOw0KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBMb2NhdG9yIGxvYywgaW50IGxpbmVIZWlnaHQsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSwgSUh5cGVybGlua1NlZ21lbnQgc2VsZWN0ZWRMaW5rKTsNCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3NpYmxlVGV4dCgpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lQYXJhZ3JhcGhTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lQYXJhZ3JhcGhTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTcxMDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoU2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGludGVyZmFjZSBJUGFyYWdyYXBoU2VnbWVudCB7DQotCQ0KLQlwdWJsaWMgdm9pZCBhZHZhbmNlTG9jYXRvcihHQyBnYywgaW50IHdIaW50LCBMb2NhdG9yIGxvYywgSGFzaHRhYmxlIG9iamVjdFRhYmxlKTsNCi0JDQotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIExvY2F0b3IgbG9jLCBIYXNodGFibGUgb2JqZWN0VGFibGUsIGJvb2xlYW4gc2VsZWN0ZWQpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lUZXh0TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSVRleHRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDcxYWQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSVRleHRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0TW9kZWwgew0KLQlJUGFyYWdyYXBoIFtdIGdldFBhcmFncmFwaHMoKTsNCi0JcHVibGljIHZvaWQgcGFyc2VUYWdnZWRUZXh0KFN0cmluZyB0YWdnZWRUZXh0LCBib29sZWFuIGV4cGFuZFVSTHMpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQlwdWJsaWMgdm9pZCBwYXJzZVJlZ3VsYXJUZXh0KFN0cmluZyByZWd1bGFyVGV4dCwgYm9vbGVhbiBleHBhbmRVUkxzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lUZXh0U2VnbWVudC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JVGV4dFNlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlNWZiMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lUZXh0U2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0U2VnbWVudCBleHRlbmRzIElQYXJhZ3JhcGhTZWdtZW50IHsNCi0JU3RyaW5nIGdldFRleHQoKTsNCi0JQ29sb3IgZ2V0Q29sb3IoKTsNCi0JRm9udCBnZXRGb250KCk7DQotCWJvb2xlYW4gaXNXb3JkV3JhcEFsbG93ZWQoKTsNCi0JYm9vbGVhbiBpc1NlbGVjdGFibGUoKTsNCi0JYm9vbGVhbiBjb250YWlucyhpbnQgeCwgaW50IHkpOw0KLQlSZWN0YW5nbGUgZ2V0Qm91bmRzKCk7DQotCXZvaWQgcGFpbnRGb2N1cyhHQyBnYywgQ29sb3IgYmcsIENvbG9yIGZnLCBib29sZWFuIHNlbGVjdGVkKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JbWFnZVNlZ21lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSW1hZ2VTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjODRjYjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JbWFnZVNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIEltYWdlU2VnbWVudCBleHRlbmRzIFBhcmFncmFwaFNlZ21lbnQgaW1wbGVtZW50cyBJSW1hZ2VTZWdtZW50IHsNCi0JcHJpdmF0ZSBpbnQgYWxpZ25tZW50ID0gQk9UVE9NOw0KLQlwcml2YXRlIFN0cmluZyBpbWFnZUlkOw0KLQkNCi0JcHVibGljIGludCBnZXRWZXJ0aWNhbEFsaWdubWVudCgpIHsNCi0JCXJldHVybiBhbGlnbm1lbnQ7DQotCX0NCi0JDQotCXZvaWQgc2V0VmVydGljYWxBbGlnbm1lbnQoaW50IGFsaWdubWVudCkgew0KLQkJdGhpcy5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7DQotCX0NCi0JDQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShIYXNodGFibGUgb2JqZWN0VGFibGUpIHsNCi0JCWlmIChpbWFnZUlkPT1udWxsKSByZXR1cm4gbnVsbDsNCi0JCU9iamVjdCBvYmogPSBvYmplY3RUYWJsZS5nZXQoaW1hZ2VJZCk7DQotCQlpZiAob2JqPT1udWxsKSByZXR1cm4gbnVsbDsNCi0JCWlmIChvYmogaW5zdGFuY2VvZiBJbWFnZSkgcmV0dXJuIChJbWFnZSlvYmo7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RJZCgpIHsNCi0JCXJldHVybiBpbWFnZUlkOw0KLQl9DQotCQ0KLQl2b2lkIHNldE9iamVjdElkKFN0cmluZyBpbWFnZUlkKSB7DQotCQl0aGlzLmltYWdlSWQgPSBpbWFnZUlkOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBhZHZhbmNlTG9jYXRvcihHQyBnYywgaW50IHdIaW50LCBMb2NhdG9yIGxvYywgSGFzaHRhYmxlIG9iamVjdFRhYmxlKSB7DQotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlKG9iamVjdFRhYmxlKTsNCi0JCWludCBpd2lkdGggPSAwOw0KLQkJaW50IGloZWlnaHQgPSAwOw0KLQkJaWYgKGltYWdlIT1udWxsKSB7DQotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsNCi0JCQlpd2lkdGggPSByZWN0LndpZHRoOw0KLQkJCWloZWlnaHQgPSByZWN0LmhlaWdodDsNCi0JCX0NCi0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCAmJiBsb2MueCArIGl3aWR0aCA+IHdIaW50KSB7DQotCQkJLy8gbmV3IGxpbmUNCi0JCQlsb2MueCA9IGxvYy5pbmRlbnQgKyBpd2lkdGg7DQotCQkJbG9jLndpZHRoID0gbG9jLng7DQotCQkJbG9jLnkgKz0gbG9jLnJvd0hlaWdodDsNCi0JCQlsb2Mucm93SGVpZ2h0ID0gaWhlaWdodDsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWxvYy54ICs9IGl3aWR0aDsNCi0JCQlsb2Mucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jLnJvd0hlaWdodCwgaWhlaWdodCk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgTG9jYXRvciBsb2MsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSwgYm9vbGVhbiBzZWxlY3RlZCkgew0KLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZShvYmplY3RUYWJsZSk7DQotCQlpbnQgaXdpZHRoID0gMDsNCi0JCWludCBpaGVpZ2h0ID0gMDsNCi0JCWlmIChpbWFnZSE9bnVsbCkgew0KLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7DQotCQkJaXdpZHRoID0gcmVjdC53aWR0aDsNCi0JCQlpaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7DQotCQl9DQotCQllbHNlIHJldHVybjsNCi0JCWxvYy53aWR0aCA9IGl3aWR0aDsNCi0JCWxvYy5oZWlnaHQgPSBpaGVpZ2h0Ow0KLQkJDQotCQlpbnQgaXggPSBsb2MueDsNCi0JCWludCBpeSA9IGxvYy55Ow0KLQkJDQotCQlpZiAoaXggKyBpd2lkdGggPiB3aWR0aCkgew0KLQkJCS8vIG5ldyByb3cNCi0JCQlpeCA9IGxvYy5pbmRlbnQgKyBsb2MubWFyZ2luV2lkdGg7DQotCQkJaXkgKz0gbG9jLnJvd0hlaWdodDsNCi0JCQlsb2Mucm93SGVpZ2h0ID0gMDsNCi0JCX0NCi0JCQ0KLQkJZ2MuZHJhd0ltYWdlKGltYWdlLCBpeCwgaXkpOw0KLQkJbG9jLnggPSBpeCArIGl3aWR0aDsNCi0JCWxvYy55ID0gaXk7DQotCQlsb2Mucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jLnJvd0hlaWdodCwgaWhlaWdodCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9Mb2NhdG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0xvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwMTU0Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0xvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYXRvciB7IA0KLQlwdWJsaWMgaW50IGluZGVudDsNCi0JcHVibGljIGludCB4LCB5Ow0KLQlwdWJsaWMgaW50IHdpZHRoLCBoZWlnaHQ7DQotCXB1YmxpYyBpbnQgcm93SGVpZ2h0Ow0KLQlwdWJsaWMgaW50IG1hcmdpbldpZHRoOw0KLQlwdWJsaWMgaW50IG1hcmdpbkhlaWdodDsNCi0JDQotCXB1YmxpYyB2b2lkIG5ld0xpbmUoKSB7DQotCQlyZXNldENhcmV0KCk7DQotCQl5ICs9IHJvd0hlaWdodDsNCi0JCXJvd0hlaWdodCA9IDA7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHJlc2V0Q2FyZXQoKSB7DQotCQl4ID0gbWFyZ2luV2lkdGggKyBpbmRlbnQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9QYXJhZ3JhcGguamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvUGFyYWdyYXBoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YTQzNTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9QYXJhZ3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5IeXBlcmxpbmtTZXR0aW5nczsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhZ3JhcGggaW1wbGVtZW50cyBJUGFyYWdyYXBoIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUCA9ICJodHRwOi8vIjsNCi0JcHJpdmF0ZSBWZWN0b3Igc2VnbWVudHM7DQotCXByaXZhdGUgYm9vbGVhbiBhZGRWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsNCi0NCi0JcHVibGljIFBhcmFncmFwaChib29sZWFuIGFkZFZlcnRpY2FsU3BhY2UpIHsNCi0JCXRoaXMuYWRkVmVydGljYWxTcGFjZSA9IGFkZFZlcnRpY2FsU3BhY2U7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRJbmRlbnQoKSB7DQotCQlyZXR1cm4gMDsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBZGRWZXJ0aWNhbFNwYWNlKCkgew0KLQkJcmV0dXJuIGFkZFZlcnRpY2FsU3BhY2U7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGFyYWdyYXBoI2dldFNlZ21lbnRzKCkNCi0JICovDQotCXB1YmxpYyBJUGFyYWdyYXBoU2VnbWVudFtdIGdldFNlZ21lbnRzKCkgew0KLQkJaWYgKHNlZ21lbnRzID09IG51bGwpDQotCQkJcmV0dXJuIG5ldyBJUGFyYWdyYXBoU2VnbWVudFswXTsNCi0JCXJldHVybiAoSVBhcmFncmFwaFNlZ21lbnRbXSkgc2VnbWVudHMudG9BcnJheSgNCi0JCQluZXcgSVBhcmFncmFwaFNlZ21lbnRbc2VnbWVudHMuc2l6ZSgpXSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkU2VnbWVudChJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50KSB7DQotCQlpZiAoc2VnbWVudHMgPT0gbnVsbCkNCi0JCQlzZWdtZW50cyA9IG5ldyBWZWN0b3IoKTsNCi0JCXNlZ21lbnRzLmFkZChzZWdtZW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBwYXJzZVJlZ3VsYXJUZXh0KA0KLQkJU3RyaW5nIHRleHQsDQotCQlib29sZWFuIGV4cGFuZFVSTHMsDQotCQlIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5ncywNCi0JCVN0cmluZyBmb250SWQpIHsNCi0JCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApDQotCQkJcmV0dXJuOw0KLQkJaWYgKGV4cGFuZFVSTHMpIHsNCi0JCQlpbnQgbG9jID0gdGV4dC5pbmRleE9mKEhUVFApOw0KLQ0KLQkJCWlmIChsb2MgPT0gLTEpDQotCQkJCWFkZFNlZ21lbnQobmV3IFRleHRTZWdtZW50KHRleHQsIGZvbnRJZCkpOw0KLQkJCWVsc2Ugew0KLQkJCQlpbnQgdGV4dExvYyA9IDA7DQotCQkJCXdoaWxlIChsb2MgIT0gLTEpIHsNCi0JCQkJCWFkZFNlZ21lbnQobmV3IFRleHRTZWdtZW50KHRleHQuc3Vic3RyaW5nKHRleHRMb2MsIGxvYyksIGZvbnRJZCkpOw0KLQkJCQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOw0KLQkJCQkJZm9yICh0ZXh0TG9jID0gbG9jOyB0ZXh0TG9jIDwgdGV4dC5sZW5ndGgoKTsgdGV4dExvYysrKSB7DQotCQkJCQkJY2hhciBjID0gdGV4dC5jaGFyQXQodGV4dExvYyk7DQotCQkJCQkJaWYgKENoYXJhY3Rlci5pc1NwYWNlQ2hhcihjKSkgew0KLQkJCQkJCQlhZGRIeXBlcmxpbmtTZWdtZW50KHRleHQuc3Vic3RyaW5nKGxvYywgdGV4dExvYyksIHNldHRpbmdzLCBmb250SWQpOw0KLQkJCQkJCQlhZGRlZCA9IHRydWU7DQotCQkJCQkJCWJyZWFrOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWlmICghYWRkZWQpIHsNCi0JCQkJCQkvLyB0aGVyZSB3YXMgbm8gc3BhY2UgLSBqdXN0IGVuZCBvZiB0ZXh0DQotCQkJCQkJYWRkSHlwZXJsaW5rU2VnbWVudCh0ZXh0LnN1YnN0cmluZyhsb2MpLCBzZXR0aW5ncywgZm9udElkKTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJCWxvYyA9IHRleHQuaW5kZXhPZihIVFRQLCB0ZXh0TG9jKTsNCi0JCQkJfQ0KLQkJCQlpZiAodGV4dExvYyA8IHRleHQubGVuZ3RoKCkpIHsNCi0JCQkJCWFkZFNlZ21lbnQobmV3IFRleHRTZWdtZW50KHRleHQuc3Vic3RyaW5nKHRleHRMb2MpLCBmb250SWQpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0gZWxzZSB7DQotCQkJYWRkU2VnbWVudChuZXcgVGV4dFNlZ21lbnQodGV4dCwgZm9udElkKSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGFkZEh5cGVybGlua1NlZ21lbnQoDQotCQlTdHJpbmcgdGV4dCwNCi0JCUh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzLA0KLQkJU3RyaW5nIGZvbnRJZCkgew0KLQkJSHlwZXJsaW5rU2VnbWVudCBocyA9IG5ldyBIeXBlcmxpbmtTZWdtZW50KHRleHQsIHNldHRpbmdzLCBmb250SWQpOw0KLQkJaHMuc2V0V29yZFdyYXBBbGxvd2VkKGZhbHNlKTsNCi0JCWhzLnNldEFjdGlvbklkKEZvcm1FbmdpbmUuVVJMX0hBTkRMRVJfSUQpOw0KLQkJYWRkU2VnbWVudChocyk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFpbnQoDQotCQlHQyBnYywNCi0JCWludCB3aWR0aCwNCi0JCUxvY2F0b3IgbG9jLA0KLQkJaW50IGxpbmVIZWlnaHQsDQotCQlIYXNodGFibGUgb2JqZWN0VGFibGUsDQotCQlJSHlwZXJsaW5rU2VnbWVudCBzZWxlY3RlZExpbmspIHsNCi0JCUlQYXJhZ3JhcGhTZWdtZW50IFtdIHNlZ21lbnRzID0gZ2V0U2VnbWVudHMoKTsNCi0JCWlmIChzZWdtZW50cy5sZW5ndGggPiAwKSB7DQotCQkJaWYgKHNlZ21lbnRzWzBdIGluc3RhbmNlb2YgSVRleHRTZWdtZW50DQotCQkJCSYmICgoSVRleHRTZWdtZW50KSBzZWdtZW50c1swXSkuaXNTZWxlY3RhYmxlKCkpDQotCQkJCWxvYy54ICs9IDE7DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWdtZW50cy5sZW5ndGg7IGorKykgew0KLQkJCQlJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gc2VnbWVudHNbal07DQotCQkJCWJvb2xlYW4gZG9TZWxlY3QgPSBmYWxzZTsNCi0JCQkJaWYgKHNlbGVjdGVkTGluayAhPSBudWxsICYmIHNlZ21lbnQuZXF1YWxzKHNlbGVjdGVkTGluaykpDQotCQkJCQlkb1NlbGVjdCA9IHRydWU7DQotCQkJCXNlZ21lbnQucGFpbnQoZ2MsIHdpZHRoLCBsb2MsIG9iamVjdFRhYmxlLCBkb1NlbGVjdCk7DQotCQkJfQ0KLQkJCWxvYy55ICs9IGxvYy5yb3dIZWlnaHQ7DQotCQl9IGVsc2Ugew0KLQkJCWxvYy55ICs9IGxpbmVIZWlnaHQ7DQotCQl9DQotCX0NCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3NpYmxlVGV4dCgpIHsNCi0JCUlQYXJhZ3JhcGhTZWdtZW50IFtdIHNlZ21lbnRzID0gZ2V0U2VnbWVudHMoKTsNCi0JCVN0cmluZ1dyaXRlciBzd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN3cml0ZXIpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgew0KLQkJCUlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQgPSBzZWdtZW50c1tpXTsNCi0JCQlpZiAoc2VnbWVudCBpbnN0YW5jZW9mIElUZXh0U2VnbWVudCkgew0KLQkJCQlTdHJpbmcgdGV4dCA9ICgoSVRleHRTZWdtZW50KXNlZ21lbnQpLmdldFRleHQoKTsNCi0JCQkJd3JpdGVyLnByaW50KHRleHQpOw0KLQkJCX0NCi0JCX0NCi0JCXdyaXRlci5wcmludGxuKCk7DQotCQlzd3JpdGVyLmZsdXNoKCk7DQotCQlyZXR1cm4gc3dyaXRlci50b1N0cmluZygpOw0KLQl9DQotCXB1YmxpYyBJVGV4dFNlZ21lbnQgZmluZFNlZ21lbnRBdChpbnQgeCwgaW50IHkpIHsNCi0JCWlmIChzZWdtZW50cyE9bnVsbCkgew0KLQkJCWZvciAoaW50IGk9MDsgaTxzZWdtZW50cy5zaXplKCk7IGkrKykgew0KLQkJCQlJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gKElQYXJhZ3JhcGhTZWdtZW50KXNlZ21lbnRzLmdldChpKTsNCi0JCQkJaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBJVGV4dFNlZ21lbnQpIHsNCi0JCQkJCUlUZXh0U2VnbWVudCB0ZXh0U2VnbWVudCA9IChJVGV4dFNlZ21lbnQpc2VnbWVudDsNCi0JCQkJCWlmICh0ZXh0U2VnbWVudC5jb250YWlucyh4LCB5KSkNCi0JCQkJCQlyZXR1cm4gdGV4dFNlZ21lbnQ7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1BhcmFncmFwaFNlZ21lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvUGFyYWdyYXBoU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDE2YWFjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvUGFyYWdyYXBoU2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXJhZ3JhcGhTZWdtZW50IGltcGxlbWVudHMgSVBhcmFncmFwaFNlZ21lbnQgew0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1RleHRNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9UZXh0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjOTY4Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1RleHRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsNCi1pbXBvcnQgb3JnLnczYy5kb20uKjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguKjsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUZXh0TW9kZWwgaW1wbGVtZW50cyBJVGV4dE1vZGVsIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQ0KLQlWZWN0b3IgcGFyYWdyYXBoczsNCi0JSUh5cGVybGlua0xpc3RlbmVyIHVybExpc3RlbmVyOw0KLQlJSHlwZXJsaW5rU2VnbWVudFtdIGh5cGVybGlua3M7DQotCWludCBzZWxlY3RlZExpbmtJbmRleCA9IC0xOw0KLQlIeXBlcmxpbmtTZXR0aW5ncyBoeXBlcmxpbmtTZXR0aW5nczsNCi0JDQotCXB1YmxpYyBUZXh0TW9kZWwoKSB7DQotCQlyZXNldCgpOw0KLQl9DQotDQotCWNsYXNzIExvY2FsSHlwZXJsaW5rU2V0dGluZ3MgZXh0ZW5kcyBIeXBlcmxpbmtTZXR0aW5ncyB7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJVGV4dE1vZGVsI2dldFBhcmFncmFwaHMoKQ0KLQkgKi8NCi0JcHVibGljIElQYXJhZ3JhcGhbXSBnZXRQYXJhZ3JhcGhzKCkgew0KLQkJaWYgKHBhcmFncmFwaHMgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbmV3IElQYXJhZ3JhcGhbMF07DQotCQlyZXR1cm4gKElQYXJhZ3JhcGhbXSkgcGFyYWdyYXBocy50b0FycmF5KA0KLQkJCW5ldyBJUGFyYWdyYXBoW3BhcmFncmFwaHMuc2l6ZSgpXSk7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzaWJsZVRleHQoKSB7DQotCQlpZiAocGFyYWdyYXBocyA9PSBudWxsKQ0KLQkJCXJldHVybiAiIjsNCi0JCVN0cmluZ0J1ZmZlciBzYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJZm9yIChpbnQgaT0wOyBpPHBhcmFncmFwaHMuc2l6ZSgpOyBpKyspIHsNCi0JCQlJUGFyYWdyYXBoIHBhcmFncmFwaCAgPSAoSVBhcmFncmFwaClwYXJhZ3JhcGhzLmdldChpKTsNCi0JCQlTdHJpbmcgdGV4dCA9IHBhcmFncmFwaC5nZXRBY2Nlc3NpYmxlVGV4dCgpOw0KLQkJCXNidWYuYXBwZW5kKHRleHQpOw0KLQkJfQ0KLQkJcmV0dXJuIHNidWYudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElUZXh0TW9kZWwjcGFyc2UoU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcGFyc2VUYWdnZWRUZXh0KFN0cmluZyB0YWdnZWRUZXh0LCBib29sZWFuIGV4cGFuZFVSTHMpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAodGFnZ2VkVGV4dD09bnVsbCkgew0KLQkJCXJlc2V0KCk7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJdHJ5IHsNCi0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPQ0KLQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGFnZ2VkVGV4dC5nZXRCeXRlcygiVVRGOCIpKTsNCi0JCQlwYXJzZUlucHV0U3RyZWFtKHN0cmVhbSwgZXhwYW5kVVJMcyk7DQotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBwYXJzZUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzLCBib29sZWFuIGV4cGFuZFVSTHMpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkJDQotCQlkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOw0KLQkNCi0JCXJlc2V0KCk7DQotCQl0cnkgew0KLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOw0KLQkJCUlucHV0U291cmNlIHNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpcyk7DQotCQkJRG9jdW1lbnQgZG9jID0gcGFyc2VyLnBhcnNlKHNvdXJjZSk7DQotCQkJcHJvY2Vzc0RvY3VtZW50KGRvYywgZXhwYW5kVVJMcyk7DQotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCQlGb3Jtc1BsdWdpbi5sb2dFeGNlcHRpb24oZSk7DQotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgew0KLQkJCUZvcm1zUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQlGb3Jtc1BsdWdpbi5sb2dFeGNlcHRpb24oZSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEb2N1bWVudChEb2N1bWVudCBkb2MsIGJvb2xlYW4gZXhwYW5kVVJMcykgew0KLQkJTm9kZSByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOw0KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSByb290LmdldENoaWxkTm9kZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgew0KLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOw0KLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7DQotCQkJCS8vIE1ha2UgYW4gaW1wbGljaXQgcGFyYWdyYXBoDQotCQkJCVN0cmluZyB0ZXh0ID0gY2hpbGQuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgIWlzSWdub3JhYmxlV2hpdGVTcGFjZSh0ZXh0LCB0cnVlKSkgew0KLQkJCQkJUGFyYWdyYXBoIHAgPSBuZXcgUGFyYWdyYXBoKHRydWUpOw0KLQkJCQkJcC5wYXJzZVJlZ3VsYXJUZXh0KA0KLQkJCQkJCXRleHQsDQotCQkJCQkJZXhwYW5kVVJMcywNCi0JCQkJCQlnZXRIeXBlcmxpbmtTZXR0aW5ncygpLA0KLQkJCQkJCW51bGwpOw0KLQkJCQkJcGFyYWdyYXBocy5hZGQocCk7DQotCQkJCX0NCi0JCQl9IGVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsNCi0JCQkJU3RyaW5nIHRhZyA9IGNoaWxkLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoKTsNCi0JCQkJaWYgKHRhZy5lcXVhbHMoInAiKSkgew0KLQkJCQkJSVBhcmFncmFwaCBwID0gcHJvY2Vzc1BhcmFncmFwaChjaGlsZCwgZXhwYW5kVVJMcyk7DQotCQkJCQlpZiAocCAhPSBudWxsKQ0KLQkJCQkJCXBhcmFncmFwaHMuYWRkKHApOw0KLQkJCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoImxpIikpIHsNCi0JCQkJCUlQYXJhZ3JhcGggcCA9IHByb2Nlc3NMaXN0SXRlbShjaGlsZCwgZXhwYW5kVVJMcyk7DQotCQkJCQlpZiAocCAhPSBudWxsKQ0KLQkJCQkJCXBhcmFncmFwaHMuYWRkKHApOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXByaXZhdGUgSVBhcmFncmFwaCBwcm9jZXNzUGFyYWdyYXBoKE5vZGUgcGFyYWdyYXBoLCBib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyYWdyYXBoLmdldENoaWxkTm9kZXMoKTsNCi0JCU5hbWVkTm9kZU1hcCBhdHRzID0gcGFyYWdyYXBoLmdldEF0dHJpYnV0ZXMoKTsNCi0JCU5vZGUgYWRkU3BhY2VBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgiYWRkVmVydGljYWxTcGFjZSIpOw0KLQkJYm9vbGVhbiBhZGRTcGFjZSA9IHRydWU7DQotDQotCQlpZiAoYWRkU3BhY2VBdHQgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGFkZFNwYWNlQXR0LmdldE5vZGVWYWx1ZSgpOw0KLQkJCWFkZFNwYWNlID0gdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLQkJfQ0KLQkJUGFyYWdyYXBoIHAgPSBuZXcgUGFyYWdyYXBoKGFkZFNwYWNlKTsNCi0NCi0JCXByb2Nlc3NTZWdtZW50cyhwLCBjaGlsZHJlbiwgZXhwYW5kVVJMcyk7DQotCQlyZXR1cm4gcDsNCi0JfQ0KLQlwcml2YXRlIElQYXJhZ3JhcGggcHJvY2Vzc0xpc3RJdGVtKE5vZGUgbGlzdEl0ZW0sIGJvb2xlYW4gZXhwYW5kVVJMcykgew0KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBsaXN0SXRlbS5nZXRDaGlsZE5vZGVzKCk7DQotCQlOYW1lZE5vZGVNYXAgYXR0cyA9IGxpc3RJdGVtLmdldEF0dHJpYnV0ZXMoKTsNCi0JCU5vZGUgYWRkU3BhY2VBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgiYWRkVmVydGljYWxTcGFjZSIpOw0KLQkJTm9kZSBzdHlsZUF0dCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJzdHlsZSIpOw0KLQkJTm9kZSB2YWx1ZUF0dCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJ2YWx1ZSIpOw0KLQkJTm9kZSBpbmRlbnRBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgiaW5kZW50Iik7DQotCQlpbnQgc3R5bGUgPSBJQnVsbGV0UGFyYWdyYXBoLkNJUkNMRTsNCi0JCWludCBpbmRlbnQgPSAtMTsNCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsNCi0JCWJvb2xlYW4gYWRkU3BhY2UgPSB0cnVlOw0KLQ0KLQkJaWYgKGFkZFNwYWNlQXR0ICE9IG51bGwpIHsNCi0JCQlTdHJpbmcgdmFsdWUgPSBhZGRTcGFjZUF0dC5nZXROb2RlVmFsdWUoKTsNCi0JCQlhZGRTcGFjZSA9IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0JCX0NCi0JCWlmIChzdHlsZUF0dCAhPSBudWxsKSB7DQotCQkJU3RyaW5nIHZhbHVlID0gc3R5bGVBdHQuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRleHQiKSkgew0KLQkJCQlzdHlsZSA9IElCdWxsZXRQYXJhZ3JhcGguVEVYVDsNCi0JCQl9IGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoImltYWdlIikpIHsNCi0JCQkJc3R5bGUgPSBJQnVsbGV0UGFyYWdyYXBoLklNQUdFOw0KLQkJCX0NCi0JCX0NCi0JCWlmICh2YWx1ZUF0dCAhPSBudWxsKSB7DQotCQkJdGV4dCA9IHZhbHVlQXR0LmdldE5vZGVWYWx1ZSgpOw0KLQkJfQ0KLQkJaWYgKGluZGVudEF0dCAhPSBudWxsKSB7DQotCQkJU3RyaW5nIHZhbHVlID0gaW5kZW50QXR0LmdldE5vZGVWYWx1ZSgpOw0KLQkJCXRyeSB7DQotCQkJCWluZGVudCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOw0KLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJQnVsbGV0UGFyYWdyYXBoIHAgPSBuZXcgQnVsbGV0UGFyYWdyYXBoKGFkZFNwYWNlKTsNCi0JCXAuc2V0SW5kZW50KGluZGVudCk7DQotCQlwLnNldEJ1bGxldFN0eWxlKHN0eWxlKTsNCi0JCXAuc2V0QnVsbGV0VGV4dCh0ZXh0KTsNCi0NCi0JCXByb2Nlc3NTZWdtZW50cyhwLCBjaGlsZHJlbiwgZXhwYW5kVVJMcyk7DQotCQlyZXR1cm4gcDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1NlZ21lbnRzKA0KLQkJUGFyYWdyYXBoIHAsDQotCQlOb2RlTGlzdCBjaGlsZHJlbiwNCi0JCWJvb2xlYW4gZXhwYW5kVVJMcykgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7DQotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7DQotCQkJSVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IG51bGw7DQotDQotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsNCi0JCQkJU3RyaW5nIHZhbHVlID0gY2hpbGQuZ2V0Tm9kZVZhbHVlKCk7DQotDQotCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmICFpc0lnbm9yYWJsZVdoaXRlU3BhY2UodmFsdWUsIGZhbHNlKSkgew0KLQkJCQkJcC5wYXJzZVJlZ3VsYXJUZXh0KA0KLQkJCQkJCXZhbHVlLA0KLQkJCQkJCWV4cGFuZFVSTHMsDQotCQkJCQkJZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwNCi0JCQkJCQludWxsKTsNCi0JCQkJfQ0KLQkJCX0gZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgew0KLQkJCQlTdHJpbmcgbmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7DQotCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImltZyIpKSB7DQotCQkJCQlzZWdtZW50ID0gcHJvY2Vzc0ltYWdlU2VnbWVudChjaGlsZCk7DQotCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhIikpIHsNCi0JCQkJCXNlZ21lbnQgPQ0KLQkJCQkJCXByb2Nlc3NIeXBlcmxpbmtTZWdtZW50KGNoaWxkLCBnZXRIeXBlcmxpbmtTZXR0aW5ncygpKTsNCi0JCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInRleHQiKSkgew0KLQkJCQkJcHJvY2Vzc1RleHRTZWdtZW50KHAsIGV4cGFuZFVSTHMsIGNoaWxkKTsNCi0JCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImIiKSkgew0KLQkJCQkJU3RyaW5nIHRleHQgPSBnZXROb2RlVGV4dChjaGlsZCkudHJpbSgpOw0KLQkJCQkJU3RyaW5nIGZvbnRJZCA9IEpGYWNlUmVzb3VyY2VzLkJBTk5FUl9GT05UOw0KLQkJCQkJcC5wYXJzZVJlZ3VsYXJUZXh0KA0KLQkJCQkJCXRleHQsDQotCQkJCQkJZXhwYW5kVVJMcywNCi0JCQkJCQlnZXRIeXBlcmxpbmtTZXR0aW5ncygpLA0KLQkJCQkJCWZvbnRJZCk7DQotCQkJCX0NCi0JCQl9DQotCQkJaWYgKHNlZ21lbnQgIT0gbnVsbCkgew0KLQkJCQlwLmFkZFNlZ21lbnQoc2VnbWVudCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgYm9vbGVhbiBpc0lnbm9yYWJsZVdoaXRlU3BhY2UoU3RyaW5nIHRleHQsIGJvb2xlYW4gaWdub3JlU3BhY2VzKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgew0KLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOw0KLQkJCWlmIChpZ25vcmVTcGFjZXMgJiYgYyA9PSAnICcpDQotCQkJCWNvbnRpbnVlOw0KLQkJCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xmJykNCi0JCQkJY29udGludWU7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JcHJpdmF0ZSBJUGFyYWdyYXBoU2VnbWVudCBwcm9jZXNzSW1hZ2VTZWdtZW50KE5vZGUgaW1hZ2UpIHsNCi0JCUltYWdlU2VnbWVudCBzZWdtZW50ID0gbmV3IEltYWdlU2VnbWVudCgpOw0KLQkJTmFtZWROb2RlTWFwIGF0dHMgPSBpbWFnZS5nZXRBdHRyaWJ1dGVzKCk7DQotCQlOb2RlIGlkID0gYXR0cy5nZXROYW1lZEl0ZW0oImhyZWYiKTsNCi0JCU5vZGUgYWxpZ24gPSBhdHRzLmdldE5hbWVkSXRlbSgiYWxpZ24iKTsNCi0JCWlmIChpZCAhPSBudWxsKSB7DQotCQkJU3RyaW5nIHZhbHVlID0gaWQuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJc2VnbWVudC5zZXRPYmplY3RJZCh2YWx1ZSk7DQotCQl9DQotCQlpZiAoYWxpZ24gIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGFsaWduLmdldE5vZGVWYWx1ZSgpLnRvTG93ZXJDYXNlKCk7DQotCQkJaWYgKHZhbHVlLmVxdWFscygidG9wIikpDQotCQkJCXNlZ21lbnQuc2V0VmVydGljYWxBbGlnbm1lbnQoSW1hZ2VTZWdtZW50LlRPUCk7DQotCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJtaWRkbGUiKSkNCi0JCQkJc2VnbWVudC5zZXRWZXJ0aWNhbEFsaWdubWVudChJbWFnZVNlZ21lbnQuTUlERExFKTsNCi0JCQllbHNlIGlmICh2YWx1ZS5lcXVhbHMoImJvdHRvbSIpKQ0KLQkJCQlzZWdtZW50LnNldFZlcnRpY2FsQWxpZ25tZW50KEltYWdlU2VnbWVudC5CT1RUT00pOw0KLQkJfQ0KLQkJcmV0dXJuIHNlZ21lbnQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9kZVRleHQoTm9kZSBub2RlKSB7DQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOw0KLQkJU3RyaW5nIHRleHQgPSAiIjsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgew0KLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOw0KLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7DQotCQkJCXRleHQgKz0gY2hpbGQuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHRleHQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBJUGFyYWdyYXBoU2VnbWVudCBwcm9jZXNzSHlwZXJsaW5rU2VnbWVudCgNCi0JCU5vZGUgbGluaywNCi0JCUh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzKSB7DQotCQlTdHJpbmcgdGV4dCA9IGdldE5vZGVUZXh0KGxpbmspOw0KLQkJSHlwZXJsaW5rU2VnbWVudCBzZWdtZW50ID0gbmV3IEh5cGVybGlua1NlZ21lbnQodGV4dCwgc2V0dGluZ3MsIG51bGwpOw0KLQkJTmFtZWROb2RlTWFwIGF0dHMgPSBsaW5rLmdldEF0dHJpYnV0ZXMoKTsNCi0JCU5vZGUgaHJlZiA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJocmVmIik7DQotCQlpZiAoaHJlZiAhPSBudWxsKSB7DQotCQkJU3RyaW5nIHZhbHVlID0gaHJlZi5nZXROb2RlVmFsdWUoKTsNCi0JCQlzZWdtZW50LnNldEFjdGlvbklkKHZhbHVlKTsNCi0JCX0NCi0JCU5vZGUgYXJnID0gYXR0cy5nZXROYW1lZEl0ZW0oImFyZyIpOw0KLQkJaWYgKGFyZyAhPSBudWxsKSB7DQotCQkJU3RyaW5nIHZhbHVlID0gYXJnLmdldE5vZGVWYWx1ZSgpOw0KLQkJCXNlZ21lbnQuc2V0QXJnKHZhbHVlKTsNCi0JCX0NCi0JCXJldHVybiBzZWdtZW50Ow0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzVGV4dFNlZ21lbnQoDQotCQlQYXJhZ3JhcGggcCwNCi0JCWJvb2xlYW4gZXhwYW5kVVJMcywNCi0JCU5vZGUgdGV4dE5vZGUpIHsNCi0JCVN0cmluZyB0ZXh0ID0gZ2V0Tm9kZVRleHQodGV4dE5vZGUpLnRyaW0oKTsNCi0NCi0JCU5hbWVkTm9kZU1hcCBhdHRzID0gdGV4dE5vZGUuZ2V0QXR0cmlidXRlcygpOw0KLQkJTm9kZSBmb250ID0gYXR0cy5nZXROYW1lZEl0ZW0oImZvbnQiKTsNCi0JCVN0cmluZyBmb250SWQgPSBudWxsOw0KLQkJaWYgKGZvbnQgIT0gbnVsbCkgew0KLQkJCWZvbnRJZCA9IGZvbnQuZ2V0Tm9kZVZhbHVlKCk7DQotCQl9DQotCQlwLnBhcnNlUmVndWxhclRleHQodGV4dCwgZXhwYW5kVVJMcywgZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwgZm9udElkKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBwYXJzZVJlZ3VsYXJUZXh0KFN0cmluZyByZWd1bGFyVGV4dCwgYm9vbGVhbiBjb252ZXJ0VVJMcykNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJlc2V0KCk7DQotCQkNCi0JCWlmIChyZWd1bGFyVGV4dD09bnVsbCkgcmV0dXJuOw0KLQ0KLQkJUGFyYWdyYXBoIHAgPSBuZXcgUGFyYWdyYXBoKHRydWUpOw0KLQkJcGFyYWdyYXBocy5hZGQocCk7DQotCQlpbnQgcHN0YXJ0ID0gMDsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVndWxhclRleHQubGVuZ3RoKCk7IGkrKykgew0KLQkJCWNoYXIgYyA9IHJlZ3VsYXJUZXh0LmNoYXJBdChpKTsNCi0JCQlpZiAocCA9PSBudWxsKSB7DQotCQkJCXAgPSBuZXcgUGFyYWdyYXBoKHRydWUpOw0KLQkJCQlwYXJhZ3JhcGhzLmFkZChwKTsNCi0JCQl9DQotCQkJaWYgKGMgPT0gJ1xuJykgew0KLQkJCQlTdHJpbmcgdGV4dCA9IHJlZ3VsYXJUZXh0LnN1YnN0cmluZyhwc3RhcnQsIGkpOw0KLQkJCQlwc3RhcnQgPSBpICsgMTsNCi0JCQkJcC5wYXJzZVJlZ3VsYXJUZXh0KA0KLQkJCQkJdGV4dCwNCi0JCQkJCWNvbnZlcnRVUkxzLA0KLQkJCQkJZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwNCi0JCQkJCW51bGwpOw0KLQkJCQlwID0gbnVsbDsNCi0JCQl9DQotCQl9DQotCQlpZiAocCAhPSBudWxsKSB7DQotCQkJLy8gbm8gbmV3IGxpbmUNCi0JCQlTdHJpbmcgdGV4dCA9IHJlZ3VsYXJUZXh0LnN1YnN0cmluZyhwc3RhcnQpOw0KLQkJCXAucGFyc2VSZWd1bGFyVGV4dCh0ZXh0LCBjb252ZXJ0VVJMcywgZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwgbnVsbCk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIEh5cGVybGlua1NldHRpbmdzIGdldEh5cGVybGlua1NldHRpbmdzKCkgew0KLQkJaWYgKGh5cGVybGlua1NldHRpbmdzID09IG51bGwpIHsNCi0JCQloeXBlcmxpbmtTZXR0aW5ncyA9IG5ldyBMb2NhbEh5cGVybGlua1NldHRpbmdzKCk7DQotCQl9DQotCQlyZXR1cm4gaHlwZXJsaW5rU2V0dGluZ3M7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rU2V0dGluZ3MoSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MpIHsNCi0JCXRoaXMuaHlwZXJsaW5rU2V0dGluZ3MgPSBzZXR0aW5nczsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVUkxMaXN0ZW5lcihJSHlwZXJsaW5rTGlzdGVuZXIgdXJsTGlzdGVuZXIpIHsNCi0JCXRoaXMudXJsTGlzdGVuZXIgPSB1cmxMaXN0ZW5lcjsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7DQotCQlpZiAocGFyYWdyYXBocyA9PSBudWxsKQ0KLQkJCXBhcmFncmFwaHMgPSBuZXcgVmVjdG9yKCk7DQotCQlwYXJhZ3JhcGhzLmNsZWFyKCk7DQotCQlzZWxlY3RlZExpbmtJbmRleCA9IC0xOw0KLQkJaHlwZXJsaW5rcyA9IG51bGw7DQotCX0NCi0NCi0JSUh5cGVybGlua1NlZ21lbnRbXSBnZXRIeXBlcmxpbmtzKCkgew0KLQkJaWYgKGh5cGVybGlua3MgIT0gbnVsbCB8fCBwYXJhZ3JhcGhzID09IG51bGwpDQotCQkJcmV0dXJuIGh5cGVybGlua3M7DQotCQlWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhZ3JhcGhzLnNpemUoKTsgaSsrKSB7DQotCQkJSVBhcmFncmFwaCBwID0gKElQYXJhZ3JhcGgpIHBhcmFncmFwaHMuZ2V0KGkpOw0KLQkJCUlQYXJhZ3JhcGhTZWdtZW50W10gc2VnbWVudHMgPSBwLmdldFNlZ21lbnRzKCk7DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWdtZW50cy5sZW5ndGg7IGorKykgew0KLQkJCQlpZiAoc2VnbWVudHNbal0gaW5zdGFuY2VvZiBJSHlwZXJsaW5rU2VnbWVudCkNCi0JCQkJCXJlc3VsdC5hZGQoc2VnbWVudHNbal0pOw0KLQkJCX0NCi0JCX0NCi0JCWh5cGVybGlua3MgPQ0KLQkJCShJSHlwZXJsaW5rU2VnbWVudFtdKSByZXN1bHQudG9BcnJheSgNCi0JCQkJbmV3IElIeXBlcmxpbmtTZWdtZW50W3Jlc3VsdC5zaXplKCldKTsNCi0JCXJldHVybiBoeXBlcmxpbmtzOw0KLQl9DQotDQotCXB1YmxpYyBJSHlwZXJsaW5rU2VnbWVudCBmaW5kSHlwZXJsaW5rQXQoaW50IHgsIGludCB5KSB7DQotCQlJSHlwZXJsaW5rU2VnbWVudFtdIGxpbmtzID0gZ2V0SHlwZXJsaW5rcygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChsaW5rc1tpXS5jb250YWlucyh4LCB5KSkNCi0JCQkJcmV0dXJuIGxpbmtzW2ldOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JcHVibGljIElUZXh0U2VnbWVudCBmaW5kU2VnbWVudEF0KGludCB4LCBpbnQgeSkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhZ3JhcGhzLnNpemUoKTsgaSsrKSB7DQotCQkJSVBhcmFncmFwaCBwID0gKElQYXJhZ3JhcGgpIHBhcmFncmFwaHMuZ2V0KGkpOw0KLQkJCUlUZXh0U2VnbWVudCBzZWdtZW50ID0gcC5maW5kU2VnbWVudEF0KHgsIHkpOw0KLQkJCWlmIChzZWdtZW50ICE9IG51bGwpDQotCQkJCXJldHVybiBzZWdtZW50Ow0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIElIeXBlcmxpbmtTZWdtZW50IGdldFNlbGVjdGVkTGluaygpIHsNCi0JCWlmIChzZWxlY3RlZExpbmtJbmRleCA9PSAtMSkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCXJldHVybiBoeXBlcmxpbmtzW3NlbGVjdGVkTGlua0luZGV4XTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiB0cmF2ZXJzZUxpbmtzKGJvb2xlYW4gbmV4dCkgew0KLQkJSUh5cGVybGlua1NlZ21lbnRbXSBsaW5rcyA9IGdldEh5cGVybGlua3MoKTsNCi0JCWlmIChsaW5rcyA9PSBudWxsKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCWludCBzaXplID0gbGlua3MubGVuZ3RoOw0KLQkJaWYgKG5leHQpIHsNCi0JCQlzZWxlY3RlZExpbmtJbmRleCsrOw0KLQkJfSBlbHNlDQotCQkJc2VsZWN0ZWRMaW5rSW5kZXgtLTsNCi0NCi0JCWlmIChzZWxlY3RlZExpbmtJbmRleCA8IDAgfHwgc2VsZWN0ZWRMaW5rSW5kZXggPiBzaXplIC0gMSkgew0KLQkJCXNlbGVjdGVkTGlua0luZGV4ID0gLTE7DQotCQl9DQotCQlyZXR1cm4gc2VsZWN0ZWRMaW5rSW5kZXggIT0gLTE7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2VsZWN0TGluayhJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlpZiAobGluayA9PSBudWxsKQ0KLQkJCXNlbGVjdGVkTGlua0luZGV4ID0gLTE7DQotCQllbHNlIHsNCi0JCQlJSHlwZXJsaW5rU2VnbWVudFtdIGxpbmtzID0gZ2V0SHlwZXJsaW5rcygpOw0KLQkJCXNlbGVjdGVkTGlua0luZGV4ID0gLTE7DQotCQkJaWYgKGxpbmtzID09IG51bGwpDQotCQkJCXJldHVybjsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7DQotCQkJCWlmIChsaW5rc1tpXS5lcXVhbHMobGluaykpIHsNCi0JCQkJCXNlbGVjdGVkTGlua0luZGV4ID0gaTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzU2VnbWVudHMoKSB7DQotCQlJSHlwZXJsaW5rU2VnbWVudFtdIGxpbmtzID0gZ2V0SHlwZXJsaW5rcygpOw0KLQkJaWYgKGxpbmtzLmxlbmd0aCA+IDApDQotCQkJcmV0dXJuIHRydWU7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCWlmIChoeXBlcmxpbmtTZXR0aW5ncyBpbnN0YW5jZW9mIExvY2FsSHlwZXJsaW5rU2V0dGluZ3MpDQotCQkJaHlwZXJsaW5rU2V0dGluZ3MuZGlzcG9zZSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvVGV4dFNlZ21lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvVGV4dFNlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllYzVkMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1RleHRTZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBqYXZhLnRleHQuQnJlYWtJdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUZXh0U2VnbWVudCBleHRlbmRzIFBhcmFncmFwaFNlZ21lbnQgaW1wbGVtZW50cyBJVGV4dFNlZ21lbnQgew0KLQlwcml2YXRlIENvbG9yIGNvbG9yOw0KLQlwcml2YXRlIFN0cmluZyBmb250SWQ7DQotCXByaXZhdGUgU3RyaW5nIHRleHQ7DQotCXByb3RlY3RlZCBib29sZWFuIHVuZGVybGluZTsNCi0JcHJpdmF0ZSBib29sZWFuIHdyYXBBbGxvd2VkID0gdHJ1ZTsNCi0JcHJvdGVjdGVkIFZlY3RvciBhcmVhUmVjdGFuZ2xlcyA9IG5ldyBWZWN0b3IoKTsNCi0JDQotCWNsYXNzIEFyZWFSZWN0YW5nbGUgew0KLQkJUmVjdGFuZ2xlIHJlY3Q7DQotCQlpbnQgZnJvbSwgdG87DQotCQlwdWJsaWMgQXJlYVJlY3RhbmdsZShSZWN0YW5nbGUgcmVjdCwgaW50IGZyb20sIGludCB0bykgew0KLQkJCXRoaXMucmVjdCA9IHJlY3Q7DQotCQkJdGhpcy5mcm9tID0gZnJvbTsNCi0JCQl0aGlzLnRvID0gdG87DQotCQl9DQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgeCwgaW50IHkpIHsNCi0JCQlyZXR1cm4gcmVjdC5jb250YWlucyh4LCB5KTsNCi0JCX0NCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0JCQlpZiAoZnJvbT09MCAmJiB0bz09IC0xKQ0KLQkJCQlyZXR1cm4gVGV4dFNlZ21lbnQudGhpcy5nZXRUZXh0KCk7DQotCQkJaWYgKGZyb20gPjAgJiYgdG8gPT0gLTEpDQotCQkJCXJldHVybiBUZXh0U2VnbWVudC50aGlzLmdldFRleHQoKS5zdWJzdHJpbmcoZnJvbSk7DQotCQkJcmV0dXJuIFRleHRTZWdtZW50LnRoaXMuZ2V0VGV4dCgpLnN1YnN0cmluZyhmcm9tLCB0byk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyBUZXh0U2VnbWVudChTdHJpbmcgdGV4dCwgU3RyaW5nIGZvbnRJZCkgew0KLQkJdGhpcy50ZXh0ID0gY2xlYW51cCh0ZXh0KTsNCi0JCXRoaXMuZm9udElkID0gZm9udElkOw0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIGNsZWFudXAoU3RyaW5nIHRleHQpIHsNCi0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgew0KLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOw0KLQkJCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGM9PSdcZicpIHsNCi0JCQkJaWYgKGkgPiAwKQ0KLQkJCQkJYnVmLmFwcGVuZCgnICcpOw0KLQkJCX0gZWxzZQ0KLQkJCQlidWYuYXBwZW5kKGMpOw0KLQkJfQ0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFdvcmRXcmFwQWxsb3dlZChib29sZWFuIHZhbHVlKSB7DQotCQl3cmFwQWxsb3dlZCA9IHZhbHVlOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzV29yZFdyYXBBbGxvd2VkKCkgew0KLQkJcmV0dXJuIHdyYXBBbGxvd2VkOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHVibGljIENvbG9yIGdldENvbG9yKCkgew0KLQkJcmV0dXJuIGNvbG9yOw0KLQl9DQotDQotCXB1YmxpYyBGb250IGdldEZvbnQoKSB7DQotCQlpZiAoZm9udElkID09IG51bGwpDQotCQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCk7DQotCQllbHNlDQotCQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChmb250SWQpOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotDQotCXZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgew0KLQkJdGhpcy50ZXh0ID0gY2xlYW51cCh0ZXh0KTsNCi0JfQ0KLQ0KLQl2b2lkIHNldENvbG9yKENvbG9yIGNvbG9yKSB7DQotCQl0aGlzLmNvbG9yID0gY29sb3I7DQotCX0NCi0NCi0Jdm9pZCBzZXRGb250SWQoU3RyaW5nIGZvbnRJZCkgew0KLQkJdGhpcy5mb250SWQgPSBmb250SWQ7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZWFSZWN0YW5nbGVzLnNpemUoKTsgaSsrKSB7DQotCQkJQXJlYVJlY3RhbmdsZSBhciA9IChBcmVhUmVjdGFuZ2xlKSBhcmVhUmVjdGFuZ2xlcy5nZXQoaSk7DQotCQkJaWYgKGFyLmNvbnRhaW5zKHgsIHkpKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKSB7DQotCQlpbnQgeD0wLCB5PTA7DQotCQlpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOw0KLQkJDQotCQlmb3IgKGludCBpPTA7IGk8YXJlYVJlY3RhbmdsZXMuc2l6ZSgpOyBpKyspIHsNCi0JCQlBcmVhUmVjdGFuZ2xlIGFyID0gKEFyZWFSZWN0YW5nbGUpYXJlYVJlY3RhbmdsZXMuZ2V0KGkpOw0KLQkJCWlmIChpPT0wKSB5ID0gYXIucmVjdC55Ow0KLQkJCXggPSBNYXRoLm1pbihhci5yZWN0LngsIHgpOw0KLQkJCXdpZHRoID0gTWF0aC5tYXgoYXIucmVjdC53aWR0aCwgd2lkdGgpOw0KLQkJCWhlaWdodCArPSBhci5yZWN0LmhlaWdodDsNCi0JCX0NCi0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGFkdmFuY2VMb2NhdG9yKA0KLQkJR0MgZ2MsDQotCQlpbnQgd0hpbnQsDQotCQlMb2NhdG9yIGxvY2F0b3IsDQotCQlIYXNodGFibGUgb2JqZWN0VGFibGUpIHsNCi0JCUZvbnQgb2xkRm9udCA9IG51bGw7DQotCQlpZiAoZm9udElkICE9IG51bGwpIHsNCi0JCQlvbGRGb250ID0gZ2MuZ2V0Rm9udCgpOw0KLQkJCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsNCi0JCX0NCi0JCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsNCi0JCWludCBsaW5lSGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7DQotDQotCQlpZiAod0hpbnQgPT0gU1dULkRFRkFVTFQgfHwgIXdyYXBBbGxvd2VkKSB7DQotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh0ZXh0KTsNCi0NCi0JCQlpZiAobG9jYXRvci54ICsgZXh0ZW50LnggPiB3SGludCkgew0KLQkJCQkvLyBuZXcgbGluZQ0KLQkJCQlsb2NhdG9yLnggPSBpc1NlbGVjdGFibGUoKT9sb2NhdG9yLmluZGVudCsxOmxvY2F0b3IuaW5kZW50Ow0KLQkJCQlsb2NhdG9yLnkgKz0gbG9jYXRvci5yb3dIZWlnaHQ7DQotCQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gMDsNCi0JCQl9DQotCQkJaW50IHdpZHRoID0gZXh0ZW50Lng7DQotCQkJaWYgKGlzU2VsZWN0YWJsZSgpKSB3aWR0aCs9MjsNCi0JCQlsb2NhdG9yLnggKz0gd2lkdGg7DQotCQkJbG9jYXRvci53aWR0aCA9IHdpZHRoOw0KLQkJCWxvY2F0b3IuaGVpZ2h0ID0gZXh0ZW50Lnk7DQotCQkJbG9jYXRvci5yb3dIZWlnaHQgPSBNYXRoLm1heChsb2NhdG9yLnJvd0hlaWdodCwgZXh0ZW50LnkpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCUJyZWFrSXRlcmF0b3Igd2IgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOw0KLQkJd2Iuc2V0VGV4dCh0ZXh0KTsNCi0NCi0JCWludCBzYXZlZCA9IDA7DQotCQlpbnQgbGFzdCA9IDA7DQotDQotCQlpbnQgd2lkdGggPSAwOw0KLQ0KLQkJUG9pbnQgbGFzdEV4dGVudCA9IG51bGw7DQotDQotCQlmb3IgKGludCBsb2MgPSB3Yi5maXJzdCgpOyBsb2MgIT0gQnJlYWtJdGVyYXRvci5ET05FOyBsb2MgPSB3Yi5uZXh0KCkpIHsNCi0JCQlTdHJpbmcgd29yZCA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsb2MpOw0KLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQod29yZCk7DQotDQotCQkJaWYgKGxvY2F0b3IueCArIGV4dGVudC54ID4gd0hpbnQpIHsNCi0JCQkJLy8gb3ZlcmZsb3cNCi0JCQkJU3RyaW5nIHNhdmVkV29yZCA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsYXN0KTsNCi0JCQkJaWYgKGxhc3RFeHRlbnQ9PW51bGwpDQotCQkJCSAgIGxhc3RFeHRlbnQgPSBnYy50ZXh0RXh0ZW50KHNhdmVkV29yZCk7DQotCQkJCWludCBsaW5lV2lkdGggPSBsb2NhdG9yLnggKyBsYXN0RXh0ZW50Lng7DQotCQkJCWlmIChpc1NlbGVjdGFibGUoKSkgbGluZVdpZHRoKz0yOw0KLQ0KLQkJCQlzYXZlZCA9IGxhc3Q7DQotCQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jYXRvci5yb3dIZWlnaHQsIGxhc3RFeHRlbnQueSk7DQotCQkJCWxvY2F0b3IueCA9IGlzU2VsZWN0YWJsZSgpP2xvY2F0b3IuaW5kZW50KzE6bG9jYXRvci5pbmRlbnQ7DQotCQkJCWxvY2F0b3IueSArPSBsb2NhdG9yLnJvd0hlaWdodDsNCi0JCQkJbG9jYXRvci5yb3dIZWlnaHQgPSAwOw0KLQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBsaW5lV2lkdGgpOw0KLQkJCX0NCi0JCQlsYXN0ID0gbG9jOw0KLQkJCWxhc3RFeHRlbnQgPSBleHRlbnQ7DQotCQl9DQotCQlTdHJpbmcgbGFzdFN0cmluZyA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsYXN0KTsNCi0JCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQobGFzdFN0cmluZyk7DQotCQlpbnQgbGluZVdpZHRoID0gZXh0ZW50Lng7DQotCQlpZiAoaXNTZWxlY3RhYmxlKCkpIGxpbmVXaWR0aCArPSAyOw0KLQkJbG9jYXRvci54ICs9IGxpbmVXaWR0aDsNCi0JCWxvY2F0b3Iud2lkdGggPSB3aWR0aDsNCi0JCWxvY2F0b3IuaGVpZ2h0ID0gbGluZUhlaWdodDsNCi0JCWxvY2F0b3Iucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jYXRvci5yb3dIZWlnaHQsIGV4dGVudC55KTsNCi0JCWlmIChvbGRGb250ICE9IG51bGwpIHsNCi0JCQlnYy5zZXRGb250KG9sZEZvbnQpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBwYWludCgNCi0JCUdDIGdjLA0KLQkJaW50IHdpZHRoLA0KLQkJTG9jYXRvciBsb2NhdG9yLA0KLQkJSGFzaHRhYmxlIG9iamVjdFRhYmxlLA0KLQkJYm9vbGVhbiBzZWxlY3RlZCkgew0KLQkJRm9udCBvbGRGb250ID0gbnVsbDsNCi0JCUNvbG9yIG9sZENvbG9yID0gbnVsbDsNCi0NCi0JCWFyZWFSZWN0YW5nbGVzLmNsZWFyKCk7DQotDQotCQlpZiAoZm9udElkICE9IG51bGwpIHsNCi0JCQlvbGRGb250ID0gZ2MuZ2V0Rm9udCgpOw0KLQkJCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsNCi0JCX0NCi0JCWlmIChjb2xvciAhPSBudWxsKSB7DQotCQkJb2xkQ29sb3IgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7DQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7DQotCQl9DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQkJaW50IGRlc2NlbnQgPSBmbS5nZXREZXNjZW50KCk7DQotDQotCQlpZiAoIXdyYXBBbGxvd2VkKSB7DQotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh0ZXh0KTsNCi0JCQlpbnQgZXdpZHRoID0gZXh0ZW50Lng7DQotCQkJaWYgKGlzU2VsZWN0YWJsZSgpKSBld2lkdGggKz0gMjsNCi0NCi0JCQlpZiAobG9jYXRvci54ICsgZXdpZHRoID4gd2lkdGgpIHsNCi0JCQkJLy8gbmV3IGxpbmUNCi0JCQkJbG9jYXRvci5yZXNldENhcmV0KCk7DQotCQkJCWlmIChpc1NlbGVjdGFibGUoKSkgbG9jYXRvci54ICs9IDE7DQotCQkJCWxvY2F0b3IueSArPSBsb2NhdG9yLnJvd0hlaWdodDsNCi0JCQkJbG9jYXRvci5yb3dIZWlnaHQgPSAwOw0KLQkJCX0NCi0JCQlnYy5kcmF3U3RyaW5nKHRleHQsIGxvY2F0b3IueCwgbG9jYXRvci55KTsNCi0JCQlpZiAodW5kZXJsaW5lKSB7DQotCQkJCWludCBsaW5lWSA9IGxvY2F0b3IueSArIGxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMTsNCi0JCQkJZ2MuZHJhd0xpbmUobG9jYXRvci54LCBsaW5lWSwgbG9jYXRvci54ICsgZXh0ZW50LngsIGxpbmVZKTsNCi0JCQl9DQotCQkJUmVjdGFuZ2xlIGJyID0NCi0JCQkJbmV3IFJlY3RhbmdsZShsb2NhdG9yLnggLSAxLCBsb2NhdG9yLnksIGV4dGVudC54ICsgMiwgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAzKTsNCi0JCQlhcmVhUmVjdGFuZ2xlcy5hZGQobmV3IEFyZWFSZWN0YW5nbGUoYnIsIDAsIC0xKSk7DQotCQkJaWYgKHNlbGVjdGVkKSB7DQotCQkJCWlmIChjb2xvciAhPSBudWxsKQ0KLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChvbGRDb2xvcik7DQotCQkJCWdjLmRyYXdGb2N1cyhici54LCBici55LCBici53aWR0aCwgYnIuaGVpZ2h0KTsNCi0JCQl9DQotDQotCQkJbG9jYXRvci54ICs9IGV3aWR0aDsNCi0JCQlsb2NhdG9yLndpZHRoID0gZXdpZHRoOw0KLQkJCWxvY2F0b3IuaGVpZ2h0ID0gbGluZUhlaWdodDsNCi0JCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LCBleHRlbnQueSk7DQotCQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgew0KLQkJCQlnYy5zZXRGb250KG9sZEZvbnQpOw0KLQkJCX0NCi0JCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgew0KLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKG9sZENvbG9yKTsNCi0JCQl9DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJQnJlYWtJdGVyYXRvciB3YiA9IEJyZWFrSXRlcmF0b3IuZ2V0TGluZUluc3RhbmNlKCk7DQotCQl3Yi5zZXRUZXh0KHRleHQpOw0KLQ0KLQkJaW50IHNhdmVkID0gMDsNCi0JCWludCBsYXN0ID0gMDsNCi0NCi0JCWZvciAoaW50IGxvYyA9IHdiLmZpcnN0KCk7IGxvYyAhPSBCcmVha0l0ZXJhdG9yLkRPTkU7IGxvYyA9IHdiLm5leHQoKSkgew0KLQkJCWlmIChsb2MgPT0gMCkNCi0JCQkJY29udGludWU7DQotCQkJU3RyaW5nIHdvcmQgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbG9jKTsNCi0JCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KHdvcmQpOw0KLQkJCWludCBld2lkdGggPSBleHRlbnQueDsNCi0JCQlpZiAoaXNTZWxlY3RhYmxlKCkpIGV3aWR0aCArPSAyOw0KLQ0KLQkJCWlmIChsb2NhdG9yLnggKyBld2lkdGggPiB3aWR0aCkgew0KLQkJCQkvLyBvdmVyZmxvdw0KLQkJCQlTdHJpbmcgcHJldkxpbmUgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbGFzdCk7DQotCQkJCWdjLmRyYXdTdHJpbmcocHJldkxpbmUsIGxvY2F0b3IueCwgbG9jYXRvci55LCB0cnVlKTsNCi0JCQkJUG9pbnQgcHJldkV4dGVudCA9IGdjLnRleHRFeHRlbnQocHJldkxpbmUpOw0KLQkJCQlpbnQgcHJldldpZHRoID0gcHJldkV4dGVudC54Ow0KLQkJCQlpZiAoaXNTZWxlY3RhYmxlKCkpIHByZXZXaWR0aCArPSAyOw0KLQ0KLQkJCQlpZiAodW5kZXJsaW5lKSB7DQotCQkJCQlpbnQgbGluZVkgPSBsb2NhdG9yLnkgKyBsaW5lSGVpZ2h0IC0gZGVzY2VudCArIDE7DQotCQkJCQlnYy5kcmF3TGluZShsb2NhdG9yLngsIGxpbmVZLCBsb2NhdG9yLnggKyBwcmV2V2lkdGgsIGxpbmVZKTsNCi0JCQkJfQ0KLQkJCQlSZWN0YW5nbGUgYnIgPQ0KLQkJCQkJbmV3IFJlY3RhbmdsZSgNCi0JCQkJCQlsb2NhdG9yLnggLSAxLA0KLQkJCQkJCWxvY2F0b3IueSwNCi0JCQkJCQlwcmV2RXh0ZW50LnggKyAyLA0KLQkJCQkJCWxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMyk7DQotCQkJCWlmIChzZWxlY3RlZCkgew0KLQkJCQkJaWYgKGNvbG9yICE9IG51bGwpDQotCQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChvbGRDb2xvcik7DQotCQkJCQlnYy5kcmF3Rm9jdXMoYnIueCwgYnIueSwgYnIud2lkdGgsIGJyLmhlaWdodCk7DQotCQkJCQlpZiAoY29sb3IgIT0gbnVsbCkNCi0JCQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsNCi0JCQkJfQ0KLQkJCQlhcmVhUmVjdGFuZ2xlcy5hZGQobmV3IEFyZWFSZWN0YW5nbGUoYnIsIHNhdmVkLCBsYXN0KSk7DQotCQkJCQ0KLQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LCBwcmV2RXh0ZW50LnkpOw0KLQkJCQlsb2NhdG9yLnJlc2V0Q2FyZXQoKTsNCi0JCQkJaWYgKGlzU2VsZWN0YWJsZSgpKSBsb2NhdG9yLnggKz0xOw0KLQkJCQlsb2NhdG9yLnkgKz0gbG9jYXRvci5yb3dIZWlnaHQ7DQotCQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gMDsNCi0JCQkJc2F2ZWQgPSBsYXN0Ow0KLQkJCX0NCi0JCQlsYXN0ID0gbG9jOw0KLQkJfQ0KLQkJLy8gcGFpbnQgdGhlIGxhc3QgbGluZQ0KLQkJU3RyaW5nIGxhc3RMaW5lID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxhc3QpOw0KLQkJZ2MuZHJhd1N0cmluZyhsYXN0TGluZSwgbG9jYXRvci54LCBsb2NhdG9yLnksIHRydWUpOw0KLQkJUG9pbnQgbGFzdEV4dGVudCA9IGdjLnRleHRFeHRlbnQobGFzdExpbmUpOw0KLQkJaW50IGxhc3RXaWR0aCA9IGxhc3RFeHRlbnQueDsNCi0JCWlmIChpc1NlbGVjdGFibGUoKSkgbGFzdFdpZHRoICs9IDI7DQotCQlSZWN0YW5nbGUgYnIgPQ0KLQkJCW5ldyBSZWN0YW5nbGUoDQotCQkJCWxvY2F0b3IueCAtIDEsDQotCQkJCWxvY2F0b3IueSwNCi0JCQkJbGFzdEV4dGVudC54ICsgMiwNCi0JCQkJbGluZUhlaWdodCAtIGRlc2NlbnQgKyAzKTsNCi0JCWFyZWFSZWN0YW5nbGVzLmFkZChuZXcgQXJlYVJlY3RhbmdsZShiciwgc2F2ZWQsIGxhc3QpKTsNCi0JCWlmICh1bmRlcmxpbmUpIHsNCi0JCQlpbnQgbGluZVkgPSBsb2NhdG9yLnkgKyBsaW5lSGVpZ2h0IC0gZGVzY2VudCArIDE7DQotCQkJZ2MuZHJhd0xpbmUobG9jYXRvci54LCBsaW5lWSwgbG9jYXRvci54ICsgbGFzdEV4dGVudC54LCBsaW5lWSk7DQotCQl9DQotCQlpZiAoc2VsZWN0ZWQpIHsNCi0JCQlpZiAoY29sb3IgIT0gbnVsbCkNCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChvbGRDb2xvcik7DQotCQkJZ2MuZHJhd0ZvY3VzKGJyLngsIGJyLnksIGJyLndpZHRoLCBici5oZWlnaHQpOw0KLQkJfQ0KLQkJbG9jYXRvci54ICs9IGxhc3RXaWR0aDsNCi0JCWxvY2F0b3Iucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jYXRvci5yb3dIZWlnaHQsIGxhc3RFeHRlbnQueSk7DQotCQlpZiAob2xkRm9udCAhPSBudWxsKSB7DQotCQkJZ2Muc2V0Rm9udChvbGRGb250KTsNCi0JCX0NCi0JCWlmIChvbGRDb2xvciAhPSBudWxsKSB7DQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChvbGRDb2xvcik7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHBhaW50Rm9jdXMoR0MgZ2MsIENvbG9yIGJnLCBDb2xvciBmZywgYm9vbGVhbiBzZWxlY3RlZCkgew0KLQkJaWYgKGFyZWFSZWN0YW5nbGVzPT1udWxsKSByZXR1cm47DQotCQlmb3IgKGludCBpPTA7IGk8YXJlYVJlY3RhbmdsZXMuc2l6ZSgpOyBpKyspIHsNCi0JCQlBcmVhUmVjdGFuZ2xlIGFyZWFSZWN0YW5nbGUgPSAoQXJlYVJlY3RhbmdsZSlhcmVhUmVjdGFuZ2xlcy5nZXQoaSk7DQotCQkJUmVjdGFuZ2xlIGJyID0gYXJlYVJlY3RhbmdsZS5yZWN0Ow0KLQkJCWlmIChzZWxlY3RlZCkgew0KLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJnKTsNCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChmZyk7DQotCQkJCWdjLmRyYXdGb2N1cyhici54LCBici55LCBici53aWR0aCwgYnIuaGVpZ2h0KTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCWdjLnNldEZvcmVncm91bmQoYmcpOw0KLQkJCQlnYy5kcmF3UmVjdGFuZ2xlKGJyLngsIGJyLnksIGJyLndpZHRoLTEsIGJyLmhlaWdodC0xKTsNCi0JCQl9DQotCQl9DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9pbWFnZTEuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2ltYWdlMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Yzk0ZWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2ltYWdlMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvaW5kZXgueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMmY4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Zm9ybT4NCi08cD4NCi1UbyBjaGVjayBmb3IgdXBkYXRlcyBmb3IgZmVhdHVyZXMgeW91IGhhdmUgaW5zdGFsbGVkLCANCi1nbyB0byB0aGUgPGEgaHJlZj0iYWN0aW9uMSI+TXkgRWNsaXBzZSAxPC9hPiBhbmQgc2VsZWN0IA0KLTxiPkF2YWlsYWJsZSBVcGRhdGVzPC9iPiBmb2xkZXIuIDxiPlNlYXJjaCBwYWdlPC9iPiB3aWxsIA0KLWJlIHNob3duIGFsbG93aW5nIHlvdSB0byBpbml0aWF0ZSBhbmQgY3VzdG9taXplIHRoZSBzZWFyY2guIA0KLU5vdyB3ZSA8Yj53aWxsPC9iPiBhZGQgYW4gDQotPGltZyBocmVmPSJpbWFnZTEiLz4gDQotaW1hZ2UgaGVyZS4gSnVzdA0KLSB0byBzaG93IGhvdyB3cmFwcGluZyBzaG91bGQgYXBwbHkgdG8gaW1hZ2VzIHdoZW4gdGhleSBhcmUgDQotIGxhcmdlciB0aGFuIHRoZSByZWd1bGFyIHRleHQuDQotPC9wPg0KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjEuIj5UbyBjaGVjayBmb3IgdXBkYXRlcyBmb3IgZmVhdHVyZXMgeW91IGhhdmUgaW5zdGFsbGVkLCANCi1nbyB0byB0aGUgPGEgaHJlZj0iYWN0aW9uMiI+TXkgRWNsaXBzZSAyPC9hPiBhbmQgc2VsZWN0IA0KLTxiPkF2YWlsYWJsZSBVcGRhdGVzPC9iPiBmb2xkZXIuIDxiPlNlYXJjaCBwYWdlPC9iPiB3aWxsIA0KLWJlIHNob3duIGFsbG93aW5nIHlvdSB0byBpbml0aWF0ZSBhbmQgY3VzdG9taXplIHRoZSBzZWFyY2guPC9saT4NCi08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIyLiI+VGhpcyBpcyB0aGUgaXRlbSBudW1iZXIgMi48L2xpPg0KLTxsaSBzdHlsZT0idGV4dCIgdmFsdWU9IjMuIj5UaGlzIGlzIHRoZSBpdGVtIG51bWJlciAzLjwvbGk+DQotPGxpPlRoaXMgaXMgdGhlIGJ1bGxldCBpdGVtLjwvbGk+DQotPGxpPlRoaXMgaXMgYW5vdGhlciBidWxsZXQgaXRlbS48L2xpPg0KLTwvZm9ybT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGQyNzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UudWkiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3JtcyIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuaGVscCIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ib290Ii8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQxZjkwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmhlbHA8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3JtczwvcHJvamVjdD4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI0MTFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNzMwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLXNvdXJjZS51cGRhdGV1aTMyLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvYmFja3dhcmRfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvYmFja3dhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNDE5Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2JhY2t3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2ZvcndhcmRfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE1MTFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9nb19uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9nb19uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIwZDg4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvZ29fbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5N2MzZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvaG9tZV9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDljMmRiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L3JlZnJlc2hfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2M2MyMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L3JlZnJlc2hfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9zaG93X3VuY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzVmNTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9zaG93X3VuY29uZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvc3RvcF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWI1M2VjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvc3RvcF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2N2aWV3MTYvYnJvd3Nlci5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY3ZpZXcxNi9icm93c2VyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3MDI3Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY3ZpZXcxNi9icm93c2VyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvYmFja3dhcmRfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvYmFja3dhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxNzlhZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2JhY2t3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzVhZjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9nb19uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9nb19uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzJmMDA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvZ29fbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmMzM2MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvaG9tZV9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzgwMDgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L3JlZnJlc2hfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyODFiNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L3JlZnJlc2hfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd191bmNvbmYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9zaG93X3VuY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5M2Y0OTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9zaG93X3VuY29uZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvc3RvcF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjBmOWI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvc3RvcF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTE4OGI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzdjYTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzI4ZWUxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvZm9yd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9nb19uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9nb19uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjgzMzI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvZ29fbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwYjJjMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvaG9tZV9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjJiYTg2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvaG9tZV9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2hfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5NDIzZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2hfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd191bmNvbmYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9zaG93X3VuY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjM4MWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9zaG93X3VuY29uZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvc3RvcF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTE5ZjQ0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvc3RvcF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2V2aWV3MTYvYnJvd3Nlci5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZXZpZXcxNi9icm93c2VyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5MzViMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZXZpZXcxNi9icm93c2VyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9kZWZfcHJvdmlkZXIuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2RlZl9wcm92aWRlci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2NiZWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2RlZl9wcm92aWRlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV9iYW5uZXIuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYzBiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV9iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fYmFubmVyLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1M2UyZDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fYmFubmVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX3VuZGVybGluZS5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmYzZDBiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX3VuZGVybGluZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUyLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX3VuZGVybGluZTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQxNGY3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX3VuZGVybGluZTIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL3RvcGljLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTM3ZTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL3RvcGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvc2FtcGxlLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvc2FtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmYjNjOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL3NhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4ODc2My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wbHVnaW5OYW1lID0gV2VsY29tZSBQb3J0YWwgZm9yIFdpbmRvd3MKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi12aWV3cy53ZWJCcm93c2VyLmxhYmVsID0gV2ViIEJyb3dzZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMGI3N2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5XZWxjb21lUG9ydGFsIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ1cGRhdGV1aTMyLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgICAgIDxwYWNrYWdlcyBwcmVmaXhlcz0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbCIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3JtcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2VsY29tZVBhZ2VzIiBuYW1lPSJXZWxjb21lIFBhZ2VzIiBzY2hlbWE9InNjaGVtYS93ZWxjb21lUGFnZXMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2VsY29tZVNlY3Rpb25zIiBuYW1lPSJXZWxjb21lIFNlY3Rpb25zIiBzY2hlbWE9InNjaGVtYS93ZWxjb21lU2VjdGlvbnMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBsYWJlbD0iU2FtcGxlIEFjdGlvbiBTZXQiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi5hY3Rpb25TZXQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9Ik9wZW4gSG9tZSBQYWdlIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9Ik9wZW4gSG9tZSBQYWdlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuU2hvd1dlbGNvbWVQYWdlQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImhlbHAvaGVscEVuZCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLlNob3dXZWxjb21lUGFnZUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiPgotICAgICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi5hY3Rpb25TZXQiPgotICAgICAgICAgPC9hY3Rpb25TZXQ+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBuYW1lPSJXZWIgQnJvd3NlciIKLSAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXIuV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3Nlci5XZWJCcm93c2VyRWRpdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndlbGNvbWUud2ViYnJvd3NlciI+Ci0gICAgICA8L2VkaXRvcj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIG5hbWU9IldlbGNvbWUgUGFnZSIKLSAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuV2VsY29tZVBvcnRhbEVkaXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53ZWxjb21lLnBvcnRhbCI+Ci0gICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVsZW1lbnRGYWN0b3JpZXMiPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXIuV2ViQnJvd3NlckVkaXRvcklucHV0RmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXIuV2ViQnJvd3NlckVkaXRvcklucHV0RmFjdG9yeSI+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLldlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dEZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuV2VsY29tZVBvcnRhbEVkaXRvcklucHV0RmFjdG9yeSI+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIud2VsY29tZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSJIb21lIgotICAgICAgICAgICAgbnVtQ29sdW1ucz0iMiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIuaG9tZVBhZ2UiPgotICAgICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgICAgIHNwYW49IjIiCi0gICAgICAgICAgICAgICBpZD0iY29tbXVuaXR5Lm5ld3MucmVtb3RlIj4KLSAgICAgICAgIDwvc2VjdGlvbj4KLSAgICAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICAgICBpZD0ic2VhcmNoIj4KLSAgICAgICAgIDwvc2VjdGlvbj4KLSAgICAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICAgICBpZD0idGFza3Muc29mdHdhcmVVcGRhdGVzIj4KLSAgICAgICAgIDwvc2VjdGlvbj4KLSAgICAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICAgICBpZD0icXVpY2tTdGFydCI+Ci0gICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICA8c2VjdGlvbgotICAgICAgICAgICAgICAgaWQ9InRpcHNBbmRUcmlja3MiPgotICAgICAgICAgPC9zZWN0aW9uPgotICAgICAgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9Ik5ld3MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLm5ld3MiPgotICAgICAgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IkNvbW11bml0eSIKLSAgICAgICAgICAgIG51bUNvbHVtbnM9IjEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLmNvbW11bml0eSI+Ci0gICAgICAgICA8c2VjdGlvbgotICAgICAgICAgICAgICAgaWQ9ImNvbW11bml0eS5saW5rcyI+Ci0gICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICA8c2VjdGlvbgotICAgICAgICAgICAgICAgaWQ9ImNvbW11bml0eS5hcnRpY2xlcyI+Ci0gICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iU2FtcGxlcyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIuc2FtcGxlcyI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIud2VsY29tZVNlY3Rpb25zIj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICBuYW1lPSJTb2Z0d2FyZSBVcGRhdGVzIgotICAgICAgICAgICAgaWQ9InRhc2tzLnNvZnR3YXJlVXBkYXRlcyI+Ci0gICAgICAgICA8Zm9ybT4KLSAgICAgICAgICAgICZsdDtwJmd0OwotJmx0O2EgaHJlZj0mcXVvdDthY3Rpb24mcXVvdDsgYXJnPSZxdW90O29yZy5lY2xpcHNlLnVwZGF0ZS51aTpvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuSW5zdGFsbFdpemFyZEFjdGlvbiZxdW90OyZndDsKLUZpbmQgdXBkYXRlcyBmb3IgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgZmVhdHVyZXMKLSZsdDsvYSZndDsmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSZsdDthIGhyZWY9JnF1b3Q7YWN0aW9uJnF1b3Q7IGFyZz0mcXVvdDtvcmcuZWNsaXBzZS51cGRhdGUudWk6b3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLkNvbmZpZ3VyYXRpb25NYW5hZ2VyQWN0aW9uJnF1b3Q7Jmd0OwotTWFuYWdlIG15IHdvcmtiZW5jaCBjb25maWd1cmF0aW9uJmx0Oy9hJmd0OyZsdDsvcCZndDsKLSAgICAgICAgIDwvZm9ybT4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICBuYW1lPSJFY2xpcHNlIENvbW11bml0eSBTaXRlcyIKLSAgICAgICAgICAgIGlkPSJjb21tdW5pdHkubGlua3MiPgotICAgICAgICAgPGZvcm0+Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Jmx0O2EgaHJlZj0mcXVvdDt1cmwmcXVvdDsgYXJnPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcmcXVvdDsmZ3Q7RWNsaXBzZS5vcmcmbHQ7L2EmZ3Q7Jmx0Oy9saSZndDsKLSAgICAgICAgIDwvZm9ybT4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICBuYW1lPSJOZXcgRWNsaXBzZSBBcnRpY2xlcyIKLSAgICAgICAgICAgIGlkPSJjb21tdW5pdHkuYXJ0aWNsZXMiPgotICAgICAgICAgPGZvcm0KLSAgICAgICAgICAgICAgIHVybD0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS11cGRhdGUtaG9tZS93ZWxjb21lLWFydGljbGVzLnhtbCIKLSAgICAgICAgICAgICAgIHR5cGU9InJlbW90ZSI+Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iSGVhZGxpbmVzIgotICAgICAgICAgICAgaWQ9ImNvbW11bml0eS5uZXdzLnJlbW90ZSI+Ci0gICAgICAgICA8Zm9ybQotICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL3BsYXRmb3JtLXVwZGF0ZS1ob21lL3dlbGNvbWUtbmV3cy54bWwiCi0gICAgICAgICAgICAgICB0eXBlPSJyZW1vdGUiPgotICAgICAgICAgPC9mb3JtPgotICAgICAgPC9zZWN0aW9uPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgIG5hbWU9IkdldCBIZWxwIgotICAgICAgICAgICAgaWQ9InNlYXJjaCI+Ci0gICAgICAgICA8Zm9ybQotICAgICAgICAgICAgICAgdHlwZT0iY3VzdG9tIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLkhlbHBTZWN0aW9uIj4KLSAgICAgICAgIDwvZm9ybT4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICBuYW1lPSJRdWljayBTdGFydCIKLSAgICAgICAgICAgIGlkPSJxdWlja1N0YXJ0Ij4KLSAgICAgICAgIDxmb3JtCi0gICAgICAgICAgICAgICB0eXBlPSJkeW5hbWljIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuYWN0aW9ucy5XZWxjb21lQ29udGVudFByb3ZpZGVyIj4KLSAgICAgICAgIDwvZm9ybT4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICBuYW1lPSJUaXBzIGFuZCBUcmlja3MiCi0gICAgICAgICAgICBpZD0idGlwc0FuZFRyaWNrcyI+Ci0gICAgICAgICA8Zm9ybQotICAgICAgICAgICAgICAgdHlwZT0iZHluYW1pYyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLmFjdGlvbnMuVGlwc0FuZFRyaWNrc0NvbnRlbnRQcm92aWRlciI+Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NjaGVtYS93ZWxjb21lUGFnZXMuZXhzZCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc2NoZW1hL3dlbGNvbWVQYWdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQzZjFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc2NoZW1hL3dlbGNvbWVQYWdlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIiIGlkPSJ3ZWxjb21lUGFnZXMiIG5hbWU9IldlbGNvbWUgUGFnZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhZ2UiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icGFnZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im51bUNvbHVtbnMiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzZWN0aW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3BhbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zY2hlbWEvd2VsY29tZVNlY3Rpb25zLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NjaGVtYS93ZWxjb21lU2VjdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0YjVlMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NjaGVtYS93ZWxjb21lU2VjdGlvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyIiBpZD0id2VsY29tZVNlY3Rpb25zIiBuYW1lPSJXZWxjb21lIFNlY3Rpb25zIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InNlY3Rpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmb3JtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLklQb3J0YWxTZWN0aW9uIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJmb3JtIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJsb2NhbCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgRm9ybXMgYXJlIGxvYWRlZCBkZXBlbmRpbmcgb24gdGhlICZsdDtzYW1wJmd0O3R5cGUmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZToNCi0mbHQ7dWwmZ3Q7DQotJmx0O2xpJmd0OyZsdDtiJmd0O2xvY2FsJmx0Oy9iJmd0OyAtIHRoZSBjb250ZW50IG9mIHRoZSBmb3JtIHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIGJvZHkgdGV4dCBvZiB0aGUgZWxlbWVudC4mbHQ7L2xpJmd0Ow0KLSZsdDtsaSZndDsmbHQ7YiZndDtyZW1vdGUmbHQ7L2ImZ3Q7IC0gdGhlIGNvbnRlbnQgb2YgdGhlIGZvcm0gd2lsbCBiZSBkb3dubG9hZGVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgVVJMLiZsdDsvbGkmZ3Q7DQotJmx0O2xpJmd0OyZsdDtiJmd0O2N1c3RvbSZsdDsvYiZndDsgLSB0aGUgZm9ybSB3aWxsIGJlIGNyZWF0ZWQgYnkgbG9hZGluZyB0aGUgY2xhc3Mgc3BlY2lmaWVkIGJ5IHRoZSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsgYXR0cmlidXRlIHRoYXQgaW1wbGVtZW50cyBJUG9ydGFsU2VjdGlvbiBpbnRlcmZhY2UuJmx0Oy9saSZndDsNCi0mbHQ7bGkmZ3Q7Jmx0O2ImZ3Q7ZHluYW1pYyZsdDsvYiZndDsgLSB0aGUgZm9ybSB3aWxsIGJlIGNyZWF0ZWQgYnkgbG9hZGluZyB0aGUgY2xhc3Mgc3BlY2lmaWVkIGJ5IHRoZSAmbHQ7c2FtcCZndDtjbGFzcyZsdDsvc2FtcCZndDsgYXR0cmlidXRlIHRoYXQgaW1wbGVtZW50cyBJRm9ybUNvbnRlbnRQcm92aWRlciBpbnRlcmZhY2UuJmx0Oy9saSZndDsNCi0mbHQ7L3VsJmd0Ow0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgICAgPHNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbCI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InJlbW90ZSI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImN1c3RvbSI+DQotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImR5bmFtaWMiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgSWYgJmx0O3NhbXAmZ3Q7dHlwZSZsdDsvc2FtcCZndDsgaXMgJmx0O3NhbXAmZ3Q7cmVtb3RlJmx0Oy9zYW1wJmd0OywgdGhlIGNvbnRlbnQgb2YgdGhlIGZvcm0gd2lsbCBiZSBkb3dubG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBVUkwuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSVBvcnRhbFNlY3Rpb24iLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9TaG93V2VsY29tZVBhZ2VBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvU2hvd1dlbGNvbWVQYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZWM1YmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9TaG93V2VsY29tZVBhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLldlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBPdXIgc2FtcGxlIGFjdGlvbiBpbXBsZW1lbnRzIHdvcmtiZW5jaCBhY3Rpb24gZGVsZWdhdGUuCi0gKiBUaGUgYWN0aW9uIHByb3h5IHdpbGwgYmUgY3JlYXRlZCBieSB0aGUgd29ya2JlbmNoIGFuZAotICogc2hvd24gaW4gdGhlIFVJLiBXaGVuIHRoZSB1c2VyIHRyaWVzIHRvIHVzZSB0aGUgYWN0aW9uLAotICogdGhpcyBkZWxlZ2F0ZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGV4ZWN1dGlvbiB3aWxsIGJlIAotICogZGVsZWdhdGVkIHRvIGl0LgotICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLSAqLwotcHVibGljIGNsYXNzIFNob3dXZWxjb21lUGFnZUFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNob3dXZWxjb21lUGFnZUFjdGlvbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWN0aW9uIGhhcyBiZWVuIGFjdGl2YXRlZC4gVGhlIGFyZ3VtZW50IG9mIHRoZQotCSAqIG1ldGhvZCByZXByZXNlbnRzIHRoZSAncmVhbCcgYWN0aW9uIHNpdHRpbmcKLQkgKiBpbiB0aGUgd29ya2JlbmNoIFVJLgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI3J1bgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJV2VsY29tZVBvcnRhbC5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcigKLQkJCQluZXcgV2VsY29tZVBvcnRhbEVkaXRvcklucHV0KCksCi0JCQkJIm9yZy5lY2xpcHNlLndlbGNvbWUucG9ydGFsIik7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCVdlbGNvbWVQb3J0YWwubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2ggaGFzIGJlZW4gY2hhbmdlZC4gV2UgCi0JICogY2FuIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlICdyZWFsJyBhY3Rpb24gaGVyZQotCSAqIGlmIHdlIHdhbnQsIGJ1dCB0aGlzIGNhbiBvbmx5IGhhcHBlbiBhZnRlciAKLQkgKiB0aGUgZGVsZWdhdGUgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBXZSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGRpc3Bvc2Ugb2YgYW55IHN5c3RlbQotCSAqIHJlc291cmNlcyB3ZSBwcmV2aW91c2x5IGFsbG9jYXRlZC4KLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBXZSB3aWxsIGNhY2hlIHdpbmRvdyBvYmplY3QgaW4gb3JkZXIgdG8KLQkgKiBiZSBhYmxlIHRvIHByb3ZpZGUgcGFyZW50IHNoZWxsIGZvciB0aGUgbWVzc2FnZSBkaWFsb2cuCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvV2VsY29tZVBvcnRhbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YTJmMDAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lUG9ydGFsIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQlJPV1NFUiA9IFBMVUdJTl9JRCArICJXZWJCcm93c2VyIjsKLQkKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgV2VsY29tZVBvcnRhbCBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTdGFydHVwI2Vhcmx5U3RhcnR1cCgpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNob3dVUkwoU3RyaW5nIG5hbWUsIFN0cmluZyB1cmwpIHsKLQkJdHJ5IHsKLQkJCVdlbGNvbWVQb3J0YWwuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IoCi0JCQkJbmV3IFdlYkJyb3dzZXJFZGl0b3JJbnB1dChuYW1lLCB1cmwpLAotCQkJCSJvcmcuZWNsaXBzZS53ZWxjb21lLndlYmJyb3dzZXIiKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJV2VsY29tZVBvcnRhbC5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFdlbGNvbWVQb3J0YWwoSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcihkZXNjcmlwdG9yKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0KLQkJCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoCi0JCQkJCSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLldlbGNvbWVQb3J0YWxSZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlbGNvbWVQb3J0YWwgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuaW50ZXJuYWxHZXRBY3RpdmVQYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBpbnRlcm5hbEdldEFjdGl2ZVBhZ2UoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXJldHVybiB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlyZXR1cm4gd2luZG93ICE9IG51bGwgPyB3aW5kb3cuZ2V0U2hlbGwoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFdlbGNvbWVQb3J0YWwuZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cmluZyhrZXkpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsIGFyZ3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZykgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cmluZyhrZXkpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsIG5ldyBTdHJpbmdbXSB7IGFyZyB9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnR1cCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCWxvZ0V4Y2VwdGlvbihlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgewotCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCWUgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGUpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCQltZXNzYWdlID0gZS50b1N0cmluZygpOwotCQkJc3RhdHVzID0KLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQlnZXRQbHVnaW5JZCgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQltZXNzYWdlLAotCQkJCQllKTsKLQkJfQotCQlsb2coc3RhdHVzLCBzaG93RXJyb3JEaWFsb2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLklORk8pIHsKLQkJCWlmIChzaG93RXJyb3JEaWFsb2cpCi0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotCQkJLy9SZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQlQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oCi0JCQkJZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsSW1hZ2VzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL1dlbGNvbWVQb3J0YWxJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3NWY0Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL1dlbGNvbWVQb3J0YWxJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBCdW5kbGUgb2YgYWxsIGltYWdlcyB1c2VkIGJ5IHRoZSBQREUgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbEltYWdlcyB7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BSRUZJWD0gV2VsY29tZVBvcnRhbC5nZXRQbHVnaW5JZCgpKyIuIjsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBCQVNFX1VSTCA9IFdlbGNvbWVQb3J0YWwuZ2V0RGVmYXVsdCgpLmdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCk7Ci0KLQotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgUExVR0lOX1JFR0lTVFJZOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElDT05TX1BBVEggPSAiaWNvbnMvZnVsbC8iOwotCi0JLyoqCi0JICogU2V0IG9mIHByZWRlZmluZWQgSW1hZ2UgRGVzY3JpcHRvcnMuCi0JICovCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfT0JKPSBJQ09OU19QQVRIKyJvYmoxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1ZJRVcgPSBJQ09OU19QQVRIKyJjdmlldzE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTENMPSBJQ09OU19QQVRIKyJlbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9MQ0xfSE9WRVI9IElDT05TX1BBVEgrImNsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xDTF9ESVNBQkxFRD0gSUNPTlNfUEFUSCsiZGxjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfVE9PTCA9IElDT05TX1BBVEggKyAiZXRvb2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1RPT0xfSE9WRVIgPSBJQ09OU19QQVRIICsgImN0b29sMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9UT09MX0RJU0FCTEVEID0gSUNPTlNfUEFUSCArICJkdG9vbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfT1ZSID0gSUNPTlNfUEFUSCArICJvdnIxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1dJWkJBTiA9IElDT05TX1BBVEggKyAid2l6YmFuLyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9GT1JNUyA9IElDT05TX1BBVEggKyAiZm9ybXMvIjsKLQotCi0JLyoqCi0JICogRnJlcXVlbnRseSB1c2VkIGltYWdlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19GT1JNX0JBTk5FUiA9IE5BTUVfUFJFRklYKyJGT1JNX0JBTk5FUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0ZPUk1fQkFOTkVSX1NIT1JUID0gTkFNRV9QUkVGSVgrIkZPUk1fQkFOTkVSX1NIT1JUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRk9STV9VTkRFUkxJTkUgPSBOQU1FX1BSRUZJWCArICJGT1JNX1VOREVSTElORSI7Ci0KLQkvKioKLQkgKiBPQkoxNgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQVBQX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImFwcF9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19CRk9MREVSX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImJmb2xkZXJfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ0FURUdPUllfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiY2F0ZWdvcnlfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ0RfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiY2Rfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ09NUFVURVJfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiY29tcHV0ZXJfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ09ORklHX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImNvbmZpZ19vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GRUFUVVJFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImZlYXR1cmVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRUZJWF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJlZml4Ml9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GTE9QUFlfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZmxvcHB5X29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0hJU1RPUllfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiaGlzdG9yeV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19MU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJsc2l0ZV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19QU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJwc2l0ZV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJlc2l0ZV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInNpdGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfV0VCX1NJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAid2ViX2JrbXJrX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1BMQUNFU19PQkogPSBjcmVhdGUoUEFUSF9PQkosICJwbGFjZXNfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0FWRURfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAic2F2ZWRfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5DT05GX0ZFQVRVUkVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidW5jb25mX2ZlYXR1cmVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVVBEQVRFU19PQkogPSBjcmVhdGUoUEFUSF9PQkosICJ1cGRhdGVzX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1ZGSVhFRF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJ2Zml4ZWRfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVlJFTU9URV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJ2cmVtb3RlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1ZSRU1PVkFCTEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidnJlbW92YWJsZV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19OT1RJTlNUX0ZFQVRVUkVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAibm90aW5zdGFsbGVkX2ZlYXR1cmVfb2JqLmdpZiIpOwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfU0VBUkNIID0gY3JlYXRlKFBBVEhfT0JKLCAidHNlYXJjaF9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FUlJfU1RfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZXJyb3Jfc3Rfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfT0tfU1RfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAib2tfc3Rfb2JqLmdpZiIpOwotCi0JCi0JLyoqCi0JICogT1ZSMTYKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0xJTktFRF9DTyAgID0gY3JlYXRlKFBBVEhfT1ZSLCAibGlua2VkX2NvLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVVBEQVRFRF9DTyAgID0gY3JlYXRlKFBBVEhfT1ZSLCAidXBkYXRlZF9jby5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0lOU1RBTExBQkxFX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiaW5zdGFsbGFibGVfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DVVJSRU5UX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiY3VycmVudF9jby5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VSUk9SX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiZXJyb3JfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19XQVJOSU5HX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAid2FybmluZ19jby5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX01PRF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgIm1vZF9jby5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0FERF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImFkZF9zdGF0LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfREVMX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiZGVsX3N0YXQuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VTkNPTkZfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJ1bmNvbmZpZ3VyZWRfY28uZ2lmIik7Ci0KLQkvKioKLQkgKiBWSUVXMTYKLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ09ORklHU19WSUVXID0gY3JlYXRlKFBBVEhfVklFVywgImNvbmZpZ3MuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSVRFU19WSUVXID0gY3JlYXRlKFBBVEhfVklFVywgInVwZGF0ZXMuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TRUxFQ1RFRF9VUERBVEVTX1ZJRVcgPSBjcmVhdGUoUEFUSF9WSUVXLCAic2VsZWN0ZWRfdXBkYXRlcy5naWYiKTsKLQotCS8qKgotCSAqIExDTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQkFDS1dBUkRfTkFWID0gY3JlYXRlKFBBVEhfTENMLCAiYmFja3dhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQkFDS1dBUkRfTkFWX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJiYWNrd2FyZF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19CQUNLV0FSRF9OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImJhY2t3YXJkX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0ZPUldBUkRfTkFWID0gY3JlYXRlKFBBVEhfTENMLCAiZm9yd2FyZF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GT1JXQVJEX05BVl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAiZm9yd2FyZF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GT1JXQVJEX05BVl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAiZm9yd2FyZF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19IT01FX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgImhvbWVfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSE9NRV9OQVZfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgImhvbWVfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSE9NRV9OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImhvbWVfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfUkVGUkVTSF9OQVYgPSBjcmVhdGUoUEFUSF9MQ0wsICJyZWZyZXNoX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1JFRlJFU0hfTkFWX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJyZWZyZXNoX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1JFRlJFU0hfTkFWX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJyZWZyZXNoX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NUT1BfTkFWID0gY3JlYXRlKFBBVEhfTENMLCAic3RvcF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TVE9QX05BVl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAic3RvcF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TVE9QX05BVl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAic3RvcF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19HT19OQVYgPSBjcmVhdGUoUEFUSF9MQ0wsICJnb19uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19HT19OQVZfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgImdvX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0dPX05BVl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAiZ29fbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19VTkNPTkYgPSBjcmVhdGUoUEFUSF9MQ0wsICJzaG93X3VuY29uZi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfVU5DT05GX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJzaG93X3VuY29uZi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfVU5DT05GX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJzaG93X3VuY29uZi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTExBUFNFX0FMTCA9IGNyZWF0ZShQQVRIX0xDTCwgImNvbGxhcHNlYWxsLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19ISUVSQVJDSFkgPSBjcmVhdGUoUEFUSF9MQ0wsICJoaWVyYXJjaGljYWxMYXlvdXQuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX0hJRVJBUkNIWV9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAiaGllcmFyY2hpY2FsTGF5b3V0LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19ISUVSQVJDSFlfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImhpZXJhcmNoaWNhbExheW91dC5naWYiKTsKLQotCS8qKgotCSAqIFdJWgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSU5TVEFMTF9XSVogID0gY3JlYXRlKFBBVEhfV0laQkFOLCAiaW5zdGFsbF93aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VUERBVEVfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgInVwZGF0ZV93aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT05GSUdfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgImNvbmZpZ193aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VTklOU1RBTExfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgInVuaW5zdGFsbF93aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JTlNUQUxMX0JBTk5FUiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJkZWZfd2l6YmFuLmpwZyIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9STV9CQU5ORVIgID0gY3JlYXRlKFBBVEhfRk9STVMsICJmb3JtX2Jhbm5lci5qcGciKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0ZPUk1fQkFOTkVSX1NIT1JUICA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAiZm9ybV9iYW5uZXIuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GT1JNX1VOREVSTElORSAgPSBjcmVhdGUoUEFUSF9GT1JNUywgImZvcm1fdW5kZXJsaW5lMi5qcGciKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1BST1ZJREVSID0gY3JlYXRlKFBBVEhfRk9STVMsICJkZWZfcHJvdmlkZXIuanBnIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JVEVNID0gY3JlYXRlKFBBVEhfRk9STVMsICJ0b3BpYy5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX05FV19CT09LTUFSSyAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJuZXdfYm9va21hcmtfd2l6LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTkVXX0ZPTERFUiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJuZXdfZm9sZGVyX3dpei5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX05FV19TRUFSQ0ggID0gY3JlYXRlKFBBVEhfV0laQkFOLCAibmV3X3NlYXJjaF93aXouZ2lmIik7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChtYWtlSW1hZ2VVUkwocHJlZml4LCBuYW1lKSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldChTdHJpbmcga2V5KSB7Ci0JCWlmIChQTFVHSU5fUkVHSVNUUlk9PW51bGwpIGluaXRpYWxpemUoKTsKLQkJcmV0dXJuIFBMVUdJTl9SRUdJU1RSWS5nZXQoa2V5KTsKLQl9Ci0KLQotcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKLQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yLCAKLQlTdHJpbmcgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpIHsKLQlVUkwgaW5zdGFsbFVSTCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotCXRyeSB7Ci0JCVVSTCBuZXdVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKTsKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ld1VSTCk7Ci0JfQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotCi1wdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlRnJvbVBsdWdpbigKLQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yLAotCVN0cmluZyBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSkgewotCVVSTCBpbnN0YWxsVVJMID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCXRyeSB7Ci0JCVVSTCBuZXdVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKTsKLQkJU3RyaW5nIGtleSA9IG5ld1VSTC50b1N0cmluZygpOwotCQlpZiAoUExVR0lOX1JFR0lTVFJZPT1udWxsKSBpbml0aWFsaXplKCk7Ci0JCWltYWdlID0gUExVR0lOX1JFR0lTVFJZLmdldChrZXkpOwotCQlpZiAoaW1hZ2U9PW51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3VVJMKTsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJUExVR0lOX1JFR0lTVFJZLnB1dChrZXksIGltYWdlKTsKLQkJfQotCX0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmV0dXJuIGltYWdlOwotfQotLyogcGFja2FnZSAqLwotcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBpbml0aWFsaXplKCkgewotCVBMVUdJTl9SRUdJU1RSWSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JbWFuYWdlKElNR19GT1JNX0JBTk5FUl9TSE9SVCwgREVTQ19GT1JNX0JBTk5FUl9TSE9SVCk7Ci0JbWFuYWdlKElNR19GT1JNX0JBTk5FUiwgREVTQ19GT1JNX0JBTk5FUik7Ci0JbWFuYWdlKElNR19GT1JNX1VOREVSTElORSwgREVTQ19GT1JNX1VOREVSTElORSk7Ci19Ci0KLQotcHJpdmF0ZSBzdGF0aWMgVVJMIG1ha2VJbWFnZVVSTChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgewotCVN0cmluZyBwYXRoID0gcHJlZml4ICsgbmFtZTsKLQlVUkwgdXJsID0gbnVsbDsKLQl0cnkgewotCQl1cmwgPSBuZXcgVVJMKEJBU0VfVVJMLCBwYXRoKTsKLQl9Ci0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlyZXR1cm4gdXJsOwotfQotCi1wdWJsaWMgc3RhdGljIEltYWdlIG1hbmFnZShTdHJpbmcga2V5LCBJbWFnZURlc2NyaXB0b3IgZGVzYykgewotCUltYWdlIGltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCVBMVUdJTl9SRUdJU1RSWS5wdXQoa2V5LCBpbWFnZSk7Ci0JcmV0dXJuIGltYWdlOwotfQotCi1wdWJsaWMgc3RhdGljIFVSTCBnZXREZWZhdWx0UHJvdmlkZXJJbWFnZVVSTCgpIHsKLQlVUkwgdXJsID0gbWFrZUltYWdlVVJMKFBBVEhfRk9STVMsICJkZWZfcHJvdmlkZXIuanBnIik7Ci0JdHJ5IHsKLQkJdXJsID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotCX0KLQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0KLQlyZXR1cm4gdXJsOyAKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsUmVzb3VyY2VzLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL1dlbGNvbWVQb3J0YWxSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxZWU0Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL1dlbGNvbWVQb3J0YWxSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIAotIwotIwotCi1Ccm93c2VyUGFnZS5hZGRyZXNzID0gQWRkcmVzczoKLUJyb3dzZXJQYWdlLnN0b3AgPSBTdG9wCi1Ccm93c2VyUGFnZS5nbyA9IEdvCi1Ccm93c2VyUGFnZS5yZWZyZXNoID0gUmVmcmVzaAotCi1XZWJCcm93c2VyVmlldy5ub3RBdmFpbGFibGUgPSBFbWJlZGRlZCBXZWIgYnJvd3NlciBpcyBub3QgYXZhaWxhYmxlLiBcCi1SZXF1aWVzdHMgZm9yIG9wZW5pbmcgVVJMcyBhcmUgcHJvY2Vzc2VkIHVzaW5nIFdlYiBicm93c2VyIHJlZ2lzdGVyZWQgdG8gaGFuZGxlIFwKLVdlYiBwYWdlcyBvbiB5b3VyIHN5c3RlbS4KLVdlYkJyb3dzZXJWaWV3LmFkZHJlc3MgPSBBZGRyZXNzOgotV2ViQnJvd3NlclZpZXcuc3RvcCA9IFN0b3AKLVdlYkJyb3dzZXJWaWV3LmdvID0gR28KLVdlYkJyb3dzZXJWaWV3LmhvbWUgPSBHbyBIb21lCi1XZWJCcm93c2VyVmlldy5yZWZyZXNoID0gUmVmcmVzaAotV2ViQnJvd3NlclZpZXcuYmFja3dhcmQgPSBHbyBCYWNrCi1XZWJCcm93c2VyVmlldy5mb3J3YXJkID0gR28gRm9yd2FyZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvYWN0aW9ucy9UaXBzQW5kVHJpY2tzQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL2FjdGlvbnMvVGlwc0FuZFRyaWNrc0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWIzYjlhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvYWN0aW9ucy9UaXBzQW5kVHJpY2tzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMjAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5XZWxjb21lUG9ydGFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLio7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUaXBzQW5kVHJpY2tzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUZvcm1Db250ZW50UHJvdmlkZXIgewotCXByaXZhdGUgSUZvcm1Db250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXI7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JRm9ybUNvbnRlbnRQcm92aWRlciNnZXRDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKSB7Ci0JCS8qCi0JCS8vIEFzayB0aGUgdXNlciB0byBzZWxlY3QgYSBmZWF0dXJlCi0JCUFib3V0SW5mb1tdIGZlYXR1cmVzID0gKChXb3JrYmVuY2gpIFdlbGNvbWVQb3J0YWwuZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpKS5nZXRDb25maWd1cmF0aW9uSW5mbygpLmdldEZlYXR1cmVzSW5mbygpOwotCQlBcnJheUxpc3Qgd2VsY29tZUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdXcml0ZXIgc3dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN3cml0ZXIpOwotCQl3cml0ZXIucHJpbnRsbigiPGZvcm0+Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUFib3V0SW5mbyBmZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQlpZiAoZmVhdHVyZS5nZXRXZWxjb21lUGFnZVVSTCgpICE9IG51bGwpIHsKLQkJCQlhZGRGZWF0dXJlTGluayh3cml0ZXIsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXdyaXRlci5wcmludGxuKCI8L2Zvcm0+Iik7Ci0JCXdyaXRlci5jbG9zZSgpOwotCQlyZXR1cm4gc3dyaXRlci50b1N0cmluZygpOwotCQkqLwotCQlyZXR1cm4gIjxmb3JtPjwvZm9ybT4iOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGZWF0dXJlTGluayhQcmludFdyaXRlciB3cml0ZXIsIEFib3V0SW5mbyBmZWF0dXJlKSB7Ci0JCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXRGZWF0dXJlTGFiZWwoKTsKLQkJU3RyaW5nIGhyZWYgPSBmZWF0dXJlLmdldFRpcHNBbmRUcmlja3NIcmVmKCk7Ci0JCWlmIChocmVmPT1udWxsKSByZXR1cm47Ci0JCXdyaXRlci5wcmludCgiPGxpPiIpOwotCQl3cml0ZXIucHJpbnQoIjxhIGhyZWY9XCJoZWxwXCIgYXJnPVwiIitocmVmKyJcIj4iK25hbWUrIjwvYT4iKTsKLQkJd3JpdGVyLnByaW50bG4oIjwvbGk+Iik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSUZvcm1Db250ZW50UHJvdmlkZXIjc2V0Q29udGVudE9ic2VydmVyKG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLklGb3JtQ29udGVudE9ic2VydmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRPYnNlcnZlcihJRm9ybUNvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewotCQl0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9hY3Rpb25zL1dlbGNvbWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvYWN0aW9ucy9XZWxjb21lQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzJkNzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9hY3Rpb25zL1dlbGNvbWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAyMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5XZWxjb21lUG9ydGFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLio7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUZvcm1Db250ZW50UHJvdmlkZXIgewotCXByaXZhdGUgSUZvcm1Db250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXI7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JRm9ybUNvbnRlbnRQcm92aWRlciNnZXRDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKSB7Ci0JCS8qCi0JCS8vIEFzayB0aGUgdXNlciB0byBzZWxlY3QgYSBmZWF0dXJlCi0JCUFib3V0SW5mb1tdIGZlYXR1cmVzID0gKChXb3JrYmVuY2gpIFdlbGNvbWVQb3J0YWwuZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpKS5nZXRDb25maWd1cmF0aW9uSW5mbygpLmdldEZlYXR1cmVzSW5mbygpOwotCQlBcnJheUxpc3Qgd2VsY29tZUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdXcml0ZXIgc3dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN3cml0ZXIpOwotCQl3cml0ZXIucHJpbnRsbigiPGZvcm0+Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUFib3V0SW5mbyBmZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQlpZiAoZmVhdHVyZS5nZXRXZWxjb21lUGFnZVVSTCgpICE9IG51bGwpIHsKLQkJCQlhZGRGZWF0dXJlTGluayh3cml0ZXIsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXdyaXRlci5wcmludGxuKCI8L2Zvcm0+Iik7Ci0JCS8qCi0KLQkJaWYgKHBlcnNwZWN0aXZlSWQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwYWdlID0gKFdvcmtiZW5jaFBhZ2UpIHdpbmRvdy5nZXRXb3JrYmVuY2goKS5zaG93UGVyc3BlY3RpdmUocGVyc3BlY3RpdmVJZCwgd2luZG93KTsKLQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJcGFnZS5zZXRFZGl0b3JBcmVhVmlzaWJsZSh0cnVlKTsKLQotCQkvLyBjcmVhdGUgaW5wdXQKLQkJV2VsY29tZUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFdlbGNvbWVFZGl0b3JJbnB1dChmZWF0dXJlKTsKLQotCQkvLyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgd2VsY29tZSBlZGl0b3IKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5maW5kRWRpdG9yKGlucHV0KTsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlwYWdlLmFjdGl2YXRlKGVkaXRvcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJcGFnZS5vcGVuRWRpdG9yKGlucHV0LCBFRElUT1JfSUQpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgV29ya2JlbmNoUGx1Z2luLlBJX1dPUktCRU5DSCwgMSwgV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJRdWlja1N0YXJ0QWN0aW9uLm9wZW5FZGl0b3JFeGNlcHRpb24iKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQl3aW5kb3cuZ2V0U2hlbGwoKSwKLQkJCQlXb3JrYmVuY2hNZXNzYWdlcy5nZXRTdHJpbmcoIldvcmtiZW5jaC5vcGVuRWRpdG9yRXJyb3JEaWFsb2dUaXRsZSIpLCAgLy8kTk9OLU5MUy0xJAotCQkJCVdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiV29ya2JlbmNoLm9wZW5FZGl0b3JFcnJvckRpYWxvZ01lc3NhZ2UiKSwgLy8kTk9OLU5MUy0xJAotCQkJCXN0YXR1cyk7Ci0JCX0KLQkJd3JpdGVyLmNsb3NlKCk7Ci0JCXJldHVybiBzd3JpdGVyLnRvU3RyaW5nKCk7Ci0JCSovCi0JCXJldHVybiAiPGZvcm0+PC9mb3JtPiI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZlYXR1cmVMaW5rKFByaW50V3JpdGVyIHdyaXRlciwgQWJvdXRJbmZvIGZlYXR1cmUpIHsKLQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldEZlYXR1cmVMYWJlbCgpOwotCQlVUkwgd2VsY29tZVVSTCA9IGZlYXR1cmUuZ2V0V2VsY29tZVBhZ2VVUkwoKTsKLQkJU3RyaW5nIGFjdGlvbiA9ICIiOwotCQl3cml0ZXIucHJpbnQoIjxsaT4iKTsKLQkJd3JpdGVyLnByaW50KCI8YSBocmVmPVwiYWN0aW9uXCI+IituYW1lKyI8L2E+Iik7Ci0JCXdyaXRlci5wcmludGxuKCI8L2xpPiIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLklGb3JtQ29udGVudFByb3ZpZGVyI3NldENvbnRlbnRPYnNlcnZlcihvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JRm9ybUNvbnRlbnRPYnNlcnZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50T2JzZXJ2ZXIoSUZvcm1Db250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKLQkJdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL0hlbHBTZWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9IZWxwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTNkZTJiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL0hlbHBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMjAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSGVscFNlY3Rpb24gaW1wbGVtZW50cyBJUG9ydGFsU2VjdGlvbkZvcm0gewotCXByaXZhdGUgVGV4dCBwaHJhc2VUZXh0OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSVBvcnRhbFNlY3Rpb24jaW5pdChvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuSUZvcm1QYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUZvcm1QYWdlIHBhZ2UpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JUG9ydGFsU2VjdGlvbiNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCAiUGhyYXNlOiIpOwotCQlwaHJhc2VUZXh0ID0gZmFjdG9yeS5jcmVhdGVUZXh0KGNvbnRhaW5lciwgIiIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlwaHJhc2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oY29udGFpbmVyLCAiR28iLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkb1NlYXJjaChwaHJhc2VUZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQlidXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXBocmFzZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHRleHQ9cGhyYXNlVGV4dC5nZXRUZXh0KCk7Ci0JCQkJYnV0dG9uLnNldEVuYWJsZWQodGV4dC5sZW5ndGgoKT4wKTsKLQkJCX0KLQkJfSk7Ci0JCXBocmFzZVRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hhcmFjdGVyPT0nXHInKSB7Ci0JCQkJCWlmIChidXR0b24uaXNFbmFibGVkKCkpCi0JCQkJCQlkb1NlYXJjaChwaHJhc2VUZXh0LmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZmFjdG9yeS5wYWludEJvcmRlcnNGb3IoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGRvU2VhcmNoKFN0cmluZyBwaHJhc2UpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBlcGhyYXNlID0gVVJMRW5jb2Rlci5lbmNvZGUocGhyYXNlLCAiVVRGLTgiKTsKLQkJCVN0cmluZyBxdWVyeSA9ICJ0YWI9c2VhcmNoJnNlYXJjaFdvcmQ9IitlcGhyYXNlOwotCQkJV29ya2JlbmNoSGVscC5nZXRIZWxwU3VwcG9ydCgpLmRpc3BsYXlIZWxwUmVzb3VyY2UocXVlcnkpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfQotCX0gCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9JRm9ybUNvbnRlbnRPYnNlcnZlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSUZvcm1Db250ZW50T2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3ODAxYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9JRm9ybUNvbnRlbnRPYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWw7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZvcm1Db250ZW50T2JzZXJ2ZXIgewotCXB1YmxpYyB2b2lkIGNvbnRlbnRDaGFuZ2VkKElGb3JtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyKTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL0lGb3JtQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9JRm9ybUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWU4NWVlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL0lGb3JtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMjAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJRm9ybUNvbnRlbnRQcm92aWRlciB7Ci0JU3RyaW5nIGdldENvbnRlbnQoKTsKLQl2b2lkIHNldENvbnRlbnRPYnNlcnZlcihJRm9ybUNvbnRlbnRPYnNlcnZlciBvYnNlcnZlcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSVBvcnRhbFNlY3Rpb25Gb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9JUG9ydGFsU2VjdGlvbkZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdkNzdhNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9JUG9ydGFsU2VjdGlvbkZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJUG9ydGFsU2VjdGlvbkZvcm0gewotCXZvaWQgaW5pdChJRm9ybVBhZ2UgcGFnZSk7Ci0JQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpOwotCXZvaWQgZGlzcG9zZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1BvcnRhbFNlY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1BvcnRhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1ZWFhMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9Qb3J0YWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDE5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuV2VsY29tZVBvcnRhbDsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFBvcnRhbFNlY3Rpb24gZXh0ZW5kcyBGb3JtU2VjdGlvbiAgewotCXByaXZhdGUgU2VjdGlvbkRlc2NyaXB0b3IgZGVzYzsKLQlwcml2YXRlIFdlbGNvbWVQb3J0YWxGb3JtIGZvcm07Ci0JcHJpdmF0ZSBIeXBlcmxpbmtBY3Rpb24gZWNsaXBzZUFjdGlvbjsKLQlwcml2YXRlIEhUVFBBY3Rpb24gaHR0cEFjdGlvbjsKLQlwcml2YXRlIEh5cGVybGlua0FjdGlvbiBoZWxwQWN0aW9uOwotCXByaXZhdGUgQ29tcG9zaXRlIGZvcm1Db250YWluZXI7Ci0JcHJpdmF0ZSBIYXNodGFibGUgZWNsaXBzZUFjdGlvbnM7Ci0KLQljbGFzcyBBY3Rpb25XcmFwcGVyIGV4dGVuZHMgQWN0aW9uIHsKLQkJSUFjdGlvbkRlbGVnYXRlIGRlbGVnYXRlOwotCi0JCXB1YmxpYyBBY3Rpb25XcmFwcGVyKFN0cmluZyBhcmcsIElBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotCQkJc3VwZXIoYXJnKTsKLQkJCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJCWlmIChkZWxlZ2F0ZSBpbnN0YW5jZW9mIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSkKLQkJCQkoKElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSkgZGVsZWdhdGUpLmluaXQoCi0JCQkJCVdlbGNvbWVQb3J0YWwuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWRlbGVnYXRlLnJ1bih0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBQb3J0YWxTZWN0aW9uKFNlY3Rpb25EZXNjcmlwdG9yIGRlc2MsIFdlbGNvbWVQb3J0YWxGb3JtIGZvcm0pIHsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy5mb3JtID0gZm9ybTsKLQkJc2V0RGVzY3JpcHRpb25QYWludGVkKGZhbHNlKTsKLQkJc2V0Q29sbGFwc2FibGUodHJ1ZSk7Ci0JCXNldEhlYWRlclRleHQoZGVzYy5nZXROYW1lKCkpOwotCQltYWtlSHlwZXJsaW5rQWN0aW9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBtYWtlSHlwZXJsaW5rQWN0aW9ucygpIHsKLQkJSUFjdGlvbkJhcnMgYmFycyA9Ci0JCQlmb3JtLmdldFBvcnRhbCgpLmdldEVkaXRvcigpLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWh0dHBBY3Rpb24gPSBuZXcgSFRUUEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSUh5cGVybGlua1NlZ21lbnQgbGluaykgewotCQkJCVN0cmluZyB1cmwgPSBsaW5rLmdldEFyZygpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQkJV2VsY29tZVBvcnRhbC5zaG93VVJMKGxpbmsuZ2V0VGV4dCgpLCB1cmwpOwotCQkJfQotCQl9OwotCQlodHRwQWN0aW9uLnNldFN0YXR1c0xpbmVNYW5hZ2VyKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JCWVjbGlwc2VBY3Rpb24gPSBuZXcgSHlwZXJsaW5rQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7Ci0JCQkJU3RyaW5nIGFyZyA9IGxpbmsuZ2V0QXJnKCk7Ci0JCQkJaWYgKGFyZyAhPSBudWxsKQotCQkJCQlydW5FY2xpcHNlQWN0aW9uKGFyZyk7Ci0JCQl9Ci0JCX07Ci0JCWVjbGlwc2VBY3Rpb24uc2V0U3RhdHVzTGluZU1hbmFnZXIoYmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpKTsKLQkJaGVscEFjdGlvbiA9IG5ldyBIeXBlcmxpbmtBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsKLQkJCQlTdHJpbmcgYXJnID0gbGluay5nZXRBcmcoKTsKLQkJCQlpZiAoYXJnICE9IG51bGwpCi0JCQkJCW9wZW5FY2xpcHNlSGVscChhcmcpOwotCQkJfQotCQl9OwotCQloZWxwQWN0aW9uLnNldFN0YXR1c0xpbmVNYW5hZ2VyKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JfQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ2xpZW50KAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcgPSBkZXNjLmdldENvbmZpZygpOwotCQlmb3JtQ29udGFpbmVyID0gZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQkJSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQkJZm9ybUNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0LnRvcE1hcmdpbiA9IGxheW91dC5ib3R0b21NYXJnaW4gPSAwOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IGxheW91dC5yaWdodE1hcmdpbiA9IDA7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gY29uZmlnLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJaWYgKGNoaWxkLmdldE5hbWUoKS5lcXVhbHMoImZvcm0iKSkgewotCQkJCWNyZWF0ZUZvcm0oZm9ybUNvbnRhaW5lciwgY2hpbGQsIGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmb3JtQ29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JtKAotCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50LAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLAotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCVN0cmluZyB0eXBlID0gY29uZmlnLmdldEF0dHJpYnV0ZSgidHlwZSIpOwotCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuZXF1YWxzKCJjdXN0b20iKSkgewotCQkJY3JlYXRlQ3VzdG9tRm9ybShwYXJlbnQsIGNvbmZpZywgZmFjdG9yeSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgRm9ybUVuZ2luZSBlbmdpbmUgPSBmYWN0b3J5LmNyZWF0ZUZvcm1FbmdpbmUocGFyZW50KTsKLQkJLy9lbmdpbmUuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9DWUFOKSk7Ci0JCWVuZ2luZS5zZXRIeXBlcmxpbmtTZXR0aW5ncyhmYWN0b3J5LmdldEh5cGVybGlua0hhbmRsZXIoKSk7Ci0JCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoVGFibGVEYXRhLkZJTEwsIFRhYmxlRGF0YS5UT1ApOwotCQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWVuZ2luZS5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZW5naW5lLnJlZ2lzdGVyVGV4dE9iamVjdCgidXJsIiwgaHR0cEFjdGlvbik7Ci0JCWVuZ2luZS5yZWdpc3RlclRleHRPYmplY3QoImFjdGlvbiIsIGVjbGlwc2VBY3Rpb24pOwotCQllbmdpbmUucmVnaXN0ZXJUZXh0T2JqZWN0KCJoZWxwIiwgaGVscEFjdGlvbik7Ci0JCWlmICh0eXBlID09IG51bGwgfHwgdHlwZS5lcXVhbHMoImxvY2FsIikpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IGNvbmZpZy5nZXRWYWx1ZSgpOwotCQkJZW5naW5lLmxvYWQoIjxmb3JtPiIgKyB2YWx1ZSArICI8L2Zvcm0+IiwgdHJ1ZSwgZmFsc2UpOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJkeW5hbWljIikpIHsKLQkJCUlGb3JtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gY3JlYXRlQ29udGVudFByb3ZpZGVyKGNvbmZpZyk7Ci0JCQlpZiAocHJvdmlkZXIhPW51bGwpIHsKLQkJCQllbmdpbmUubG9hZChwcm92aWRlci5nZXRDb250ZW50KCksIHRydWUsIGZhbHNlKTsKLQkJCQlwcm92aWRlci5zZXRDb250ZW50T2JzZXJ2ZXIobmV3IElGb3JtQ29udGVudE9ic2VydmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBjb250ZW50Q2hhbmdlZChJRm9ybUNvbnRlbnRQcm92aWRlciBwcm92aWRlcikgewotCQkJCQkJZW5naW5lLmxvYWQocHJvdmlkZXIuZ2V0Q29udGVudCgpLCB0cnVlLCBmYWxzZSk7Ci0JCQkJCQlyZWZsb3coKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJyZW1vdGUiKSkgewotCQkJU3RyaW5nIHVybE5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKCJ1cmwiKTsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgVVJMIHVybCA9IG5ldyBVUkwodXJsTmFtZSk7Ci0JCQkJUnVubmFibGUgbG9hZGVyID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCQkJCQllbmdpbmUubG9hZChpcywgZmFsc2UpOwotCQkJCQkJCXBhcmVudC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlyZWZsb3coKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCXBhcmVudC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlXZWxjb21lUG9ydGFsLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCi0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQobG9hZGVyKTsKLQkJCQl0LnN0YXJ0KCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCVdlbGNvbWVQb3J0YWwubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUN1c3RvbUZvcm0oCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSBjb25maWcuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUG9ydGFsU2VjdGlvbkZvcm0pIHsKLQkJCQlJUG9ydGFsU2VjdGlvbkZvcm0gcHNlY3Rpb24gPSAoSVBvcnRhbFNlY3Rpb25Gb3JtKSBvYmo7Ci0JCQkJLy9wc2VjdGlvbi5pbml0KGZvcm0uZ2V0UG9ydGFsKCkpOwotCQkJCUNvbnRyb2wgY29udHJvbCA9IHBzZWN0aW9uLmNyZWF0ZUNvbnRyb2wocGFyZW50LCBmYWN0b3J5KTsKLQkJCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKFRhYmxlRGF0YS5GSUxMLCBUYWJsZURhdGEuVE9QKTsKLQkJCQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCQkJY29udHJvbC5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlXZWxjb21lUG9ydGFsLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElGb3JtQ29udGVudFByb3ZpZGVyIGNyZWF0ZUNvbnRlbnRQcm92aWRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gY29uZmlnLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUZvcm1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKElGb3JtQ29udGVudFByb3ZpZGVyKSBvYmo7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV2VsY29tZVBvcnRhbC5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHJlZmxvdygpIHsKLQkJZm9ybUNvbnRhaW5lci5sYXlvdXQoKTsKLQkJc3VwZXIucmVmbG93KCk7Ci0JCWZvcm0udXBkYXRlU2l6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBydW5FY2xpcHNlQWN0aW9uKGZpbmFsIFN0cmluZyBhcmcpIHsKLQkJQnVzeUluZGljYXRvcgotCQkJLnNob3dXaGlsZShmb3JtLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaW5hbCBJQWN0aW9uIGFjdGlvbiA9IGdldEVjbGlwc2VBY3Rpb24oYXJnKTsKLQkJCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQkJCWFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQWN0aW9uIGdldEVjbGlwc2VBY3Rpb24oU3RyaW5nIGFyZykgewotCQlpZiAoZWNsaXBzZUFjdGlvbnMgPT0gbnVsbCkgewotCQkJZWNsaXBzZUFjdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCX0KLQkJSUFjdGlvbiBhY3Rpb24gPSAoSUFjdGlvbikgZWNsaXBzZUFjdGlvbnMuZ2V0KGFyZyk7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkKLQkJCXJldHVybiBhY3Rpb247Ci0JCS8vIGxvYWQKLQkJaW50IGNvbCA9IGFyZy5pbmRleE9mKCc6Jyk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGFyZy5zdWJzdHJpbmcoMCwgY29sKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGFyZy5zdWJzdHJpbmcoY29sICsgMSk7Ci0JCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2MgPQotCQkJUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKHBsdWdpbklkKTsKLQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJbG9nQWN0aW9uTGlua0Vycm9yKHBsdWdpbklkLCBjbGFzc05hbWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ2xhc3MgYWN0aW9uQ2xhc3M7Ci0JCXRyeSB7Ci0JCQlhY3Rpb25DbGFzcyA9IGRlc2MuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dBY3Rpb25MaW5rRXJyb3IocGx1Z2luSWQsIGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IGFjdGlvbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUFjdGlvbikKLQkJCQlhY3Rpb24gPSAoSUFjdGlvbikgb2JqOwotCQkJZWxzZQotCQkJCWFjdGlvbiA9IG5ldyBBY3Rpb25XcmFwcGVyKGFyZywgKElBY3Rpb25EZWxlZ2F0ZSkgb2JqKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dBY3Rpb25MaW5rRXJyb3IocGx1Z2luSWQsIGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dBY3Rpb25MaW5rRXJyb3IocGx1Z2luSWQsIGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCWxvZ0FjdGlvbkxpbmtFcnJvcihwbHVnaW5JZCwgY2xhc3NOYW1lKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVjbGlwc2VBY3Rpb25zLnB1dChhcmcsIGFjdGlvbik7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ0FjdGlvbkxpbmtFcnJvcihTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCVdlbGNvbWVQb3J0YWwuZ2V0UGx1Z2luSWQoKSwKLQkJCQlJU3RhdHVzLk9LLAotCQkJCSJVbmFibGUgdG8gbG9hZCBjbGFzcyAiCi0JCQkJCSsgY2xhc3NOYW1lCi0JCQkJCSsgIiBmcm9tIHBsdWctaW4gIgotCQkJCQkrIHBsdWdpbklkCi0JCQkJCSsgIi4iLAotCQkJCW51bGwpOwotCQlXZWxjb21lUG9ydGFsLmxvZyhzdGF0dXMsIHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3BlbkVjbGlwc2VIZWxwKFN0cmluZyBhcmcpIHsKLQkJV29ya2JlbmNoSGVscC5nZXRIZWxwU3VwcG9ydCgpLmRpc3BsYXlIZWxwUmVzb3VyY2UoYXJnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9TZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvU2VjdGlvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0OTdiMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9TZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDE5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkRlc2NyaXB0b3IgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZzsKLQkKLQlwdWJsaWMgU2VjdGlvbkRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGNvbmZpZy5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGNvbmZpZy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0JcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWcoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbEVkaXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQxMmU2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lUG9ydGFsRWRpdG9yIGV4dGVuZHMgRWRpdG9yUGFydCB7Ci0JcHJpdmF0ZSBXZWxjb21lUG9ydGFsUGFydCB3ZWxjb21lUGFydDsKLQkKLQlwdWJsaWMgV2VsY29tZVBvcnRhbEVkaXRvcigpIHsKLQkJd2VsY29tZVBhcnQgPSBuZXcgV2VsY29tZVBvcnRhbFBhcnQodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHdlbGNvbWVQYXJ0IT1udWxsKQotCQkJd2VsY29tZVBhcnQuZGlzcG9zZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjZ290b01hcmtlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmICghKGlucHV0IGluc3RhbmNlb2YgV2VsY29tZVBvcnRhbEVkaXRvcklucHV0KSkKLQkJCXRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigiSW52YWxpZCBJbnB1dDogTXVzdCBiZSBXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQiKTsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl3ZWxjb21lUGFydC5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbEVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZjFmNDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbEVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci0vKioKLSAqIEEgc2ltcGxlIGVkaXRvciBpbnB1dCBmb3IgdGhlIHdlbGNvbWUgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLldlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dEZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogV2VsY29tZUVkaXRvcklucHV0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dCgpIHsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJXZWxjb21lIjsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaj09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqID09IHRoaXMpIHJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgV2VsY29tZVBvcnRhbEVkaXRvcklucHV0KSB7Ci0JCQlXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQgd29iaiA9IChXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQpb2JqOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBJUGVyc2lzdGFibGVFbGVtZW50KCkgewotCQkJcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0JCQkJcmV0dXJuIEZBQ1RPUllfSUQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkJfQotCQl9OwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dEZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjNzZmMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3Rvcnk7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbEVkaXRvcklucHV0RmFjdG9yeSBpbXBsZW1lbnRzIElFbGVtZW50RmFjdG9yeSB7Ci0JLyoqCi0JICovCi0JcHVibGljIFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dEZhY3RvcnkoKSB7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeSNjcmVhdGVFbGVtZW50KG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlIGNyZWF0ZUVsZW1lbnQoSU1lbWVudG8gbWVtZW50bykgewotCQlyZXR1cm4gbmV3IFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbEZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTQ0YjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbEZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbEZvcm0gZXh0ZW5kcyBXZWJGb3JtIHsKLQlwcml2YXRlIFdlbGNvbWVQb3J0YWxQYXJ0IHBvcnRhbDsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBwYWdlQ29uZmlnOwotCi0JcHVibGljIFdlbGNvbWVQb3J0YWxGb3JtKFdlbGNvbWVQb3J0YWxQYXJ0IHBvcnRhbCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHBhZ2VDb25maWcpIHsKLQkJdGhpcy5wb3J0YWwgPSBwb3J0YWw7Ci0JCXRoaXMucGFnZUNvbmZpZyA9IHBhZ2VDb25maWc7Ci0JCXNldEhlYWRpbmdWaXNpYmxlKGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbW9kZWwpIHsKLQkJdXBkYXRlKCk7Ci0JfQotCQotCXB1YmxpYyBXZWxjb21lUG9ydGFsUGFydCBnZXRQb3J0YWwoKSB7Ci0JCXJldHVybiBwb3J0YWw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IGdldEludGVnZXIocGFnZUNvbmZpZywgIm51bUNvbHVtbnMiLCAxKTsKLQkJbGF5b3V0LnRvcE1hcmdpbiA9IDA7Ci0JCWxheW91dC5sZWZ0TWFyZ2luID0gbGF5b3V0LnJpZ2h0TWFyZ2luID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZz0xNTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCS8vcGFyZW50LnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aD10cnVlOwotCQlTZWxlY3RhYmxlRm9ybUxhYmVsIGN1c3RvbWl6ZSA9IGdldEZhY3RvcnkoKS5jcmVhdGVTZWxlY3RhYmxlTGFiZWwocGFyZW50LCAiQ3VzdG9taXplLi4uIik7Ci0JCWdldEZhY3RvcnkoKS50dXJuSW50b0h5cGVybGluayhjdXN0b21pemUsIG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChDb250cm9sIGxpbmspIHsKLQkJCX0KLQkJfSk7Ci0JCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuYWxpZ24gPSBUYWJsZURhdGEuQ0VOVEVSOwotCQl0ZC5jb2xzcGFuID0gbGF5b3V0Lm51bUNvbHVtbnM7Ci0JCWN1c3RvbWl6ZS5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBzZWN0aW9uUmVmcyA9IHBhZ2VDb25maWcuZ2V0Q2hpbGRyZW4oInNlY3Rpb24iKTsKLQkJZm9yIChpbnQgaT0wOyBpPHNlY3Rpb25SZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgc2VjdGlvblJlZiA9IHNlY3Rpb25SZWZzW2ldOwotCQkJU3RyaW5nIGlkID0gc2VjdGlvblJlZi5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCQlTZWN0aW9uRGVzY3JpcHRvciBkZXNjID0gcG9ydGFsLmZpbmRTZWN0aW9uKGlkKTsKLQkJCWlmIChkZXNjPT1udWxsKSBjb250aW51ZTsKLQkJCVBvcnRhbFNlY3Rpb24gc2VjdGlvbiA9IG5ldyBQb3J0YWxTZWN0aW9uKGRlc2MsIHRoaXMpOwotCQkJQ29udHJvbCBjb250cm9sID0gc2VjdGlvbi5jcmVhdGVDb250cm9sKHBhcmVudCwgZ2V0RmFjdG9yeSgpKTsKLQkJCWludCBzcGFuID0gZ2V0SW50ZWdlcihzZWN0aW9uUmVmLCAic3BhbiIsIDEpOwotCQkJdGQgPSBuZXcgVGFibGVEYXRhKFRhYmxlRGF0YS5GSUxMLCBUYWJsZURhdGEuVE9QKTsKLQkJCXRkLmNvbHNwYW4gPSBzcGFuOwotCQkJdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJY29udHJvbC5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCXJlZ2lzdGVyU2VjdGlvbihzZWN0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGdldEludGVnZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIGF0dE5hbWUsIGludCBkZWYpIHsKLQkJU3RyaW5nIHZhbHVlID0gY29uZmlnLmdldEF0dHJpYnV0ZShhdHROYW1lKTsKLQkJaWYgKHZhbHVlIT1udWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBkZWY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbFBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzM0ZDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbFBhZ2UgaW1wbGVtZW50cyBJRm9ybVBhZ2UgewotCXByaXZhdGUgQ29udHJvbCBjb250cm9sOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBXZWxjb21lUG9ydGFsUGFydCBwb3J0YWw7Ci0JcHJpdmF0ZSBXZWxjb21lUG9ydGFsRm9ybSBmb3JtOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZzsKLQlwcml2YXRlIFNlbGVjdGFibGVGb3JtTGFiZWwgdGFiOwotCQotCXB1YmxpYyBXZWxjb21lUG9ydGFsUGFnZShXZWxjb21lUG9ydGFsUGFydCBwb3J0YWwsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJdGhpcy5wb3J0YWwgPSBwb3J0YWw7Ci0JCXRoaXMuZm9ybSA9IG5ldyBXZWxjb21lUG9ydGFsRm9ybShwb3J0YWwsIGNvbmZpZyk7Ci0JCXRoaXMubmFtZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRhYihTZWxlY3RhYmxlRm9ybUxhYmVsIHRhYikgewotCQl0aGlzLnRhYiA9IHRhYjsKLQl9Ci0JCi0JcHVibGljIFNlbGVjdGFibGVGb3JtTGFiZWwgZ2V0VGFiKCkgewotCQlyZXR1cm4gdGFiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGJlY29tZXNJbnZpc2libGUoSUZvcm1QYWdlIG5ld1BhZ2UpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVjb21lc1Zpc2libGUoSUZvcm1QYWdlIHByZXZpb3VzUGFnZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmNvbnRyb2wgPSBmb3JtLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJZm9ybS5pbml0aWFsaXplKG51bGwpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU291cmNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotCQlyZXR1cm4gcG9ydGFsLmlzVmlzaWJsZSh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsUGFydC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzNjcwMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuV2VsY29tZVBvcnRhbDsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVQb3J0YWxQYXJ0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX1BBRERJTkcgPSA1OwotCXByaXZhdGUgSGFzaHRhYmxlIHNlY3Rpb25EZXNjcmlwdG9yczsKLQljbGFzcyBUYWJMaXN0ZW5lciBpbXBsZW1lbnRzIElIeXBlcmxpbmtMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rTGFiZWwpIHsKLQkJCUlGb3JtUGFnZSBwYWdlID0gKElGb3JtUGFnZSkgbGlua0xhYmVsLmdldERhdGEoKTsKLQkJCXdvcmtib29rLnNlbGVjdFBhZ2UocGFnZSwgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlua0VudGVyZWQoQ29udHJvbCBsaW5rTGFiZWwpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rTGFiZWwpIHsKLQkJCWlmIChsaW5rTGFiZWw9PXNlbGVjdGVkVGFiKQotCQkJCWhpZ2hsaWdodFRhYihzZWxlY3RlZFRhYiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRhYkxpc3RlbmVyIHRhYkxpc3RlbmVyID0gbmV3IFRhYkxpc3RlbmVyKCk7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgdGFiQ29udGFpbmVyOwotCXByaXZhdGUgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeTsKLQlwcml2YXRlIEh5cGVybGlua0hhbmRsZXIgaGhhbmRsZXI7Ci0JcHJpdmF0ZSBXZWxjb21lUG9ydGFsRWRpdG9yIGVkaXRvcjsKLQlwcml2YXRlIENvbG9yIHRhYkNvbG9yOwotCXByaXZhdGUgTm9UYWJzV29ya2Jvb2sgd29ya2Jvb2s7Ci0JcHJpdmF0ZSBTZWxlY3RhYmxlRm9ybUxhYmVsIHNlbGVjdGVkVGFiOwotCi0JcHVibGljIFdlbGNvbWVQb3J0YWxQYXJ0KFdlbGNvbWVQb3J0YWxFZGl0b3IgZWRpdG9yKSB7Ci0JCWZhY3RvcnkgPSBuZXcgRm9ybVdpZGdldEZhY3RvcnkoKTsKLQkJaGhhbmRsZXIgPSBuZXcgSHlwZXJsaW5rSGFuZGxlcigpOwotCQl3b3JrYm9vayA9IG5ldyBOb1RhYnNXb3JrYm9vaygpOwotCQl0aGlzLmVkaXRvciA9IGVkaXRvcjsKLQl9Ci0JCi0JcHVibGljIFdlbGNvbWVQb3J0YWxFZGl0b3IgZ2V0RWRpdG9yKCkgewotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZhY3RvcnkuZGlzcG9zZSgpOwotCQloaGFuZGxlci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZShJRm9ybVBhZ2UgcGFnZSkgewotCQlyZXR1cm4gd29ya2Jvb2suZ2V0Q3VycmVudFBhZ2UoKS5lcXVhbHMocGFnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNyZWF0ZVRpdGxlKGNvbnRhaW5lcik7Ci0JCWNyZWF0ZVRhYnMoY29udGFpbmVyKTsKLQkJd29ya2Jvb2suY3JlYXRlQ29udHJvbChjb250YWluZXIpOwotCQl3b3JrYm9vay5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXdvcmtib29rLmFkZEZvcm1TZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUZvcm1TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvcm1TZWxlY3RlZChJRm9ybVBhZ2UgcGFnZSwgYm9vbGVhbiBzZXRGb2N1cykgewotCQkJCWhpZ2h0bGlnaHRUYWIoKFdlbGNvbWVQb3J0YWxQYWdlKSBwYWdlKTsKLQkJCX0KLQkJfSk7Ci0JCXdvcmtib29rLnNlbGVjdFBhZ2Uod29ya2Jvb2suZ2V0UGFnZXMoKVswXSwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRpdGxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJV2VsY29tZVRpdGxlQXJlYSB0aXRsZSA9IG5ldyBXZWxjb21lVGl0bGVBcmVhKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRpdGxlLnNldExheW91dERhdGEoZ2QpOwotCQl0aXRsZS5zZXRUZXh0KCJXZWxjb21lIik7Ci0JCXRpdGxlLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JCXRpdGxlLnNldEZvcmVncm91bmQoZmFjdG9yeS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0JCXRpdGxlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFicyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRhYkNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCXRhYkNvbnRhaW5lci5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCVBvaW50IHNpemUgPSB0YWJDb250YWluZXIuZ2V0U2l6ZSgpOwotCQkJCVJlY3RhbmdsZSB0YWJCb3VuZHMgPSBzZWxlY3RlZFRhYi5nZXRCb3VuZHMoKTsKLQkJCQlHQyBnYyA9IGUuZ2M7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlKDAsIHRhYkJvdW5kcy55LVRBQl9QQURESU5HLCBzaXplLngsIHRhYkJvdW5kcy5oZWlnaHQrVEFCX1BBRERJTkcrVEFCX1BBRERJTkcpOwotCQkJfQotCQl9KTsKLQkJdGFiQ29sb3IgPQotCQkJZmFjdG9yeS5nZXRDb2xvcihGb3JtV2lkZ2V0RmFjdG9yeS5DT0xPUl9DT01QT1NJVEVfU0VQQVJBVE9SKTsKLQkJdGFiQ29udGFpbmVyLnNldEJhY2tncm91bmQodGFiQ29sb3IpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gVEFCX1BBRERJTkc7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBUQUJfUEFERElORyArIFRBQl9QQURESU5HOwotCQl0YWJDb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQl0YWJDb250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWhoYW5kbGVyLnNldEJhY2tncm91bmQodGFiQ29sb3IpOwotCQloaGFuZGxlci5zZXRGb3JlZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQloaGFuZGxlci5zZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKAotCQkJSHlwZXJsaW5rU2V0dGluZ3MuVU5ERVJMSU5FX1JPTExPVkVSKTsKLQkJbG9hZFRhYnModGFiQ29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRUYWJzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IFtdIHBhZ2VzID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoV2VsY29tZVBvcnRhbC5nZXRQbHVnaW5JZCgpLCAid2VsY29tZVBhZ2VzIik7Ci0JCWZvciAoaW50IGk9MDsgaTxwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJY3JlYXRlVGFiKHBhcmVudCwgcGFnZXNbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYigKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQlXZWxjb21lUG9ydGFsUGFnZSBwYWdlID0gbmV3IFdlbGNvbWVQb3J0YWxQYWdlKHRoaXMsIGNvbmZpZyk7Ci0JCVNlbGVjdGFibGVGb3JtTGFiZWwgdGFiID0gZmFjdG9yeS5jcmVhdGVTZWxlY3RhYmxlTGFiZWwocGFyZW50LCBwYWdlLmdldFRpdGxlKCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQl0YWIuc2V0QmFja2dyb3VuZCh0YWJDb2xvcik7Ci0JCXRhYi5zZXRGb3JlZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQloaGFuZGxlci5yZWdpc3Rlckh5cGVybGluayh0YWIsIHRhYkxpc3RlbmVyKTsKLQkJdGFiLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJdGFiLnNldExheW91dERhdGEoZ2QpOwotCQl0YWIuc2V0RGF0YShwYWdlKTsKLQkJcGFnZS5zZXRUYWIodGFiKTsKLQkJd29ya2Jvb2suYWRkUGFnZShwYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGlnaHRsaWdodFRhYihXZWxjb21lUG9ydGFsUGFnZSBwYWdlKSB7Ci0JCWlmIChzZWxlY3RlZFRhYiAhPSBudWxsKQotCQkJaGlnaGxpZ2h0VGFiKHNlbGVjdGVkVGFiLCBmYWxzZSk7Ci0JCVNlbGVjdGFibGVGb3JtTGFiZWwgdGFiID0gcGFnZS5nZXRUYWIoKTsKLQkJaGlnaGxpZ2h0VGFiKHRhYiwgdHJ1ZSk7Ci0JCXNlbGVjdGVkVGFiID0gdGFiOwotCQl0YWJDb250YWluZXIucmVkcmF3KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhpZ2hsaWdodFRhYihTZWxlY3RhYmxlRm9ybUxhYmVsIHRhYiwgYm9vbGVhbiBzZWxlY3RlZCkgewotCQlDb2xvciBiZyA9IHRhYkNvbG9yOwotCQlDb2xvciBmZyA9IGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCk7Ci0JCXRhYi5zZXRGb3JlZ3JvdW5kKHNlbGVjdGVkID8gYmcgOiBmZyk7Ci0JCXRhYi5zZXRCYWNrZ3JvdW5kKHNlbGVjdGVkID8gZmcgOiBiZyk7Ci0JfQotCi0JcHVibGljIFNlY3Rpb25EZXNjcmlwdG9yIGZpbmRTZWN0aW9uKFN0cmluZyBpZCkgewotCQlpZiAoc2VjdGlvbkRlc2NyaXB0b3JzPT1udWxsKSB7Ci0JCQlzZWN0aW9uRGVzY3JpcHRvcnM9bmV3IEhhc2h0YWJsZSgpOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IFtdIHNlY3Rpb25zID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoV2VsY29tZVBvcnRhbC5nZXRQbHVnaW5JZCgpLCAid2VsY29tZVNlY3Rpb25zIik7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VjdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlTZWN0aW9uRGVzY3JpcHRvciBkZXNjID0gbmV3IFNlY3Rpb25EZXNjcmlwdG9yKHNlY3Rpb25zW2ldKTsKLQkJCQlzZWN0aW9uRGVzY3JpcHRvcnMucHV0KGRlc2MuZ2V0SWQoKSwgZGVzYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTZWN0aW9uRGVzY3JpcHRvcilzZWN0aW9uRGVzY3JpcHRvcnMuZ2V0KGlkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVRpdGxlQXJlYS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVRpdGxlQXJlYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzYwMDAzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVUaXRsZUFyZWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuRm9ybUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuV2VsY29tZVBvcnRhbEltYWdlczsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVUaXRsZUFyZWEgZXh0ZW5kcyBGb3JtTGFiZWwgewotCXByaXZhdGUgSW1hZ2UgdG9wSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSBib3R0b21JbWFnZTsKLQotCXB1YmxpYyBXZWxjb21lVGl0bGVBcmVhKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdG9wSW1hZ2UgPSBXZWxjb21lUG9ydGFsSW1hZ2VzLmdldChXZWxjb21lUG9ydGFsSW1hZ2VzLklNR19GT1JNX0JBTk5FUik7Ci0JCWJvdHRvbUltYWdlID0gV2VsY29tZVBvcnRhbEltYWdlcy5nZXQoV2VsY29tZVBvcnRhbEltYWdlcy5JTUdfRk9STV9VTkRFUkxJTkUpOwotCX0KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlQb2ludCB0ZXh0U2l6ZSA9IHN1cGVyLmNvbXB1dGVTaXplKHdIaW50LCBoSGludCwgY2hhbmdlZCk7Ci0JCWludCB3aWR0aCA9IHRleHRTaXplLng7Ci0JCWludCBoZWlnaHQgPSBNYXRoLm1heCh0ZXh0U2l6ZS55LCB0b3BJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQpOwotCQloZWlnaHQgKz0gYm90dG9tSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludChQYWludEV2ZW50IGUpIHsKLQkJR0MgZ2MgPSBlLmdjOwotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0JCWdjLmRyYXdJbWFnZSh0b3BJbWFnZSwgYm91bmRzLngsIGJvdW5kcy55KTsKLQkJaW50IHkgPQlib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLSBib3R0b21JbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQ7Ci0JCWdjLmRyYXdJbWFnZShib3R0b21JbWFnZSwgMCwgeSk7Ci0JCXN1cGVyLnBhaW50KGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9Ccm93c2VyQ29udHJvbFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9Ccm93c2VyQ29udHJvbFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiNzAyNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvQnJvd3NlckNvbnRyb2xTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogTmVlZGVkIGZvciB0aGUgT0xFIGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2VyQ29udHJvbFNpdGUgZXh0ZW5kcyBPbGVDb250cm9sU2l0ZSB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWVuQnVpbHQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkRG93bmxvYWQgPSBmYWxzZTsKLQkvLyBXZWIgQnJvd3NlcgotCXByaXZhdGUgV2ViQnJvd3NlciBicm93c2VyOwotCXByaXZhdGUgU3RyaW5nIHByZXNlbnRhdGlvblVSTDsKLQlwcml2YXRlIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcjsKLQlwcml2YXRlIGludCB3b3JrU29GYXIgPSAwOwotCXByaXZhdGUgaW50IHByZXZNYXggPSAwOwotCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5zdGF0dXNMaW5lTWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0Jdm9pZCBzZXRCcm93c2VyKFdlYkJyb3dzZXIgYnJvd3NlcikgewotCQl0aGlzLmJyb3dzZXIgPSBicm93c2VyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uVVJMKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uVVJMOwotCX0KLQotCS8qKgotCSAqIEJyb3dzZXJDb250cm9sU2l0ZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBCcm93c2VyQ29udHJvbFNpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgcHJvZ0lkKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUsIHByb2dJZCk7Ci0KLQkJYWRkRXZlbnRMaXN0ZW5lcihXZWJCcm93c2VyLkRvd25sb2FkQmVnaW4sIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3RhcnRlZERvd25sb2FkID0gdHJ1ZTsKLQkJCQkvL3dlYlByb2dyZXNzLnNldFNlbGVjdGlvbigwKTsKLQkJCQlwcmV2TWF4ID0gLTE7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZEV2ZW50TGlzdGVuZXIoV2ViQnJvd3Nlci5Eb3dubG9hZENvbXBsZXRlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCXN0YXJ0ZWREb3dubG9hZCA9IGZhbHNlOwotCQkJCS8vd2ViUHJvZ3Jlc3Muc2V0U2VsZWN0aW9uKDApOwotCQkJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKQotCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5nZXRQcm9ncmVzc01vbml0b3IoKS5kb25lKCk7Ci0JCQkJcHJlc2VudGF0aW9uVVJMID0gYnJvd3Nlci5nZXRMb2NhdGlvblVSTCgpOwotCQkJfQotCQl9KTsKLQotCQlhZGRFdmVudExpc3RlbmVyKFdlYkJyb3dzZXIuQmVmb3JlTmF2aWdhdGUyLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCS8vVmFyaWFudCB1cmxWYXIgPSBldmVudC5hcmd1bWVudHNbMV07Ci0JCQkJLy9TdHJpbmcgc3RyVXJsID0gdXJsVmFyLmdldFN0cmluZygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBSZXNwb25kIHRvIFByb2dyZXNzQ2hhbmdlIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgUHJvZ3Jlc3MgYmFyCi0JCWFkZEV2ZW50TGlzdGVuZXIoV2ViQnJvd3Nlci5Qcm9ncmVzc0NoYW5nZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIXN0YXJ0ZWREb3dubG9hZCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJVmFyaWFudCBwcm9ncmVzcyA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlWYXJpYW50IG1heFByb2dyZXNzID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCi0JCQkJaWYgKHByb2dyZXNzID09IG51bGwgfHwgbWF4UHJvZ3Jlc3MgPT0gbnVsbCB8fCBwcm9ncmVzcy5nZXRJbnQoKSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8qCi0JCQkJaWYgKG1heFByb2dyZXNzLmdldEludCgpIT0xMDApCi0JCQkJICAgd2ViUHJvZ3Jlc3Muc2V0TWF4aW11bShtYXhQcm9ncmVzcy5nZXRJbnQoKSk7Ci0JCQkJKi8KLQkJCQlpZiAocHJldk1heCAhPSBtYXhQcm9ncmVzcy5nZXRJbnQoKSkgewotCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5nZXRQcm9ncmVzc01vbml0b3IoKS5iZWdpblRhc2soIiIsIG1heFByb2dyZXNzLmdldEludCgpKTsKLQkJCQkJcHJldk1heCA9IG1heFByb2dyZXNzLmdldEludCgpOwotCQkJCX0KLQkJCQkvL3dlYlByb2dyZXNzLnNldFNlbGVjdGlvbihwcm9ncmVzcy5nZXRJbnQoKSk7Ci0JCQkJaW50IG5ld1ZhbHVlID0gcHJvZ3Jlc3MuZ2V0SW50KCk7Ci0JCQkJaW50IHdvcmtlZCA9IG5ld1ZhbHVlIC0gd29ya1NvRmFyOwotCQkJCXdvcmtTb0ZhciA9IG5ld1ZhbHVlOwotCQkJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKQotCQkJCQlzdGF0dXNMaW5lTWFuYWdlci5nZXRQcm9ncmVzc01vbml0b3IoKS53b3JrZWQod29ya2VkKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWRkRXZlbnRMaXN0ZW5lcihXZWJCcm93c2VyLlN0YXR1c1RleHRDaGFuZ2UsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFyaWFudCBuZXdUZXh0ID0gZXZlbnQuYXJndW1lbnRzWzBdOwotCQkJCVN0cmluZyBtc2cgPSBuZXdUZXh0LmdldFN0cmluZygpOwotCi0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKQotCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShtc2cpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKQotCQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgiIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvR2xvYmFsQWN0aW9uSGFuZGxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0dsb2JhbEFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiM2MyMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvR2xvYmFsQWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgR2xvYmFsQWN0aW9uSGFuZGxlciB7Ci0JcHJpdmF0ZSBib29sZWFuIGFjdGl2ZSA9IGZhbHNlOwotCXByaXZhdGUgQ29tYm8gY29tYm87Ci0JcHJpdmF0ZSBDb250cm9sTGlzdGVuZXIgY29udHJvbExpc3RlbmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBDb250cm9sTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5BY3RpdmF0ZSA6Ci0JCQkJCWFjdGl2ZSA9IHRydWU7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNFbmFibGVTdGF0ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5EZWFjdGl2YXRlIDoKLQkJCQkJYWN0aXZlID0gZmFsc2U7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNFbmFibGVTdGF0ZSgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEdsb2JhbEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JCXB1YmxpYyBHbG9iYWxBY3Rpb24oU3RyaW5nIGlkKSB7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlkb0dsb2JhbEFjdGlvbihpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEdsb2JhbEFjdGlvbiBjdXRBY3Rpb247Ci0JcHJpdmF0ZSBHbG9iYWxBY3Rpb24gY29weUFjdGlvbjsKLQlwcml2YXRlIEdsb2JhbEFjdGlvbiBwYXN0ZUFjdGlvbjsKLQlwcml2YXRlIEdsb2JhbEFjdGlvbiBkZWxldGVBY3Rpb247Ci0JcHJpdmF0ZSBHbG9iYWxBY3Rpb24gc2VsZWN0QWxsQWN0aW9uOwotCXByaXZhdGUgR2xvYmFsQWN0aW9uIHVuZG9BY3Rpb247Ci0KLQlwdWJsaWMgR2xvYmFsQWN0aW9uSGFuZGxlcihJQWN0aW9uQmFycyBhY3Rpb25CYXIsIENvbWJvIGNvbWJvKSB7Ci0JCXRoaXMuY29tYm8gPSBjb21ibzsKLQkJbWFrZUFjdGlvbnMoKTsKLQkJYWN0aW9uQmFyLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNVVCwKLQkJCWN1dEFjdGlvbik7Ci0JCWFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DT1BZLAotCQkJY29weUFjdGlvbik7Ci0JCWFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5QQVNURSwKLQkJCXBhc3RlQWN0aW9uKTsKLQkJYWN0aW9uQmFyLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkRFTEVURSwKLQkJCWRlbGV0ZUFjdGlvbik7Ci0JCWFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5TRUxFQ1RfQUxMLAotCQkJc2VsZWN0QWxsQWN0aW9uKTsKLQkJYWN0aW9uQmFyLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE8sCi0JCQl1bmRvQWN0aW9uKTsKLQkJY29udHJvbExpc3RlbmVyID0gbmV3IENvbnRyb2xMaXN0ZW5lcigpOwotCQljb21iby5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIGNvbnRyb2xMaXN0ZW5lcik7Ci0JCWNvbWJvLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBjb250cm9sTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICghY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQljb21iby5yZW1vdmVMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIGNvbnRyb2xMaXN0ZW5lcik7Ci0JCQljb21iby5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgY29udHJvbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJY3V0QWN0aW9uID0gbmV3IEdsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNVVCk7Ci0JCWNvcHlBY3Rpb24gPSBuZXcgR2xvYmFsQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ09QWSk7Ci0JCXBhc3RlQWN0aW9uID0gbmV3IEdsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlBBU1RFKTsKLQkJZGVsZXRlQWN0aW9uID0gbmV3IEdsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkRFTEVURSk7Ci0JCXNlbGVjdEFsbEFjdGlvbiA9Ci0JCQluZXcgR2xvYmFsQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuU0VMRUNUX0FMTCk7Ci0JCXVuZG9BY3Rpb24gPSBuZXcgR2xvYmFsQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuVU5ETyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFjdGlvbnNFbmFibGVTdGF0ZSgpIHsKLQkJaWYgKCFhY3RpdmUpIHsKLQkJCWN1dEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWNvcHlBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXNlbGVjdEFsbEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXVuZG9BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWNvcHlBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXNlbGVjdEFsbEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvR2xvYmFsQWN0aW9uKFN0cmluZyBpZCkgewotCQlpZiAoaWQuZXF1YWxzKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VUKSkKLQkJCWNvbWJvLmN1dCgpOwotCQllbHNlIGlmIChpZC5lcXVhbHMoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DT1BZKSkKLQkJCWNvbWJvLmNvcHkoKTsKLQkJZWxzZSBpZiAoaWQuZXF1YWxzKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuUEFTVEUpKQotCQkJY29tYm8ucGFzdGUoKTsKLQkJZWxzZSBpZiAoaWQuZXF1YWxzKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuREVMRVRFKSkKLQkJCWRvRGVsZXRlKCk7Ci0JCWVsc2UgaWYgKGlkLmVxdWFscyhJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlNFTEVDVF9BTEwpKQotCQkJZG9TZWxlY3RBbGwoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9EZWxldGUoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gY29tYm8uZ2V0VGV4dCgpOwotCQlQb2ludCBzZWxlY3Rpb24gPSBjb21iby5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi54ID09IHNlbGVjdGlvbi55KQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbGVmdCA9IHRleHQuc3Vic3RyaW5nKDAsIHNlbGVjdGlvbi54KTsKLQkJU3RyaW5nIHJpZ2h0ID0gdGV4dC5zdWJzdHJpbmcoc2VsZWN0aW9uLnkgKyAxKTsKLQkJY29tYm8uc2V0VGV4dChsZWZ0ICsgcmlnaHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1NlbGVjdEFsbCgpIHsKLQkJU3RyaW5nIHRleHQgPSBjb21iby5nZXRUZXh0KCk7Ci0JCVBvaW50IG5ld1NlbGVjdGlvbiA9IG5ldyBQb2ludCgwLCB0ZXh0Lmxlbmd0aCgpKTsKLQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9JRW1iZWRkZWRXZWJCcm93c2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvSUVtYmVkZGVkV2ViQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTkxNGI0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9JRW1iZWRkZWRXZWJCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3NlcjsKLQotcHVibGljIGludGVyZmFjZSBJRW1iZWRkZWRXZWJCcm93c2VyIHsKLQlwdWJsaWMgdm9pZCBvcGVuVG8oU3RyaW5nIHVybCk7Ci0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoSVdlYkJyb3dzZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvSVdlYkJyb3dzZXJMaXN0ZW5lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0lXZWJCcm93c2VyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzNDI0My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvSVdlYkJyb3dzZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDE4LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJCcm93c2VyTGlzdGVuZXIgewotCXZvaWQgc3RhdGVDaGFuZ2VkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGVjOGNmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEFjdGl2ZVggYmFzZWQgd2ViIGJyb3dzZXIgY29udHJvbC4KLSAqLwotcHVibGljIGNsYXNzIFdlYkJyb3dzZXIgaW1wbGVtZW50cyBPbGVMaXN0ZW5lciB7Ci0JLy8gR2VuZXJhdGVkIGZyb20gdHlwZWxpYiBmaWxlbmFtZTogc2hkb2N2dy5kbGwKLQotCS8vIENvbnN0YW50cyBmb3IgV2ViQnJvd3NlciBDb21tYW5kU3RhdGVDaGFuZ2UKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NDX1VQREFURUNPTU1BTkRTID0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU0NfTkFWSUdBVEVGT1JXQVJEID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTQ19OQVZJR0FURUJBQ0sgPSAyOwotCi0JLy8gV2ViIEJyb3dzZXIgQ29udHJvbCBFdmVudHMgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQmVmb3JlTmF2aWdhdGUgPSAxMDA7Ci0JLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5hdmlnYXRlQ29tcGxldGUgPSAxMDE7Ci0JLy8gRmlyZWQgd2hlbiB0aGUgZG9jdW1lbnQgYmVpbmcgbmF2aWdhdGVkIHRvIGJlY29tZXMgdmlzaWJsZSBhbmQgZW50ZXJzIHRoZSBuYXZpZ2F0aW9uIHN0YWNrLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFN0YXR1c1RleHRDaGFuZ2UgPSAxMDI7Ci0JLy8gU3RhdHVzYmFyIHRleHQgY2hhbmdlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9ncmVzc0NoYW5nZSA9IDEwODsKLQkvLyBGaXJlZCB3aGVuIGRvd25sb2FkIHByb2dyZXNzIGlzIHVwZGF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG93bmxvYWRDb21wbGV0ZSA9IDEwNDsKLQkvLyBEb3dubG9hZCBvZiBwYWdlIGNvbXBsZXRlLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENvbW1hbmRTdGF0ZUNoYW5nZSA9IDEwNTsKLQkvLyBUaGUgZW5hYmxlZCBzdGF0ZSBvZiBhIGNvbW1hbmQgY2hhbmdlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERvd25sb2FkQmVnaW4gPSAxMDY7Ci0JLy8gRG93bmxvYWQgb2YgYSBwYWdlIHN0YXJ0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTmV3V2luZG93ID0gMTA3OwotCS8vIEZpcmVkIHdoZW4gYSBuZXcgd2luZG93IHNob3VsZCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRpdGxlQ2hhbmdlID0gMTEzOwotCS8vIERvY3VtZW50IHRpdGxlIGNoYW5nZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVCZWZvcmVOYXZpZ2F0ZSA9IDIwMDsKLQkvLyBGaXJlZCB3aGVuIGEgbmV3IGh5cGVybGluayBpcyBiZWluZyBuYXZpZ2F0ZWQgdG8gaW4gYSBmcmFtZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZU5hdmlnYXRlQ29tcGxldGUgPSAyMDE7Ci0JLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvIGluIGEgZnJhbWUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVOZXdXaW5kb3cgPSAyMDQ7Ci0JLy8gRmlyZWQgd2hlbiBhIG5ldyB3aW5kb3cgc2hvdWxkIGJlIGNyZWF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUXVpdCA9IDEwMzsKLQkvLyBGaXJlZCB3aGVuIGFwcGxpY2F0aW9uIGlzIHF1aXRpbmcuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93TW92ZSA9IDEwOTsKLQkvLyBGaXJlZCB3aGVuIHdpbmRvdyBoYXMgYmVlbiBtb3ZlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dSZXNpemUgPSAxMTA7Ci0JLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gc2l6ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QWN0aXZhdGUgPSAxMTE7Ci0JLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gYWN0aXZhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb3BlcnR5Q2hhbmdlID0gMTEyOwotCS8vIEZpcmVkIHdoZW4gdGhlIFB1dFByb3BlcnR5IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQmVmb3JlTmF2aWdhdGUyID0gMjUwOwotCS8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0by4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOZXdXaW5kb3cyID0gMjUxOwotCS8vIEZpcmVkIHdoZW4gYSBuZXcgd2luZG93IHNob3VsZCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERvY3VtZW50Q29tcGxldGUgPSAyNTk7Ci0JLy8gRmlyZWQgd2hlbiB0aGUgZG9jdW1lbnQgYmVpbmcgbmF2aWdhdGVkIHRvIHJlYWNoZXMgUmVhZHlTdGF0ZV9Db21wbGV0ZS4KLQotCS8vIFdlYiBCcm93c2VyIHByb3BlcnRpZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQSURfUkVBRFlTVEFURSA9IC01MjU7Ci0KLQkvLyBXZWIgQnJvd3NlciBzdGF0ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfVU5JTklUSUFMSVpFRCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9MT0FESU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0xPQURFRCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9JTlRFUkFDVElWRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9DT01QTEVURSA9IDQ7Ci0KLQkvLyBLZWVwIHRyYWNrIG9mIHRoZSB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIG5hdmlnYXRlIGluIHRoZSBmb3J3YXJkIGFuZCBiYWNrd2FyZCBkaXJlY3Rpb25zCi0JcHJpdmF0ZSBib29sZWFuIGJhY2t3YXJkRW5hYmxlZDsKLQlwcml2YXRlIGJvb2xlYW4gZm9yd2FyZEVuYWJsZWQ7Ci0KLQkvLyBUaGUgYXV0b21hdGlvbiBvYmplY3QgYW5kIENvbnRyb2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIE9MRSBjb250cm9sCi0JcHJpdmF0ZSBPbGVBdXRvbWF0aW9uIG9sZU9iamVjdDsKLQlwcml2YXRlIEJyb3dzZXJDb250cm9sU2l0ZSBjb250cm9sU2l0ZTsKLQotCS8vIFRoZSBPTEUgZnJhbWUgKHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSkKLQlwcml2YXRlIE9sZUZyYW1lIGNvbnRyb2xGcmFtZTsKLQotCS8vcHJpdmF0ZSBOZXN0ZWRQcmludERlbGVnYXRlIGFQcmludERlbGVnYXRlID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBXZWJCcm93c2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBDcmVhdGUgdGhlIE9MRSBmcmFtZS4gCi0JCWNvbnRyb2xGcmFtZSA9IGNyZWF0ZU9sZUZyYW1lKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlcyB0aGUgSUU1IE9MRSBDb250cm9sCi0JCS8vIFRoZSBjb25zdHJ1Y3RvciBhbHNvIHJlZ2lzdGVycyBhbGwgdGhlIG5lY2Vzc2FyeSBPTEUgbGlzdGVuZXJzLgotCQkvLyBmb3Igbm93LCBvbmx5IGNhdGNoIHRoZSBleGVjcHRpb24gaWYgY3JlYXRpbmcgYW5kIGFjdGl2YXRpbmcgdGhlIAotCQkvLyBjb250cm9sIGZhaWxzLiBObyBjaGVja2luZyBpZiB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHRoZSBPTEUgY29udHJvbCAKLQkJLy8gaXMgaW5zdGFsbGVkLgotCQl0cnkgewotCQkJY29udHJvbFNpdGUgPQotCQkJCW5ldyBCcm93c2VyQ29udHJvbFNpdGUoCi0JCQkJCWNvbnRyb2xGcmFtZSwKLQkJCQkJU1dULk5PTkUsCi0JCQkJCSJTaGVsbC5FeHBsb3JlciIpOwotCQkJY29udHJvbFNpdGUuc2V0QnJvd3Nlcih0aGlzKTsKLQkJCW9sZU9iamVjdCA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQotCQkJYmFja3dhcmRFbmFibGVkID0gZmFsc2U7Ci0JCQlmb3J3YXJkRW5hYmxlZCA9IGZhbHNlOwotCi0JCQkvLyBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIENvbW1hbmQgU3RhdGVzCi0JCQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKENvbW1hbmRTdGF0ZUNoYW5nZSwgdGhpcyk7Ci0KLQkJCS8vIGluaXRpYWxpemUgY29udHJvbAotCQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9TSE9XKTsKLQotCQkJLy8gY3JlYXRlIHByaW50IERlbGVnYXRlIChoYXMgdG8gYmUgZG9uZSBlYXJseSwgaGVyZSEpLgotCQkJLy9hUHJpbnREZWxlZ2F0ZSA9IG5ldyBOZXN0ZWRQcmludERlbGVnYXRlKHRoaXMsIG9sZU9iamVjdCwgY29udHJvbFNpdGUpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgaWQgPSAib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyIjsKLQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGlkLCBJU3RhdHVzLk9LLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQlQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl9Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgYmFjaygpIHsKLQotCQlpZiAoIWJhY2t3YXJkRW5hYmxlZCkKLQkJCXJldHVybiBPTEUuU19GQUxTRTsKLQkJZm9yd2FyZEVuYWJsZWQgPSB0cnVlOwotCi0JCS8vIGRpc3BpZD0xMDAsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb0JhY2siCi0KLQkJLy8gWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRCBpZiB5b3Uga25vdyBpdCBiZWZvcmUgaGFuZCAtIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheQotCQkvL2ludCBkaXNwSWRNZW1iZXIgPSAxMDA7Ci0KLQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBsb29rIHVwIHRoZSBESVNQSUQgZHluYW1pY2FsbHkKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVPYmplY3QuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiR29CYWNrIiB9KTsKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIGludCBjb3B5KCkgewotCQlpbnQgcmVzdWx0ID0gY29udHJvbFNpdGUucXVlcnlTdGF0dXMoT0xFLk9MRUNNRElEX0NPUFkpOwotCQlpZiAoKHJlc3VsdCAmIE9MRS5PTEVDTURGX0VOQUJMRUQpID09IE9MRS5PTEVDTURGX0VOQUJMRUQpIHsKLQkJCXJlc3VsdCA9Ci0JCQkJY29udHJvbFNpdGUuZXhlYygKLQkJCQkJT0xFLk9MRUNNRElEX0NPUFksCi0JCQkJCU9MRS5PTEVDTURFWEVDT1BUX0RPREVGQVVMVCwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIE9sZUZyYW1lIGNyZWF0ZU9sZUZyYW1lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGNvbnRyb2xGcmFtZSA9PSBudWxsKSB7Ci0JCQljb250cm9sRnJhbWUgPSBuZXcgT2xlRnJhbWUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQljb250cm9sRnJhbWUuc2V0TGF5b3V0RGF0YSgKLQkJCQluZXcgR3JpZERhdGEoCi0JCQkJCUdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMCi0JCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRyb2xGcmFtZTsKLQotCX0KLQkvKioKLQkgKiBjbGVhbiB1cAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vKiogY2xlYW4gdXAKLQkJaWYgKG9sZU9iamVjdCAhPSBudWxsKQotCQkJb2xlT2JqZWN0LmRpc3Bvc2UoKTsKLQkJb2xlT2JqZWN0ID0gbnVsbDsKLQotCQlpZiAoY29udHJvbFNpdGUgIT0gbnVsbCkKLQkJCWNvbnRyb2xTaXRlLmRpc3Bvc2UoKTsKLQkJY29udHJvbFNpdGUgPSBudWxsOwotCi0JCWlmIChjb250cm9sRnJhbWUgIT0gbnVsbCkKLQkJCWNvbnRyb2xGcmFtZS5kaXNwb3NlKCk7Ci0JCWNvbnRyb2xGcmFtZSA9IG51bGw7Ci0KLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIGludCBmb3J3YXJkKCkgewotCQlpZiAoIWZvcndhcmRFbmFibGVkKQotCQkJcmV0dXJuIE9MRS5TX0ZBTFNFOwotCQliYWNrd2FyZEVuYWJsZWQgPSB0cnVlOwotCQkvLyBkaXNwaWQ9MTAxLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29Gb3J3YXJkIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMTAxOwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0gb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkdvRm9yd2FyZCIgfSk7Ci0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVPYmplY3QuaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gT0xFLlZUX0VNUFRZKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldEludCgpOwotCX0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbEZyYW1lOwotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uTmFtZSgpIHsKLQkJLy8gZGlzcGlkPTIxMCwgdHlwZT1QUk9QR0VULCBuYW1lPSJMb2NhdGlvbk5hbWUiCi0KLQkJLy8gWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRCBpZiB5b3Uga25vdyBpdCBiZWZvcmUgaGFuZCAtIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheQotCQkvL2ludCBkaXNwSWRNZW1iZXIgPSAyMTA7Ci0KLQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBsb29rIHVwIHRoZSBESVNQSUQgZHluYW1pY2FsbHkKLQkJaW50W10gcmdkaXNwaWQgPQotCQkJb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkxvY2F0aW9uTmFtZSIgfSk7Ci0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlT2JqZWN0LmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gT0xFLlZUX0VNUFRZKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldFN0cmluZygpOwotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJMKCkgewotCQkvLyBkaXNwaWQ9MjExLCB0eXBlPVBST1BHRVQsIG5hbWU9IkxvY2F0aW9uVVJMIgotCQkvLyBZb3UgY2FuIGhhcmQgY29kZSB0aGUgRElTUElEIGlmIHlvdSBrbm93IGl0IGJlZm9yZSBoYW5kIC0gdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5Ci0JCS8vaW50IGRpc3BJZE1lbWJlciA9IDIxMTsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQlpbnRbXSByZ2Rpc3BpZCA9Ci0JCQlvbGVPYmplY3QuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiTG9jYXRpb25VUkwiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlT2JqZWN0LmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gT0xFLlZUX0VNUFRZKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldFN0cmluZygpOwotCX0KLQlwcm90ZWN0ZWQgT2xlRnJhbWUgZ2V0T2xlRnJhbWUoKSB7Ci0JCXJldHVybiBjb250cm9sRnJhbWU7Ci0KLQl9Ci0KLQlwdWJsaWMgQnJvd3NlckNvbnRyb2xTaXRlIGdldENvbnRyb2xTaXRlKCkgewotCQlyZXR1cm4gY29udHJvbFNpdGU7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVhZHlTdGF0ZSgpIHsKLQkJLy8gZGlzcGlkPTQyOTQ5NjY3NzEsIHR5cGU9UFJPUEdFVCwgbmFtZT0iUmVhZHlTdGF0ZSIKLQkJLy8gUkVBRFlTVEFURV9VTklOSVRJQUxJWkVEID0gMDsKLQkJLy8gUkVBRFlTVEFURV9MT0FESU5HID0gMTsKLQkJLy8gUkVBRFlTVEFURV9MT0FERUQgPSAyOwotCQkvLyBSRUFEWVNUQVRFX0lOVEVSQUNUSVZFID0gMzsKLQkJLy8gUkVBRFlTVEFURV9DT01QTEVURSA9IDQ7Ci0KLQkJLy8gWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRCBpZiB5b3Uga25vdyBpdCBiZWZvcmUgaGFuZCAtIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheQotCQkvL2ludCBkaXNwSWRNZW1iZXIgPSAtNTI1OwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0gb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIlJlYWR5U3RhdGUiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlT2JqZWN0LmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gT0xFLlZUX0VNUFRZKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIChDb21tYW5kU3RhdGVDaGFuZ2UpIDoKLQkJCQlpbnQgY29tbWFuZCA9IDA7Ci0JCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0KLQkJCQlWYXJpYW50IHZhclJlc3VsdCA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlpZiAodmFyUmVzdWx0ICE9IG51bGwgJiYgdmFyUmVzdWx0LmdldFR5cGUoKSAhPSBPTEUuVlRfRU1QVFkpIHsKLQkJCQkJY29tbWFuZCA9IHZhclJlc3VsdC5nZXRJbnQoKTsKLQkJCQl9Ci0KLQkJCQl2YXJSZXN1bHQgPSBldmVudC5hcmd1bWVudHNbMV07Ci0JCQkJaWYgKHZhclJlc3VsdCAhPSBudWxsICYmIHZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0VNUFRZKSB7Ci0JCQkJCWVuYWJsZWQgPSB2YXJSZXN1bHQuZ2V0Qm9vbGVhbigpOwotCQkJCX0KLQotCQkJCWlmIChjb21tYW5kID09IENTQ19OQVZJR0FURUJBQ0spCi0JCQkJCWJhY2t3YXJkRW5hYmxlZCA9IGVuYWJsZWQ7Ci0JCQkJaWYgKGNvbW1hbmQgPT0gQ1NDX05BVklHQVRFRk9SV0FSRCkKLQkJCQkJZm9yd2FyZEVuYWJsZWQgPSBlbmFibGVkOwotCi0JCQkJcmV0dXJuOwotCi0JCQljYXNlIChEb2N1bWVudENvbXBsZXRlKSA6Ci0JCQkJdmFyUmVzdWx0ID0gZXZlbnQuYXJndW1lbnRzWzBdOwotCQkJCXJldHVybjsKLQkJfQotCQkvL3Rocm93IG5ldyBPbGVFcnJvcihPTEUuRVJST1JfTk9UX0lNUExFTUVOVEVEKTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIGludCBob21lKCkgewotCQkvLyBkaXNwaWQ9MTAyLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29Ib21lIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMTAyOwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0gb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkdvSG9tZSIgfSk7Ci0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVPYmplY3QuaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gT0xFLlZUX0VNUFRZKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldEludCgpOwotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IG5hdmlnYXRlKFN0cmluZyB1cmwpIHsKLQkJcmV0dXJuIG5hdmlnYXRlKG9sZU9iamVjdCwgdXJsKTsKLQl9Ci0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGludCBuYXZpZ2F0ZShPbGVBdXRvbWF0aW9uIGFPbGVBdXRvbWF0aW9uLCBTdHJpbmcgdXJsKSB7Ci0JCS8vaWYgKExvZ2dlci5ERUJVRykKLQkJLy9Mb2dnZXIubG9nRGVidWdNZXNzYWdlKCJXZWJCcm93c2VyIiwgIm5hdmlnYXRlIHRvOiAiICsgdXJsKTsKLQkJLy8gZGlzcGlkPTEwNCwgdHlwZT1NRVRIT0QsIG5hbWU9Ik5hdmlnYXRlIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMTA0OwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCS8vIEhlcmUgd2UgYXJlIGxvb2tpbmcgdXAgdGhlIGlkIG9mIHRoZSBhcmd1bWVudCBhcyB3ZWxsCi0JCWludFtdIHJnZGlzcGlkID0KLQkJCWFPbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIk5hdmlnYXRlIiwgIlVSTCIgfSk7Ci0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQotCQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbMV07Ci0JCXJndmFyZ1swXSA9IG5ldyBWYXJpYW50KHVybCk7Ci0JCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFsxXTsKLQkJcmdkaXNwaWROYW1lZEFyZ3NbMF0gPSByZ2Rpc3BpZFsxXTsgLy8gaWRlbnRpZmllciBvZiBhcmd1bWVudAotCQlWYXJpYW50IHBWYXJSZXN1bHQgPQotCQkJYU9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlciwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgPT0gT0xFLlZUX0VNUFRZKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBwVmFyUmVzdWx0LmdldEludCgpOwotCi0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgcHJpbnQoKSB7Ci0JCXJldHVybiBwcmludChjb250cm9sU2l0ZSwgdHJ1ZSk7Ci0JfQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBpbnQgcHJpbnQoQnJvd3NlckNvbnRyb2xTaXRlIGFDb250cm9sU2l0ZSwgYm9vbGVhbiBwcm9tcHR1c2VyKSB7Ci0KLQkJaW50IHJlc3VsdCA9IGFDb250cm9sU2l0ZS5xdWVyeVN0YXR1cyhPTEUuT0xFQ01ESURfUFJJTlQpOwotCi0JCWlmICgocmVzdWx0ICYgT0xFLk9MRUNNREZfRU5BQkxFRCkgPT0gT0xFLk9MRUNNREZfRU5BQkxFRCkgewotCQkJaWYgKHByb21wdHVzZXIpCi0JCQkJcmVzdWx0ID0KLQkJCQkJYUNvbnRyb2xTaXRlLmV4ZWMoCi0JCQkJCQlPTEUuT0xFQ01ESURfUFJJTlQsCi0JCQkJCQlPTEUuT0xFQ01ERVhFQ09QVF9QUk9NUFRVU0VSLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9Ci0JCQkJCWFDb250cm9sU2l0ZS5leGVjKAotCQkJCQkJT0xFLk9MRUNNRElEX1BSSU5ULAotCQkJCQkJT0xFLk9MRUNNREVYRUNPUFRfRE9OVFBST01QVFVTRVIsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCk7Ci0JCX0KLQotCQkvL2lmIChMb2dnZXIuREVCVUcpCi0JCS8vTG9nZ2VyLmxvZ0RlYnVnTWVzc2FnZSgiV2ViQnJvd3NlciIsICJleGVjIHJldHVybnM6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKHJlc3VsdCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIGN1cnJlbnRseSB2aWV3ZWQgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCi0JCS8vIGRpc3BpZD0gNDI5NDk2Njc0NiwgdHlwZT1NRVRIT0QsIG5hbWU9IlJlZnJlc2giCi0KLQkJLy8gWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRCBpZiB5b3Uga25vdyBpdCBiZWZvcmUgaGFuZCAtIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheQotCQkvL2ludCBkaXNwSWRNZW1iZXIgPSAgNDI5NDk2Njc0NjsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZU9iamVjdC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJSZWZyZXNoIiB9KTsKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCi0JCW9sZU9iamVjdC5pbnZva2VOb1JlcGx5KGRpc3BJZE1lbWJlcik7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgc2VhcmNoKCkgewotCQkvLyBkaXNwaWQ9MTAzLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29TZWFyY2giCi0KLQkJLy8gWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRCBpZiB5b3Uga25vdyBpdCBiZWZvcmUgaGFuZCAtIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheQotCQkvL2ludCBkaXNwSWRNZW1iZXIgPSAxMDM7Ci0KLQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBsb29rIHVwIHRoZSBESVNQSUQgZHluYW1pY2FsbHkKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVPYmplY3QuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiR29TZWFyY2giIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlT2JqZWN0Lmludm9rZShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJLy8gZGlzcGlkPTEwNiwgdHlwZT1NRVRIT0QsIG5hbWU9IlN0b3AiCi0KLQkJLy8gWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRCBpZiB5b3Uga25vdyBpdCBiZWZvcmUgaGFuZCAtIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheQotCQkvL2ludCBkaXNwSWRNZW1iZXIgPSAxMDY7Ci0KLQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBsb29rIHVwIHRoZSBESVNQSUQgZHluYW1pY2FsbHkKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVPYmplY3QuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiU3RvcCIgfSk7Ci0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQotCQkvL1ZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQkJb2xlT2JqZWN0Lmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBmb3J3YXJkRW5hYmxlZAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcndhcmRFbmFibGVkKCkgewotCQlyZXR1cm4gZm9yd2FyZEVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYmFja3dhcmRFbmFibGVkCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmFja3dhcmRFbmFibGVkKCkgewotCQlyZXR1cm4gYmFja3dhcmRFbmFibGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTc0MDJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC4qOwotCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvciBleHRlbmRzIEVkaXRvclBhcnQgaW1wbGVtZW50cyBJRW1iZWRkZWRXZWJCcm93c2VyIHsKLQkvLyBOTAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTk9UX0FWQUlMQUJMRSA9Ci0JCSJXZWJCcm93c2VyVmlldy5ub3RBdmFpbGFibGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUREUkVTUyA9ICJXZWJCcm93c2VyVmlldy5hZGRyZXNzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUT1AgPSAiV2ViQnJvd3NlclZpZXcuc3RvcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9HTyA9ICJXZWJCcm93c2VyVmlldy5nbyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SRUZSRVNIID0gIldlYkJyb3dzZXJWaWV3LnJlZnJlc2giOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQkFDS1dBUkQgPSAiV2ViQnJvd3NlclZpZXcuYmFja3dhcmQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRk9SV0FSRCA9ICJXZWJCcm93c2VyVmlldy5mb3J3YXJkIjsKLQotCXByaXZhdGUgaW50IEFERFJFU1NfU0laRSA9IDEwOwotCXByaXZhdGUgV2ViQnJvd3NlciBicm93c2VyOwotCXByaXZhdGUgQ29udHJvbCBjb250cm9sOwotCXByaXZhdGUgQ29tYm8gYWRkcmVzc0NvbWJvOwotCXByaXZhdGUgT2JqZWN0IGlucHV0OwotCXByaXZhdGUgVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXI7Ci0JcHJpdmF0ZSBBY3Rpb24gcmVmcmVzaEFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBzdG9wQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIGdvQWN0aW9uOwotCXByaXZhdGUgR2xvYmFsQWN0aW9uSGFuZGxlciBnbG9iYWxBY3Rpb25IYW5kbGVyOwotCXByaXZhdGUgSVdlYkJyb3dzZXJMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNnb3RvTWFya2VyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JICovCi0JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkKLQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBXZWJCcm93c2VyRWRpdG9ySW5wdXQpKQotCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKCJJbnZhbGlkIElucHV0OiBNdXN0IGJlIFdlbGNvbWVFZGl0b3JJbnB1dCIpOwotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBXZWJCcm93c2VyRWRpdG9yKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSUZvcm1QYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbnRyb2wgPSBjb250YWluZXI7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJQ29tcG9zaXRlIG5hdkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDE7Ci0JCW5hdkNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY3JlYXRlTmF2QmFyKG5hdkNvbnRhaW5lcik7Ci0JCW5hdkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZmluYWwgV2ViQnJvd3NlciB3aW5Ccm93c2VyID0gbmV3IFdlYkJyb3dzZXIoY29udGFpbmVyKTsKLQkJYnJvd3NlciA9IHdpbkJyb3dzZXI7Ci0KLQkJQ29udHJvbCBjID0gYnJvd3Nlci5nZXRDb250cm9sKCk7Ci0JCWMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWZpbmFsIEJyb3dzZXJDb250cm9sU2l0ZSBzaXRlID0gd2luQnJvd3Nlci5nZXRDb250cm9sU2l0ZSgpOwotCQlJU3RhdHVzTGluZU1hbmFnZXIgc21uZyA9Ci0JCQlnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCXNpdGUuc2V0U3RhdHVzTGluZU1hbmFnZXIoc21uZyk7Ci0KLQkJc2l0ZS5hZGRFdmVudExpc3RlbmVyKFdlYkJyb3dzZXIuRG93bmxvYWRDb21wbGV0ZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgdXJsID0gd2luQnJvd3Nlci5nZXRMb2NhdGlvblVSTCgpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQlhZGRyZXNzQ29tYm8uc2V0VGV4dCh1cmwpOwotCQkJCQlkb3dubG9hZENvbXBsZXRlKHVybCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJc2l0ZS5hZGRFdmVudExpc3RlbmVyKFdlYkJyb3dzZXIuRG93bmxvYWRCZWdpbiwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdG9wQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJcmVmcmVzaEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjb250YWluZXIsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuV2ViQnJvd3NlclZpZXciKTsKLQkJV2ViQnJvd3NlckVkaXRvcklucHV0IGlucHV0ID0gKFdlYkJyb3dzZXJFZGl0b3JJbnB1dClnZXRFZGl0b3JJbnB1dCgpOwotCQlvcGVuVG8oaW5wdXQuZ2V0VVJMKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5UbyhmaW5hbCBTdHJpbmcgdXJsKSB7Ci0JCWFkZHJlc3NDb21iby5zZXRUZXh0KHVybCk7Ci0JCWNvbnRyb2wuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbmF2aWdhdGUodXJsKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvd25sb2FkQ29tcGxldGUoU3RyaW5nIHVybCkgewotCQlzdG9wQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZWZyZXNoQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChsaXN0ZW5lciE9bnVsbCkKLQkJCWxpc3RlbmVyLnN0YXRlQ2hhbmdlZCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihJV2ViQnJvd3Nlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTmF2QmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgYWRkcmVzc0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlhZGRyZXNzTGFiZWwuc2V0VGV4dChXZWxjb21lUG9ydGFsLmdldFN0cmluZyhLRVlfQUREUkVTUykpOwotCi0JCWFkZHJlc3NDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04gfCBTV1QuQk9SREVSKTsKLQkJYWRkcmVzc0NvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCVN0cmluZyB0ZXh0ID0gYWRkcmVzc0NvbWJvLmdldFRleHQoKTsKLQkJCQlnb0FjdGlvbi5zZXRFbmFibGVkKHRleHQubGVuZ3RoKCkgPiAwKTsKLQkJCX0KLQkJfSk7Ci0JCWFkZHJlc3NDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHRleHQgPQotCQkJCQlhZGRyZXNzQ29tYm8uZ2V0SXRlbShhZGRyZXNzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJaWYgKHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCQluYXZpZ2F0ZSh0ZXh0KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbmF2aWdhdGUoYWRkcmVzc0NvbWJvLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlhZGRyZXNzQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVRvb2xCYXIgdG9vbGJhciA9IG5ldyBUb29sQmFyKHBhcmVudCwgU1dULkZMQVQgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCXRvb2xCYXJNYW5hZ2VyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKHRvb2xiYXIpOwotCQltYWtlQWN0aW9ucygpOwotCQlJQWN0aW9uQmFycyBiYXJzID0gZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJZ2xvYmFsQWN0aW9uSGFuZGxlciA9IG5ldyBHbG9iYWxBY3Rpb25IYW5kbGVyKGJhcnMsIGFkZHJlc3NDb21ibyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5hdmlnYXRlKFN0cmluZyB1cmwpIHsKLQkJYnJvd3Nlci5uYXZpZ2F0ZSh1cmwpOwotCQlTdHJpbmdbXSBpdGVtcyA9IGFkZHJlc3NDb21iby5nZXRJdGVtcygpOwotCQlpbnQgbG9jID0gLTE7Ci0JCVN0cmluZyBub3JtVVJMID0gZ2V0Tm9ybWFsaXplZFVSTCh1cmwpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbm9ybUl0ZW0gPSBnZXROb3JtYWxpemVkVVJMKGl0ZW1zW2ldKTsKLQkJCWlmIChub3JtVVJMLmVxdWFscyhub3JtSXRlbSkpIHsKLQkJCQkvLyBtYXRjaCAKLQkJCQlsb2MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChsb2MgIT0gLTEpIHsKLQkJCWFkZHJlc3NDb21iby5yZW1vdmUobG9jKTsKLQkJfQotCQlhZGRyZXNzQ29tYm8uYWRkKHVybCwgMCk7Ci0JCWlmIChhZGRyZXNzQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiBBRERSRVNTX1NJWkUpIHsKLQkJCWFkZHJlc3NDb21iby5yZW1vdmUoYWRkcmVzc0NvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSk7Ci0JCX0KLQkJYWRkcmVzc0NvbWJvLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQl9Ci0JCi0Jdm9pZCBiYWNrKCkgewotCQlicm93c2VyLmJhY2soKTsKLQl9Ci0Jdm9pZCBmb3J3YXJkKCkgewotCQlicm93c2VyLmZvcndhcmQoKTsKLQl9Ci0JYm9vbGVhbiBpc0JhY2t3YXJkRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGJyb3dzZXIuaXNCYWNrd2FyZEVuYWJsZWQoKTsKLQl9Ci0JYm9vbGVhbiBpc0ZvcndhcmRFbmFibGVkKCkgewotCQlyZXR1cm4gYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlnb0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbmF2aWdhdGUoYWRkcmVzc0NvbWJvLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX07Ci0JCWdvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlnb0FjdGlvbi5zZXRUb29sVGlwVGV4dChXZWxjb21lUG9ydGFsLmdldFN0cmluZyhLRVlfR08pKTsKLQkJZ29BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19HT19OQVYpOwotCQlnb0FjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfR09fTkFWX0QpOwotCQlnb0FjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfR09fTkFWX0gpOwotCi0JCXN0b3BBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWJyb3dzZXIuc3RvcCgpOwotCQkJfQotCQl9OwotCQlzdG9wQWN0aW9uLnNldFRvb2xUaXBUZXh0KFdlbGNvbWVQb3J0YWwuZ2V0U3RyaW5nKEtFWV9TVE9QKSk7Ci0JCXN0b3BBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19TVE9QX05BVik7Ci0JCXN0b3BBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfU1RPUF9OQVZfRCk7Ci0JCXN0b3BBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfU1RPUF9OQVZfSCk7Ci0JCXN0b3BBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcmVmcmVzaEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYnJvd3Nlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX07Ci0JCXJlZnJlc2hBY3Rpb24uc2V0VG9vbFRpcFRleHQoCi0JCQlXZWxjb21lUG9ydGFsLmdldFN0cmluZyhLRVlfUkVGUkVTSCkpOwotCQlyZWZyZXNoQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfUkVGUkVTSF9OQVYpOwotCQlyZWZyZXNoQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX1JFRlJFU0hfTkFWX0QpOwotCQlyZWZyZXNoQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX1JFRlJFU0hfTkFWX0gpOwotCQlyZWZyZXNoQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXRvb2xCYXJNYW5hZ2VyLmFkZChnb0FjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl0b29sQmFyTWFuYWdlci5hZGQoc3RvcEFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChyZWZyZXNoQWN0aW9uKTsKLQkJdG9vbEJhck1hbmFnZXIudXBkYXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5vcm1hbGl6ZWRVUkwoU3RyaW5nIHVybCkgewotCQl1cmwgPSB1cmwudG9Mb3dlckNhc2UoKTsKLQkJaWYgKHVybC5pbmRleE9mKCI6Ly8iKSA9PSAtMSkgewotCQkJdXJsID0gImh0dHA6Ly8iICsgdXJsOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkKLQkJCWJyb3dzZXIuZGlzcG9zZSgpOwotCQlnbG9iYWxBY3Rpb25IYW5kbGVyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoY29udHJvbCAhPSBudWxsKQotCQkJY29udHJvbC5zZXRGb2N1cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9yQ29udHJpYnV0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9yQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiOTAzOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDE4LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLio7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyRWRpdG9yQ29udHJpYnV0b3IKLQlleHRlbmRzIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yCi0JaW1wbGVtZW50cyBJV2ViQnJvd3Nlckxpc3RlbmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05PVF9BVkFJTEFCTEUgPQotCQkiV2ViQnJvd3NlclZpZXcubm90QXZhaWxhYmxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0hPTUUgPSAiV2ViQnJvd3NlclZpZXcuaG9tZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9CQUNLV0FSRCA9ICJXZWJCcm93c2VyVmlldy5iYWNrd2FyZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GT1JXQVJEID0gIldlYkJyb3dzZXJWaWV3LmZvcndhcmQiOwotCi0JcHJpdmF0ZSBBY3Rpb24gaG9tZUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBiYWNrd2FyZEFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBmb3J3YXJkQWN0aW9uOwotCXByaXZhdGUgV2ViQnJvd3NlckVkaXRvciBlZGl0b3I7Ci0JCi0JcHVibGljIFdlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvcigpIHsKLQkJbWFrZUFjdGlvbnMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLklXZWJCcm93c2VyTGlzdGVuZXIjc3RhdGVDaGFuZ2VkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCXVwZGF0ZUFjdGlvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCWhvbWVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVdlYkJyb3dzZXJFZGl0b3JJbnB1dCBpbnB1dCA9IChXZWJCcm93c2VyRWRpdG9ySW5wdXQpZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJZWRpdG9yLm9wZW5UbyhpbnB1dC5nZXRVUkwoKSk7Ci0JCQl9Ci0JCX07Ci0JCWhvbWVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJaG9tZUFjdGlvbi5zZXRUb29sVGlwVGV4dChXZWxjb21lUG9ydGFsLmdldFN0cmluZyhLRVlfSE9NRSkpOwotCQlob21lQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19IT01FX05BVik7Ci0JCWhvbWVBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfSE9NRV9OQVZfRCk7Ci0JCWhvbWVBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfSE9NRV9OQVZfSCk7Ci0KLQotCQliYWNrd2FyZEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZWRpdG9yLmJhY2soKTsKLQkJCX0KLQkJfTsKLQkJYmFja3dhcmRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWJhY2t3YXJkQWN0aW9uLnNldFRvb2xUaXBUZXh0KFdlbGNvbWVQb3J0YWwuZ2V0U3RyaW5nKEtFWV9CQUNLV0FSRCkpOwotCQliYWNrd2FyZEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfQkFDS1dBUkRfTkFWKTsKLQkJYmFja3dhcmRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfQkFDS1dBUkRfTkFWX0QpOwotCQliYWNrd2FyZEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19CQUNLV0FSRF9OQVZfSCk7Ci0KLQkJZm9yd2FyZEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZWRpdG9yLmZvcndhcmQoKTsKLQkJCX0KLQkJfTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRUb29sVGlwVGV4dChXZWxjb21lUG9ydGFsLmdldFN0cmluZyhLRVlfRk9SV0FSRCkpOwotCQlmb3J3YXJkQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfRk9SV0FSRF9OQVYpOwotCQlmb3J3YXJkQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0ZPUldBUkRfTkFWX0QpOwotCQlmb3J3YXJkQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0ZPUldBUkRfTkFWX0gpOwotCQlmb3J3YXJkQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl0b29sQmFyTWFuYWdlci5hZGQoaG9tZUFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChiYWNrd2FyZEFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChmb3J3YXJkQWN0aW9uKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlpZiAodGhpcy5lZGl0b3IgIT0gbnVsbCkKLQkJCXRoaXMuZWRpdG9yLnNldExpc3RlbmVyKG51bGwpOwotCQllZGl0b3IgPSAoV2ViQnJvd3NlckVkaXRvcikgdGFyZ2V0RWRpdG9yOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5zZXRMaXN0ZW5lcih0aGlzKTsKLQkJCXVwZGF0ZUFjdGlvbnMoKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQWN0aW9ucygpIHsKLQkJYmFja3dhcmRBY3Rpb24uc2V0RW5hYmxlZChlZGl0b3IuaXNCYWNrd2FyZEVuYWJsZWQoKSk7Ci0JCWZvcndhcmRBY3Rpb24uc2V0RW5hYmxlZChlZGl0b3IuaXNGb3J3YXJkRW5hYmxlZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvcklucHV0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OWUwODcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLS8qKgotICogQSBzaW1wbGUgZWRpdG9yIGlucHV0IGZvciB0aGUgd2VsY29tZSBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZBQ1RPUllfSUQgPSAib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyLldlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JLyoqCi0JICogV2VsY29tZUVkaXRvcklucHV0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFdlYkJyb3dzZXJFZGl0b3JJbnB1dChTdHJpbmcgbmFtZSwgU3RyaW5nIHVybCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqPT1udWxsKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBXZWJCcm93c2VyRWRpdG9ySW5wdXQpIHsKLQkJCVdlYkJyb3dzZXJFZGl0b3JJbnB1dCB3b2JqID0gKFdlYkJyb3dzZXJFZGl0b3JJbnB1dClvYmo7Ci0JCQlyZXR1cm4gd29iai5nZXRVUkwoKS5lcXVhbHMoZ2V0VVJMKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBuZXcgSVBlcnNpc3RhYmxlRWxlbWVudCgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQkJCXJldHVybiBGQUNUT1JZX0lEOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJCQltZW1lbnRvLnB1dFN0cmluZygibmFtZSIsIG5hbWUpOwotCQkJCW1lbWVudG8ucHV0U3RyaW5nKCJ1cmwiLCB1cmwpOwotCQkJfQotCQl9OwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvcklucHV0RmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4MDU1Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvcklucHV0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyRWRpdG9ySW5wdXRGYWN0b3J5IGltcGxlbWVudHMgSUVsZW1lbnRGYWN0b3J5IHsKLQkvKioKLQkgKi8KLQlwdWJsaWMgV2ViQnJvd3NlckVkaXRvcklucHV0RmFjdG9yeSgpIHsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5I2NyZWF0ZUVsZW1lbnQob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JcHVibGljIElBZGFwdGFibGUgY3JlYXRlRWxlbWVudChJTWVtZW50byBtZW1lbnRvKSB7Ci0JCVN0cmluZyBuYW1lID0gbWVtZW50by5nZXRTdHJpbmcoIm5hbWUiKTsKLQkJU3RyaW5nIHVybCA9IG1lbWVudG8uZ2V0U3RyaW5nKCJ1cmwiKTsKLQkJcmV0dXJuIG5ldyBXZWJCcm93c2VyRWRpdG9ySW5wdXQobmFtZSwgdXJsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ODI0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTE2OWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLnVpPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmhlbHAuYmFzZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkuZm9ybXM8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eDwvcHJvamVjdD4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9HcmFwaGljc191cGRhdGUuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvR3JhcGhpY3NfdXBkYXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWUxYTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9HcmFwaGljc191cGRhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDExMClodHRwOi8vZGVzaWduLnRvcm9sYWIuaWJtLmNvbS9haW0vV1NXQi1lY2xpcHNlLzEwMjBfUERFL2ltcGxlbWVudGF0aW9uX2ljb25zL29yZy5lY2xpcHNlLnBkZS9HcmFwaGljc19wZGUuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5ncmFwaGljczwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJHcmVnIEFkYW1zIiBuYW1lPUF1dGhvcj4KLTxNRVRBIGNvbnRlbnQ9Ik1pY3Jvc29mdCBGcm9udFBhZ2UgNC4wIiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBiZ0NvbG9yPXdoaXRlPgotPEgyPm9yZy5lY2xpcHNlLnVwZGF0ZS51aSAtIEdyYXBoaWNzIFN1bW1hcnk8L0gyPjxGT05UIHNpemU9LTE+PFNUUk9ORz5Db21wZXRlbmN5IAotbGVhZDogPC9TVFJPTkc+VmxhZCBLbGljbmlrIC8gVE9MIDxCUj48U1RST05HPlRlY2huaWNhbCBsZWFkOiA8L1NUUk9ORz5EZWphbiAKLUdsb3ppYyAvIFRPTCA8QlI+PFNUUk9ORz5VQ0QgZGVzaWduZXI6IDwvU1RST05HPkp1bGlhbiBKb25lcyAvIFRPTCAKLTxCUj48U1RST05HPlVJIGRlc2lnbmVyOiA8L1NUUk9ORz5BbmRy6WUgUHJvdWx4IC8gVE9MIDxCUj48U1RST05HPklEIHdyaXRlcjogCi08L1NUUk9ORz4tPC9GT05UPiAKLTxIUiB3aWR0aD0iMTAwJSIgU0laRT0xPgotPEI+PEZPTlQgc2l6ZT0tMT5IaXN0b3J5OjwvRk9OVD48L0I+IAotPHA+PGZvbnQgc2l6ZT0iLTEiPkFwcmlsIDE5LCAyMDAyIDogVGVtcGxhdGUgU3VibWlzc2lvbjwvZm9udD48L3A+Ci08SFIgd2lkdGg9IjEwMCUiIFNJWkU9MT4KLTwhLS0tIFN0YXJ0IEhlcmUgLS0tPgotPFRBQkxFIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MyB3aWR0aD0iMTAwJSIgYm9yZGVyPTAgaGVpZ2h0PSIzMTQ3Ij4KLSAgCi0gIDxUUiBiZ0NvbG9yPSNiZmJmN2Y+Ci0gICAgPFREIGNvbFNwYW49Nz48Qj48Rk9OVCBzaXplPSsyPlZpZXc8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGY5Zj4KLSAgICA8VEQ+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEI+PEZPTlQgc2l6ZT0tMT5JdGVtPC9GT05UPjwvQj48L1REPgotICAgIDxURD48Qj48Rk9OVCBzaXplPS0xPkZpbGUgTmFtZSZuYnNwOyAoLmdpZik8L0ZPTlQ+PC9CPjwvVEQ+Ci0gICAgPFREPjxCPjxGT05UIHNpemU9LTE+RGVzY3JpcHRpb24vSG9vdmVyIEhlbHA8L0ZPTlQ+PC9CPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPENFTlRFUj48Qj48Rk9OVCBzaXplPS0xPk9sZDwvRk9OVD48L0I+IDwvQ0VOVEVSPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPENFTlRFUj48Qj48Rk9OVCBzaXplPS0xPk5ldyBGdWxsPC9GT05UPjwvQj4gPC9DRU5URVI+PC9URD4KLSAgICA8VEQ+PEI+PEZPTlQgc2l6ZT0tMT5TdGF0dXM8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPkNvbmZpZ3VyYXRpb25zPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT5jb25maWdzPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IHNob3dzIHRoZSBjb25maWd1cmF0aW9ucyBvZiB0aGUgRWNsaXBzZS1iYXNlZCBhcHBsaWNhdGlvbjwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3ZpZXcxNi9jb25maWdzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N2aWV3MTYvY29uZmlncy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldmlldzE2L2NvbmZpZ3MuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD5VcGRhdGVzPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT51cGRhdGVzPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+c2hvd3Mgc2l0ZXMgYW4gRWNsaXBzZSBhcHAgY2FuIGJlIHVwZGF0ZWQgZnJvbTwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3ZpZXcxNi91cGRhdGVzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N2aWV3MTYvdXBkYXRlcy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldmlldzE2L3VwZGF0ZXMuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+UHJldmlldzwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5wcmV2aWV3PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5zaG93cyBkZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBvYmplY3Q8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC92aWV3MTYvcHJldmlldy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L3ByZXZpZXcuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXZpZXcxNi9wcmV2aWV3LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD40PC9URD4KLSAgICA8VEQ+V2ViIEJyb3dzZXI8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YnJvd3NlcjwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YSBmdWxseS1mdW5jdGlvbmluZyBXZWIgYnJvd3NlciAoaG9zdHMgSUU1IC0gV2luZG93cyBvbmx5KTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3ZpZXcxNi9icm93c2VyLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N2aWV3MTYvYnJvd3Nlci5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldmlldzE2L2Jyb3dzZXIuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+NTwvVEQ+Ci0gICAgPFREPlVwZGF0ZSBQZXJzcGVjdGl2ZTwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj51cGRhdGVfcGVyczwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+UmVwcmVzZW50cyBJbnN0YWxsL1VwZGF0ZQotICAgICAgcGVyc3BlY3RpdmUgaW4gdGhlIFVJPC9mb250PjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L3VwZGF0ZV9wZXJzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V2aWV3MTYvdXBkYXRlX3BlcnMuZ2lmIiB3aWR0aD0xNiAKLWJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPgotICA8L1RSPgotICAKLSAgPFRSIGJnQ29sb3I9I2JmYmY3Zj4KLSAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+VG9vbGJhciBXaXphcmQ8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L2NvbmZpZ193aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi9jb25maWdfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi9jb25maWdfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLQkKLSAgPFRSIGJnQ29sb3I9I2RmZGY5Zj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPjwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L2luc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvaW5zdGFsbF93aXouZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L2luc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgCi0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjM8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3X2Jvb2ttYXJrX3dpei5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvbmV3X2Jvb2ttYXJrX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfZm9sZGVyX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi9uZXdfZm9sZGVyX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjU8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19zZWFyY2hfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjY8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi91bmluc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvdW5pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvdW5pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+NzwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L3VwZGF0ZV93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi91cGRhdGVfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi91cGRhdGVfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgCi0gIAotICA8VFIgYmdDb2xvcj0jYmZiZjdmPgotICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5Mb2NhbCBUb29sYmFyPC9GT05UPjwvQj48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjE8L1REPgotICAgIDxURD5HbyBCYWNrd2FyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7YmFja3dhcmRfbmF2PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgc3RhbmRhcmQgYnJvd3NlciAnYmFja3dhcmQnIGJ1dHRvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtHbyBCYWNrd2FyZCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiAKLSAgICAgIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiAKLSAgICAgIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L2JhY2t3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L2JhY2t3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD5HbyBGb3J3YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtmb3J3YXJkX25hdjwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHN0YW5kYXJkIGJyb3dzZXIgJ2ZvcndhcmQnIGJ1dHRvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtHbyBGb3J3YXJkJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MzwvVEQ+Ci0gICAgPFREPkdvPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtnb19uYXY8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+QSBzdGFuZGFyZCBicm93c2VyIGJ1dHRvbiBmb3IKLSAgICAgICAgICAgIG5hdmlnYXRpbmcgdG8gYSBVUkwuPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO0dvJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IAotICAgIGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD5HbyBIb21lPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtob21lX25hdjwvRk9OVD48L1REPgotICAgIDxURCA+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHN0YW5kYXJkIGJyb3dzZXIgYnV0dG9uCi0gICAgICAgICAgICBmb3IgZ29pbmcgdG8gdGhlIGhvbWUgbG9jYXRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO0dvIEhvbWUmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9ob21lX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZiIgCi0gICAgICB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD41PC9URD4KLSAgICA8VEQ+UmVmcmVzaDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7cmVmcmVzaF9uYXY8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+UmVmcmVzaCB0aGUgY29udGVudHMgb2YgdGhlIHZpZXc8L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7UmVmcmVzaCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L3JlZnJlc2hfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjY8L1REPgotICAgIDxURD5TdG9wPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnN0b3BfbmF2PC9mb250PjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgc3RhbmRhcmQgYnJvd3NlciBidXR0b24gZm9yIHN0b3BwaW5nCi0gICAgICAgICAgICB0aGUgbmF2aWdhdGlvbiBpbiBwcm9ncmVzczwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtTdG9wJm5ic3A7Jm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvc3RvcF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9zdG9wX25hdi5naWYiIAotICAgICAgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD43PC9URD4KLSAgICA8VEQ+U2hvdyBVbmNvbmZpZ3VyZWQgRmVhdHVyZXM8L1REPgotICAgIDxURD5zaG93X3VuY29uZjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgdG9nZ2xlIGJ1dHRvbiB0aGF0IGFsbG93cwotICAgICAgICAgICAgdW5jb25maWd1cmVkIGZlYXR1cmVzIHRvIHNob3cgaW4gdGhlIHZpZXc8L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7U2hvdyBVbmNvbmZpZ3VyZWQgRmVhdHVyZXMmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPC9URD4KLSAgICA8VEQgQkdDT0xPUj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L3Nob3dfdW5jb25mLmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L3Nob3dfdW5jb25mLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotCQotICA8VFIgYmdDb2xvcj0jYmZiZjdmPgotICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5Nb2RlbCBPYmplY3Q8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPiZuYnNwO0FwcGxpY2F0aW9uIENvbmZpZ3VyYXRpb248L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2FwcF9vYmo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdXNlZCB0byBsb2FkIHRoZSBjdXJyZW50Ci0gICAgICBhcHBsaWNhdGlvbjwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2FwcF9vYmouZ2lmIiB3aWR0aD0xNiAKLSAgICBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvb2JqMTYvYXBwX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPk15IENvbXB1dGVyPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtjb21wdXRlcl9vYmo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnRoZSBmaWxlIHN5c3RlbSByb290PC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvY29tcHV0ZXJfb2JqLmdpZiIgd2lkdGg9MTYgCi0gICAgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvY29tcHV0ZXJfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MzwvVEQ+Ci0gICAgPFREPiZuYnNwO0ZlYXR1cmU8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2ZlYXR1cmVfb2JqPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5mZWF0dXJlIG9iamVjdDwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2ZlYXR1cmVfb2JqLmdpZiIgd2lkdGg9MTYgCi1hbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9mZWF0dXJlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+NDwvVEQ+Ci0gICAgPFREPlVuY29uZmlndXJlZCBGZWF0dXJlPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDt1bmNvbmZfZmVhdHVyZV9vYmo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmZlYXR1cmUgdGhhdCBpcyBjdXJyZW50bHkgdW5jb25maWd1cmVkIChpLmUuIHN0aWxsCi0gICAgICBwcmVzZW50IGJ1dCBkaXNhYmxlZCBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uKTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3VuY29uZl9mZWF0dXJlX29iai5naWYiIHdpZHRoPTE2IAotICAgIGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3VuY29uZl9mZWF0dXJlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjU8L1REPgotICAgIDxURD5QbGFjZXMgdG8gVmlzaXQ8L1REPgotICAgIDxURD5wbGFjZXNfb2JqPC9URD4KLSAgICA8VEQ+YSBmb2xkZXIgdGhhdCBjb250YWlucyBib29rbWFya3MgdG8gcmVtb3RlIHNpdGVzIHRoYXQKLSAgICAgIGNvbnRhaW4gY29vbCBmZWF0dXJlczwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvcGxhY2VzX29iai5naWYiIHdpZHRoPTE2IAotYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3BsYWNlc19vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgICZuYnNwOzwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD42PC9URD4KLSAgICA8VEQ+U2l0ZTwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5zaXRlX29iaiZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+dXBkYXRlIHNpdGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50IGEgcHJvdmlkZXIKLSAgICAgIHNpdGUgKHNpdGUgdGhhdCBpcyBzZXQgdXAgdG8gYWN0IGFzIGEgc291cmNlIG9mIGZlYXR1cmVzKTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3NpdGVfb2JqLmdpZiIgd2lkdGg9MTYgCi1hbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9zaXRlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+NzwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5Mb2NhbCBTaXRlPC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5sc2l0ZV9vYmo8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+dXBkYXRlIHNpdGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHJlY2VpdmVyIHNpdGUgKHNpdGUKLSAgICAgIHRoYXQgaXMgc2V0IHVwIHRvIGFjdCBhcyBhIHRhcmdldCBvZiB0aGUgZmVhdHVyZSBpbnN0YWxsYXRpb24pPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgCi1zcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2xzaXRlX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9sc2l0ZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgICZuYnNwOzwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD44PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPkZlYXR1cmUgQ2F0ZWdvcnk8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmNhdGVnb3J5X29iajwvZm9udD48L1REPgotICAgIDxURD5zaXRlcyBjYW4gY2xhc3NpZnkgZmVhdHVyZXMgdGhleSBob3N0IGludG8gaGllcmFyY2hpY2FsCi0gICAgICBjYXRlZ29yaWVzPC9URD4KLSAgICA8VEQ+Ci0gICAgICA8UCBhbGlnbj1sZWZ0PjxJTUcgaGVpZ2h0PTE2IHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvY2F0ZWdvcnlfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9QPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvY2F0ZWdvcnlfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICAmbmJzcDs8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+OTwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5Cb29rbWFyayBGb2xkZXI8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmJmb2xkZXJfb2JqPC9mb250PjwvVEQ+Ci0gICAgPFREPmZvbGRlciBvYmplY3QgaW4gdGhlIHZpZXcgdGhhdCBwcm92aWRlcyBmb3IKLSAgICAgIG9yZ2FuaXppbmcgc2l0ZSBib29rbWFya3MgYW5kIHNlYXJjaCBvYmplY3RzPC9URD4KLSAgICA8VEQ+Ci0gICAgICA8UCBhbGlnbj1sZWZ0PjxJTUcgaGVpZ2h0PTE2IHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvYmZvbGRlcl9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1A+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmID48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvYmZvbGRlcl9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgICZuYnNwOzwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4xMDwvVEQ+Ci0gICAgPFREPlRleHQgU2VhcmNoPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnRzZWFyY2hfb2JqPC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5UZXh0IHNlYXJjaCBvYmplY3QmbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi90c2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3RzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD4xMTwvVEQ+Ci0gICAgPFREPlVwZGF0ZSBTZWFyY2g8L1REPgotICAgIDxURD51c2VhcmNoX29iajwvVEQ+Ci0gICAgPFREPkF2YWlsYWJsZSBVcGRhdGVzIHNlYXJjaCBvYmplY3Q8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3VzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdXNlYXJjaF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD4KLSAgICA8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MTI8L1REPgotICAgIDxURD5QbHVnLWluIFNlYXJjaDwvVEQ+Ci0gICAgPFREPnBzZWFyY2hfb2JqPC9URD4KLSAgICA8VEQ+UGx1Zy1pbiBzZWFyY2ggb2JqZWN0PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9wc2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3BzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+Ci0gICAgPC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjEzPC9URD4KLSAgICA8VEQ+Rml4ZWQgVm9sdW1lPC9URD4KLSAgICA8VEQ+dmZpeGVkX29iajwvVEQ+Ci0gICAgPFREPkxvY2FsIGZpbGUgc3lzdGVtIHZvbHVtZSB0aGF0IHJlcHJlc2VudHMgYSBmaXhlZCBkcml2ZSAoV2luZG93cykgb3IKLSAgICAgIGZvbGRlciAoTGludXgpPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi92Zml4ZWRfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD4KLSAgICA8L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3ZmaXhlZF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIAotICAgIDwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4xNDwvVEQ+Ci0gICAgPFREPlJlbW90ZSBWb2x1bWU8L1REPgotICAgIDxURD52cmVtb3RlX29iajwvVEQ+Ci0gICAgPFREPlJlbW90ZSBmaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCByZXByZXNlbnRzIGEgc2hhcmVkIGRyaXZlIChXaW5kb3cpIG9yCi0gICAgICBtb3VudGVkIHZvbHVtZSAoTGludXgpPC9URD4KLSAgICA8VEQgaGVpZ2h0ID0xNiAKLSAgICAgIGFsdD0iIiA8SU1HIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdnJlbW90ZV9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0iMSIgCi0gICA+Ci0gICAgPC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi92cmVtb3RlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgJm5ic3A7Ci0gICAgPC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjE1PC9URD4KLSAgICA8VEQ+UmVtb3ZhYmxlIFZvbHVtZTwvVEQ+Ci0gICAgPFREPnZyZW1vdmFibGVfb2JqPC9URD4KLSAgICA8VEQ+UmVtb3ZhYmxlIGZpbGUgc3lzdGVtIHZvbHVtZSB0aGF0IGlzIG5laXRoZXIgQ0QtUk9NIG5vciBGbG9wcHkgRGlzay4KLSAgICAgIFRoaXMgaW1hZ2UgaXMgdXNlZCBmb3IgYWxsIG90aGVyIHJlbW92YWJsZSB2b2x1bWVzIGxpa2UgRFZELVJPTSwgdmFyaW91cwotICAgICAgUENNQ0lBIGNhcmRzIGV0Yy48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3ZyZW1vdmFibGVfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD4KLSAgICA8L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3ZyZW1vdmFibGVfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICAmbmJzcDsKLSAgICA8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MTY8L1REPgotICAgIDxURD5DRC1ST008L1REPgotICAgIDxURD5jZF9vYmo8L1REPgotICAgIDxURD5GaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCByZXByZXNlbnQgYSBDRC1ST00gZHJpdmU8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2NkX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2NkX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPgotICAgIDwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD4xNzwvVEQ+Ci0gICAgPFREPkZsb3BweSBEaXNrPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmZsb3BweV9vYmo8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPkZpbGUgc3lzdGVtIHZvbHVtZSB0aGF0IHJlcHJlc2VudHMgYSAzIDEvMiBpbmNoIGZsb3BweQotICAgICAgZGlzayBkcml2ZTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2Zsb3BweV9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9mbG9wcHlfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4xODwvVEQ+Ci0gICAgPFREPlNhdmVkIENvbmZpZ3VyYXRpb25zPC9URD4KLSAgICA8VEQ+c2F2ZWRfb2JqPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iMiI+Rm9sZGVyIHRoYXQgaG9sZHMgcGFzdCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiBwcmVzZXJ2ZWQgYW5kL29yCi0gICAgICByZW5hbWVkPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvc2F2ZWRfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmYgPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9zYXZlZF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+MTk8L1REPgotICAgIDxURD5Db25maWd1cmF0aW9uIEhpc3Rvcnk8L1REPgotICAgIDxURD5oaXN0b3J5X29iajwvVEQ+Ci0gICAgPFREPkZvbGRlciB0aGF0IGhvbGRzIHBhc3QgY29uZmlndXJhdGlvbnM8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2hpc3Rvcnlfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmYgPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9oaXN0b3J5X29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4yMDwvVEQ+Ci0gICAgPFREPkF2YWlsYWJsZSBVcGRhdGVzPC9URD4KLSAgICA8VEQ+dXBkYXRlc19vYmo8L1REPgotICAgIDxURD5VcGRhdGUgU2VhcmNoIG9iamVjdCB0aGF0IGlzIHByZS1jb25maWd1cmVkIHRvIGxvb2sgZm9yCi0gICAgICBhdmFpbGFibGUgdXBkYXRlcyBvZiBhbGwgdGhlIGluc3RhbGxlZCBmZWF0dXJlcy4gSXQgY2Fubm90IGJlIHJlbW92ZWQgZnJvbQotICAgICAgdGhlIHZpZXcuPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi91cGRhdGVzX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmID48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdXBkYXRlc19vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+MjE8L1REPgotICAgIDxURD5Db25maWd1cmF0aW9uPC9URD4KLSAgICA8VEQ+Y29uZmlnX29iajwvVEQ+Ci0gICAgPFREPkEgY29uZmlndXJhdGlvbiBoaXN0b3J5IGVudHJ5IHRoYXQgcmVwcmVzZW50cyBvbmUKLSAgICAgIGNvbmZpZ3VyYXRpb248L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2NvbmZpZ19vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZiA+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2NvbmZpZ19vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0JCi0JCi0JCi0gIDxUUiBiZ0NvbG9yPSNjY2NjY2M+Ci0gICAgPFREIGNvbFNwYW49Nz48Qj48Rk9OVCBzaXplPSsyPk9iamVjdCBPdmVybGF5IDwvRk9OVD48L0I+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4xPC9URD4KLSAgICA8VEQ+Jm5ic3A7Y3VycmVudDwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5jdXJyZW50X2NvJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7aW5kaWNhdGVzIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY3VycmVudCBpLmUuIGluCi0gICAgICBlZmZlY3Q8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL292cjE2L2N1cnJlbnRfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL292cjE2L2N1cnJlbnRfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPiZuYnNwO2Vycm9yPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT5lcnJvcl9jbyZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPndpbGwgYmUgb3ZlcmxheWVkIG92ZXIgUERFIGVkaXRvciBvYmplY3RzIHRoYXQgYXJlIAotICAgICAgc29tZWhvdyBhc3NvY2lhdGVkIHdpdGggWE1MIHN5bnRheCBvciB2YWxpZGF0aW9uIGVycm9ycyZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb3ZyMTYvZXJyb3JfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL292cjE2L2Vycm9yX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+Jm5ic3A7aW5zdGFsbGFibGU8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+aW5zdGFsbGFibGVfY28mbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmluZGljYXRlcyB0aGF0IHNpdGUgY2FuIGFjY2VwdCBmZWF0dXJlcyBkdXJpbmcKLSAgICAgIGluc3RhbGxhdGlvbjwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb3ZyMTYvaW5zdGFsbGFibGVfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD4mbmJzcDtsaW5rZWQ8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+bGlua2VkX2NvJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5pbmRpY2F0ZXMgdGhhdCB0aGUgc2l0ZSBpcyBvbmx5IGxpbmtlZCB0byB0aGUKLSAgICAgIGNvbmZpZ3VyYXRpb248L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTAgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vdnIxNi9saW5rZWRfY28uZ2lmIiB3aWR0aD0xMSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vdnIxNi9saW5rZWRfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gICAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+NTwvVEQ+Ci0gICAgPFREPnVuY29uZmlndXJlZDwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj51bmNvbmZpZ3VyZWRfY28mbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPiAgICAgIAotICAgICAgPC9mb250PjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxQPjwvUD48SU1HIGhlaWdodD04IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvb3ZyMTYvdW5jb25maWd1cmVkX2NvLmdpZiIgCi0gICAgICB3aWR0aD03IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0JCi0gIAotICAKLSAgPHRyIGJnQ29sb3I9I2NjY2NjYz4KLSAgICA8VEQgY29sU3Bhbj03PjxiPjxmb250IHNpemU9IisyIj5Gb3JtcyBBcnR3b3JrPC9mb250PjwvYj48L1REPgotICA8L3RyPgotICA8dHI+Ci0gICAgPFREPjE8L1REPgotICAgIDxURD4mbmJzcDtUb3BpYzwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj50b3BpYyZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2FuIGltYWdlIHRvIGJlIHVzZWQgYXMgYSBjdXN0b20gYnVsbGV0IGZvciBpdGVtcyBpbgotICAgICAgYSAnV2VsY29tZScgcGFnZTwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2Zvcm1zL3RvcGljLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPiA8L1REPgotICA8L3RyPgotICA8dHIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD5EZWZhdWx0IFByb3ZpZGVyPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmRlZl9wcm92aWRlciZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YW4gaW1hZ2UgdG8gYmUgdXNlZCBpbiBhIGZlYXR1cmUgZGVzY3JpcHRpb24gcGFnZSBpbiAKLSAgICAgIGNhc2VzIHdoZXJlIG9uZSB3YXMgbm90IHN1cHBsaWVkIGJ5IGZlYXR1cmUgcHJvdmlkZXIgKHNob3VsZCBiZSBKUEVHKTxJTUcgCi0gICAgICBoZWlnaHQ9NDggYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZm9ybXMvZGVmX3Byb3ZpZGVyLmdpZiIgd2lkdGg9MTA5IAotICAgICAgYm9yZGVyPTA+ICAgICAgICAgIAotICAgICAgICAgICAgICAgICA8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE1MCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZm9ybXMvZGVmX3Byb3ZpZGVyLmdpZiIgd2lkdGg9MTkwIGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPgotICA8L3RyPgotICA8dHI+Ci0gICAgPFREPjM8L1REPgotICAgIDxURD4mbmJzcDtGb3JtIEJhbm5lcjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5mb3JtX2Jhbm5lciZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YSBiYW5uZXIgaW1hZ2UgdXNlZCBpbiBhbGwgZm9ybSBwYWdlcyBiZWhpbmQgdGhlIGhlYWRpbmcKLSAgICAgIChzaG93biBoZXJlIGluIDE6MTAgem9vbSBvdXQpPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTMgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5naWYiIHdpZHRoPTYwIGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4mbmJzcDsKLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD4gPC9URD4KLSAgPC90cj4KLSAgPHRyIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD40PC9URD4KLSAgICA8VEQ+Jm5ic3A7Rm9ybSBCYW5uZXIgVW5kZXJsaW5lPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmZvcm1fdW5kZXJsaW5lJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5hIHNlY29uZCBwb3J0aW9uIG9mIHRoZSBiYW5uZXIgdXNlZCB1bmRlciB0aGUgaGVhZGluZwotICAgICAgdGV4dCAoc2hvd24gaGVyZSBpbiAxOjEwIHpvb20gb3V0KTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xIGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUuZ2lmIiB3aWR0aD02MCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Jm5ic3A7Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gIDwvdHI+Ci0gIAotICAKLSAgCi0gIAotICA8VFIgYmdDb2xvcj0jY2NjY2NjPgotICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5XaXphcmQgR3JhcGhpYzwvRk9OVD48L0I+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4xPC9URD4KLSAgICA8VEQ+TmV3IEJvb2ttYXJrIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7bmV3X2Jvb2ttYXJrX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Y3JlYXRlcyBhIG5ldyB1cGRhdGUgc2l0ZSBib29rbWFyazwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9uZXdfYm9va21hcmtfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9uZXdfYm9va21hcmtfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4yPC9URD4KLSAgICA8VEQ+TmV3IEZvbGRlciB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO25ld19mb2xkZXJfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5jcmVhdGVzIGEgbmV3IGJvb2ttYXJrIGZvbGRlcjwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9uZXdfZm9sZGVyX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vbmV3X2ZvbGRlcl93aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+TmV3IFNlYXJjaCB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO25ld19zZWFyY2hfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Y3JlYXRlcyBhIG5ldyBzZWFyY2ggb2JqZWN0PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL25ld19zZWFyY2hfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9uZXdfc2VhcmNoX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+NDwvVEQ+Ci0gICAgPFREPkluc3RhbGwgRmVhdHVyZSB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2luc3RhbGxfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5pbnN0YWxscyBhIG5ldyBmZWF0dXJlIGludG8gdGhlIHBsYXRmb3JtPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL2luc3RhbGxfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9pbnN0YWxsX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREID41PC9URD4KLSAgICA8VEQ+VXBkYXRlIEZlYXR1cmUgd2l6YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDt1cGRhdGVfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5pbnN0YWxscyBhIG5ld2VyIHZlcnNpb24gb2YgYW4gYWxyZWFkeSBpbnN0YWxsZWQgZmVhdHVyZTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi91cGRhdGVfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi91cGRhdGVfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURCA+NjwvVEQ+Ci0gICAgPFREPkNvbmZpZ3VyZSBGZWF0dXJlIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7Y29uZmlnX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Y29uZmlndXJlcyBvciB1bmNvbmZpZ3VyZXMgYW4gaW5zdGFsbGVkIGZlYXR1cmU8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vY29uZmlnX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vY29uZmlnX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+NzwvVEQ+Ci0gICAgPFREPlVuaW5zdGFsbCBGZWF0dXJlIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7dW5pbnN0YWxsX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+cGVybWFuZW50bHkgcmVtb3ZlcyBhIGZlYXR1cmUgZnJvbSB0aGUgcGxhdGZvcm08L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vdW5pbnN0YWxsX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vdW5pbnN0YWxsX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+ODwvVEQ+Ci0gICAgPFREPkRlZmF1bHQgSW5zdGFsbCBXaXphcmQgYmFubmVyPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtkZWZfd2l6YmFuPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5hIGRlZmF1bHQgaW1hZ2Ugc2hvd24gaW4gaW5zdGFsbCB3aXphcmQgcGFnZXMgd2hlbiAKLSAgICAgIG9uZSBpcyBub3Qgc3VwcGxpZWQgYnkgZmVhdHVyZSBwcm92aWRlcnM8SU1HIGhlaWdodD0yNTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vZGVmX3dpemJhbi5qcGciIHdpZHRoPTExOCAKLWJvcmRlcj0wPiAgICAgICAgIAotICAgICAgICAgICA8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTI1OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL2RlZl93aXpiYW4uanBnIiB3aWR0aD0xMTggYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj48L1RBQkxFPgotPFA+PC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBDUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmUwMDBiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwNCi0gICAgICAgICAgICAgICBpY29ucy8sXA0KLSAgICAgICAgICAgICAgICouamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sDQotamFycy5jb21waWxlLm9yZGVyID0gdXBkYXRldWkuamFyDQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgc2NoZW1hLw0KLXNvdXJjZS51cGRhdGV1aS5qYXIgPSBzcmMvDQotI2phcnMuZXh0cmEuY2xhc3NwYXRoID0gLi4vb3JnLmVjbGlwc2UudG9tY2F0L3NlcnZsZXQuamFyDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGMwZGU1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVlYjZkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9zaG93X3VuY29uZi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9zaG93X3VuY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4Y2Y5NmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L2NvbmZpZ193aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L2NvbmZpZ193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThhY2VjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9jb25maWdfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvaW5zdGFsbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlmZjI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvdW5pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvdW5pbnN0YWxsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NWZjZDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VwZGF0ZV93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VwZGF0ZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTlkNDQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi91cGRhdGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NDg2MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvc2hvd191bmNvbmYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTViNzA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L3Nob3dfdW5jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi9jb25maWdfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi9jb25maWdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhYzcyMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L2luc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0YzYzZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzMzMTI4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi91bmluc3RhbGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi91cGRhdGVfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi91cGRhdGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NGViZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvdXBkYXRlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V2aWV3MTYvY29uZmlncy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V2aWV3MTYvY29uZmlncy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODRmYmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L2NvbmZpZ3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L3ByZXZpZXcuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L3ByZXZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmJmOWNmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXZpZXcxNi9wcmV2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZGVmX3Byb3ZpZGVyLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZGVmX3Byb3ZpZGVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiMDNmZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2RlZl9wcm92aWRlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZm9ybV9iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJjMGIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZm9ybV9iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzZTJkMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX3VuZGVybGluZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjNkMGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX3VuZGVybGluZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL3RvcGljLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvdG9waWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRkNGVjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvdG9waWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9hcHBfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYXBwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1M2NhZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9hcHBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYmZvbGRlcl9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9iZm9sZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjczZTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9iZm9sZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2NhdGVnb3J5X29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2NhdGVnb3J5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ODdkMDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jYXRlZ29yeV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jb25maWdfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvY29uZmlnX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODRmYmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jb25maWdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZWZpeDJfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZWZpeDJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzODk1Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXgyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXhfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZWZpeF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ZjNDk5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZWZpeF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lcnJvcl9zdF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lcnJvcl9zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM2MDY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZXJyb3Jfc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZXNpdGVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZXNpdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmZDA3Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VzaXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2ZlYXR1cmVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZmVhdHVyZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA2NjgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZmVhdHVyZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9oaXN0b3J5X29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2hpc3Rvcnlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ZDQzYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2hpc3Rvcnlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvbHNpdGVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvbHNpdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1MGJkYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2xzaXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L25vdGluc3RhbGxlZF9mZWF0dXJlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L25vdGluc3RhbGxlZF9mZWF0dXJlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTJiODQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9ub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9va19zdF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9va19zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvb2tfc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvcHNpdGVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvcHNpdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4OTdmMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3BzaXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3NpdGVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvc2l0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODU2OGY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvc2l0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njg4MWZkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdW5jb25mX2ZlYXR1cmVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdXBkYXRlc19vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91cGRhdGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjRmN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91cGRhdGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3VzZWFyY2hfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdXNlYXJjaF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDgwNTk5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdXNlYXJjaF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi93ZWJfYmttcmtfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvd2ViX2JrbXJrX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmM1MjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi93ZWJfYmttcmtfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvYWRkX3N0YXQuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9hZGRfc3RhdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjNhMmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9hZGRfc3RhdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2N1cnJlbnRfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9jdXJyZW50X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwNzdmOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2N1cnJlbnRfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9kZWxfc3RhdC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2RlbF9zdGF0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMjA3Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2RlbF9zdGF0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvZXJyb3JfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9lcnJvcl9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9lcnJvcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvaW5zdGFsbGFibGVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk5OWI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvaW5zdGFsbGFibGVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9saW5rZWRfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9saW5rZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjQwZTFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvbGlua2VkX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvbW9kX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvbW9kX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxYjhkNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L21vZF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3VuY29uZmlndXJlZF9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3VuY29uZmlndXJlZF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTg5Y2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91bmNvbmZpZ3VyZWRfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91cGRhdGVkX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvdXBkYXRlZF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjg2YWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91cGRhdGVkX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvd2FybmluZ19jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3dhcm5pbmdfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJkYWM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvd2FybmluZ19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9jb25maWdfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL2NvbmZpZ193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTE5ZmJmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL2NvbmZpZ193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vZGVmX3dpemJhbi5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9kZWZfd2l6YmFuLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZWJhNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9kZWZfd2l6YmFuLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL2luc3RhbGxfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL2luc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlZTdjMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9pbnN0YWxsX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91bmluc3RhbGxfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjIzMzc4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vdXBkYXRlX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91cGRhdGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzNjQ4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91cGRhdGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvcGx1Z2luLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTFhZmJiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSMgDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMNCi0jIFVwZGF0ZSBVSSBwbHVnaW4ueG1sIHJlc291cmNlcw0KLSMNCi1wbHVnaW5OYW1lID0gSW5zdGFsbC9VcGRhdGUgVUkNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLWZyYWdtZW50TmFtZVdpbiA9IEluc3RhbGwvVXBkYXRlIFVJIGZvciBXaW5kb3dzDQotDQotdXBkYXRlTWVudS5sYWJlbCA9ICZTb2Z0d2FyZSBVcGRhdGVzDQotYWN0aW9uU2V0cy5zb2Z0d2FyZVVwZGF0ZXMubGFiZWwgPSBTb2Z0d2FyZSBVcGRhdGVzDQotYWN0aW9uU2V0cy51cGRhdGVzLmxhYmVsID0gJkZpbmQgYW5kIEluc3RhbGwuLi4NCi1hY3Rpb25TZXRzLmNvbmZpZ01hbmFnZXIubGFiZWwgPSAmTWFuYWdlIENvbmZpZ3VyYXRpb24uLi4NCi1hY3Rpb25TZXRzLndlYlNpdGVzLmxhYmVsID0gJlVwZGF0ZSBTaXRlcyAoZXhwZXJpbWVudGFsKQ0KLQ0KLXNlYXJjaENhdGVnb3J5Lm5hbWUgPSBTZWFyY2ggQ2F0ZWdvcnkNCi1zZWFyY2hDYXRlZ29yaWVzLnVwZGF0ZXMgPSBBdmFpbGFibGUgVXBkYXRlcw0KLXNlYXJjaENhdGVnb3JpZXMudXBkYXRlcy5kZXNjID0gPGZvcm0+PHA+U2VhcmNoIGZvciB1cGRhdGVzIHRvIFwNCi1mZWF0dXJlcyBjdXJyZW50bHkgaW5zdGFsbGVkIGluIHRoaXMgYXBwbGljYXRpb24uIFVwZGF0ZXMgYXJlIFwNCi1mZWF0dXJlcyB0aGF0IGhhdmUgdGhlIHNhbWUgaWRlbnRpZmllciBhcyB0aGUgaW5zdGFsbGVkIGZlYXR1cmVzLCBcDQotYnV0IG5ld2VyIHZlcnNpb25zLjwvcD5cDQotPHA+VXNlIHNjb3BlIHNldHRpbmdzIHRvIGNvbnRyb2wgdGhlIFwNCi1leHRlbnQgb2YgdGhlIHNlYXJjaCBhbmQgdGhlIHVwZGF0ZSBzaXRlcyB0aGF0IHdpbGwgYmUgdmlzaXRlZC48L3A+XA0KLTxwPk5vdGUgdGhhdCB0aGUgc2V0dGluZ3MgaW4gPGI+UHJlZmVyZW5jZXM8L2I+IGFmZmVjdCB3aGV0aGVyIHRoZSBuZXcgZmVhdHVyZSBcDQotdmVyc2lvbnMgd2lsbCBiZSBjb25zaWRlcmVkIHZhbGlkIGFzIHVwZGF0ZXMuPC9wPjwvZm9ybT4NCi0NCi1zZWFyY2hDYXRlZ29yaWVzLmV4cHJlc3Npb24gPSBSZWd1bGFyIEV4cHJlc3Npb25zDQotc2VhcmNoQ2F0ZWdvcmllcy5leHByZXNzaW9uLmRlc2MgPSA8Zm9ybT48cD5TZWFyY2ggZm9yIGZlYXR1cmVzIHRoYXQgXA0KLWNvbnRhaW4gZGVzaXJlZCB0ZXh0IG9yIHJlcXVsYXIgZXhwcmVzc2lvbi4gVXNlIHRoZSBxdWVyeSBzZXR0aW5ncyBcDQotdG8gY29uZmlndXJlIHNlYXJjaCBvcHRpb25zLjwvcD48L2Zvcm0+DQotDQotc2VhcmNoQ2F0ZWdvcmllcy5wbHVnaW4gPSBQbHVnLWlucyBpbiBGZWF0dXJlcw0KLXNlYXJjaENhdGVnb3JpZXMucGx1Z2luLmRlc2MgPSA8Zm9ybT48cD5Mb29rIGZvciBwbHVnLWlucyB0aGF0IFwNCi1hcmUgcGFja2FnZWQgaW4gdGhlIGZlYXR1cmVzLiBUaGlzIHNlYXJjaCBjYXRlZ29yeSBpcyB1c2VmdWwgXA0KLXdoZW4gcmVxdWlyZWQgcGx1Zy1pbnMgb2YgdGhlIGZlYXR1cmUgeW91IHdhbnRlZCB0byBpbnN0YWxsIFwNCi13ZXJlIG5vdCBmb3VuZCBpbiB0aGlzIGFwcGxpY2F0aW9uLjwvcD48L2Zvcm0+DQotDQotbWFpblByZWZlcmVuY2UubmFtZSA9IEluc3RhbGwvVXBkYXRlDQotDQotcHJvcGVydGllcy5nZW5lcmFsLWluZm8ubGFiZWwgPSBHZW5lcmFsIEluZm9ybWF0aW9uDQotcHJvcGVydGllcy5saWNlbnNlLmxhYmVsID0gTGljZW5zZSBBZ3JlZW1lbnQNCi1wcm9wZXJ0aWVzLmNvcHlyaWdodC5sYWJlbCA9IENvcHlyaWdodA0KLXByb3BlcnRpZXMuc3RhdHVzLmxhYmVsID0gU3RhdHVzDQotcHJvcGVydGllcy5jdXJyZW50Q29uZmlnLmFjdGl2aXRpZXMgPSBBY3Rpdml0aWVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTFiMTE2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KLTxwbHVnaW4NCi0gICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIg0KLSAgIG5hbWU9IiVwbHVnaW5OYW1lIg0KLSAgIHZlcnNpb249IjMuMC4wIg0KLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiDQotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSSI+DQotDQotICAgPHJ1bnRpbWU+DQotICAgICAgPGxpYnJhcnkgbmFtZT0idXBkYXRldWkuamFyIj4NCi0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4NCi0gICAgICAgICA8cGFja2FnZXMgcHJlZml4ZXM9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aSIvPg0KLSAgICAgIDwvbGlicmFyeT4NCi0gICA8L3J1bnRpbWU+DQotICAgPHJlcXVpcmVzPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscC5iYXNlIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiLz4NCi0gICA8L3JlcXVpcmVzPg0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+DQotICAgICAgPHBhZ2UNCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLklGZWF0dXJlQWRhcHRlciINCi0gICAgICAgICAgICBuYW1lPSIlcHJvcGVydGllcy5nZW5lcmFsLWluZm8ubGFiZWwiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzLkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuZmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UiPg0KLSAgICAgIDwvcGFnZT4NCi0gICAgICA8cGFnZQ0KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSUZlYXR1cmVBZGFwdGVyIg0KLSAgICAgICAgICAgIG5hbWU9IiVwcm9wZXJ0aWVzLmxpY2Vuc2UubGFiZWwiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzLkZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuZmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2UiPg0KLSAgICAgIDwvcGFnZT4NCi0gICAgICA8cGFnZQ0KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSUZlYXR1cmVBZGFwdGVyIg0KLSAgICAgICAgICAgIG5hbWU9IiVwcm9wZXJ0aWVzLmNvcHlyaWdodC5sYWJlbCINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXMuRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2UiPg0KLSAgICAgIDwvcGFnZT4NCi0gICAgICA8cGFnZQ0KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIg0KLSAgICAgICAgICAgIG5hbWU9IiVwcm9wZXJ0aWVzLnN0YXR1cy5sYWJlbCINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXMuRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UiPg0KLSAgICAgIDwvcGFnZT4NCi0gICAgICA8cGFnZQ0KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciINCi0gICAgICAgICAgICBuYW1lPSIlcHJvcGVydGllcy5nZW5lcmFsLWluZm8ubGFiZWwiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzLkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuY29uZmlnU2l0ZSI+DQotICAgICAgPC9wYWdlPg0KLSAgICAgIDxwYWdlDQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlNpdGVMb2NhbCINCi0gICAgICAgICAgICBuYW1lPSIlcHJvcGVydGllcy5nZW5lcmFsLWluZm8ubGFiZWwiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzLkluc3RhbGxDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuaW5zdGFsbENvbmZpZyI+DQotICAgICAgPC9wYWdlPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4NCi0gICAgICA8cGFnZQ0KLSAgICAgICAgICAgIG5hbWU9IiVtYWluUHJlZmVyZW5jZS5uYW1lIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuTWFpblByZWZlcmVuY2VQYWdlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuTWFpblByZWZlcmVuY2VQYWdlIj4NCi0gICAgICA8L3BhZ2U+DQotICAgPC9leHRlbnNpb24+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0FkZEJvb2ttYXJrc0FjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0FkZEJvb2ttYXJrc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGU5NmNhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9BZGRCb29rbWFya3NBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci0KLS8qKgotICogQWRkcyBib29rbWFya3MgdG8gdXBkYXRlIHNpdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRCb29rbWFya3NBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHVibGljIEFkZEJvb2ttYXJrc0FjdGlvbigpIHsKLQkJc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkFkZEJvb2ttYXJrc0FjdGlvbi5hZGQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCU5ld1dlYlNpdGVEaWFsb2cgZGlhbG9nID0gbmV3IE5ld1dlYlNpdGVEaWFsb2coVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkFkZEJvb2ttYXJrc0FjdGlvbi5uZXciKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gTmV3V2ViU2l0ZURpYWxvZy5PSykgewotCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkuc2F2ZUJvb2ttYXJrcygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0NvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhYzA4Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy4qOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gTWFuYWdlciB3aW5kb3cuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdwotCWV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLQl7Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uVmlldyB2aWV3OwotCXByaXZhdGUgR2xvYmFsQWN0aW9uIHByb3BlcnRpZXNBY3Rpb247Ci0JcHJpdmF0ZSBJQWN0aW9uIHByb3BlcnRpZXNBY3Rpb25IYW5kbGVyOwotCQotCWNsYXNzIEdsb2JhbEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBJQWN0aW9uIGhhbmRsZXI7Ci0KLQkJcHVibGljIEdsb2JhbEFjdGlvbigpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFjdGlvbkhhbmRsZXIoSUFjdGlvbiBhY3Rpb24pIHsKLQkJCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCQloYW5kbGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJaGFuZGxlciA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCQl0aGlzLmhhbmRsZXIgPSBhY3Rpb247Ci0JCQkJYWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJc2V0RW5hYmxlZChoYW5kbGVyLmlzRW5hYmxlZCgpKTsKLQkJCQlzZXRDaGVja2VkKGhhbmRsZXIuaXNDaGVja2VkKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEFjdGlvbi5FTkFCTEVEKSkgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCXNldEVuYWJsZWQoYm9vbC5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEFjdGlvbi5DSEVDS0VEKSkgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCXNldENoZWNrZWQoYm9vbC5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoaGFuZGxlciAhPSBudWxsKQotCQkJCWhhbmRsZXIucnVuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCS8vIFNldHVwIHdpbmRvdy4KLQkJYWRkTWVudUJhcigpOwotCQlhZGRBY3Rpb25zKCk7Ci0JCWFkZFRvb2xCYXIoU1dULkZMQVQpOwotLy8JCWFkZFN0YXR1c0xpbmUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQWN0aW9ucygpIHsKLQkJSU1lbnVNYW5hZ2VyIG1lbnVCYXIgPSBnZXRNZW51QmFyTWFuYWdlcigpOwotCQlJTWVudU1hbmFnZXIgZmlsZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdy5maWxlTWVudSIpKTsgLy8kTk9OLU5MUy0xJAotCQltZW51QmFyLmFkZChmaWxlTWVudSk7Ci0KLQkJcHJvcGVydGllc0FjdGlvbiA9IG5ldyBHbG9iYWxBY3Rpb24oKTsKLQkJcHJvcGVydGllc0FjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cucHJvcGVydGllcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wZXJ0aWVzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZpbGVNZW51LmFkZChwcm9wZXJ0aWVzQWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJQWN0aW9uIGNsb3NlQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQljbG9zZSgpOwotCQkJfQotCQl9OwotCQljbG9zZUFjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cuY2xvc2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZmlsZU1lbnUuYWRkKGNsb3NlQWN0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhvb2tHbG9iYWxBY3Rpb25zKCkgewotCQlpZihwcm9wZXJ0aWVzQWN0aW9uSGFuZGxlciE9bnVsbCkKLQkJCXByb3BlcnRpZXNBY3Rpb24uc2V0QWN0aW9uSGFuZGxlcihwcm9wZXJ0aWVzQWN0aW9uSGFuZGxlcik7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlldyA9IG5ldyBDb25maWd1cmF0aW9uVmlldyh0aGlzKTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZ2Q7Ci0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAxOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdmlldy5jcmVhdGVQYXJ0Q29udHJvbChjb250YWluZXIpOwotCQlDb250cm9sIHZpZXdDb250cm9sID0gdmlldy5nZXRDb250cm9sKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXZpZXdDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCQlob29rR2xvYmFsQWN0aW9ucygpOwotCi0JCXVwZGF0ZUFjdGlvbkJhcnMoKTsKLQotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCXZpZXcuZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsb2NhbFNpdGUpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQlnZXRTaGVsbCgpLnNldEltYWdlKHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX0NPTkZJR1NfVklFVywgMCkpOwotCQkKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQWN0aW9uQmFycygpIHsKLQkJZ2V0TWVudUJhck1hbmFnZXIoKS51cGRhdGVBbGwoZmFsc2UpOwotCQlnZXRUb29sQmFyTWFuYWdlcigpLnVwZGF0ZShmYWxzZSk7Ci0vLwkJZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS51cGRhdGUoZmFsc2UpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKHZpZXcgIT0gbnVsbCkKLQkJCXZpZXcuZGlzcG9zZSgpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjcmVhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCS8vIHNldCB0aGUgdGl0bGUKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvbk1hbmFnZXJBY3Rpb24udGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0U2hlbGwoKS5zZXRTaXplKDgwMCwgNjAwKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCS8vIHVwZGF0ZSBhY3Rpb24gYmFycwotCQl1cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXNBY3Rpb25IYW5kbGVyKElBY3Rpb24gaGFuZGxlcil7Ci0JCXByb3BlcnRpZXNBY3Rpb25IYW5kbGVyPWhhbmRsZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1Jlc3RhcnREaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9SZXN0YXJ0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzUzYTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1Jlc3RhcnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIEEgZGlhbG9nIHdoaWNoIHByb21wdHMgdGhlIHVzZXIgdG8gcmVzdGFydCBhZnRlciBhbiB1cGRhdGUgb3BlcmF0aW9uCi0gKiBhbmQgcHJvdmlkZXMgWWVzLCBObywgQ29udGludWUgYnV0dG9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN0YXJ0RGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRJTlVFID0gMjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSB5ZXNObyA9IG5ldyBTdHJpbmdbXSB7SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIHllc05vQXBwbHkgPSBuZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkFwcGx5Q2hhbmdlcyIpfTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgaW50IGJ1dHRvbklkID0gMDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRpYWxvZwotCSAqIEBzZWUgTWVzc2FnZURpYWxvZyNNZXNzYWdlRGlhbG9nKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLlN0cmluZ1tdLCBpbnQpCi0JICovCi0JcHVibGljIFJlc3RhcnREaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBib29sZWFuIHJlc3RhcnROZWVkZWQpIHsKLQkJc3VwZXIocGFyZW50LAotCQkJCXRpdGxlLAotCQkJCW51bGwsCS8vIGFjY2VwdCB0aGUgZGVmYXVsdCB3aW5kb3cgaWNvbgotCQkJCW1lc3NhZ2UsCi0JCQkJUVVFU1RJT04sCi0JCQkJcmVzdGFydE5lZWRlZCA/IHllc05vIDogeWVzTm9BcHBseSwgCi0JCQkJMCk7CQkvLyB5ZXMgaXMgdGhlIGRlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiB0aGUgWWVzL05vL0NvbnRpbnVlIHF1ZXN0aW9uIGRpYWxvZy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHJlc3RhcnRJc1JlYWxseU5lZWRlZCB3aGVuIGZhbHNlLCB0aGUgY2hhbmdlcyBhcmUgYXBwbGllZCB0byB0aGUgY3VycmVudCBjb25maWcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHByZXNzZXMgIFlFUwotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlblF1ZXN0aW9uKFNoZWxsIHBhcmVudCwgYm9vbGVhbiByZXN0YXJ0SXNSZWFsbHlOZWVkZWQpIHsKLQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXN0YXJ0VGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWVzc2FnZSA9IHJlc3RhcnRJc1JlYWxseU5lZWRlZCA/IFVwZGF0ZVVJLmdldFN0cmluZygiUmVzdGFydE1lc3NhZ2UiKTogVXBkYXRlVUkuZ2V0U3RyaW5nKCJPcHRpb25hbFJlc3RhcnRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlSZXN0YXJ0RGlhbG9nIGRpYWxvZyA9IG5ldyBSZXN0YXJ0RGlhbG9nKHBhcmVudCwgdGl0bGUsCW1lc3NhZ2UsIHJlc3RhcnRJc1JlYWxseU5lZWRlZCk7Ci0JCWludCBidXR0b249IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChidXR0b24gPT0gMikKLQkJCUluc3RhbGxDb25maWd1cmF0aW9uLmFwcGx5Q2hhbmdlcygpOwotCQlyZXR1cm4gYnV0dG9uID09IDA7IC8vIFllcwotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGEgYnV0dG9uIGlzIHByZXNzZWQsIHN0b3JlIHRoZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpIHsKLQkJaWYgKGlkID09IDIpIHsgCi0JCQlidXR0b25JZD0gQ09OVElOVUU7Ci0JCX0gCi0JCQotCQlzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlcidzIHNlbGVjdGlvbiwKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdXNlciBoYXNuJ3QgY2hvc2VuIHlldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB1c2VyJ3Mgc2VsZWN0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIGludCBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBidXR0b25JZDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlTGFiZWxQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMzA2MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4YWFiMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmhlbHAuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmhlbHAuaW50ZXJuYWwuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHkuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVVJIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS51aSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQVBQX0lEID0gIm9yZy5lY2xpcHNlLnVwZGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVcGRhdGVVSSBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwcml2YXRlIFVwZGF0ZU1vZGVsIG1vZGVsOwotCXByaXZhdGUgVXBkYXRlTWFuYWdlckF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvcjsKLQlwcml2YXRlIFN0cmluZyBhcHBTZXJ2ZXJIb3N0OwotCXByaXZhdGUgaW50IGFwcFNlcnZlclBvcnQ7Ci0JcHJpdmF0ZSBVcGRhdGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZW1pbmRPbkNhbmNlbCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVwZGF0ZVVJKCkgewotCi0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9Ci0JCQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKAotCQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVwZGF0ZVVJIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmludGVybmFsR2V0QWN0aXZlUGFnZSgpOwotCX0KLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgaW50ZXJuYWxHZXRBY3RpdmVQYWdlKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpCi0JCQlyZXR1cm4gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotCi0JcHVibGljIFVwZGF0ZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgVXBkYXRlTGFiZWxQcm92aWRlcigpOwotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkTWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RyaW5nKGtleSk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwgYXJncyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkTWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RyaW5nKGtleSk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwgbmV3IFN0cmluZ1tdIHsgYXJnIH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQltb2RlbCA9IG5ldyBVcGRhdGVNb2RlbCgpOwotCQlhdXRoZW50aWNhdG9yID0gbmV3IFVwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yKCk7Ci0JCUF1dGhlbnRpY2F0b3Iuc2V0RGVmYXVsdChhdXRoZW50aWNhdG9yKTsKLQkJaW50IGhpc3RvcnlQcmVmID0KLQkJCWdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KFVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUpOwotCQlpZiAoaGlzdG9yeVByZWYgPiAwKSB7Ci0JCQlVcGRhdGVDb3JlLkRFRkFVTFRfSElTVE9SWSA9IGhpc3RvcnlQcmVmOwotCQl9Ci0JfQotCQotCQotCi0JcHVibGljIGJvb2xlYW4gaXNXZWJBcHBTdGFydGVkKCkgewotCQlyZXR1cm4gYXBwU2VydmVySG9zdCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwU2VydmVySG9zdCgpIHsKLQkJcmV0dXJuIGFwcFNlcnZlckhvc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRBcHBTZXJ2ZXJQb3J0KCkgewotCQlyZXR1cm4gYXBwU2VydmVyUG9ydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCW1vZGVsLnNodXRkb3duKCk7Ci0KLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCi0JfQotCi0JcHVibGljIFVwZGF0ZU1vZGVsIGdldFVwZGF0ZU1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQlsb2dFeGNlcHRpb24oZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSwgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQllID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQkJbWVzc2FnZSA9IGUudG9TdHJpbmcoKTsKLQkJCXN0YXR1cyA9Ci0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJZ2V0UGx1Z2luSWQoKSwKLQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJbWVzc2FnZSwKLQkJCQkJZSk7Ci0JCX0KLQkJbG9nKHN0YXR1cywgc2hvd0Vycm9yRGlhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgewotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5JTkZPKSB7Ci0JCQlpZiAoc2hvd0Vycm9yRGlhbG9nKQotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJc3RhdHVzKTsKLQkJCS8vUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotLy8JCQkgU2hvdWxkIGxvZyBvbiB0aGUgdXBkYXRlIHBsdWdpbidzIGxvZwotLy8JCQlQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudXBkYXRlLnVpIik7ICAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVbXSBzZWFyY2hTaXRlKAotCQlTdHJpbmcgZmVhdHVyZUlkLAotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSwKLQkJYm9vbGVhbiBvbmx5Q29uZmlndXJlZCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBudWxsOwotCi0JCWlmIChvbmx5Q29uZmlndXJlZCkKLQkJCXJlZmVyZW5jZXMgPSBzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQllbHNlCi0JCQlyZWZlcmVuY2VzID0gc2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWZlcmVuY2VzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlTdHJpbmcgaWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCQlpZiAoZmVhdHVyZUlkLmVxdWFscyhpZCkpIHsKLQkJCQlyZXN1bHQuYWRkKGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUZlYXR1cmVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElGZWF0dXJlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZVtdIGdldEluc3RhbGxlZEZlYXR1cmVzKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlib29sZWFuIG9ubHlDb25maWd1cmVkKSB7Ci0JCVZlY3RvciBmZWF0dXJlcyA9IG5ldyBWZWN0b3IoKTsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBpc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJU3RyaW5nIGlkID0gdmlkLmdldElkZW50aWZpZXIoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJlZFNpdGUgaXNpdGUgPSBpc2l0ZXNbaV07Ci0JCQkJSUZlYXR1cmVbXSByZXN1bHQgPQotCQkJCQlVcGRhdGVVSS5zZWFyY2hTaXRlKGlkLCBpc2l0ZSwgb25seUNvbmZpZ3VyZWQpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0Lmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlGZWF0dXJlIGluc3RhbGxlZEZlYXR1cmUgPSByZXN1bHRbal07Ci0JCQkJCWZlYXR1cmVzLmFkZChpbnN0YWxsZWRGZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiAoSUZlYXR1cmVbXSkgZmVhdHVyZXMudG9BcnJheShuZXcgSUZlYXR1cmVbZmVhdHVyZXMuc2l6ZSgpXSk7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBhdXRoZW50aWNhdG9yLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFVwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yCi0JICovCi0JcHVibGljIFVwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yIGdldEF1dGhlbnRpY2F0b3IoKSB7Ci0JCXJldHVybiBhdXRoZW50aWNhdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldE9yaWdpbmF0aW5nVVJMKFN0cmluZyBpZCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IGdldE9yaWdpbmF0aW5nVVJMU2VjdGlvbigpOwotCQlTdHJpbmcgdmFsdWUgPSBzZWN0aW9uLmdldChpZCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgVVJMKHZhbHVlKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE9yaWdpbmF0aW5nVVJMKFN0cmluZyBpZCwgVVJMIHVybCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IGdldE9yaWdpbmF0aW5nVVJMU2VjdGlvbigpOwotCQlzZWN0aW9uLnB1dChpZCwgdXJsLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElEaWFsb2dTZXR0aW5ncyBnZXRPcmlnaW5hdGluZ1VSTFNlY3Rpb24oKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHNldHRpbmdzLmdldFNlY3Rpb24oIm9yaWdpbmF0aW5nVVJMcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzZWN0aW9uID09IG51bGwpCi0JCQlzZWN0aW9uID0gc2V0dGluZ3MuYWRkTmV3U2VjdGlvbigib3JpZ2luYXRpbmdVUkxzIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0byByZXN0YXJ0Ci0JICogQHBhcmFtIHJlc3RhcnRJc1JlYWxseU5lZWRlZCB0cnVlIHdoZW4gYSByZXN0YXJ0IGlzIG5lZWRlZCwgZmFsc2UgaWYgdGhlIHVzZXIgZmVlbHMgbHVja3kgKHRtKSBhbmQgd2FudHMgdGhlIGNoYW5nZXMKLQkgKiBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IGNvbmZpZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXF1ZXN0UmVzdGFydChib29sZWFuIHJlc3RhcnRJc1JlYWxseU5lZWRlZCkgewotCQlib29sZWFuIHJlc3RhcnQgPQotCQkJUmVzdGFydERpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQkJZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQlyZXN0YXJ0SXNSZWFsbHlOZWVkZWQpOwotCQlpZiAocmVzdGFydCkKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkucmVzdGFydCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93VVJMKFN0cmluZyB1cmwpIHsKLQkJc2hvd1VSTCh1cmwsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNob3dVUkwoU3RyaW5nIHVybCwgYm9vbGVhbiBlbmNvZGVIb3N0QW5kUG9ydCkgewotCQlpZiAoZW5jb2RlSG9zdEFuZFBvcnQpCi0JCQl1cmwgPSBlbmNvZGVIb3N0QW5kUG9ydCh1cmwpOwotCi0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJUHJvZ3JhbS5sYXVuY2godXJsKTsKLQkJfSBlbHNlIHsKLQkJCUlCcm93c2VyIGJyb3dzZXIgPSBCcm93c2VyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUJyb3dzZXIoKTsKLQkJCXRyeSB7Ci0JCQkJYnJvd3Nlci5kaXNwbGF5VVJMKHVybCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGVIb3N0QW5kUG9ydChTdHJpbmcgdXJsTmFtZSkgewotCQlTdHJpbmcgY2FsbGJhY2tVUkwgPSBnZXRDYWxsYmFja1VSTEFzU3RyaW5nKCk7Ci0JCWlmIChjYWxsYmFja1VSTCA9PSBudWxsKQotCQkJcmV0dXJuIHVybE5hbWU7Ci0JCVN0cmluZyBjYWxsYmFja1BhcmFtZXRlciA9ICJ1cGRhdGVVUkw9IiArIGNhbGxiYWNrVVJMOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmxOYW1lLmluZGV4T2YoJz8nKSAhPSAtMSkKLQkJCXJldHVybiB1cmxOYW1lICsgIiYiICsgY2FsbGJhY2tQYXJhbWV0ZXI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJcmV0dXJuIHVybE5hbWUgKyAiPyIgKyBjYWxsYmFja1BhcmFtZXRlcjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2FsbGJhY2tVUkxBc1N0cmluZygpIHsKLQkJU3RyaW5nIGhvc3QgPSBnZXREZWZhdWx0KCkuZ2V0QXBwU2VydmVySG9zdCgpOwotCQlpbnQgcG9ydCA9IGdldERlZmF1bHQoKS5nZXRBcHBTZXJ2ZXJQb3J0KCk7Ci0JCWlmIChob3N0ID09IG51bGwgfHwgcG9ydCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgewotCQkJU3RyaW5nIHZhbHVlID0KLQkJCQkiaHR0cDovLyIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGhvc3QKLQkJCQkJKyAiOiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIHBvcnQKLQkJCQkJKyAiLyIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIFdFQl9BUFBfSUQKLQkJCQkJKyAiL2luc3RhbGwiOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCXZhbHVlID0gVVJMRW5jb2Rlci5lbmNvZGUodmFsdWUsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UmVtaW5kT25DYW5jZWwoKSB7Ci0JCXJldHVybiByZW1pbmRPbkNhbmNlbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJlbWluZE9uQ2FuY2VsKGJvb2xlYW4gcmVtaW5kKSB7Ci0JCXJlbWluZE9uQ2FuY2VsID0gcmVtaW5kOyAKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlJbWFnZXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSUltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTBlNTFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSUltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci0KLS8qKgotICogQnVuZGxlIG9mIGFsbCBpbWFnZXMgdXNlZCBieSB0aGUgUERFIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVVJSW1hZ2VzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElDT05TX1BBVEggPSAiaWNvbnMvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0IG9mIHByZWRlZmluZWQgSW1hZ2UgRGVzY3JpcHRvcnMuCi0JICovCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfT0JKPSBJQ09OU19QQVRIKyJvYmoxNi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfVklFVyA9IElDT05TX1BBVEgrImV2aWV3MTYvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xDTD0gSUNPTlNfUEFUSCsiZWxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9MQ0xfRElTQUJMRUQ9IElDT05TX1BBVEgrImRsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfT1ZSID0gSUNPTlNfUEFUSCArICJvdnIxNi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfV0laQkFOID0gSUNPTlNfUEFUSCArICJ3aXpiYW4vIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfRk9STVMgPSBJQ09OU19QQVRIICsgImZvcm1zLyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogRnJlcXVlbnRseSB1c2VkIGltYWdlcwotCSAqLwotCi0JLyoqCi0JICogT0JKMTYKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0FQUF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJhcHBfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19CRk9MREVSX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImJmb2xkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DQVRFR09SWV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJjYXRlZ29yeV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR19PQkogPSBjcmVhdGUoUEFUSF9PQkosICJjb25maWdfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GRUFUVVJFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImZlYXR1cmVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FRklYX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVmaXgyX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSElTVE9SWV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJoaXN0b3J5X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTFNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAibHNpdGVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19QU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJwc2l0ZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VTSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVzaXRlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJzaXRlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfV0VCX1NJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAid2ViX2JrbXJrX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5DT05GX0ZFQVRVUkVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidW5jb25mX2ZlYXR1cmVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VUERBVEVTX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInVwZGF0ZXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19OT1RJTlNUX0ZFQVRVUkVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAibm90aW5zdGFsbGVkX2ZlYXR1cmVfb2JqLmdpZiIpOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRVJSX1NUX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVycm9yX3N0X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfT0tfU1RfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAib2tfc3Rfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBPVlIxNgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTElOS0VEX0NPICAgPSBjcmVhdGUoUEFUSF9PVlIsICJsaW5rZWRfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VQREFURURfQ08gICA9IGNyZWF0ZShQQVRIX09WUiwgInVwZGF0ZWRfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0lOU1RBTExBQkxFX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiaW5zdGFsbGFibGVfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NVUlJFTlRfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJjdXJyZW50X2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FUlJPUl9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImVycm9yX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19XQVJOSU5HX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAid2FybmluZ19jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTU9EX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAibW9kX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19BRERfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJhZGRfc3RhdC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfREVMX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiZGVsX3N0YXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VOQ09ORl9DTyA9IGNyZWF0ZShQQVRIX09WUiwgInVuY29uZmlndXJlZF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVklFVzE2Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR1NfVklFVyA9IGNyZWF0ZShQQVRIX1ZJRVcsICJjb25maWdzLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMQ0wKLQkgKi8KLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1VOQ09ORiA9IGNyZWF0ZShQQVRIX0xDTCwgInNob3dfdW5jb25mLmdpZiIpOyAvLyROT04tTkxTLTEkCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfVU5DT05GX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJzaG93X3VuY29uZi5naWYiKTsgLy8kTk9OLU5MUy0xJAotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1VOQ09ORl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAic2hvd191bmNvbmYuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTExBUFNFX0FMTCA9IGNyZWF0ZShQQVRIX0xDTCwgImNvbGxhcHNlYWxsLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX0hJRVJBUkNIWSA9IGNyZWF0ZShQQVRIX0xDTCwgImhpZXJhcmNoaWNhbExheW91dC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19ISUVSQVJDSFlfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImhpZXJhcmNoaWNhbExheW91dC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogV0laCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0lOU1RBTExfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgImluc3RhbGxfd2l6LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VUERBVEVfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgInVwZGF0ZV93aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR19XSVogID0gY3JlYXRlKFBBVEhfV0laQkFOLCAiY29uZmlnX3dpei5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5JTlNUQUxMX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJ1bmluc3RhbGxfd2l6LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JTlNUQUxMX0JBTk5FUiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJkZWZfd2l6YmFuLmpwZyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19QUk9WSURFUiA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAiZGVmX3Byb3ZpZGVyLmpwZyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JVEVNID0gY3JlYXRlKFBBVEhfRk9STVMsICJ0b3BpYy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobWFrZUltYWdlVVJMKHByZWZpeCwgbmFtZSkpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIG1ha2VJbWFnZVVSTChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJVVJMIGJhc2UgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkocHJlZml4KTsKLQkJCXJldHVybiBuZXcgVVJMKGJhc2UsIG5hbWUpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTI5MTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIA0KLSMNCi0jDQotUmVzdGFydFRpdGxlID0gSW5zdGFsbC9VcGRhdGUNCi1SZXN0YXJ0TWVzc2FnZSA9IFlvdSB3aWxsIG5lZWQgdG8gcmVzdGFydCB0aGUgd29ya2JlbmNoIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4gXA0KLVdvdWxkIHlvdSBsaWtlIHRvIHJlc3RhcnQgbm93Pw0KLQ0KLU9wdGlvbmFsUmVzdGFydE1lc3NhZ2UgPSBJdCBpcyByZWNvbW1lbmRlZCB5b3UgcmVzdGFydCB0aGUgd29ya2JlbmNoIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGVmZmVjdCwgXA0KLWJ1dCBpdCBtYXkgYmUgcG9zc2libGUgdG8gYXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB3aXRob3V0IHJlc3RhcnRpbmcuXA0KLVdvdWxkIHlvdSBsaWtlIHRvIHJlc3RhcnQgbm93Pw0KLQ0KLUFwcGx5Q2hhbmdlcz1BcHBseSBDaGFuZ2VzDQotDQotQWRkQm9va21hcmtzQWN0aW9uLmFkZD1BZGQgQm9va21hcmsuLi4NCi1BZGRCb29rbWFya3NBY3Rpb24ubmV3PU5ldyBCb29rbWFyaw0KLQ0KLUNvbmZpZ3VyYXRpb25NYW5hZ2VyQWN0aW9uLnRpdGxlPVByb2R1Y3QgQ29uZmlndXJhdGlvbg0KLUNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmZpbGVNZW51PSZGaWxlDQotQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cucHJvcGVydGllcz0mUHJvcGVydGllcw0KLUNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmNsb3NlPSZDbG9zZQ0KLQ0KLUVkaXRCb29rbWFya3NBY3Rpb24uZWRpdD1FZGl0IEJvb2ttYXJrcy4uLg0KLUVkaXRCb29rbWFya3NBY3Rpb24udGl0bGU9Qm9va21hcmtzDQotDQotSW5zdGFsbFdpemFyZEFjdGlvbi50aXRsZT1JbnN0YWxsL1VwZGF0ZQ0KLUluc3RhbGxXaXphcmQucmV0cnlUaXRsZSA9IFByb2JsZW0gb2NjdXJyZWQNCi1JbnN0YWxsV2l6YXJkLnJldHJ5ID0gRG8geW91IHdhbnQgdG8gcmV0cnk/DQotDQotV2ViQm9va21hcmtzRGlhbG9nLmxhYmVsPUN1cnJlbnQgQm9va21hcmtzOg0KLVdlYkJvb2ttYXJrc0RpYWxvZy5hZGQ9QWRkLi4uDQotV2ViQm9va21hcmtzRGlhbG9nLm5ldz1OZXcgQm9va21hcmsNCi1XZWJCb29rbWFya3NEaWFsb2cuZWRpdD1FZGl0Li4uDQotV2ViQm9va21hcmtzRGlhbG9nLmVkaXRUaXRsZT1FZGl0IEJvb2ttYXJrDQotV2ViQm9va21hcmtzRGlhbG9nLnJlbW92ZT1SZW1vdmUNCi0NCi1EaXNjb3ZlcnlGb2xkZXIubmFtZT1TaXRlcyB0byBWaXNpdA0KLUZlYXR1cmVBZGFwdGVyLmZhaWx1cmU9PGZhaWx1cmU+DQotU2l0ZUJvb2ttYXJrLmNvbm5lY3RpbmcgPSBDb25uZWN0aW5nIHRvICJ7MH0iLi4uDQotU2l0ZUJvb2ttYXJrLmRvd25sb2FkaW5nID0gRG93bmxvYWRpbmc6XCANCi1TaXRlQ2F0ZWdvcnkub3RoZXIubGFiZWwgPSBPdGhlcg0KLVNpdGVDYXRlZ29yeS5vdGhlci5kZXNjcmlwdGlvbiA9IEZlYXR1cmVzIGZvdW5kIHVuZGVyIHRoaXMgY2F0ZWdvcnkgYXJlIGVpdGhlciBub3QgY2F0ZWdvcml6ZWQgb3IgdGhlaXIgY2F0ZWdvcmllcyBjb3VsZCBub3QgYmUgZm91bmQgb24gc2VydmVyLg0KLQ0KLU1haW5QcmVmZXJlbmNlUGFnZS5jaGVja1NpZ25hdHVyZSA9IENoZWNrIGRpZ2l0YWwgJnNpZ25hdHVyZXMgb2YgZG93bmxvYWRlZCBhcmNoaXZlcw0KLU1haW5QcmVmZXJlbmNlUGFnZS5oaXN0b3J5U2l6ZSA9ICZNYXhpbXVtIG51bWJlciBvZiAnSGlzdG9yeScgY29uZmlndXJhdGlvbnM6DQotTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVZlcnNpb25zID0gVmFsaWQgdXBkYXRlcw0KLU1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVWZXJzaW9ucy5lcXVpdmFsZW50ID0gZSZxdWl2YWxlbnQgKDEuMC4xIC0+IDEuMC4yIC0gb25seSBzZXJ2aWNlIGluY3JlbWVudHMpDQotTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVZlcnNpb25zLmNvbXBhdGlibGUgPSAmY29tcGF0aWJsZSAoMS4wLjkgLT4gMS4xLjAgLSBzZXJ2aWNlIGFuZCBtaW5vciBpbmNyZW1lbnRzKQ0KLU1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVQb2xpY3kgPSAmVXBkYXRlIFBvbGljeQ0KLU1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVQb2xpY3lVUkwgPSBQbyZsaWN5IFVSTDoNCi1NYWluUHJlZmVyZW5jZVBhZ2UucHJveHlHcm91cCA9IFByb3h5IHNldHRpbmdzDQotTWFpblByZWZlcmVuY2VQYWdlLmVuYWJsZUh0dHBQcm94eSA9IEUmbmFibGUgSFRUUCBwcm94eSBjb25uZWN0aW9uDQotTWFpblByZWZlcmVuY2VQYWdlLmh0dHBQcm94eUhvc3QgPSAmSFRUUCBwcm94eSBob3N0IGFkZHJlc3M6DQotTWFpblByZWZlcmVuY2VQYWdlLmh0dHBQcm94eVBvcnQgPSAgSFRUUCAmcHJveHkgaG9zdCBwb3J0Og0KLU1haW5QcmVmZXJlbmNlUGFnZS5kaWdpdGFsU2lnbmF0dXJlLnRpdGxlID0gRGlnaXRhbCBTaWduYXR1cmUgQ2hlY2sNCi1NYWluUHJlZmVyZW5jZVBhZ2UuZGlnaXRhbFNpZ25hdHVyZS5tZXNzYWdlID0gWW91IGhhdmUgY2hvc2VuIHRvIGRpc2FibGUgZGlnaXRhbCBzaWduYXR1cmUgXA0KLWNoZWNrcyBmb3IgZG93bmxvYWRlZCBhcmNoaXZlcy4gTm90ZSB0aGF0IHVuc2lnbmVkIGFyY2hpdmVzIG1heSBcDQotY29udGFpbiBzb2Z0d2FyZSB0aGF0IGNhbiBoYXJtIHlvdXIgY29tcHV0ZXIuDQotDQotVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5kZXNjcmlwdGlvbj1TZXR0aW5ncyBmb3IgYXV0b21hdGljIGZlYXR1cmUgdXBkYXRlDQotVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5sYWJlbD1BZGRyZXNzICZNYXBwaW5ncyBVUkw6DQotVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5pbnZhbGlkPUludmFsaWQgbWFwcGluZ3MgVVJMDQotDQotQ29uZmlndXJhdGlvbkFjdGl2aXRpZXNQcm9wZXJ0eVBhZ2UubGFiZWw9QWN0aXZpdGllcyB0aGF0IGNhdXNlZCB0aGUgY3JlYXRpb24gb2YgdGhpcyBjb25maWd1cmF0aW9uOg0KLQ0KLUNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnBhdGg9TG9jYXRpb24gcGF0aDogDQotQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UudHlwZT1Mb2NhdGlvbiB0eXBlOiANCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5lbmFibGVkPUVuYWJsZWQ6IA0KLUNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnllcz15ZXMNCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5ubz1ubw0KLUNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnByaXZhdGU9cHJpdmF0ZQ0KLUNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLmV4dGVuc2lvbj1wcm9kdWN0IGV4dGVuc2lvbg0KLUNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnByb2R1Y3Q9cHJvZHVjdA0KLUNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnVua25vd249dW5rbm93bg0KLQ0KLUZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2Uuc2hvd0luQnJvd3Nlcj1TaG93IGluIEJyb3dzZXINCi1GZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlLm5vQ29weXJpZ2h0PUZlYXR1cmUgZG9lcyBub3QgY29udGFpbiBhIGNvcHlyaWdodCBzdGF0ZW1lbnQNCi0NCi1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5uYW1lPU5hbWU6DQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuaWQ9SWRlbnRpZmllcjoNCi1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS52ZXJzaW9uPVZlcnNpb246DQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UucHJvdmlkZXI9UHJvdmlkZXI6DQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Uuc2l6ZT1TaXplOg0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLnBsYXRmb3Jtcz1TdXBwb3J0ZWQgUGxhdGZvcm1zDQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Uud3M9V2luZG93aW5nIFN5c3RlbTogDQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuYXJjaD1DUFUgQXJjaGl0ZWN0dXJlOiANCi1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5ubD1MYW5ndWFnZXM6IA0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmFsbD1hbGwNCi1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5vcz1PcGVyYXRpbmcgU3lzdGVtOg0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmRlc2M9RGVzY3JpcHRpb24NCi0NCi1GZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZS5zaG93SW5Ccm93c2VyPVNob3cgaW4gQnJvd3Nlcg0KLUZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlLm5vTGljZW5zZT1GZWF0dXJlIGRvZXMgbm90IGNvbnRhaW4gYSBsaWNlbnNlLg0KLQ0KLUZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UucGVuZGluZ0NoYW5nZXM9VGhlIGZlYXR1cmUgaGFzIHBlbmRpbmcgY2hhbmdlcy4gIFRoZXJlZm9yZSwgaXRzIHN0YXR1cyBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB1bnRpbCB5b3UgcmVzdGFydCB0aGUgd29ya2JlbmNoLg0KLUZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UucmVhc29uPVJlYXNvbjoNCi1GZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLm1pc3NpbmdPcHRpb25hbD1UaGlzIG9wdGlvbmFsIGZlYXR1cmUgaXMgY3VycmVudGx5IG5vdCBpbnN0YWxsZWQuDQotRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5taXNzaW5nPVJlZmVyZW5jZWQgZmVhdHVyZSBub3QgZm91bmQuDQotRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5nb29kQ29uZmlndXJhdGlvbj1UaGUgZmVhdHVyZSBpcyBjb25maWd1cmVkIHByb3Blcmx5Lg0KLQ0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy53dGl0bGUgPSBKYXIgVmVyaWZpY2F0aW9uDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlRpdGxlPSBGZWF0dXJlIHZlcmlmaWNhdGlvbg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5WZXJpZmljYXRpb249VmVyaWZpY2F0aW9uDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvbXBvbmVudE5vdEluc3RhbGxlZD1UaGlzIGZlYXR1cmUgd2lsbCBub3QgYmUgaW5zdGFsbGVkLg0KLQ0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5BYm91dFRvSW5zdGFsbC5GaWxlPVdhcm5pbmc6IFlvdSBhcmUgYWJvdXQgdG8gaW5zdGFsbCBhbiB1bnNpZ25lZCBmZWF0dXJlIGZpbGUuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLk5vdERpZ2l0YWxseVNpZ25lZC5GaWxlPSBXYXJuaW5nOiBUaGlzIGZlYXR1cmUgZmlsZSBoYXMgbm90IGJlZW4gZGlnaXRhbGx5IHNpZ25lZC4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuQ2Fubm90VmVyaWZ5UHJvdmlkZXIuRmlsZT1UaGUgcHJvdmlkZXIgb2YgdGhpcyBmZWF0dXJlIGZpbGUgY2Fubm90IGJlIHZlcmlmaWVkLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Db3JydXB0ZWRDb250ZW50LkZpbGU9VGhlIGNvbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGZpbGUgaGFzIGJlZW4gY29ycnVwdGVkDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlNpZ25lZENvbXBvbmVudC5GaWxlPVlvdSBhcmUgYWJvdXQgdG8gaW5zdGFsbCBhIHNpZ25lZCBmZWF0dXJlIGZpbGUuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlVua25vd25DZXJ0aWZpY2F0ZS5GaWxlPVRoZSBjZXJ0aWZpY2F0ZXMgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcyBmZWF0dXJlIGZpbGUgYXJlIG5vdCByZWNvZ25pemVkLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5VbmFibGVUb1ZlcmlmeVByb3ZpZGVyLkZpbGU9VGhlIHByb3ZpZGVyIG9mIHRoaXMgZmVhdHVyZSBmaWxlIGNhbm5vdCBiZSB2ZXJpZmllZC4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuUHJvdmlkZXJLbm93bi5GaWxlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgZmlsZSBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgYSB0cnVzdGVkIHRoaXJkIHBhcnR5Lg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Lbm93bkNlcnRpZmljYXRlLkZpbGU9T25lIG9mIHRoZSBjZXJ0aWZpY2F0ZXMgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcyBmZWF0dXJlIGZpbGUgd2FzIHJlY29nbml6ZWQuDQotDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkFib3V0VG9JbnN0YWxsLkZlYXR1cmU9V2FybmluZzogWW91IGFyZSBhYm91dCB0byBpbnN0YWxsIGFuIHVuc2lnbmVkIGZlYXR1cmUuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLk5vdERpZ2l0YWxseVNpZ25lZC5GZWF0dXJlPSBXYXJuaW5nOiBUaGlzIGZlYXR1cmUgaGFzIG5vdCBiZWVuIGRpZ2l0YWxseSBzaWduZWQuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhbm5vdFZlcmlmeVByb3ZpZGVyLkZlYXR1cmU9VGhlIHByb3ZpZGVyIG9mIHRoaXMgZmVhdHVyZSBjYW5ub3QgYmUgdmVyaWZpZWQuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvcnJ1cHRlZENvbnRlbnQuRmVhdHVyZT1UaGUgY29udGVudCBvZiB0aGlzIGZlYXR1cmUgaGFzIGJlZW4gY29ycnVwdGVkDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlNpZ25lZENvbXBvbmVudC5GZWF0dXJlPVlvdSBhcmUgYWJvdXQgdG8gaW5zdGFsbCBhIHNpZ25lZCBmZWF0dXJlLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Vbmtub3duQ2VydGlmaWNhdGUuRmVhdHVyZT1UaGUgY2VydGlmaWNhdGVzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgZmVhdHVyZSBhcmUgbm90IHJlY29nbml6ZWQuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlVuYWJsZVRvVmVyaWZ5UHJvdmlkZXIuRmVhdHVyZT1UaGUgcHJvdmlkZXIgb2YgdGhpcyBmZWF0dXJlIGNhbm5vdCBiZSB2ZXJpZmllZC4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuUHJvdmlkZXJLbm93bi5GZWF0dXJlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgaGFzIGJlZW4gdmFsaWRhdGVkIGJ5IGEgdHJ1c3RlZCB0aGlyZCBwYXJ0eS4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuS25vd25DZXJ0aWZpY2F0ZS5GZWF0dXJlPU9uZSBvZiB0aGUgY2VydGlmaWNhdGVzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgZmVhdHVyZSB3YXMgcmVjb2duaXplZC4NCi0NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuQ2F1dGlvbj1cclxuQ2F1dGlvbjogXCJ7MH1cIiBhc3NlcnRzIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGlzIHNhZmUuIFxyXG5Zb3Ugc2hvdWxkIG9ubHkgaW5zdGFsbCB0aGlzIGZlYXR1cmUgaWYgeW91IHRydXN0IFwiezB9XCIgdG8gbWFrZSB0aGF0IGFzc2VydGlvbg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5GaWxlTmFtZT1GaWxlIElkZW50aWZpZXI6DQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkZlYXR1cmVOYW1lPUZlYXR1cmUgbmFtZToNCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuRmVhdHVyZUlkZW50aWZpZXI9RmVhdHVyZSBJZGVudGlmaWVyOg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Qcm92aWRlcj0JUHJvdmlkZXI6DQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLk1heUNob29zZVRvSW5zdGFsbD1Zb3UgbWF5IGNob29zZSB0byBpbnN0YWxsIHRoZSBmZWF0dXJlIG9yIGNhbmNlbCBpdHMgaW5zdGFsbGF0aW9uLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5NYXlDaG9vc2VUb0NvbnRpbnVlPVlvdSBtYXkgY2hvb3NlIHRvIGNvbnRpbnVlIHRvIGluc3RhbGwgdGhlIGZlYXR1cmUgb3IgY2FuY2VsIGl0cyBpbnN0YWxsYXRpb24uDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkluc3RhbGw9Jkluc3RhbGwNCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuQ29udGludWU9QyZvbnRpbnVlDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhbmNlbD0mQ2FuY2VsDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlJvb3RDQT0gQWNjb3JkaW5nIHRvOiANCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuU3ViamVjdENBPSBGaWxlIHNpZ25lZCBieTogDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNlcnRpZmljYXRlSW5mbz0gQ2VydGlmaWNhdGU6DQotDQotVXNlclZlcmlmaWNhdGlvbkRpYWxvZy5QYXNzd29yZFJlcXVpcmVkPVBhc3N3b3JkIFJlcXVpcmVkDQotVXNlclZlcmlmaWNhdGlvbkRpYWxvZy5Db25uZWN0VG89Q29ubmVjdCB0bzogDQotVXNlclZlcmlmaWNhdGlvbkRpYWxvZy5QYXNzd29yZD1QYXNzd29yZDoNCi1Vc2VyVmVyaWZpY2F0aW9uRGlhbG9nLlVzZXJOYW1lPVVzZXIgbmFtZToNCi0NCi1Db25maWd1cmF0aW9uUHJldmlld0Zvcm0uY29uZmlnRGVzY3JpcHRpb249VGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4NCi1Db25maWd1cmF0aW9uUHJldmlld0Zvcm0uaW5zdGFsbD1JbnN0YWxsIExvY2F0aW9uDQotDQotQ29uZmlndXJhdGlvblZpZXcubWlzc2luZ0ZlYXR1cmUgPSB7MH0gKG5vdCBpbnN0YWxsZWQpDQotQ29uZmlndXJhdGlvblZpZXcuY3VycmVudD1DdXJyZW50IENvbmZpZ3VyYXRpb24NCi1Db25maWd1cmF0aW9uVmlldy5wZW5kaW5nPVwgKHBlbmRpbmcgY2hhbmdlcykNCi1Db25maWd1cmF0aW9uVmlldy5lcnJvcj1FcnJvcg0KLUNvbmZpZ3VyYXRpb25WaWV3LmNvbGxhcHNlTGFiZWw9Q29sbGFwc2UgQWxsDQotQ29uZmlndXJhdGlvblZpZXcuY29sbGFwc2VUb29sdGlwPUNvbGxhcHNlIEFsbA0KLUNvbmZpZ3VyYXRpb25WaWV3LnJldmVydExhYmVsPVJldmVydC4uLg0KLUNvbmZpZ3VyYXRpb25WaWV3Lmluc3RhbGxIaXN0b3J5ID1JbnN0YWxsYXRpb24gSGlzdG9yeQ0KLUNvbmZpZ3VyYXRpb25WaWV3LmV4dExvY2F0aW9uPUV4dGVuc2lvbiBMb2NhdGlvbi4uLg0KLUNvbmZpZ3VyYXRpb25WaWV3LnVuaW5zdGFsbD1Vbmluc3RhbGwNCi1Db25maWd1cmF0aW9uVmlldy5pbnN0YWxsPUluc3RhbGwNCi1Db25maWd1cmF0aW9uVmlldy5hbm90aGVyVmVyc2lvbj0mQW5vdGhlciBWZXJzaW9uLi4uDQotQ29uZmlndXJhdGlvblZpZXcuZmluZFVwZGF0ZXM9RmluZCBVcGRhdGVzLi4uDQotQ29uZmlndXJhdGlvblZpZXcuc2hvd05lc3RlZEZlYXR1cmVzPVNob3cgTmVzdGVkIEZlYXR1cmVzDQotQ29uZmlndXJhdGlvblZpZXcuc2hvd05lc3RlZFRvb2x0aXA9U2hvdyBOZXN0ZWQgRmVhdHVyZXMNCi1Db25maWd1cmF0aW9uVmlldy5zaG93SW5zdGFsbD1TaG93IEluc3RhbGwgTG9jYXRpb25zDQotQ29uZmlndXJhdGlvblZpZXcuc2hvd0luc3RhbGxUb29sdGlwPVNob3cgSW5zdGFsbCBMb2NhdGlvbnMNCi1Db25maWd1cmF0aW9uVmlldy5zaG93RGlzYWJsZWQ9U2hvdyBEaXNhYmxlZCBGZWF0dXJlcw0KLUNvbmZpZ3VyYXRpb25WaWV3LnNob3dEaXNhYmxlZFRvb2x0aXA9U2hvdyBEaXNhYmxlZCBGZWF0dXJlcw0KLUNvbmZpZ3VyYXRpb25WaWV3Lm5ldz1OZXcNCi1Db25maWd1cmF0aW9uVmlldy5yZXBsYWNlV2l0aD1SZXBsYWNlIHdpdGgNCi1Db25maWd1cmF0aW9uVmlldy5yZXZlcnRQcmV2aW91c0xhYmVsPVJldmVydCB0byBQcmV2aW91cw0KLUNvbmZpZ3VyYXRpb25WaWV3LnJldmVydFByZXZpb3VzRGVzYz1Zb3UgY2FuIHJldmVydCB0byBvbmUgb2YgdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb25zIGlmIHlvdSBhcmUgaGF2aW5nIHByb2JsZW1zIHdpdGggdGhlIGN1cnJlbnQgb25lLg0KLUNvbmZpZ3VyYXRpb25WaWV3LnVwZGF0ZUxhYmVsPVNjYW4gZm9yIFVwZGF0ZXMNCi1Db25maWd1cmF0aW9uVmlldy51cGRhdGVEZXNjPVNlYXJjaCBmb3IgdXBkYXRlcyBmb3IgYWxsIHRoZSBpbnN0YWxsZWQgZmVhdHVyZXMuDQotQ29uZmlndXJhdGlvblZpZXcuZGV0ZWN0ZWRDaGFuZ2VzPURldGVjdGVkIENoYW5nZXMuLi4NCi1Db25maWd1cmF0aW9uVmlldy5kZXRlY3RlZExhYmVsPVByb2Nlc3MgRGV0ZWN0ZWQgQ2hhbmdlcw0KLUNvbmZpZ3VyYXRpb25WaWV3LmRldGVjdGVkRGVzYz1Qcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB0aGF0IHdlcmUgZGV0ZWN0ZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4NCi1Db25maWd1cmF0aW9uVmlldy5pbnN0YWxsSGlzdExhYmVsPVZpZXcgSW5zdGFsbGF0aW9uIEhpc3RvcnkNCi1Db25maWd1cmF0aW9uVmlldy5pbnN0YWxsSGlzdERlc2M9VmlldyBhbGwgYWN0aXZpdGllcyBzaW5jZSB0aGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBwcm9kdWN0Lg0KLUNvbmZpZ3VyYXRpb25WaWV3LmFjdGl2aXRpZXNMYWJlbD1TaG93IEFjdGl2aXRpZXMNCi1Db25maWd1cmF0aW9uVmlldy5hY3Rpdml0aWVzRGVzYz1WaWV3IHRoZSBhY3Rpdml0aWVzIHRoYXQgY2F1c2VkIHRoZSBjcmVhdGlvbiBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uDQotQ29uZmlndXJhdGlvblZpZXcuZW5hYmxlTG9jRGVzYz1Zb3UgY2FuIGVuYWJsZSBvciBkaXNhYmxlIGFuIGVudGlyZSBpbnN0YWxsIGxvY2F0aW9uLiBEaXNhYmxpbmcgYSBsb2NhdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRpc2FibGluZyBldmVyeSBmZWF0dXJlIGluIGl0Lg0KLUNvbmZpZ3VyYXRpb25WaWV3LmV4dExvY0xhYmVsPUFkZCBhbiBFeHRlbnNpb24gTG9jYXRpb24NCi1Db25maWd1cmF0aW9uVmlldy5leHRMb2NEZXNjPUxvY2F0ZSBhbmQgYWRkIGFuIGV4dGVuc2lvbiBsb2NhdGlvbiB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBBbiBleHRlbnNpb24gbG9jYXRpb24gY29udGFpbnMgZmVhdHVyZXMgYW5kIHBsdWdpbnMgcHJldmlvdXNseSBpbnN0YWxsZWQuDQotQ29uZmlndXJhdGlvblZpZXcucHJvcGVydGllc0xhYmVsPVNob3cgUHJvcGVydGllcw0KLUNvbmZpZ3VyYXRpb25WaWV3Lmluc3RhbGxQcm9wRGVzYz1WaWV3IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBpbnN0YWxsIGxvY2F0aW9uLg0KLUNvbmZpZ3VyYXRpb25WaWV3LnJlcGxhY2VWZXJzaW9uTGFiZWw9UmVwbGFjZSBXaXRoIEFub3RoZXIgVmVyc2lvbg0KLUNvbmZpZ3VyYXRpb25WaWV3LnJlcGxhY2VWZXJzaW9uRGVzYz1EaXNhYmxlcyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmZWF0dXJlIGFuZCByZXBsYWNlcyBpdCB3aXRoIGFub3RoZXIgdmVyc2lvbiBmcm9tIHRoZSBsaXN0IG9mIHRoZSBjdXJyZW50bHkgZGlzYWJsZWQgZmVhdHVyZXMuDQotQ29uZmlndXJhdGlvblZpZXcuZW5hYmxlRmVhdHVyZURlc2M9WW91IGNhbiBlbmFibGUgb3IgZGlzYWJsZSBhIGZlYXR1cmUuIEZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoZSBmZWF0dXJlIHdpbGwgYmUgcmVtb3ZlZCBidXQgdGhlIGZlYXR1cmUgaXRzZWxmIHdpbGwgc3RpbGwgYmUgcHJlc2VudCB0byBiZSBlbmFibGVkIGxhdGVyLg0KLUNvbmZpZ3VyYXRpb25WaWV3Lmluc3RhbGxPcHRpb25hbExhYmVsPUluc3RhbGwgZnJvbSBPcmlnaW5hdGluZyBTZXJ2ZXINCi1Db25maWd1cmF0aW9uVmlldy5pbnN0YWxsT3B0aW9uYWxEZXNjPVRoaXMgb3B0aW9uYWwgZmVhdHVyZSB3YXMgbm90IG9yaWdpbmFsbHkgaW5zdGFsbGVkLiBZb3UgY2FuIGluc3RhbGwgaXQgbm93IGJ5IGNvbm5lY3RpbmcgdG8gdGhlIG9yaWdpbmF0aW5nIHNlcnZlciBvZiB0aGUgcGFyZW50Lg0KLUNvbmZpZ3VyYXRpb25WaWV3LnVuaW5zdGFsbExhYmVsPVVuaW5zdGFsbA0KLUNvbmZpZ3VyYXRpb25WaWV3LnVuaW5zdGFsbERlc2M9VGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBub3QgdXNlZCBhbmQgY2FuIGJlIHVuaW5zdGFsbGVkIGZyb20gdGhlIHByb2R1Y3QuDQotQ29uZmlndXJhdGlvblZpZXcudW5pbnN0YWxsRGVzYzI9VW5pbnN0YWxsIHRoZSBmZWF0dXJlIGZyb20gdGhlIHByb2R1Y3QuIFRoaXMgd2lsbCBkaXNhYmxlIHRoZSBmZWF0dXJlIGZyb20gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGRpc2suDQotQ29uZmlndXJhdGlvblZpZXcuc2NhbkxhYmVsPVNjYW4gZm9yIFVwZGF0ZXMNCi1Db25maWd1cmF0aW9uVmlldy5zY2FuRGVzYz1TZWFyY2ggZm9yIHVwZGF0ZXMgZm9yIHRoaXMgZmVhdHVyZS4NCi1Db25maWd1cmF0aW9uVmlldy5mZWF0dXJlUHJvcExhYmVsPVNob3cgUHJvcGVydGllcw0KLUNvbmZpZ3VyYXRpb25WaWV3LmZlYXR1cmVQcm9wRGVzYz1WaWV3IHByb3BlcnRpZXMgb2YgdGhlIGZlYXR1cmUgc3VjaCBhcyB2ZXJzaW9uLCBwcm92aWRlciBuYW1lLCBsaWNlbnNlIGFncmVlbWVudCBldGMuDQotDQotQWN0aW9ucy5icm9rZW5Db25maWdRdWVzdGlvbj1UaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGVycm9ycyBhbmQgdGhpcyBvcGVyYXRpb24gY2FuIGhhdmUgdW5wcmVkaWN0YWJsZSByZXN1bHRzLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZSA/DQotDQotRmVhdHVyZVN0YXRlQWN0aW9uLmRpc2FibGU9RGlzYWJsZQ0KLUZlYXR1cmVTdGF0ZUFjdGlvbi5lbmFibGU9RW5hYmxlDQotRmVhdHVyZVN0YXRlQWN0aW9uLmRpc2FibGVRdWVzdGlvbj1EbyB5b3Ugd2FudCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZT8NCi1GZWF0dXJlU3RhdGVBY3Rpb24uRW5hYmxlUXVlc3Rpb249RG8geW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgZmVhdHVyZT8NCi1GZWF0dXJlU3RhdGVBY3Rpb24uZGlhbG9nVGl0bGU9Q3VycmVudCBDb25maWd1cmF0aW9uDQotDQotRmVhdHVyZVVuaW5zdGFsbEFjdGlvbi51bmluc3RhbGw9VW5pbnN0YWxsDQotRmVhdHVyZVVuaW5zdGFsbEFjdGlvbi51bmluc3RhbGxRdWVzdGlvbj1EbyB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhpcyBmZWF0dXJlPw0KLUZlYXR1cmVVbmluc3RhbGxBY3Rpb24uZGlhbG9nVGl0bGU9Q3VycmVudCBDb25maWd1cmF0aW9uDQotDQotU2l0ZVN0YXRlQWN0aW9uLmRpYWxvZ1RpdGxlPUN1cnJlbnQgQ29uZmlndXJhdGlvbg0KLVNpdGVTdGF0ZUFjdGlvbi5kaXNhYmxlTGFiZWw9RGlzYWJsZQ0KLVNpdGVTdGF0ZUFjdGlvbi5kaXNhYmxlTWVzc2FnZT1EbyB5b3Ugd2FudCB0byBkaXNhYmxlIGFsbCB0aGUgZmVhdHVyZXMgaW4gInswfSI/DQotU2l0ZVN0YXRlQWN0aW9uLmVuYWJsZUxhYmVsPUVuYWJsZQ0KLVNpdGVTdGF0ZUFjdGlvbi5lbmFibGVNZXNzYWdlPURvIHlvdSB3YW50IHRvIGVuYWJsZSBmZWF0dXJlcyBpbiAiezB9Ij8NCi0NCi1GaW5kVXBkYXRlc0FjdGlvbi51cGRhdGVzPVVwZGF0ZXMNCi0NCi1JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLnRpdGxlPUluc3RhbGxhdGlvbiBIaXN0b3J5DQotSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5kZXNjPVRoZSBsaXN0IGJlbG93IHJlcHJlc2VudHMgdGhlIGhpc3Rvcnkgb2YgeW91ciB1cGRhdGUgYWN0aXZpdGllcyBmcm9tIHRoZSBwcm9kdWN0IGluc3RhbGxhdGlvbiB0byBkYXRlLiBFYWNoIG9wZXJhdGlvbiBjYXJyaWVzIGEgZGF0ZSBpdCBjb21tZW5jZWQsIGFzIHdlbGwgYXMgYWN0aXZpdGllcyBwZXJmb3JtZWQuIE9wZXJhdGlvbnMgYXJlIHNvcnRlZCBieSBkYXRlIGluIGFzY2VuZGluZyBvcmRlci4NCi1JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmFjdGl2aXR5PUFDVElWSVRZDQotSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5kYXRlVGltZT1EYXRlIC8gVGltZQ0KLUluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24udGFyZ2V0PVRhcmdldA0KLUluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uYWN0aW9uPUFjdGlvbg0KLUluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uc3RhdHVzPVN0YXR1cw0KLUluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uZXJyb3JzPUVycm9ycyB3aGlsZSBjcmVhdGluZyBpbnN0YWxsYXRpb24gaGlzdG9yeSBmaWxlLg0KLQ0KLU5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uLnNlbGVjdEV4dExvY2F0aW9uPVNlbGVjdCBhbiBleHRlbnNpb24gbG9jYXRpb24uIEFuIGV4dGVuc2lvbiBsb2NhdGlvbiBpcyBhIGRpcmVjdG9yeSBuYW1lZCBlY2xpcHNlLCB3aGljaCBjb250YWlucyB0aGUgLmVjbGlwc2Vwcm9kdWN0IG1hcmtlciBmaWxlLCBhcyB3ZWxsIHRoZSBmZWF0dXJlcyBhbmQgcGx1Z2lucyBmb2xkZXJzLg0KLU5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uLmV4dEluZm9UaXRsZT1JbnZhbGlkIEV4dGVuc2lvbg0KLU5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uLmV4dEluZm9NZXNzYWdlPVNlbGVjdGVkIGxvY2F0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBwcm9kdWN0IGV4dGVuc2lvbi4gQW4gZXh0ZW5zaW9uIHNob3VsZCBjb25zaXN0IG9mIGEgZGlyZWN0b3J5IG5hbWVkIGVjbGlwc2UsIHdoaWNoIGNvbnRhaW5zIGEgbWFya2VyIGZpbGUgY2FsbGVkIC5lY2xpcHNlcHJvZHVjdCBhbmQgdGhlIGZlYXR1cmVzIGFuZCBwbHVnaW5zIGZvbGRlcnMuICBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgbG9jYXRpb24uDQotDQotQWN0aXZpdGllc1RhYmxlVmlld2VyLmVuYWJsZWQ9RW5hYmxlZA0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5mZWF0dXJlSW5zdGFsbGVkPUZlYXR1cmUgSW5zdGFsbGVkDQotQWN0aXZpdGllc1RhYmxlVmlld2VyLmZlYXR1cmVSZW1vdmVkPUZlYXR1cmUgUmVtb3ZlZA0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5zaXRlSW5zdGFsbGVkPVNpdGUgSW5zdGFsbGVkDQotQWN0aXZpdGllc1RhYmxlVmlld2VyLnNpdGVSZW1vdmVkPVNpdGUgUmVtb3ZlZA0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5kaXNhYmxlZD1EaXNhYmxlZA0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5yZXZlcnQ9UmV2ZXJ0DQotQWN0aXZpdGllc1RhYmxlVmlld2VyLnJlY29uY2lsZT1SZWNvbmNpbGUNCi1BY3Rpdml0aWVzVGFibGVWaWV3ZXIudW5rbm93bj11bmtub3duDQotQWN0aXZpdGllc1RhYmxlVmlld2VyLmRhdGU9RGF0ZQ0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci50YXJnZXQ9VGFyZ2V0DQotQWN0aXZpdGllc1RhYmxlVmlld2VyLmFjdGlvbj1BY3Rpb24NCi0NCi1EZWx0YUZlYXR1cmVBZGFwdGVyLnNob3J0TmFtZSA9IHswfSAoezF9KQ0KLURlbHRhRmVhdHVyZUFkYXB0ZXIubG9uZ05hbWUgPSB7MH0gKHsxfSkgaW4gezJ9DQotDQotRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLnRpdGxlID0gRHVwbGljYXRlIENvbmZsaWN0cw0KLUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5tZXNzYWdlID0gSWYgeW91IGNvbnRpbnVlIHdpdGggdGhlIHVwZGF0ZS9pbnN0YWxsLCBcDQotdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIHdpbGwgY29udGFpbiBkdXBsaWNhdGlvbiBjb25mbGljdHMgXA0KLXRoYXQgbWF5IGNhdXNlIHBhcnRzIG9mIHRoZSBwcm9kdWN0IHRvIGJlIHVudXNhYmxlLiBEbyB5b3Ugd2FudCB0byBcDQotY29udGludWU/DQotRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLnRyZWVMYWJlbCA9ICZEZXRlY3RlZCBjb25mbGljdHM6DQotDQotSW5zdGFsbERlbHRhV2l6YXJkLnd0aXRsZSA9IENvbmZpZ3VyYXRpb24gQ2hhbmdlcw0KLUluc3RhbGxEZWx0YVdpemFyZC5wcm9jZXNzaW5nID0gUHJvY2Vzc2luZyBwZW5kaW5nIGNoYW5nZXM6DQotSW5zdGFsbERlbHRhV2l6YXJkLnRpdGxlID0gUGVuZGluZyBDb25maWd1cmF0aW9uIENoYW5nZXMNCi1JbnN0YWxsRGVsdGFXaXphcmQuZGVzYyA9IENoZWNrIHRoZSBjaGFuZ2VzIHlvdSB3aXNoIHRvIHByb2Nlc3Mgbm93LiBSZW1vdmUgY2hhbmdlcyB0aGF0IHNob3VsZCBuZXZlciBiZSBwcm9jZXNzZWQuDQotSW5zdGFsbERlbHRhV2l6YXJkLmxhYmVsID0gRGV0ZWN0ZWQgJmNoYW5nZXM6DQotSW5zdGFsbERlbHRhV2l6YXJkLmRlbGV0ZSA9ICZSZW1vdmUNCi1JbnN0YWxsRGVsdGFXaXphcmQuZXJyb3JzID0gJkVycm9yIERldGFpbHMuLi4NCi1JbnN0YWxsRGVsdGFXaXphcmQubWVzc2FnZSA9IFNlbGVjdGVkIHVwZGF0ZSB3aWxsIHJlc3VsdCBpbiBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24uDQotDQotTW9kZVNlbGVjdGlvblBhZ2UudGl0bGU9RmVhdHVyZSBVcGRhdGVzDQotTW9kZVNlbGVjdGlvblBhZ2UuZGVzYz1DaG9vc2UgdGhlIHdheSB5b3Ugd2FudCB0byBzZWFyY2ggZm9yIGZlYXR1cmVzIHRvIGluc3RhbGwNCi1Nb2RlU2VsZWN0aW9uUGFnZS51cGRhdGVzPVNlYXJjaCBmb3IgJnVwZGF0ZXMgb2YgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgZmVhdHVyZXMNCi1Nb2RlU2VsZWN0aW9uUGFnZS5uZXdGZWF0dXJlcz0mU2VhcmNoIGZvciBuZXcgZmVhdHVyZXMgdG8gaW5zdGFsbA0KLQ0KLU1vcmVJbmZvR2VuZXJhdG9yLm5vdEluc3RhbGxlZD1ub3QgaW5zdGFsbGVkDQotTW9yZUluZm9HZW5lcmF0b3IuYWxsPWFsbA0KLU1vcmVJbmZvR2VuZXJhdG9yLmxpY2Vuc2U9TGljZW5zZQ0KLU1vcmVJbmZvR2VuZXJhdG9yLkhUTUxsaWNlbnNlPUhUTUwgdmVyc2lvbiBvZiB0aGUgbGljZW5zZSBhZ3JlZW1lbnQNCi1Nb3JlSW5mb0dlbmVyYXRvci5saWNlbnNlQXZhaWxhYmxlPWlzIGFsc28gYXZhaWxhYmxlLg0KLU1vcmVJbmZvR2VuZXJhdG9yLmNvcHlyaWdodD1Db3B5cmlnaHQNCi1Nb3JlSW5mb0dlbmVyYXRvci5IVE1MY29weXJpZ2h0PUhUTUwgdmVyc2lvbiBvZiB0aGUgY29weXJpZ2h0DQotTW9yZUluZm9HZW5lcmF0b3IuY29weXJpZ2h0QXZhaWxhYmxlPWlzIGFsc28gYXZhaWxhYmxlLg0KLU1vcmVJbmZvR2VuZXJhdG9yLnBsYXRmb3Jtcz1TdXBwb3J0ZWQgUGxhdGZvcm1zDQotTW9yZUluZm9HZW5lcmF0b3IuZm9vdHByaW50PUZvb3RwcmludA0KLU1vcmVJbmZvR2VuZXJhdG9yLmRvd25sb2FkU2l6ZT1Eb3dubG9hZCBzaXplOg0KLU1vcmVJbmZvR2VuZXJhdG9yLmluc3RhbGxTaXplPUluc3RhbGwgc2l6ZToNCi1Nb3JlSW5mb0dlbmVyYXRvci5kb3dubG9hZFRpbWU9RXN0aW1hdGVkIGRvd25sb2FkIHRpbWU6DQotTW9yZUluZm9HZW5lcmF0b3IubGVzc3RoYW5vbmU9bGVzcyB0aGFuIG9uZSBtaW51dGUNCi1Nb3JlSW5mb0dlbmVyYXRvci5kZXNjPURlc2NyaXB0aW9uDQotTW9yZUluZm9HZW5lcmF0b3IubW9yZUluZm89TW9yZSBpbmZvLi4uDQotDQotTmV3VXBkYXRlU2l0ZURpYWxvZy5uYW1lPU5hbWU6IA0KLU5ld1VwZGF0ZVNpdGVEaWFsb2cudXJsPVVSTDogDQotDQotSW5zdGFsbFdpemFyZC53dGl0bGU9SW5zdGFsbA0KLUluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UudGl0bGU9IE9wdGlvbmFsIEZlYXR1cmVzDQotSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS5kZXNjID0gU29tZSBvZiB0aGUgZmVhdHVyZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhpcyBmZWF0dXJlIGFyZSBvcHRpb25hbC4NCi1JbnN0YWxsV2l6YXJkLk9wdGlvbmFsRmVhdHVyZXNQYWdlLnRyZWVMYWJlbCA9ICZBdmFpbGFibGUgb3B0aW9uYWwgZmVhdHVyZXM6DQotSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS5zZWxlY3RBbGwgPSAmU2VsZWN0IEFsbA0KLUluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UuZGVzZWxlY3RBbGwgPSAmRGVzZWxlY3QgQWxsDQotDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmNvdW50ZXIgPSB7MH0gb2YgezF9IHNlbGVjdGVkLg0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS50aXRsZT1TZWFyY2ggUmVzdWx0cw0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5kZXNjPVNlbGVjdCBmZWF0dXJlcyB0byBpbnN0YWxsIGZyb20gdGhlIHNlYXJjaCByZXN1bHQgbGlzdC4NCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UubGFiZWw9U2VsZWN0IHRoZSBmZWF0dXJlcyB0byAmaW5zdGFsbDoNCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2Uuc2VsZWN0QWxsPSZTZWxlY3QgQWxsDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmRlc2VsZWN0QWxsPSZEZXNlbGVjdCBBbGwNCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UubW9yZUluZm89Jk1vcmUgSW5mbw0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5wcm9wZXJ0aWVzPSZQcm9wZXJ0aWVzDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnNob3dTdGF0dXM9JkVycm9yIERldGFpbHMuLi4NCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuZmlsdGVyRmVhdHVyZXM9XCBGaWwmdGVyIGZlYXR1cmVzIGluY2x1ZGVkIGluIG90aGVyIGZlYXR1cmVzIG9uIHRoZSBsaXN0DQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmZpbHRlclBhdGNoZXM9XCBGaWwmdGVyIHBhdGNoZXMgaW5jbHVkZWQgaW4gb3RoZXIgcGF0Y2hlcyBvbiB0aGUgbGlzdA0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5mZWF0dXJlPUZlYXR1cmUNCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UudmVyc2lvbj1WZXJzaW9uDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnByb3ZpZGVyPVByb3ZpZGVyDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnByb3A9JlByb3BlcnRpZXMNCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuaW52YWxpZC5sb25nPUludmFsaWQgY29tYmluYXRpb24gLSBzZWxlY3QgXCJTaG93IFN0YXR1cy4uLlwiIGZvciBkZXRhaWxzLg0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5pbnZhbGlkLnNob3J0PUludmFsaWQgY29tYmluYXRpb24NCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuY3ljbGU9Q3ljbGUgc3RhcnRpbmcgYXQgezB9DQotDQotSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5hY2NlcHQgPSBJICZhY2NlcHQgdGhlIHRlcm1zIGluIHRoZSBsaWNlbnNlIGFncmVlbWVudA0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuYWNjZXB0MiA9IEkgJmFjY2VwdCB0aGUgdGVybXMgaW4gdGhlIGxpY2Vuc2UgYWdyZWVtZW50cw0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVjbGluZSA9IEkgJmRvIG5vdCBhY2NlcHQgdGhlIHRlcm1zIGluIHRoZSBsaWNlbnNlIGFncmVlbWVudA0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVjbGluZTIgPSBJICZkbyBub3QgYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnRzDQotSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kZXNjID0gVGhpcyBmZWF0dXJlIGhhcyBhIGxpY2Vuc2UgXA0KLWFncmVlbWVudCB0aGF0IHlvdSBuZWVkIHRvIGFjY2VwdCBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIFwNCi10aGUgaW5zdGFsbGF0aW9uLg0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVzYzIgPSBTb21lIG9mIHRoZSBmZWF0dXJlcyBoYXZlIGxpY2Vuc2UgXA0KLWFncmVlbWVudHMgdGhhdCB5b3UgbmVlZCB0byBhY2NlcHQgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCBcDQotdGhlIGluc3RhbGxhdGlvbi4NCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmRvd249TmV4dCAmTGljZW5zZQ0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuaGVhZGVyPXswfSBvdXQgb2YgezF9OiB7Mn0gKHszfSkNCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLnRpdGxlID0gRmVhdHVyZSBMaWNlbnNlDQotSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS51cD0mUHJldmlvdXMgTGljZW5zZQ0KLQ0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS50aXRsZSA9IEluc3RhbGwgTG9jYXRpb24NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UuZGVzYyA9IENob29zZSB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGZlYXR1cmVzIHdpbGwgYmUgaW5zdGFsbGVkLg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5qb2JzTGFiZWwgPSBGZWF0dXJlcyB0byAmaW5zdGFsbDoNCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2Uuc2l0ZUxhYmVsID0gQSZ2YWlsYWJsZSBzaXRlczoNCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubmV3ID0gJkFkZCBTaXRlLi4uDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmRlbGV0ZSA9ICZSZW1vdmUgU2l0ZQ0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5yZXF1aXJlZFNwYWNlID0gUmVxdWlyZWQgc3BhY2U6DQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmF2YWlsYWJsZVNwYWNlID0gRnJlZSBzcGFjZToNCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24gPSBUYXJnZXQgTG9jYXRpb24NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24ubWVzc2FnZSA9IFNlbGVjdCBhIG5ldyBpbnN0YWxsIGxvY2F0aW9uDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmVtcHR5ID0gVGFyZ2V0IGluc3RhbGwgbG9jYXRpb24gbXVzdCBiZSBzZWxlY3RlZC4gSWYgbm9uZSBpcyBhdmFpbGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUuDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmV4aXN0cyA9IFRhcmdldCBsb2NhdGlvbiBhbHJlYWR5IGV4aXN0cy4NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXJyb3IudGl0bGUgPSBJbnZhbGlkIExvY2F0aW9uDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmVycm9yLm1lc3NhZ2UgPSBUaGUgc2VsZWN0ZWQgbG9jYXRpb24gY2Fubm90IGJlIHVzZWQgdG8gaW5zdGFsbCBmZWF0dXJlczogezB9DQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmVycm9yLnJlYXNvbiA9IFJlYXNvbjogezB9DQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnNpemUgPSB7MH1LQg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS51bmtub3duU2l6ZSA9IFVua25vd24NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UucGF0Y2hFcnJvciA9IFBhdGNoICJ7MH0iIG11c3QgYmUgaW5zdGFsbGVkIGluIHRoZSBzYW1lIHNpdGUgYXMgInsxfSINCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UucGF0Y2hFcnJvcjIgPSBQYXRjaCAiezB9IiBtdXN0IGJlIGluc3RhbGxlZCBpbiB0aGUgc2FtZSBzaXRlIGFzICJ7MX0iIDogezJ9DQotDQotUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZC53dGl0bGU9UmV2ZXJ0IHRvIGEgUHJldmlvdXMgQ29uZmlndXJhdGlvbg0KLVJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLnRpdGxlPVJldmVydCB0byBhIFByZXZpb3VzIENvbmZpZ3VyYXRpb24NCi1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5kZXNjPUNob29zZSBhIHN0YWJsZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIHJldmVydA0KLVJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmxhYmVsPSZQYXN0IGNvbmZpZ3VyYXRpb25zOg0KLVJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmFjdGl2aXRpZXM9JkFjdGl2aXRpZXMgdGhhdCBjYXVzZWQgdGhlIGNyZWF0aW9uIG9mIHRoaXMgY29uZmlndXJhdGlvbjoNCi1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5xdWVzdGlvbj1UaGlzIG9wZXJhdGlvbiByZXF1aXJlcyByZXN0YXJ0aW5nIHRoZSB3b3JrYmVuY2guICBXb3VsZCB5b3UgbGlrZSB0byBwcm9jZWVkPw0KLQ0KLVJldmVydC5Qcm9ibGVtRGlhbG9nLnRpdGxlID0gUmVzdG9yZSBQcm9ibGVtcw0KLQ0KLVNob3dBY3Rpdml0aWVzRGlhbG9nLnRpdGxlID0gQ3VycmVudCBDb25maWd1cmF0aW9uDQotU2hvd0FjdGl2aXRpZXNEaWFsb2cuZGF0ZSA9IERhdGU6DQotU2hvd0FjdGl2aXRpZXNEaWFsb2cubG9jID0gTG9jYXRpb246IA0KLVNob3dBY3Rpdml0aWVzRGlhbG9nLmxhYmVsID0gQWN0aXZpdGllcyB0aGF0IGNhdXNlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbjoNCi0NCi1TaXRlUGFnZS50aXRsZT1VcGRhdGUgc2l0ZXMgdG8gdmlzaXQNCi1TaXRlUGFnZS5kZXNjPVNlbGVjdCB1cGRhdGUgc2l0ZXMgdG8gdmlzaXQgd2hpbGUgbG9va2luZyBmb3IgbmV3IGZlYXR1cmVzLg0KLVNpdGVQYWdlLmxhYmVsPSZTaXRlcyB0byBpbmNsdWRlIGluIHNlYXJjaDoNCi1TaXRlUGFnZS5hZGRVcGRhdGVTaXRlPU5ldyBSZW1vJnRlIFNpdGUuLi4NCi1TaXRlUGFnZS5hZGRMb2NhbFNpdGU9TmV3ICZMb2NhbCBTaXRlLi4uDQotU2l0ZVBhZ2UuYWRkTG9jYWxaaXBwZWRTaXRlPU5ldyAmQXJjaGl2ZWQgU2l0ZS4uLg0KLVNpdGVQYWdlLmVkaXQ9JkVkaXQuLi4NCi1TaXRlUGFnZS5yZW1vdmU9JlJlbW92ZQ0KLVNpdGVQYWdlLmlnbm9yZT0mSWdub3JlIGZlYXR1cmVzIG5vdCBhcHBsaWNhYmxlIHRvIHRoaXMgZW52aXJvbm1lbnQNCi1TaXRlUGFnZS5uZXc9TmV3IFVwZGF0ZSBTaXRlDQotU2l0ZVBhZ2UuZGlhbG9nRWRpdExvY2FsPUVkaXQgTG9jYWwgU2l0ZQ0KLVNpdGVQYWdlLmRpYWxvZ0VkaXRVcGRhdGVTaXRlPUVkaXQgUmVtb3RlIFNpdGUNCi1TaXRlUGFnZS5jb25uZWN0aW5nPUNvbm5lY3RpbmcNCi1TZWFyY2hSdW5uZXIuY29ubmVjdGlvbkVycm9yPUNvbm5lY3Rpb24gZXJyb3INCi0NCi1Mb2NhbFNpdGVTZWxlY3Rvci5kaWFsb2dNZXNzYWdlPVNlbGVjdCBhIGxvY2FsIHVwZGF0ZSBzaXRlLg0KLUxvY2FsU2l0ZVNlbGVjdG9yLmRpckluZm9UaXRsZT1JbnZhbGlkIFNpdGUNCi1Mb2NhbFNpdGVTZWxlY3Rvci5kaXJJbmZvTWVzc2FnZT1TZWxlY3RlZCBsb2NhdGlvbiBkb2VzIG5vdCBjb250YWluIGFuIHVwZGF0ZSBzaXRlLiAgUGxlYXNlIHNlbGVjdCBhbm90aGVyIGxvY2F0aW9uLg0KLUxvY2FsU2l0ZVNlbGVjdG9yLmRpYWxvZ01lc3NhZ2V6aXA9U2VsZWN0IExvY2FsIFNpdGUgQXJjaGl2ZQ0KLUxvY2FsU2l0ZVNlbGVjdG9yLnppcEluZm9UaXRsZT1JbnZhbGlkIFNpdGUNCi1Mb2NhbFNpdGVTZWxlY3Rvci56aXBJbmZvTWVzc2FnZT1TZWxlY3RlZCBhcmNoaXZlIGRvZXMgbm90IGNvbnRhaW4gYW4gdXBkYXRlIHNpdGUuICBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgYXJjaGl2ZS4NCi0NCi1JbnN0YWxsU2VydmxldC51bmtub3duU2VydmVyVVJMPVVwZGF0ZSBzZXJ2ZXIgVVJMIGlzIHVua25vd24uDQotSW5zdGFsbFNlcnZsZXQubm9GZWF0dXJlcz1ObyBmZWF0dXJlcyB0byBpbnN0YWxsLg0KLUluc3RhbGxTZXJ2bGV0LmluUHJvZ3Jlc3MgPSBBbm90aGVyIGluc3RhbGwgc2Vzc2lvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLg0KLUluc3RhbGxTZXJ2bGV0LmluY29ycmVjdFVSTEZvcm1hdD1VcGRhdGUgc2VydmVyIFVSTCBoYXMgaW5jb3JyZWN0IGZvcm1hdDogezB9DQotSW5zdGFsbFNlcnZsZXQuY29udGFjdFdlYm1hc3Rlcj1Db250YWN0IFdlYiBtYXN0ZXIgdGhhdCBtYWludGFpbnMgdGhlIHBhZ2UgdGhhdCBpbml0aWF0ZWQgdGhpcyBvcGVyYXRpb24uDQotDQotTWlzc2luZ0ZlYXR1cmUucHJvdmlkZXIgPSBOL0ENCi1NaXNzaW5nRmVhdHVyZS5kZXNjLnVua25vd24gPSBUaGUgZmVhdHVyZSB3YXMgbm90IGxvYWRlZCBkdWUgdG8gZXJyb3JzLiBPcGVuIGZlYXR1cmUgcHJvcGVydGllcyBmb3IgZGV0YWlscy4NCi1NaXNzaW5nRmVhdHVyZS5kZXNjLm9wdGlvbmFsID0gVGhpcyBvcHRpb25hbCBmZWF0dXJlIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQuDQotSW5zdGFsbERlbHRhV2l6YXJkLnJlbWluZGVyPVRvIHByb2Nlc3MgdGhlc2UgY2hhbmdlcyBhdCBhIGxhdGVyIHRpbWUsIGdvIHRvIEhlbHAtPlNvZnR3YXJlIFVwZGF0ZXMtPk1hbmFnZSBDb25maWd1cmF0aW9uLi4uDQotU3dhcEZlYXR1cmVXaXphcmQudGl0bGU9UmVwbGFjZSBXaXRoIEFub3RoZXIgVmVyc2lvbg0KLVN3YXBGZWF0dXJlV2l6YXJkUGFnZS50aXRsZT1SZXBsYWNlIFdpdGggQW5vdGhlciBWZXJzaW9uDQotU3dhcEZlYXR1cmVXaXphcmRQYWdlLmRlc2M9RGlzYWJsZSB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmZWF0dXJlIGFuZCByZXBsYWNlIGl0IHdpdGggb25lIG9mIHRoZSB2ZXJzaW9ucyBmcm9tIHRoZSBsaXN0DQotU3dhcEZlYXR1cmVXaXphcmRQYWdlLmxhYmVsPSZBdmFpbGFibGUgZGlzYWJsZWQgdmVyc2lvbnM6DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrRm9sZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQm9va21hcmtGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3NmI1Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQm9va21hcmtGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBCb29rbWFya0ZvbGRlciBleHRlbmRzIE5hbWVkTW9kZWxPYmplY3QgewotCXByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW49IG5ldyBBcnJheUxpc3QoKTsKLQlwdWJsaWMgQm9va21hcmtGb2xkZXIoKSB7Ci0JfQotCQotCXB1YmxpYyBCb29rbWFya0ZvbGRlcihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbi5zaXplKCk+MDsKLQl9IAotCQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKE5hbWVkTW9kZWxPYmplY3Qgb2JqZWN0KSB7Ci0JCWludGVybmFsQWRkKG9iamVjdCk7Ci0JCW5vdGlmeU9iamVjdHNBZGRlZCh0aGlzLCBuZXcgT2JqZWN0W10ge29iamVjdH0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENoaWxkcmVuKE5hbWVkTW9kZWxPYmplY3QgW10gb2JqZWN0cykgewotCQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaW50ZXJuYWxBZGQob2JqZWN0c1tpXSk7Ci0JCX0KLQkJbm90aWZ5T2JqZWN0c0FkZGVkKHRoaXMsIG9iamVjdHMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFkZChOYW1lZE1vZGVsT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCWNoaWxkLnNldE1vZGVsKGdldE1vZGVsKCkpOwotCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkcmVuKE5hbWVkTW9kZWxPYmplY3QgW10gb2JqZWN0cykgewotCQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJY2hpbGRyZW4ucmVtb3ZlKG9iamVjdHNbaV0pOwotCQkJb2JqZWN0c1tpXS5zZXRQYXJlbnQobnVsbCk7Ci0JCX0KLQkJbm90aWZ5T2JqZWN0c1JlbW92ZWQodGhpcywgb2JqZWN0cyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya1V0aWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxMDJmZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQm9va21hcmtVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1wdWJsaWMgY2xhc3MgQm9va21hcmtVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoU3RyaW5nIGZpbGVOYW1lLCBWZWN0b3IgYm9va21hcmtzKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlEb2N1bWVudCBkb2MgPSBwYXJzZXIucGFyc2UoZmlsZU5hbWUpOwotCQkJTm9kZSByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJcHJvY2Vzc1Jvb3Qocm9vdCwgYm9va21hcmtzKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2l0ZUJvb2ttYXJrW10gZ2V0Qm9va21hcmtzKFZlY3RvciBib29rbWFya3MpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBib29rbWFya3Muc2l6ZSgpOyBpKyspIHsKLQkJCXByb2Nlc3NFbnRyeShib29rbWFya3MuZ2V0KGkpLCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiAoU2l0ZUJvb2ttYXJrW10pIHJlc3VsdC50b0FycmF5KG5ldyBTaXRlQm9va21hcmtbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQm9va21hcmtGb2xkZXIgZ2V0Rm9sZGVyKFZlY3RvciBib29rbWFya3MsIElQYXRoIHBhdGgpIHsKLQkJTmFtZWRNb2RlbE9iamVjdCBvYmplY3QgPSBmaW5kKGJvb2ttYXJrcywgcGF0aCk7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikKLQkJCXJldHVybiAoQm9va21hcmtGb2xkZXIpIG9iamVjdDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOYW1lZE1vZGVsT2JqZWN0IGZpbmQoVmVjdG9yIGJvb2ttYXJrcywgSVBhdGggcGF0aCkgewotCQlPYmplY3RbXSBhcnJheSA9IGJvb2ttYXJrcy50b0FycmF5KCk7Ci0JCXJldHVybiBmaW5kKGFycmF5LCBwYXRoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBOYW1lZE1vZGVsT2JqZWN0IGZpbmQoT2JqZWN0W10gYXJyYXksIElQYXRoIHBhdGgpIHsKLQkJU3RyaW5nIG5hbWUgPSBwYXRoLnNlZ21lbnQoMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCU5hbWVkTW9kZWxPYmplY3Qgb2JqID0gKE5hbWVkTW9kZWxPYmplY3QpIGFycmF5W2ldOwotCQkJaWYgKG9iai5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2ttYXJrRm9sZGVyKSB7Ci0JCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQkJSVBhdGggY2hpbGRQYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJCQkJQm9va21hcmtGb2xkZXIgZm9sZGVyID0gKEJvb2ttYXJrRm9sZGVyKSBvYmo7Ci0JCQkJCQlyZXR1cm4gZmluZChmb2xkZXIuZ2V0Q2hpbGRyZW4obnVsbCksIGNoaWxkUGF0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NSb290KE5vZGUgcm9vdCwgVmVjdG9yIGJvb2ttYXJrcykgewotCQlpZiAocm9vdC5nZXROb2RlTmFtZSgpLmVxdWFscygiYm9va21hcmtzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSByb290LmdldENoaWxkTm9kZXMoKTsKLQkJCXByb2Nlc3NDaGlsZHJlbihjaGlsZHJlbiwgbnVsbCwgYm9va21hcmtzKTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NDaGlsZHJlbigKLQkJTm9kZUxpc3QgY2hpbGRyZW4sCi0JCUJvb2ttYXJrRm9sZGVyIGZvbGRlciwKLQkJVmVjdG9yIGJvb2ttYXJrcykgewotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJTmFtZWRNb2RlbE9iamVjdCBvYmplY3QgPSBudWxsOwotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInNpdGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCW9iamVjdCA9IGNyZWF0ZVNpdGUoY2hpbGQpOwotCi0JCQkJfSBlbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygiZm9sZGVyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlvYmplY3QgPSBjcmVhdGVGb2xkZXIoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChmb2xkZXIgIT0gbnVsbCkgewotCQkJCQlmb2xkZXIuYWRkQ2hpbGQob2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlib29rbWFya3MuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJCW9iamVjdC5zZXRNb2RlbChtb2RlbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTaXRlQm9va21hcmsgY3JlYXRlU2l0ZShOb2RlIGNoaWxkKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChnZXRBdHRyaWJ1dGUoY2hpbGQsICJ1cmwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCVN0cmluZyB3ZWIgPSBnZXRBdHRyaWJ1dGUoY2hpbGQsICJ3ZWIiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHdlYkJvb2ttYXJrID0gKHdlYiAhPSBudWxsICYmIHdlYi5lcXVhbHMoInRydWUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgc2VsID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAic2VsZWN0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHNlbGVjdGVkID0gKHNlbCAhPSBudWxsICYmIHNlbC5lcXVhbHMoInRydWUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlTaXRlQm9va21hcmsgYm9va21hcmsgPSBuZXcgU2l0ZUJvb2ttYXJrKG5hbWUsIHVybCwgd2ViQm9va21hcmssIHNlbGVjdGVkKTsKLQotCQlTdHJpbmcgbG9jYWwgPSBnZXRBdHRyaWJ1dGUoY2hpbGQsICJsb2NhbCIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2ttYXJrLnNldExvY2FsKGxvY2FsICE9IG51bGwgJiYgbG9jYWwuZXF1YWxzKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGlnbiA9IGdldEF0dHJpYnV0ZShjaGlsZCwgImlnbm9yZWQtY2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpZ24gIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGlnbiwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJQXJyYXlMaXN0IGFycmF5ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHRvayA9IHN0b2submV4dFRva2VuKCk7Ci0JCQkJYXJyYXkuYWRkKHRvayk7Ci0JCQl9Ci0JCQlib29rbWFyay5zZXRJZ25vcmVkQ2F0ZWdvcmllcygoU3RyaW5nW10pIGFycmF5LnRvQXJyYXkobmV3IFN0cmluZ1thcnJheS5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIGJvb2ttYXJrOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEJvb2ttYXJrRm9sZGVyIGNyZWF0ZUZvbGRlcihOb2RlIGNoaWxkKSB7Ci0JCUJvb2ttYXJrRm9sZGVyIGZvbGRlciA9IG5ldyBCb29rbWFya0ZvbGRlcigpOwotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShjaGlsZCwgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb2xkZXIuc2V0TmFtZShuYW1lKTsKLQkJaWYgKGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlwcm9jZXNzQ2hpbGRyZW4oY2hpbGRyZW4sIGZvbGRlciwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RvcmUoU3RyaW5nIGZpbGVOYW1lLCBWZWN0b3IgYm9va21hcmtzKSB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG51bGw7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG9zdyk7Ci0JCQl3cml0ZXIucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludGxuKCI8Ym9va21hcmtzPiIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJvb2ttYXJrcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBib29rbWFya3MuZ2V0KGkpOwotCQkJCXdyaXRlT2JqZWN0KCIgICAiLCBvYmosIHdyaXRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXdyaXRlci5wcmludGxuKCI8L2Jvb2ttYXJrcz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAob3N3ICE9IG51bGwpCi0JCQkJCW9zdy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKGZvcyAhPSBudWxsKQotCQkJCQlmb3MuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZU9iamVjdCgKLQkJU3RyaW5nIGluZGVudCwKLQkJT2JqZWN0IG9iaiwKLQkJUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLQkJCVNpdGVCb29rbWFyayBib29rbWFyayA9IChTaXRlQm9va21hcmspIG9iajsKLQkJCVN0cmluZyBuYW1lID0gYm9va21hcmsuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHVybCA9IGJvb2ttYXJrLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgd2ViID0gYm9va21hcmsuaXNXZWJCb29rbWFyaygpPyJ0cnVlIjoiZmFsc2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBzZWwgPSBib29rbWFyay5pc1NlbGVjdGVkKCk/InRydWUiOiJmYWxzZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIGxvY2FsID0gYm9va21hcmsuaXNMb2NhbCgpID8gInRydWUiIDogImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgW10gaWduID0gYm9va21hcmsuZ2V0SWdub3JlZENhdGVnb3JpZXMoKTsKLQkJCVN0cmluZ0J1ZmZlciB3aWduID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZ24ubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCXdpZ24uYXBwZW5kKCcsJyk7Ci0JCQkJd2lnbi5hcHBlbmQoaWduW2ldKTsKLQkJCX0KLQkJCXdyaXRlci5wcmludChpbmRlbnQgKyAiPHNpdGUgbmFtZT1cIiIgKyBuYW1lICsgIlwiIHVybD1cIiIgKyB1cmwgKyAiXCIgd2ViPVwiIiArIHdlYiArICJcIiBzZWxlY3RlZD1cIiIgKyBzZWwgKyAiXCIgbG9jYWw9XCIiICsgbG9jYWwgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJCWlmICh3aWduLmxlbmd0aCgpID4gMCkKLQkJCQl3cml0ZXIucHJpbnQoIiBpZ25vcmVkLWNhdGVnb3JpZXM9XCIiK3dpZ24udG9TdHJpbmcoKSsiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl3cml0ZXIucHJpbnRsbigiLz4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2ttYXJrRm9sZGVyKSB7Ci0JCQlCb29rbWFya0ZvbGRlciBmb2xkZXIgPSAoQm9va21hcmtGb2xkZXIpIG9iajsKLQkJCVN0cmluZyBuYW1lID0gZm9sZGVyLmdldE5hbWUoKTsKLQkJCXdyaXRlci5wcmludGxuKGluZGVudCArICI8Zm9sZGVyIG5hbWU9XCIiICsgbmFtZSArICJcIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGZvbGRlci5nZXRDaGlsZHJlbihmb2xkZXIpOwotCQkJU3RyaW5nIGluZGVudDIgPSBpbmRlbnQgKyAiICAgIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCXdyaXRlT2JqZWN0KGluZGVudDIsIGNoaWxkcmVuW2ldLCB3cml0ZXIpOwotCQkJfQotCQkJd3JpdGVyLnByaW50bG4oaW5kZW50ICsgIjwvZm9sZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJTm9kZSBhdHQgPSBhdHRzLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJaWYgKGF0dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYXR0LmdldE5vZGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NGb2xkZXIoQm9va21hcmtGb2xkZXIgZm9sZGVyLCBBcnJheUxpc3QgcmVzdWx0KSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZm9sZGVyLmdldENoaWxkcmVuKGZvbGRlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXByb2Nlc3NFbnRyeShjaGlsZHJlbltpXSwgcmVzdWx0KTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NFbnRyeShPYmplY3Qgb2JqLCBBcnJheUxpc3QgcmVzdWx0KSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBTaXRlQm9va21hcmspCi0JCQlyZXN1bHQuYWRkKG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2ttYXJrRm9sZGVyKSB7Ci0JCQlwcm9jZXNzRm9sZGVyKChCb29rbWFya0ZvbGRlcikgb2JqLCByZXN1bHQpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2ZjIzNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXINCi0JZXh0ZW5kcyBTaW1wbGVGZWF0dXJlQWRhcHRlcg0KLQlpbXBsZW1lbnRzIElDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgew0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIgYWRhcHRlcjsNCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpZ3VyZWQ7DQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVkOw0KLQ0KLQlwdWJsaWMgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKA0KLQkJSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyLA0KLQkJSUZlYXR1cmUgZmVhdHVyZSwNCi0JCWJvb2xlYW4gY29uZmlndXJlZCwNCi0JCWJvb2xlYW4gdXBkYXRlZCwNCi0JCWJvb2xlYW4gb3B0aW9uYWwpIHsNCi0JCXN1cGVyKGZlYXR1cmUsIG9wdGlvbmFsKTsNCi0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7DQotCQl0aGlzLmNvbmZpZ3VyZWQgPSBjb25maWd1cmVkOw0KLQkJdGhpcy51cGRhdGVkID0gdXBkYXRlZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKG9iamVjdCA9PSBudWxsKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCWlmIChvYmplY3QgPT0gdGhpcykNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHsNCi0JCQl0cnkgew0KLQkJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWQgPSAoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBvYmplY3Q7DQotCQkJCXJldHVybiBhZC5nZXRDb25maWd1cmVkU2l0ZSgpLmVxdWFscyhnZXRDb25maWd1cmVkU2l0ZSgpKQ0KLQkJCQkJJiYgYWQuZ2V0RmVhdHVyZShudWxsKS5lcXVhbHMoZ2V0RmVhdHVyZShudWxsKSk7DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7DQotCQlyZXR1cm4gYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpOw0KLQl9DQotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7DQotCQlyZXR1cm4gYWRhcHRlci5nZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpOw0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZCgpIHsNCi0JCXJldHVybiBjb25maWd1cmVkOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlZCgpIHsNCi0JCXJldHVybiB1cGRhdGVkOw0KLQl9DQotCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXJbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJdHJ5IHsNCi0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQ0KLQkJCQlnZXRGZWF0dXJlKG51bGwpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXJbXSByZXN1bHQgPQ0KLQkJCQluZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW2luY2x1ZGVkLmxlbmd0aF07DQotCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkNCi0JCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7DQotCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpOw0KLQkJCXN1Yk1vbml0b3IuYmVnaW5UYXNrKCIiLCBpbmNsdWRlZC5sZW5ndGgpOyAvLyROT04tTkxTLTEkDQotDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgew0KLQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGZyZWYgPSBpbmNsdWRlZFtpXTsNCi0JCQkJSUZlYXR1cmUgZmVhdHVyZTsNCi0JCQkJYm9vbGVhbiBjaGlsZENvbmZpZ3VyZWQgPSBjb25maWd1cmVkOw0KLQkJCQlib29sZWFuIHVwZGF0ZWQgPSBmYWxzZTsNCi0JCQkJdHJ5IHsNCi0JCQkJCWZlYXR1cmUgPSBmcmVmLmdldEZlYXR1cmUoDQotCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc3ViTW9uaXRvciwgMSkpOw0KLQkJCQkJY2hpbGRDb25maWd1cmVkID0NCi0JCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCkuaXNDb25maWd1cmVkKGZlYXR1cmUpOw0KLQkJCQkJLy8vKg0KLQkJCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgcmVmcGlkID0NCi0JCQkJCQlmcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7DQotCQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBmcGlkID0NCi0JCQkJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7DQotCQkJCQl1cGRhdGVkID0gIXJlZnBpZC5lcXVhbHMoZnBpZCk7DQotCQkJCQkvLyovDQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkJZmVhdHVyZSA9IG5ldyBNaXNzaW5nRmVhdHVyZShnZXRGZWF0dXJlKG51bGwpLCBmcmVmKTsNCi0JCQkJCWNoaWxkQ29uZmlndXJlZCA9IGZhbHNlOw0KLQkJCQl9DQotDQotCQkJCXJlc3VsdFtpXSA9DQotCQkJCQluZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKA0KLQkJCQkJCWFkYXB0ZXIsDQotCQkJCQkJZmVhdHVyZSwNCi0JCQkJCQljaGlsZENvbmZpZ3VyZWQsDQotCQkJCQkJdXBkYXRlZCwNCi0JCQkJCQlmcmVmLmlzT3B0aW9uYWwoKSk7DQotCQkJCXJlc3VsdFtpXS5zZXRJbmNsdWRlZCh0cnVlKTsNCi0JCQl9DQotCQkJcmV0dXJuIHJlc3VsdDsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVBZGFwdGVyWzBdOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkU2l0ZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkU2l0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyMjkxYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJlZFNpdGVBZGFwdGVyCi0JZXh0ZW5kcyBVSU1vZGVsT2JqZWN0Ci0JaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIHsKLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgY3NpdGU7Ci0JCQotCXB1YmxpYyBDb25maWd1cmVkU2l0ZUFkYXB0ZXIoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7Ci0JCXRoaXMuY3NpdGUgPSBjc2l0ZTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7Ci0JCXJldHVybiBjc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0PT1udWxsKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmplY3QgPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyID0gKENvbmZpZ3VyZWRTaXRlQWRhcHRlcilvYmplY3Q7Ci0JCQlyZXR1cm4gY3NpdGUhPW51bGwgJiYgY3NpdGUuZ2V0U2l0ZSgpLmVxdWFscyhhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCkuZ2V0U2l0ZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDb25maWd1cmVkU2l0ZSgpLmdldFNpdGUoKS5nZXRVUkwoKS50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9EaXNjb3ZlcnlGb2xkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9EaXNjb3ZlcnlGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwZWIwZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRGlzY292ZXJ5Rm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi1wdWJsaWMgY2xhc3MgRGlzY292ZXJ5Rm9sZGVyIGV4dGVuZHMgQm9va21hcmtGb2xkZXIgewotCXB1YmxpYyBEaXNjb3ZlcnlGb2xkZXIoKSB7Ci0JCXN1cGVyKFVwZGF0ZVVJLmdldFN0cmluZygiRGlzY292ZXJ5Rm9sZGVyLm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TW9kZWwoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkpOwotCX0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQljaGlsZHJlbi5jbGVhcigpOwotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbal07Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJSVVSTEVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKTsKLQkJCQkJaWYgKGVudHJpZXMubGVuZ3RoID4gMCkgewotCQkJCQkJLy8gT25seSBhZGQgZGlzY292ZXJ5IHNpdGVzIGlmCi0JCQkJCQkvLyBvZiByb290IGZlYXR1cmVzCi0JCQkJCQlpZiAoIWlzSW5jbHVkZWQocmVmLCByZWZzKSkKLQkJCQkJCQlhZGRCb29rbWFya3MoZW50cmllcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc0luY2x1ZGVkKAotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcykgewotCQl0cnkgewotCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSByZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgY2FuZGlkYXRlID0gcmVmc1tpXTsKLQkJCQkvLyBJZ25vcmUgc2VsZgotCQkJCWlmIChjYW5kaWRhdGUuZXF1YWxzKHJlZikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCUlGZWF0dXJlIGNmZWF0dXJlID0gY2FuZGlkYXRlLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQkJCWNmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGlyZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGlyZWYgPSBpcmVmc1tqXTsKLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpdmlkID0gaXJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCWlmIChpdmlkLmVxdWFscyh2aWQpKSB7Ci0JCQkJCQkvLyBiaW5nbyAtIGluY2x1ZGVkIGluIGF0IGxlYXN0IG9uZSBmZWF0dXJlCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIHZvaWQgYWRkQm9va21hcmtzKElVUkxFbnRyeVtdIGVudHJpZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVVJMRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0KLQkJCQluZXcgU2l0ZUJvb2ttYXJrKAotCQkJCQllbnRyeS5nZXRBbm5vdGF0aW9uKCksCi0JCQkJCWVudHJ5LmdldFVSTCgpLAotCQkJCQllbnRyeS5nZXRUeXBlKCkgPT0gSVVSTEVudHJ5LldFQl9TSVRFKTsKLQkJCWJvb2ttYXJrLnNldFJlYWRPbmx5KGVudHJ5LmdldFR5cGUoKSAhPSBJVVJMRW50cnkuV0VCX1NJVEUpOwotCQkJaWYgKCFjb250YWlucyhib29rbWFyaykpCi0JCQkJaW50ZXJuYWxBZGQoYm9va21hcmspOwotCQl9Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhTaXRlQm9va21hcmsgYm9va21hcmspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG8gPSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgewotCQkJCS8vIG5vdGU6IG1hdGNoIG9uIFVSTCwgbm90IHRoZSBsYWJlbAotCQkJCWlmIChib29rbWFyay5nZXRVUkwoKS5lcXVhbHMoKChTaXRlQm9va21hcmspIG8pLmdldFVSTCgpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQlpZiAoaGFzQ2hpbGRyZW4oKSA9PSBmYWxzZSkKLQkJCWluaXRpYWxpemUoKTsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzhlN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmVhdHVyZUFkYXB0ZXIgZXh0ZW5kcyBVSU1vZGVsT2JqZWN0IGltcGxlbWVudHMgSUZlYXR1cmVBZGFwdGVyIHsNCi0JcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVkPWZhbHNlOw0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQWRhcHRlciNnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpDQotCSAqLw0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZWQoKSB7DQotCQlyZXR1cm4gaW5jbHVkZWQ7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHNldEluY2x1ZGVkKGJvb2xlYW4gaW5jbHVkZWQpIHsNCi0JCXRoaXMuaW5jbHVkZWQgPSBpbmNsdWRlZDsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXRyeSB7DQotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUobnVsbCk7DQotCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKTsNCi0JCX0NCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlQWRhcHRlci5mYWlsdXJlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJdHJ5IHsNCi0JCQlJRmVhdHVyZVJlZmVyZW5jZSBbXSBpbmNsdWRlZCA9IGdldEZlYXR1cmUobW9uaXRvcikuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCXJldHVybiBpbmNsdWRlZC5sZW5ndGg+MDsNCi0JCX0NCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmMjAwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7DQotDQotcHVibGljIGNsYXNzIEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyIGV4dGVuZHMgRmVhdHVyZUFkYXB0ZXIgew0KLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWY7DQotCXByaXZhdGUgYm9vbGVhbiB0b3VjaGVkOw0KLQ0KLQlwdWJsaWMgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZikgew0KLQkJdGhpcy5mZWF0dXJlUmVmID0gZmVhdHVyZVJlZjsNCi0JCXNldEluY2x1ZGVkKGZlYXR1cmVSZWYgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKTsNCi0JfQ0KLQkNCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gZmVhdHVyZVJlZi5nZXRGZWF0dXJlKG1vbml0b3IpOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldEZhc3RMYWJlbCgpIHsNCi0JCXJldHVybiBmZWF0dXJlUmVmLmdldFVSTCgpLnRvU3RyaW5nKCk7DQotCX0NCi0JDQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgew0KLQkJcmV0dXJuIGZlYXR1cmVSZWYuZ2V0U2l0ZSgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCXJldHVybiBmZWF0dXJlUmVmLmdldFVSTCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgew0KLQkJcmV0dXJuIGZlYXR1cmVSZWYgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlID8gDQotCQkJKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKWZlYXR1cmVSZWYpLmlzT3B0aW9uYWwoKTpmYWxzZTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdG91Y2hJbmNsdWRlZEZlYXR1cmVzKElSdW5uYWJsZUNvbnRleHQgY29udGV4dCkgew0KLQkJaWYgKHRvdWNoZWQpIHJldHVybjsNCi0JCWZpbmFsIElGZWF0dXJlUmVmZXJlbmNlIFtdIGluY2x1ZGVkOw0KLQkJDQotCQl0cnkgew0KLQkJCWluY2x1ZGVkID0gCWdldEZlYXR1cmUobnVsbCkuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJfQ0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWlmIChpbmNsdWRlZC5sZW5ndGggPT0gMCkgcmV0dXJuOw0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcyAoKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJCQltb25pdG9yLmJlZ2luVGFzayhVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVCb29rbWFyay5kb3dubG9hZGluZyIpLCBpbmNsdWRlZC5sZW5ndGgpOyAvLyROT04tTkxTLTEkDQotCQkJCWZvciAoaW50IGk9MDsgaTxpbmNsdWRlZC5sZW5ndGg7IGkrKykgew0KLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gaW5jbHVkZWRbaV07DQotCQkJCQl0cnkgew0KLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhyZWYuZ2V0VVJMKCkudG9TdHJpbmcoKSk7DQotCQkJCQkJcmVmLmdldEZlYXR1cmUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7DQotCQkJCQkJLy9tb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCX0NCi0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQltb25pdG9yLmRvbmUoKTsNCi0JCQl9DQotCQl9Ow0KLQkJdHJ5IHsNCi0JCQljb250ZXh0LnJ1bih0cnVlLCBmYWxzZSwgb3ApOw0KLQkJCXRvdWNoZWQ9dHJ1ZTsNCi0JCX0NCi0JCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIElGZWF0dXJlQWRhcHRlcltdIGdldEluY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQl0cnkgew0KLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQ0KLQkJCQlnZXRGZWF0dXJlKG1vbml0b3IpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcltdIHJlc3VsdCA9DQotCQkJCW5ldyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcltpbmNsdWRlZC5sZW5ndGhdOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsNCi0JCQkJcmVzdWx0W2ldID0gbmV3IEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKGluY2x1ZGVkW2ldKTsNCi0JCQl9DQotCQkJcmV0dXJuIHJlc3VsdDsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVBZGFwdGVyWzBdOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBnZXRGZWF0dXJlUmVmZXJlbmNlKCkgew0KLQkJcmV0dXJuIGZlYXR1cmVSZWY7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTc0M2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBleHRlbmRzIElGZWF0dXJlQWRhcHRlciwgSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCB7DQotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZCgpOw0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZWQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkU2l0ZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTI3MGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkU2l0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIgZXh0ZW5kcyBJQ29uZmlndXJlZFNpdGVDb250ZXh0IHsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZFNpdGVDb250ZXh0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2UyNzhiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZFNpdGVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmVkU2l0ZUNvbnRleHQgewotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKTsKLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldENvbmZpZ3VyZWRTaXRlKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUZlYXR1cmVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMDZiNTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lGZWF0dXJlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUZlYXR1cmVBZGFwdGVyIHsNCi0JcHVibGljIFVSTCBnZXRVUkwoKTsNCi0JcHVibGljIElTaXRlIGdldFNpdGUoKTsNCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0JcHVibGljIElGZWF0dXJlQWRhcHRlciBbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7DQotCXB1YmxpYyBib29sZWFuIGhhc0luY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsNCi0JcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlZCgpOw0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCk7DQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFzdExhYmVsKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JU2l0ZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JU2l0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1ODU1NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSVNpdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVBZGFwdGVyIHsNCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsNCi0JcHVibGljIFVSTCBnZXRVUkwoKTsNCi0JcHVibGljIElTaXRlIGdldFNpdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsNCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL01pc3NpbmdGZWF0dXJlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTWlzc2luZ0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NzE5ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTWlzc2luZ0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nRmVhdHVyZSBpbXBsZW1lbnRzIElGZWF0dXJlIHsNCi0NCi0JcHJpdmF0ZSBVUkwgdXJsOw0KLQlwcml2YXRlIElTaXRlIHNpdGU7DQotCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2UgcmVmZXJlbmNlOw0KLQlwcml2YXRlIElGZWF0dXJlIHBhcmVudDsNCi0JcHJpdmF0ZSBJVVJMRW50cnkgZGVzYzsNCi0JcHJpdmF0ZSBWZXJzaW9uZWRJZGVudGlmaWVyIGlkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNaXNzaW5nRmVhdHVyZS5pZCIpLCAiMC4wLjAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCXB1YmxpYyBNaXNzaW5nRmVhdHVyZShJU2l0ZSBzaXRlLCBVUkwgdXJsKSB7DQotCQl0aGlzLnNpdGUgPSBzaXRlOw0KLQkJdGhpcy51cmwgPSB1cmw7DQotCQlkZXNjID0gbmV3IElVUkxFbnRyeSgpIHsNCi0JCQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbigpIHsNCi0JCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiTWlzc2luZ0ZlYXR1cmUuZGVzYy51bmtub3duIik7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgew0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQkJcHVibGljIGludCBnZXRUeXBlKCkgew0KLQkJCQlyZXR1cm4gSVVSTEVudHJ5LlVQREFURV9TSVRFOw0KLQkJCX0NCi0JCX07DQotCX0NCi0JcHVibGljIE1pc3NpbmdGZWF0dXJlKElGZWF0dXJlUmVmZXJlbmNlIHJlZikgew0KLQkJdGhpcyhudWxsLCByZWYpOw0KLQl9DQotDQotCXB1YmxpYyBNaXNzaW5nRmVhdHVyZShJRmVhdHVyZSBwYXJlbnQsIElGZWF0dXJlUmVmZXJlbmNlIHJlZikgew0KLQkJdGhpcyhyZWYuZ2V0U2l0ZSgpLCByZWYuZ2V0VVJMKCkpOw0KLQkJdGhpcy5yZWZlcmVuY2UgPSByZWY7DQotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsNCi0NCi0JCWlmIChpc09wdGlvbmFsKCkpIHsNCi0JCQlkZXNjID0gbmV3IElVUkxFbnRyeSgpIHsNCi0JCQkJcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQkJCQlyZXR1cm4gbnVsbDsNCi0JCQkJfQ0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb24oKSB7DQotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJNaXNzaW5nRmVhdHVyZS5kZXNjLm9wdGlvbmFsIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7DQotCQkJCQlyZXR1cm4gbnVsbDsNCi0JCQkJfQ0KLQkJCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7DQotCQkJCQlyZXR1cm4gSVVSTEVudHJ5LlVQREFURV9TSVRFOw0KLQkJCQl9DQotCQkJfTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgew0KLQkJcmV0dXJuIHJlZmVyZW5jZSAhPSBudWxsDQotCQkJJiYgcmVmZXJlbmNlIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZQ0KLQkJCSYmICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgcmVmZXJlbmNlKS5pc09wdGlvbmFsKCk7DQotCX0NCi0NCi0JcHVibGljIElGZWF0dXJlIGdldFBhcmVudCgpIHsNCi0JCXJldHVybiBwYXJlbnQ7DQotCX0NCi0NCi0JcHVibGljIFVSTCBnZXRPcmlnaW5hdGluZ1NpdGVVUkwoKSB7DQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0JCWlmICh2aWQgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCVN0cmluZyBrZXkgPSB2aWQuZ2V0SWRlbnRpZmllcigpOw0KLQkJcmV0dXJuIFVwZGF0ZVVJLmdldE9yaWdpbmF0aW5nVVJMKGtleSk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJZGVudGlmaWVyKCkNCi0JICovDQotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKSB7DQotCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsNCi0JCQl0cnkgew0KLQkJCQlyZXR1cm4gcmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gaWQ7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRTaXRlKCkNCi0JICovDQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgew0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRMYWJlbCgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgew0KLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsDQotCQkJJiYgcmVmZXJlbmNlIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgew0KLQkJCVN0cmluZyBuYW1lID0gKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSByZWZlcmVuY2UpLmdldE5hbWUoKTsNCi0JCQlpZiAobmFtZSAhPSBudWxsKQ0KLQkJCQlyZXR1cm4gbmFtZTsNCi0JCX0NCi0JCXJldHVybiB1cmwudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldFVSTCgpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRVcGRhdGVJbmZvKCkNCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0VXBkYXRlU2l0ZUVudHJ5KCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXREaXNjb3ZlcnlJbmZvcygpDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5W10gZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldFByb3ZpZGVyKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXIoKSB7DQotCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJNaXNzaW5nRmVhdHVyZS5wcm92aWRlciIpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXREZXNjcmlwdGlvbigpDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldERlc2NyaXB0aW9uKCkgew0KLQkJcmV0dXJuIGRlc2M7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRDb3B5cmlnaHQoKQ0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXRDb3B5cmlnaHQoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldExpY2Vuc2UoKQ0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXRMaWNlbnNlKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRPUygpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE9TKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRXUygpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXROTCgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRBcmNoKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0T1NBcmNoKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbWFnZSgpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEltYWdlKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbXBvcnRzKCkNCi0JICovDQotCXB1YmxpYyBJSW1wb3J0W10gZ2V0SW1wb3J0cygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0QXJjaGl2ZXMoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZ1tdIGdldEFyY2hpdmVzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXREYXRhRW50cmllcygpDQotCSAqLw0KLQlwdWJsaWMgSU5vblBsdWdpbkVudHJ5W10gZ2V0Tm9uUGx1Z2luRW50cmllcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjYWRkRGF0YUVudHJ5KElEYXRhRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGROb25QbHVnaW5FbnRyeShJTm9uUGx1Z2luRW50cnkgZGF0YUVudHJ5KSB7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXREb3dubG9hZFNpemUoKQ0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplKCkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbnN0YWxsU2l6ZShJU2l0ZSkNCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplKCkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNpc1ByaW1hcnkoKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5KCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0QXBwbGljYXRpb24oKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXRQbHVnaW5FbnRyaWVzKCkNCi0JICovDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRQbHVnaW5FbnRyaWVzKCkgew0KLQkJcmV0dXJuIG5ldyBJUGx1Z2luRW50cnlbMF07DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2dldFBsdWdpbkVudHJ5Q291bnQoKQ0KLQkgKi8NCi0JcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2dldERvd25sb2FkU2l6ZShJUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemUoSVBsdWdpbkVudHJ5IGVudHJ5KSB7DQotCQlyZXR1cm4gMDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0SW5zdGFsbFNpemUoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0SW5zdGFsbFNpemUoSVBsdWdpbkVudHJ5IGVudHJ5KSB7DQotCQlyZXR1cm4gMDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI3N0b3JlKElQbHVnaW5FbnRyeSwgU3RyaW5nLCBJbnB1dFN0cmVhbSkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3JlKElQbHVnaW5FbnRyeSBlbnRyeSwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQ0KLQkgKi8NCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNyZW1vdmUoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlKElQbHVnaW5FbnRyeSBlbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihJRmVhdHVyZUNvbnRlbnRQcm92aWRlcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgZmVhdHVyZUNvbnRlbnRQcm92aWRlcikgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI3NldFNpdGUoSVNpdGUpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRoaXMuc2l0ZSA9IHNpdGU7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBnZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjaW5zdGFsbChJRmVhdHVyZSxJVmVyaWZpZXIsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbCgNCi0JCUlGZWF0dXJlIHRhcmdldEZlYXR1cmUsDQotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsDQotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2luc3RhbGwoSUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10sIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKA0KLQkJSUZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywNCi0JCUlWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwNCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI3JlbW92ZShJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNyZW1vdmUoSVBsdWdpbkVudHJ5LCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlKElQbHVnaW5FbnRyeSBlbnRyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0Tm9uUGx1Z2luRW50cnlDb3VudCgpDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldE5vblBsdWdpbkVudHJ5Q291bnQoKSB7DQotCQlyZXR1cm4gMDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldEluc3RhbGxIYW5kbGVyRW50cnkoKQ0KLQkgKi8NCi0JcHVibGljIElJbnN0YWxsSGFuZGxlckVudHJ5IGdldEluc3RhbGxIYW5kbGVyRW50cnkoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBnZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBuZXcgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVswXTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRBZmZpbml0eUZlYXR1cmUoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBZmZpbml0eUZlYXR1cmUoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2dldFJhd05vblBsdWdpbkVudHJpZXMoKQ0KLQkgKi8NCi0JcHVibGljIElOb25QbHVnaW5FbnRyeVtdIGdldFJhd05vblBsdWdpbkVudHJpZXMoKSB7DQotCQlyZXR1cm4gZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2dldFJhd1BsdWdpbkVudHJpZXMoKQ0KLQkgKi8NCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFJhd1BsdWdpbkVudHJpZXMoKSB7DQotCQlyZXR1cm4gZ2V0UGx1Z2luRW50cmllcygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2dldFByaW1hcnlQbHVnaW5JRCgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlQbHVnaW5JRCgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2dldFJhd0ltcG9ydHMoKQ0KLQkgKi8NCi0JcHVibGljIElJbXBvcnRbXSBnZXRSYXdJbXBvcnRzKCkgew0KLQkJcmV0dXJuIG5ldyBJSW1wb3J0WzBdOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2lzUGF0Y2goKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdXNpdmUoKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL05hbWVkTW9kZWxPYmplY3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9OYW1lZE1vZGVsT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjJmODkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL05hbWVkTW9kZWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC4qOwotCi1wdWJsaWMgY2xhc3MgTmFtZWRNb2RlbE9iamVjdCBleHRlbmRzIFVJTW9kZWxPYmplY3QgCi0JCQkJCQkJaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciwgU2VyaWFsaXphYmxlICB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQl0cmFuc2llbnQgcHJpdmF0ZSBOYW1lZE1vZGVsT2JqZWN0IHBhcmVudDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX05BTUU9InBfbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgTmFtZWRNb2RlbE9iamVjdCgpIHsKLQl9Ci0JCi0JcHVibGljIE5hbWVkTW9kZWxPYmplY3QoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG51bGwpOwotCQlpZiAocGFyZW50IT1udWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIE5hbWVkTW9kZWxPYmplY3QpCi0JCQlyZXR1cm4gKChOYW1lZE1vZGVsT2JqZWN0KXBhcmVudCkuZ2V0UGF0aCgpLmFwcGVuZChnZXROYW1lKCkpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFBhdGgoZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQlub3RpZnlPYmplY3RDaGFuZ2VkKFBfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgYXJnMCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTmFtZWRNb2RlbE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpbXBsZUZlYXR1cmVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2ltcGxlRmVhdHVyZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhMjNmNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2ltcGxlRmVhdHVyZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2ltcGxlRmVhdHVyZUFkYXB0ZXIgZXh0ZW5kcyBGZWF0dXJlQWRhcHRlciB7DQotCXByb3RlY3RlZCBJRmVhdHVyZSBmZWF0dXJlOw0KLQlwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWw7DQotCXB1YmxpYyBTaW1wbGVGZWF0dXJlQWRhcHRlcihJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl0aGlzKGZlYXR1cmUsIGZhbHNlKTsNCi0JfQ0KLQlwdWJsaWMgU2ltcGxlRmVhdHVyZUFkYXB0ZXIoSUZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBvcHRpb25hbCkgew0KLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsNCi0JCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsNCi0JfQ0KLQkNCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gZmVhdHVyZTsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRGYXN0TGFiZWwoKSB7DQotCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCXJldHVybiBmZWF0dXJlLmdldFVSTCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpIHsNCi0JCXJldHVybiBmZWF0dXJlLmdldFNpdGUoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElGZWF0dXJlQWRhcHRlcltdIGdldEluY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQl0cnkgew0KLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9IGdldEZlYXR1cmUobW9uaXRvcikuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCVNpbXBsZUZlYXR1cmVBZGFwdGVyW10gcmVzdWx0ID0NCi0JCQkJbmV3IFNpbXBsZUZlYXR1cmVBZGFwdGVyW2luY2x1ZGVkLmxlbmd0aF07DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgew0KLQkJCQlyZXN1bHRbaV0gPQ0KLQkJCQkJbmV3IFNpbXBsZUZlYXR1cmVBZGFwdGVyKGluY2x1ZGVkW2ldLmdldEZlYXR1cmUobnVsbCksIGluY2x1ZGVkW2ldLmlzT3B0aW9uYWwoKSk7DQotCQkJCXJlc3VsdFtpXS5zZXRJbmNsdWRlZCh0cnVlKTsNCi0JCQl9DQotCQkJcmV0dXJuIHJlc3VsdDsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVBZGFwdGVyWzBdOw0KLQkJfQ0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7DQotCQlyZXR1cm4gb3B0aW9uYWw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVCb29rbWFyay5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVCb29rbWFyay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjkzZWY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQm9va21hcmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7DQotDQotcHVibGljIGNsYXNzIFNpdGVCb29rbWFyayBleHRlbmRzIE5hbWVkTW9kZWxPYmplY3QgDQotCQkJCQkJCWltcGxlbWVudHMgSVNpdGVBZGFwdGVyIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9VUkw9InBfdXJsIjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1RZUEU9InBfdHlwZSI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCXByaXZhdGUgVVJMIHVybDsNCi0JdHJhbnNpZW50IHByaXZhdGUgSVNpdGUgc2l0ZTsNCi0JdHJhbnNpZW50IHByaXZhdGUgVmVjdG9yIGNhdGFsb2c7DQotCXRyYW5zaWVudCBwcml2YXRlIFNpdGVDYXRlZ29yeSBvdGhlckNhdGVnb3J5Ow0KLQlwcml2YXRlIGJvb2xlYW4gd2ViQm9va21hcms7DQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZDsNCi0JcHJpdmF0ZSBTdHJpbmcgW10gaWdub3JlZENhdGVnb3JpZXMgPSBuZXcgU3RyaW5nWzBdOw0KLQlwcml2YXRlIGJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsNCi0JcHJpdmF0ZSBib29sZWFuIGxvY2FsID0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGZhbHNlOw0KLQ0KLQlwdWJsaWMgU2l0ZUJvb2ttYXJrKCkgew0KLQl9DQotCQ0KLQlwdWJsaWMgU2l0ZUJvb2ttYXJrKFN0cmluZyBuYW1lLCBVUkwgdXJsLCBib29sZWFuIHdlYkJvb2ttYXJrKSB7DQotCQl0aGlzKG5hbWUsIHVybCwgd2ViQm9va21hcmssIGZhbHNlKTsNCi0JfQ0KLQkNCi0JcHVibGljIFNpdGVCb29rbWFyayhTdHJpbmcgbmFtZSwgVVJMIHVybCwgYm9vbGVhbiB3ZWJCb29rbWFyaywgYm9vbGVhbiBzZWxlY3RlZCkgew0KLQkJc3VwZXIobmFtZSk7DQotCQl0aGlzLnVybCA9IHVybDsNCi0JCXRoaXMud2ViQm9va21hcmsgPSB3ZWJCb29rbWFyazsNCi0JCXRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7DQotCQl0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7DQotCQlyZXR1cm4gc2VsZWN0ZWQ7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgW10gZ2V0SWdub3JlZENhdGVnb3JpZXMoKSB7DQotCQlyZXR1cm4gaWdub3JlZENhdGVnb3JpZXM7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldElnbm9yZWRDYXRlZ29yaWVzKFN0cmluZyBbXSBjYXRlZ29yaWVzKSB7DQotCQl0aGlzLmlnbm9yZWRDYXRlZ29yaWVzID0gY2F0ZWdvcmllczsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0V2ViQm9va21hcmsoYm9vbGVhbiB2YWx1ZSkgew0KLQkJaWYgKGlzTG9jYWwoKSkgcmV0dXJuOw0KLQkJdGhpcy53ZWJCb29rbWFyayA9IHZhbHVlOw0KLQkJbm90aWZ5T2JqZWN0Q2hhbmdlZChQX1RZUEUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYkJvb2ttYXJrKCkgew0KLQkJcmV0dXJuIHdlYkJvb2ttYXJrOw0KLQl9DQotCQ0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgc2V0VVJMKFVSTCB1cmwpIHsNCi0JCXRoaXMudXJsID0gdXJsOw0KLQkJc2l0ZSA9IG51bGw7DQotCQlub3RpZnlPYmplY3RDaGFuZ2VkKFBfVVJMKTsNCi0JfQ0KLQkNCi0JcHVibGljIElTaXRlIGdldFNpdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQlyZXR1cm4gZ2V0U2l0ZSh0cnVlLCBtb25pdG9yKTsNCi0JfQ0KLQkNCi0JcHVibGljIElTaXRlIGdldFNpdGUoYm9vbGVhbiBzaG93RGlhbG9nSWZGYWlsZWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJaWYgKHNpdGU9PW51bGwpIHsNCi0JCQl0cnkgew0KLQkJCQljb25uZWN0KG1vbml0b3IpOw0KLQkJCX0NCi0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlLCBzaG93RGlhbG9nSWZGYWlsZWQpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1NpdGVDb25uZWN0ZWQoKSB7DQotCQlyZXR1cm4gc2l0ZSE9bnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgY29ubmVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWNvbm5lY3QodHJ1ZSwgbW9uaXRvcik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoYm9vbGVhbiB1c2VDYWNoZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCWlmIChtb25pdG9yPT1udWxsKSBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMik7IC8vJE5PTi1OTFMtMSQNCi0JCQltb25pdG9yLnN1YlRhc2soVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiU2l0ZUJvb2ttYXJrLmNvbm5lY3RpbmciLCB1cmwudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkDQotCQkJc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUodXJsLCB1c2VDYWNoZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7DQotCQkJaWYgKHNpdGUhPW51bGwpIHsNCi0JCQkJY3JlYXRlQ2F0YWxvZyhuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsNCi0JCQkJdW5hdmFpbGFibGUgPSBmYWxzZTsNCi0JCQl9IGVsc2Ugew0KLQkJCQljYXRhbG9nID0gbmV3IFZlY3RvcigpOw0KLQkJCQl1bmF2YWlsYWJsZSA9IHRydWU7DQotCQkJfQ0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdW5hdmFpbGFibGUgPSB0cnVlOw0KLQkJCXRocm93IGU7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzVW5hdmFpbGFibGUoKSB7DQotCQlyZXR1cm4gdW5hdmFpbGFibGU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldFVuYXZhaWxhYmxlKGJvb2xlYW4gdmFsdWUpIHsNCi0JCXVuYXZhaWxhYmxlID0gdmFsdWU7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBjcmVhdGVDYXRhbG9nKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJY2F0YWxvZyA9IG5ldyBWZWN0b3IoKTsNCi0JCW90aGVyQ2F0ZWdvcnkgPSBuZXcgU2l0ZUNhdGVnb3J5KHRoaXMsIG51bGwsIG51bGwpOw0KLQkJLy8gQWRkIGFsbCB0aGUgY2F0ZWdvcmllcw0KLQkJSUNhdGVnb3J5IFtdIGNhdGVnb3JpZXMgPSBzaXRlLmdldENhdGVnb3JpZXMoKTsNCi0JCQ0KLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIFtdIGZlYXR1cmVSZWZzOw0KLQkJZmVhdHVyZVJlZnMgPSBzaXRlLmdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkNCi0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBmZWF0dXJlUmVmcy5sZW5ndGggKyBjYXRlZ29yaWVzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWZvciAoaW50IGk9MDsgaTxjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUNhdGVnb3J5IGNhdGVnb3J5ID0gY2F0ZWdvcmllc1tpXTsNCi0JCQlhZGRDYXRlZ29yeVRvQ2F0YWxvZyhjYXRlZ29yeSk7DQotCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQl9DQotCQkvLyBBZGQgZmVhdHVyZXMgdG8gY2F0ZWdvcmllcw0KLQ0KLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYgPSBmZWF0dXJlUmVmc1tpXTsNCi0JCQlhZGRGZWF0dXJlVG9DYXRhbG9nKGZlYXR1cmVSZWYpOw0KLQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJfQ0KLQkJaWYgKG90aGVyQ2F0ZWdvcnkuZ2V0Q2hpbGRDb3VudCgpPjApDQotCQkgICBjYXRhbG9nLmFkZChvdGhlckNhdGVnb3J5KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0IFtdIGdldENhdGFsb2coYm9vbGVhbiB3aXRoQ2F0ZWdvcmllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQlpZiAod2l0aENhdGVnb3JpZXMpDQotCQkJcmV0dXJuIGNhdGFsb2cudG9BcnJheSgpOw0KLQkJZWxzZSB7DQotCQkJLy8gTWFrZSBhIGZsYXQgY2F0YWxvZw0KLQkJCVZlY3RvciBmbGF0Q2F0YWxvZyA9IG5ldyBWZWN0b3IoKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8Y2F0YWxvZy5zaXplKCk7IGkrKykgew0KLQkJCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KWNhdGFsb2cuZ2V0KGkpOw0KLQkJCQljYXRlZ29yeS5hZGRGZWF0dXJlc1RvKGZsYXRDYXRhbG9nKTsNCi0JCQl9DQotCQkJcmV0dXJuIGZsYXRDYXRhbG9nLnRvQXJyYXkoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGFkZENhdGVnb3J5VG9DYXRhbG9nKElDYXRlZ29yeSBjYXRlZ29yeSkgew0KLQkJU3RyaW5nIG5hbWUgPSBjYXRlZ29yeS5nZXROYW1lKCk7DQotCQlpbnQgbG9jID0gbmFtZS5pbmRleE9mKCcvJyk7DQotCQlpZiAobG9jID09IC0xKSB7DQotCQkJLy8gZmlyc3QgbGV2ZWwNCi0JCQljYXRhbG9nLmFkZChuZXcgU2l0ZUNhdGVnb3J5KHRoaXMsIG5hbWUsIGNhdGVnb3J5KSk7DQotCQl9DQotCQllbHNlIHsNCi0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobmFtZSk7DQotCQkJbmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOw0KLQkJCXBhdGggPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsNCi0JCQlTaXRlQ2F0ZWdvcnkgcGFyZW50Q2F0ZWdvcnkgPSBmaW5kQ2F0ZWdvcnkocGF0aCwgY2F0YWxvZy50b0FycmF5KCkpOw0KLQkJCWlmIChwYXJlbnRDYXRlZ29yeSE9bnVsbCkgew0KLQkJCQlwYXJlbnRDYXRlZ29yeS5hZGQobmV3IFNpdGVDYXRlZ29yeSh0aGlzLCBuYW1lLCBjYXRlZ29yeSkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwcml2YXRlIHZvaWQgYWRkRmVhdHVyZVRvQ2F0YWxvZyhJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZSkgew0KLQkJSUNhdGVnb3J5IFtdIGNhdGVnb3JpZXMgPSBmZWF0dXJlLmdldENhdGVnb3JpZXMoKTsNCi0JCWJvb2xlYW4gb3JwaGFuID0gdHJ1ZTsNCi0NCi0JCWZvciAoaW50IGk9MDsgaTxjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUNhdGVnb3J5IGNhdGVnb3J5ID0gY2F0ZWdvcmllc1tpXTsNCi0JCQlTdHJpbmcgbmFtZSA9IGNhdGVnb3J5LmdldE5hbWUoKTsNCi0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobmFtZSk7DQotCQkJU2l0ZUNhdGVnb3J5IHBhcmVudENhdGVnb3J5ID0gZmluZENhdGVnb3J5KHBhdGgsIGNhdGFsb2cudG9BcnJheSgpKTsNCi0JCQlpZiAocGFyZW50Q2F0ZWdvcnkhPW51bGwpIHsNCi0JCSAgIAkJcGFyZW50Q2F0ZWdvcnkuYWRkKG5ldyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcihmZWF0dXJlKSk7DQotCQkgICAJCW9ycGhhbiA9IGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0JCWlmIChvcnBoYW4pDQotCQkJb3RoZXJDYXRlZ29yeS5hZGQobmV3IEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKGZlYXR1cmUpKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTaXRlQ2F0ZWdvcnkgZmluZENhdGVnb3J5KElQYXRoIHBhdGgsIE9iamVjdCBbXSBjaGlsZHJlbikgew0KLQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5baV07DQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB7DQotCQkJCVNpdGVDYXRlZ29yeSBzYyA9IChTaXRlQ2F0ZWdvcnkpY2hpbGQ7DQotCQkJCWlmIChzYy5nZXROYW1lKCkuZXF1YWxzKHBhdGguc2VnbWVudCgwKSkpIHsNCi0JCQkJICAgaWYgKHBhdGguc2VnbWVudENvdW50KCk9PTEpIHJldHVybiBzYzsNCi0JCQkJCWVsc2Ugew0KLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7DQotCQkJCQkJcmV0dXJuIGZpbmRDYXRlZ29yeShwYXRoLCBzYy5nZXRDaGlsZHJlbigpKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCS8qKg0KLQkgKiBAc2VlIElTaXRlQWRhcHRlciNnZXRMYWJlbCgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgew0KLQkJcmV0dXJuIGdldE5hbWUoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgew0KLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5Ow0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgew0KLQkJcmV0dXJuIHJlYWRPbmx5Ow0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbChib29sZWFuIGxvY2FsKSB7DQotCQl0aGlzLmxvY2FsID0gbG9jYWw7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzTG9jYWwoKSB7DQotCQlyZXR1cm4gbG9jYWw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzI1MGFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBTaXRlQ2F0ZWdvcnkgZXh0ZW5kcyBVSU1vZGVsT2JqZWN0IHsNCi0NCi0JVmVjdG9yIGNoaWxkcmVuOw0KLQlwcml2YXRlIElDYXRlZ29yeSBjYXRlZ29yeTsNCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCi0JcHJpdmF0ZSBib29sZWFuIHRvdWNoZWQ7DQotCXByaXZhdGUgaW50IGZlYXR1cmVDb3VudDsNCi0JcHJpdmF0ZSBib29sZWFuIGNhbmNlbGVkOw0KLQlwcml2YXRlIFNpdGVCb29rbWFyayBib29rbWFyazsNCi0NCi0JY2xhc3MgT3RoZXJDYXRlZ29yeSBpbXBsZW1lbnRzIElDYXRlZ29yeSB7DQotCQlJVVJMRW50cnkgZW50cnk7DQotCQlwdWJsaWMgT3RoZXJDYXRlZ29yeSgpIHsNCi0JCQllbnRyeSA9IG5ldyBJVVJMRW50cnkoKSB7DQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbigpIHsNCi0JCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVDYXRlZ29yeS5vdGhlci5kZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQkJCQlyZXR1cm4gbnVsbDsNCi0JCQkJfQ0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2xhenopIHsNCi0JCQkJCXJldHVybiBudWxsOw0KLQkJCQl9DQotCQkJCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsNCi0JCQkJCXJldHVybiBJVVJMRW50cnkuVVBEQVRFX1NJVEU7DQotCQkJCX0NCi0JCQl9Ow0KLQkJfQ0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJCXJldHVybiBTaXRlQ2F0ZWdvcnkudGhpcy5nZXROYW1lKCk7DQotCQl9DQotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgew0KLQkJCXJldHVybiBTaXRlQ2F0ZWdvcnkudGhpcy5nZXROYW1lKCk7DQotCQl9DQotCQlwdWJsaWMgSVVSTEVudHJ5IGdldERlc2NyaXB0aW9uKCkgew0KLQkJCXJldHVybiBlbnRyeTsNCi0JCX0NCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBjbGF6eikgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBTaXRlQ2F0ZWdvcnkoU2l0ZUJvb2ttYXJrIGJvb2ttYXJrLCBTdHJpbmcgbmFtZSwgSUNhdGVnb3J5IGNhdGVnb3J5KSB7DQotCQl0aGlzLmJvb2ttYXJrID0gYm9va21hcms7DQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgew0KLQkJCXRoaXMubmFtZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZUNhdGVnb3J5Lm90aGVyLmxhYmVsIik7IC8vJE5PTi1OTFMtMSQNCi0JCQl0aGlzLmNhdGVnb3J5ID0gbmV3IE90aGVyQ2F0ZWdvcnkoKTsNCi0JCX0gZWxzZSB7DQotCQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7DQotCQl9DQotCQljaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsNCi0JfQ0KLQkNCi0JcHVibGljIFNpdGVCb29rbWFyayBnZXRCb29rbWFyaygpIHsNCi0JCXJldHVybiBib29rbWFyazsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc090aGVyQ2F0ZWdvcnkoKSB7DQotCQlyZXR1cm4gY2F0ZWdvcnkgaW5zdGFuY2VvZiBPdGhlckNhdGVnb3J5Ow0KLQl9DQotDQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsNCi0JCXJldHVybiBjYW5jZWxlZCA/IG5ldyBPYmplY3RbMF0gOiBjaGlsZHJlbi50b0FycmF5KCk7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgew0KLQkJcmV0dXJuIGNhbmNlbGVkID8gMCA6IGNoaWxkcmVuLnNpemUoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCQlyZXR1cm4gbmFtZTsNCi0JfQ0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgew0KLQkJcmV0dXJuIGNhdGVnb3J5LmdldE5hbWUoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGNhdGVnb3J5LmdldExhYmVsKCk7DQotCX0NCi0NCi0JcHVibGljIElDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIHsNCi0JCXJldHVybiBjYXRlZ29yeTsNCi0JfQ0KLQ0KLQl2b2lkIGFkZChPYmplY3QgY2hpbGQpIHsNCi0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikNCi0JCQlmZWF0dXJlQ291bnQrKzsNCi0JCWNoaWxkcmVuLmFkZChjaGlsZCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdG91Y2hGZWF0dXJlcyhJUnVubmFibGVDb250ZXh0IGNvbnRleHQpIHsNCi0JCWlmIChjaGlsZHJlbi5zaXplKCkgPT0gMCB8fCB0b3VjaGVkIHx8IGZlYXR1cmVDb3VudCA9PSAwKQ0KLQkJCXJldHVybjsNCi0NCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJCQltb25pdG9yLmJlZ2luVGFzaygNCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZUJvb2ttYXJrLmRvd25sb2FkaW5nIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJCWZlYXR1cmVDb3VudCk7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsNCi0JCQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuLmdldChpKTsNCi0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkNCi0JCQkJCQlicmVhazsNCi0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikgew0KLQkJCQkJCUlGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0gKElGZWF0dXJlQWRhcHRlcikgY2hpbGQ7DQotCQkJCQkJbW9uaXRvci5zdWJUYXNrKGFkYXB0ZXIuZ2V0RmFzdExhYmVsKCkpOw0KLQkJCQkJCXRyeSB7DQotCQkJCQkJCWFkYXB0ZXIuZ2V0RmVhdHVyZSgNCi0JCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOw0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQltb25pdG9yLmRvbmUoKTsNCi0JCQl9DQotCQl9Ow0KLQ0KLQkJdHJ5IHsNCi0JCQljb250ZXh0LnJ1bih0cnVlLCB0cnVlLCBvcCk7DQotCQkJdG91Y2hlZCA9IHRydWU7DQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQotCQkJY2FuY2VsZWQgPSB0cnVlOw0KLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZXNUbyhWZWN0b3IgZmxhdExpc3QpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsNCi0JCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7DQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIpIHsNCi0JCQkJRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIgY2ZlYXR1cmUgPQ0KLQkJCQkJKEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKSBjaGlsZDsNCi0JCQkJLy8gRG9uJ3QgYWRkIGR1cGxpY2F0ZXMgLSB0aGVyZSBtYXkgYmUgdGhlIHNhbWUNCi0JCQkJLy8gZmVhdHVyZSBwcmVzZW50IGluIHNldmVyYWwgY2F0ZWdvcmllcw0KLQkJCQlpZiAoZmluZEZlYXR1cmUoZmxhdExpc3QsIGNmZWF0dXJlLmdldEZlYXR1cmVSZWZlcmVuY2UoKSkNCi0JCQkJCT09IG51bGwpIHsNCi0JCQkJCWZsYXRMaXN0LmFkZChjaGlsZCk7DQotCQkJCX0NCi0JCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB7DQotCQkJCSgoU2l0ZUNhdGVnb3J5KSBjaGlsZCkuYWRkRmVhdHVyZXNUbyhmbGF0TGlzdCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIgZmluZEZlYXR1cmUoDQotCQlWZWN0b3IgZmxhdExpc3QsDQotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYXRMaXN0LnNpemUoKTsgaSsrKSB7DQotCQkJRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIgY2ZlYXR1cmUgPQ0KLQkJCQkoRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIpIGZsYXRMaXN0LmdldChpKTsNCi0JCQlpZiAoY2ZlYXR1cmUuZ2V0RmVhdHVyZVJlZmVyZW5jZSgpLmVxdWFscyhmZWF0dXJlUmVmKSkNCi0JCQkJcmV0dXJuIGNmZWF0dXJlOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VJTW9kZWxPYmplY3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VSU1vZGVsT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODRkYmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VJTW9kZWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC4qOwotCi0KLXB1YmxpYyBjbGFzcyBVSU1vZGVsT2JqZWN0IGV4dGVuZHMgUGxhdGZvcm1PYmplY3QgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7Ci0JVXBkYXRlTW9kZWwgbW9kZWw7Ci0JCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoVXBkYXRlTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQkKLQlwdWJsaWMgVXBkYXRlTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5T2JqZWN0Q2hhbmdlZChTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKG1vZGVsPT1udWxsKSByZXR1cm47Ci0JCW1vZGVsLmZpcmVPYmplY3RDaGFuZ2VkKHRoaXMsIHByb3BlcnR5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5T2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBbXSBvYmplY3RzKSB7Ci0JCWlmIChtb2RlbD09bnVsbCkgcmV0dXJuOwotCQltb2RlbC5maXJlT2JqZWN0c0FkZGVkKHBhcmVudCwgb2JqZWN0cyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBbXSBvYmplY3RzKSB7Ci0JCWlmIChtb2RlbD09bnVsbCkgcmV0dXJuOwotCQltb2RlbC5maXJlT2JqZWN0c1JlbW92ZWQocGFyZW50LCBvYmplY3RzKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VwZGF0ZU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvVXBkYXRlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3YWUyMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvVXBkYXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNb2RlbCBpbXBsZW1lbnRzIElBZGFwdGFibGUgew0KLQlwcml2YXRlIFZlY3RvciBib29rbWFya3MgPSBuZXcgVmVjdG9yKCk7DQotCXByaXZhdGUgVmVjdG9yIGxpc3RlbmVycyA9IG5ldyBWZWN0b3IoKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX0ZJTEUgPSAiYm9va21hcmtzLnhtbCI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBVcGRhdGVNb2RlbCgpIHsNCi0JCXJlc2V0KCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgew0KLQkJLy8gbG9hZCBib29rbWFya3MNCi0JCWJvb2ttYXJrcy5jbGVhcigpOw0KLQkJQm9va21hcmtVdGlsLnBhcnNlKGdldEJvb2ttYXJrc0ZpbGVOYW1lKCksIGJvb2ttYXJrcyk7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIGdldEJvb2ttYXJrc0ZpbGVOYW1lKCkgew0KLQkJVVJMIHBsYXRmb3JtWE1MID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOw0KLQkJaWYgKCEiZmlsZSIuZXF1YWxzKHBsYXRmb3JtWE1MLmdldFByb3RvY29sKCkpKSB7DQotCQkJSVBhdGggcGF0aCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7DQotCQkJcGF0aCA9IHBhdGguYXBwZW5kKEJPT0tNQVJLX0ZJTEUpOw0KLQkJCXJldHVybiBwYXRoLnRvT1NTdHJpbmcoKTsNCi0JCX0gZWxzZSB7DQotCQkJRmlsZSBmID0gbmV3IEZpbGUocGxhdGZvcm1YTUwuZ2V0RmlsZSgpKTsNCi0JCQlmID0gbmV3IEZpbGUoZi5nZXRQYXJlbnRGaWxlKCksIEJPT0tNQVJLX0ZJTEUpOw0KLQkJCXJldHVybiBmLmdldEFic29sdXRlUGF0aCgpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsNCi0JCXNhdmVCb29rbWFya3MoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2F2ZUJvb2ttYXJrcygpIHsNCi0JCUJvb2ttYXJrVXRpbC5zdG9yZShnZXRCb29rbWFya3NGaWxlTmFtZSgpLCBib29rbWFya3MpOw0KLQl9DQotCQ0KLQkNCi0JcHVibGljIHZvaWQgYWRkQm9va21hcmsoTmFtZWRNb2RlbE9iamVjdCBib29rbWFyaykgew0KLQkJYm9va21hcmtzLmFkZChib29rbWFyayk7DQotCQlib29rbWFyay5zZXRNb2RlbCh0aGlzKTsNCi0JCWZpcmVPYmplY3RzQWRkZWQobnVsbCwgbmV3IE9iamVjdCBbXXtib29rbWFya30pOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVCb29rbWFyayhOYW1lZE1vZGVsT2JqZWN0IGJvb2ttYXJrKSB7DQotCQlib29rbWFya3MucmVtb3ZlKGJvb2ttYXJrKTsNCi0JCWJvb2ttYXJrLnNldE1vZGVsKG51bGwpOw0KLQkJZmlyZU9iamVjdHNSZW1vdmVkKG51bGwsIG5ldyBPYmplY3QgW117Ym9va21hcmt9KTsNCi0JfQ0KLQkNCi0JcHVibGljIE5hbWVkTW9kZWxPYmplY3QgW10gZ2V0Qm9va21hcmtzKCkgew0KLQkJcmV0dXJuIChOYW1lZE1vZGVsT2JqZWN0W10pYm9va21hcmtzLnRvQXJyYXkobmV3IE5hbWVkTW9kZWxPYmplY3RbYm9va21hcmtzLnNpemUoKV0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgU2l0ZUJvb2ttYXJrIFtdIGdldEJvb2ttYXJrTGVhZnMoKSB7DQotCQlyZXR1cm4gQm9va21hcmtVdGlsLmdldEJvb2ttYXJrcyhib29rbWFya3MpOw0KLQl9DQotCQ0KLQlwdWJsaWMgQm9va21hcmtGb2xkZXIgZ2V0Rm9sZGVyKElQYXRoIHBhdGgpIHsNCi0JCXJldHVybiBCb29rbWFya1V0aWwuZ2V0Rm9sZGVyKGJvb2ttYXJrcywgcGF0aCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSANCi0JCSAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOw0KLQl9DQotDQotDQotCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpDQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGZpcmVPYmplY3RzQWRkZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IFtdIGNoaWxkcmVuKSB7DQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9bGlzdGVuZXJzLml0ZXJhdG9yKCk7DQotCQkJCWl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCUlVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIpaXRlci5uZXh0KCk7DQotCQkJbGlzdGVuZXIub2JqZWN0c0FkZGVkKHBhcmVudCwgY2hpbGRyZW4pOw0KLQkJfQ0KLQl9DQotDQotDQotCXB1YmxpYyB2b2lkIGZpcmVPYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gY2hpbGRyZW4pIHsNCi0JCWZvciAoSXRlcmF0b3IgaXRlcj1saXN0ZW5lcnMuaXRlcmF0b3IoKTsNCi0JCQkJaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcilpdGVyLm5leHQoKTsNCi0JCQlsaXN0ZW5lci5vYmplY3RzUmVtb3ZlZChwYXJlbnQsIGNoaWxkcmVuKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgZmlyZU9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7DQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9bGlzdGVuZXJzLml0ZXJhdG9yKCk7DQotCQkJaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcilpdGVyLm5leHQoKTsNCi0JCQlsaXN0ZW5lci5vYmplY3RDaGFuZ2VkKG9iamVjdCwgcHJvcGVydHkpOw0KLQkJfQ0KLQl9DQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9BYnN0cmFjdE92ZXJsYXlJY29uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvQWJzdHJhY3RPdmVybGF5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGNiZGYzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9BYnN0cmFjdE92ZXJsYXlJY29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEFuIE92ZXJsYXlJY29uIGNvbnNpc3RzIG9mIGEgbWFpbiBpY29uIGFuZCBzZXZlcmFsIGFkb3JubWVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE92ZXJsYXlJY29uIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQotCXN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDE2OwotCXN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFQgPSAxNjsKLQotCXByaXZhdGUgUG9pbnQgZlNpemUgPSBudWxsOwotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZk92ZXJsYXlzW11bXTsKLQotCXB1YmxpYyBBYnN0cmFjdE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMpIHsKLQkJdGhpcyhvdmVybGF5cywgbnVsbCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0T3ZlcmxheUljb24oSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cywgUG9pbnQgc2l6ZSkgewotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJaWYgKHNpemUgIT0gbnVsbCkKLQkJCWZTaXplID0gc2l6ZTsKLQkJZWxzZQotCQkJZlNpemUgPSBuZXcgUG9pbnQoREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnkgLSBpZC5oZWlnaHQpOwotCQkJCXggKz0gaWQud2lkdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbVJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeCA9IGdldFNpemUoKS54OwotCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQl4IC09IGlkLndpZHRoOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnkgLSBpZC5oZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEltYWdlRGF0YSBnZXRCYXNlSW1hZ2VEYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCUltYWdlRGF0YSBiYXNlID0gZ2V0QmFzZUltYWdlRGF0YSgpOwotCQlkcmF3SW1hZ2UoYmFzZSwgMCwgMCk7Ci0JCWlmIChmT3ZlcmxheXMgIT0gbnVsbCkgewotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAwKQotCQkJCWRyYXdUb3BSaWdodChmT3ZlcmxheXNbMF0pOwotCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDEpCi0JCQkJZHJhd0JvdHRvbVJpZ2h0KGZPdmVybGF5c1sxXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMikKLQkJCQlkcmF3Qm90dG9tTGVmdChmT3ZlcmxheXNbMl0pOwotCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDMpCi0JCQkJZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgMCk7Ci0JCQkJeCArPSBpZC53aWR0aDsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCWZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCXggLT0gaWQud2lkdGg7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZlNpemU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0RlZmF1bHRDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9EZWZhdWx0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjdhN2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0RlZmF1bHRDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbnRlbnRQcm92aWRlciB7DQotDQotcHVibGljIERlZmF1bHRDb250ZW50UHJvdmlkZXIoKSB7DQotCXN1cGVyKCk7DQotfQ0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQ0KLXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0ltYWdlT3ZlcmxheUljb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9JbWFnZU92ZXJsYXlJY29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGI5NzcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0ltYWdlT3ZlcmxheUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBbiBPdmVybGF5SWNvbiBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgc2V2ZXJhbCBhZG9ybm1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VPdmVybGF5SWNvbiBleHRlbmRzIEFic3RyYWN0T3ZlcmxheUljb24gewotCXByaXZhdGUgSW1hZ2UgYmFzZTsKLQotCXB1YmxpYyBJbWFnZU92ZXJsYXlJY29uKEltYWdlIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMpIHsKLQkJdGhpcyhiYXNlLCBvdmVybGF5cywgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZU92ZXJsYXlJY29uKEltYWdlIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMsIFBvaW50IHNpemUpIHsKLQkJc3VwZXIob3ZlcmxheXMsIHNpemUpOwotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW1hZ2VEYXRhIGdldEJhc2VJbWFnZURhdGEoKSB7Ci0JCXJldHVybiBiYXNlLmdldEltYWdlRGF0YSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9PdmVybGF5SWNvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL092ZXJsYXlJY29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZjRlNzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL092ZXJsYXlJY29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi0NCi0vKioNCi0gKiBBbiBPdmVybGF5SWNvbiBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgc2V2ZXJhbCBhZG9ybm1lbnRzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7DQotCQ0KLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEg9IDE2Ow0KLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUPSAxNjsNCi0JDQotCXByaXZhdGUgUG9pbnQgZlNpemU9IG51bGw7DQotCQkNCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZkJhc2U7DQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZPdmVybGF5c1tdW107DQotDQotCXB1YmxpYyBPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3IgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cykgew0KLQkJZkJhc2U9IGJhc2U7DQotCQlpZiAoZkJhc2UgPT0gbnVsbCkNCi0JCQlmQmFzZT0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsNCi0JCWZPdmVybGF5cz0gb3ZlcmxheXM7DQotCQlmU2l6ZT0gbmV3IFBvaW50KERFRkFVTFRfV0lEVEgsIERFRkFVTFRfSEVJR0hUKTsNCi0JfQ0KLQlwdWJsaWMgT3ZlcmxheUljb24oSW1hZ2VEZXNjcmlwdG9yIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMsIFBvaW50IHNpemUpIHsNCi0JCWZCYXNlPSBiYXNlOw0KLQkJaWYgKGZCYXNlID09IG51bGwpDQotCQkJZkJhc2U9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7DQotCQlmT3ZlcmxheXM9IG92ZXJsYXlzOw0KLQkJZlNpemU9IHNpemU7DQotCX0NCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbUxlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsNCi0JCWlmIChvdmVybGF5cyA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsNCi0JCWludCB4PSAwOw0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IDM7IGkrKykgew0KLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsNCi0JCQkJSW1hZ2VEYXRhIGlkPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsNCi0JCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueS1pZC5oZWlnaHQpOw0KLQkJCQl4Kz0gaWQud2lkdGg7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21SaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgew0KLQkJaWYgKG92ZXJsYXlzID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJaW50IGxlbmd0aD0gb3ZlcmxheXMubGVuZ3RoOw0KLQkJaW50IHg9IGdldFNpemUoKS54Ow0KLQkJZm9yIChpbnQgaT0gMjsgaSA+PSAwOyBpLS0pIHsNCi0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7DQotCQkJCUltYWdlRGF0YSBpZD0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7DQotCQkJCXgtPSBpZC53aWR0aDsNCi0JCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueS1pZC5oZWlnaHQpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7DQotCQlJbWFnZURhdGEgYmc9IGZCYXNlLmdldEltYWdlRGF0YSgpOw0KLQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsNCi0JCQ0KLQkJaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7DQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAwKQ0KLQkJCQlkcmF3VG9wUmlnaHQoIGZPdmVybGF5c1swXSk7DQotCQkJCQ0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMSkNCi0JCQkJZHJhd0JvdHRvbVJpZ2h0KGZPdmVybGF5c1sxXSk7DQotCQkJCQ0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMikNCi0JCQkJZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsNCi0JCQkJDQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAzKQ0KLQkJCQlkcmF3VG9wTGVmdChmT3ZlcmxheXNbM10pOw0KLQkJfQkNCi0JfQ0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgew0KLQkJaWYgKG92ZXJsYXlzID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJaW50IGxlbmd0aD0gb3ZlcmxheXMubGVuZ3RoOw0KLQkJaW50IHg9IDA7DQotCQlmb3IgKGludCBpPSAwOyBpIDwgMzsgaSsrKSB7DQotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgew0KLQkJCQlJbWFnZURhdGEgaWQ9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOw0KLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOw0KLQkJCQl4Kz0gaWQud2lkdGg7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXByb3RlY3RlZCB2b2lkIGRyYXdUb3BSaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgew0KLQkJaWYgKG92ZXJsYXlzID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJaW50IGxlbmd0aD0gb3ZlcmxheXMubGVuZ3RoOw0KLQkJaW50IHg9IGdldFNpemUoKS54Ow0KLQkJZm9yIChpbnQgaT0gMjsgaSA+PSAwOyBpLS0pIHsNCi0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7DQotCQkJCUltYWdlRGF0YSBpZD0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7DQotCQkJCXgtPSBpZC53aWR0aDsNCi0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7DQotCQlyZXR1cm4gZlNpemU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1BpeGVsQ29udmVydGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvUGl4ZWxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3YzZkOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvUGl4ZWxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFBpeGVsQ29udmVydGVyIHsKLQkKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQkKLQlwdWJsaWMgUGl4ZWxDb252ZXJ0ZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyhpbnQgY2hhcnMpIHsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgY2hhcnMpOwotCX0KLQotCXB1YmxpYyBpbnQgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoaW50IGRsdXMpIHsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGRsdXMpOwotCX0KLQotCXB1YmxpYyBpbnQgY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKGludCBkbHVzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKGZGb250TWV0cmljcywgZGx1cyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGludCBjaGFycykgewotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGNoYXJzKTsKLQl9CQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9TV1RVdGlsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZlZTBkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7Ci0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBzaW1wbGlmeSBhY2Nlc3MgdG8gc29tZSBTV1QgcmVzb3VyY2VzLiAKLSAqLwotcHVibGljIGNsYXNzIFNXVFV0aWwgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZGlzcGxheSB0byBiZSB1c2VkLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcywgaWYKLQkgKiB0aGUgdGhyZWFkIGNhbGxpbmcgdGhpcyBtZXRob2QgaGFzIGFuIGFzc29jaWF0ZWQgZGlzYXBseS4gSWYgc28sIHRoaXMKLQkgKiBkaXNwbGF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZhdWx0IGRpc3BsYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5OwotCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBkaXNwbGF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoZWxsIGZvciB0aGUgZ2l2ZW4gd2lkZ2V0LiBJZiB0aGUgd2lkZ2V0IGRvZXNuJ3QgcmVwcmVzZW50Ci0JICogYSBTV1Qgb2JqZWN0IHRoYXQgbWFuYWdlIGEgc2hlbGwsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoZWxsIGZvciB0aGUgZ2l2ZW4gd2lkZ2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbChXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKQotCQkJcmV0dXJuICgoQ29udHJvbCkgd2lkZ2V0KS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ2FyZXQpCi0JCQlyZXR1cm4gKChDYXJldCkgd2lkZ2V0KS5nZXRQYXJlbnQoKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgRHJhZ1NvdXJjZSkKLQkJCXJldHVybiAoKERyYWdTb3VyY2UpIHdpZGdldCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBEcm9wVGFyZ2V0KQotCQkJcmV0dXJuICgoRHJvcFRhcmdldCkgd2lkZ2V0KS5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIE1lbnUpCi0JCQlyZXR1cm4gKChNZW51KSB3aWRnZXQpLmdldFBhcmVudCgpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBTY3JvbGxCYXIpCi0JCQlyZXR1cm4gKChTY3JvbGxCYXIpIHdpZGdldCkuZ2V0UGFyZW50KCkuZ2V0U2hlbGwoKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpZiAoYnV0dG9uLmdldEZvbnQoKS5lcXVhbHMoSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKSkpCi0JCQlidXR0b24uc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlQaXhlbENvbnZlcnRlciBjb252ZXJ0ZXI9IG5ldyBQaXhlbENvbnZlcnRlcihidXR0b24pOwotCQlpbnQgd2lkdGhIaW50PSBjb252ZXJ0ZXIuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaGVpZ2h0IGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QnV0dG9uSGVpZ3RoSGludChCdXR0b24gYnV0dG9uKSB7Ci0JCWlmIChidXR0b24uZ2V0Rm9udCgpLmVxdWFscyhKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpKSkKLQkJCWJ1dHRvbi5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCVBpeGVsQ29udmVydGVyIGNvbnZlcnRlcj0gbmV3IFBpeGVsQ29udmVydGVyKGJ1dHRvbik7Ci0JCXJldHVybiBjb252ZXJ0ZXIuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX0hFSUdIVCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aWR0aCBhbmQgaGVpZ2h0IGhpbnQgZm9yIHRoZSBidXR0b24gY29udHJvbC4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBpcyBhIE5PUCBpZiB0aGUgYnV0dG9uJ3MgbGF5b3V0IGRhdGEgaXMgbm90Ci0JICogYW4gaW5zdGFuY2Ugb2YgPGNvZGU+R3JpZERhdGE8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBidXR0b24JdGhlIGJ1dHRvbiBmb3Igd2hpY2ggdG8gc2V0IHRoZSBkaW1lbnNpb24gaGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCdXR0b25EaW1lbnNpb25IaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChidXR0b24pOwotCQlPYmplY3QgZ2QgPSBidXR0b24uZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZ2QgaW5zdGFuY2VvZiBHcmlkRGF0YSkgewotCQkJKChHcmlkRGF0YSkgZ2QpLmhlaWdodEhpbnQgPSBnZXRCdXR0b25IZWlndGhIaW50KGJ1dHRvbik7Ci0JCQkoKEdyaWREYXRhKSBnZCkud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGJ1dHRvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGlhbG9nU2l6ZShEaWFsb2cgZGlhbG9nLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJUG9pbnQgY29tcHV0ZWRTaXplID0KLQkJCWRpYWxvZy5nZXRTaGVsbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXdpZHRoID0gTWF0aC5tYXgoY29tcHV0ZWRTaXplLngsIHdpZHRoKTsKLQkJaGVpZ2h0ID0gTWF0aC5tYXgoY29tcHV0ZWRTaXplLnksIGhlaWdodCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9TaGFyZWRMYWJlbFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU2hhcmVkTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTEyZDkwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9TaGFyZWRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgU2hhcmVkTGFiZWxQcm92aWRlcgotCWV4dGVuZHMgTGFiZWxQcm92aWRlcgotCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9FUlJPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9XQVJOSU5HID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0NVUlJFTlQgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfSU5TVEFMTEFCTEUgPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfTElOS0VEID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9NT0QgPSAzMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX1VQREFURUQgPSA2NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX1VOQ09ORklHVVJFRCA9IDEyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0FERCA9IDI1NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0RFTCA9IDUxMjsKLQotCUhhc2h0YWJsZSBpbWFnZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JQXJyYXlMaXN0IGNvbnN1bWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBTaGFyZWRMYWJlbFByb3ZpZGVyKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWlmICghY29uc3VtZXJzLmNvbnRhaW5zKGNvbnN1bWVyKSkKLQkJCWNvbnN1bWVycy5hZGQoY29uc3VtZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWNvbnN1bWVycy5yZW1vdmUoY29uc3VtZXIpOwotCQlpZiAoY29uc3VtZXJzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXNldCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXJlc2V0KCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZW51bSA9IGltYWdlcy5lbGVtZW50cygpOyBlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlpbWFnZXMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0KEltYWdlRGVzY3JpcHRvciBkZXNjKSB7Ci0JCXJldHVybiBnZXQoZGVzYywgMCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldChJbWFnZURlc2NyaXB0b3IgZGVzYywgaW50IGZsYWdzKSB7Ci0JCU9iamVjdCBrZXkgPSBkZXNjOwotCi0JCWlmIChmbGFncyAhPSAwKSB7Ci0JCQlrZXkgPSBnZXRLZXkoZGVzYy5oYXNoQ29kZSgpLCBmbGFncyk7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGltYWdlcy5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UoZGVzYywgZmxhZ3MpOwotCQkJaW1hZ2VzLnB1dChrZXksIGltYWdlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXQoSW1hZ2UgaW1hZ2UsIGludCBmbGFncykgewotCQlpZiAoZmxhZ3M9PTApIHJldHVybiBpbWFnZTsKLQkJU3RyaW5nIGtleSA9IGdldEtleShpbWFnZS5oYXNoQ29kZSgpLCBmbGFncyk7Ci0JCUltYWdlIHJlc3VsdEltYWdlID0gKEltYWdlKWltYWdlcy5nZXQoa2V5KTsKLQkJaWYgKHJlc3VsdEltYWdlID09IG51bGwpIHsKLQkJCXJlc3VsdEltYWdlID0gY3JlYXRlSW1hZ2UoaW1hZ2UsIGZsYWdzKTsKLQkJCWltYWdlcy5wdXQoa2V5LCByZXN1bHRJbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEltYWdlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEtleShsb25nIGhhc2hDb2RlLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuICgiIitoYXNoQ29kZSkgKyAiOiIrZmxhZ3M7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoSW1hZ2VEZXNjcmlwdG9yIGJhc2VEZXNjLCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGZsYWdzID09IDApIHsKLQkJCXJldHVybiBiYXNlRGVzYy5jcmVhdGVJbWFnZSgpOwotCQl9Ci0JCUltYWdlRGVzY3JpcHRvcltdIGxvd2VyTGVmdCA9IGdldExvd2VyTGVmdE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VEZXNjcmlwdG9yW10gdXBwZXJSaWdodCA9IGdldFVwcGVyUmlnaHRPdmVybGF5cyhmbGFncyk7Ci0JCUltYWdlRGVzY3JpcHRvcltdIGxvd2VyUmlnaHQgPSBnZXRMb3dlclJpZ2h0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZURlc2NyaXB0b3JbXSB1cHBlckxlZnQgPSBnZXRVcHBlckxlZnRPdmVybGF5cyhmbGFncyk7Ci0JCU92ZXJsYXlJY29uIGNvbXBEZXNjID0KLQkJCW5ldyBPdmVybGF5SWNvbigKLQkJCQliYXNlRGVzYywKLQkJCQluZXcgSW1hZ2VEZXNjcmlwdG9yW11bXSB7IHVwcGVyUmlnaHQsIGxvd2VyUmlnaHQsIGxvd2VyTGVmdCwgdXBwZXJMZWZ0IH0pOwotCQlyZXR1cm4gY29tcERlc2MuY3JlYXRlSW1hZ2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShJbWFnZSBiYXNlSW1hZ2UsIGludCBmbGFncykgewotCQlpZiAoZmxhZ3MgPT0gMCkgewotCQkJcmV0dXJuIGJhc2VJbWFnZTsKLQkJfQotCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlckxlZnQgPSBnZXRMb3dlckxlZnRPdmVybGF5cyhmbGFncyk7Ci0JCUltYWdlRGVzY3JpcHRvcltdIHVwcGVyUmlnaHQgPSBnZXRVcHBlclJpZ2h0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlclJpZ2h0ID0gZ2V0TG93ZXJSaWdodE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VEZXNjcmlwdG9yW10gdXBwZXJMZWZ0ID0gZ2V0VXBwZXJMZWZ0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZU92ZXJsYXlJY29uIGNvbXBEZXNjID0KLQkJCW5ldyBJbWFnZU92ZXJsYXlJY29uKAotCQkJCWJhc2VJbWFnZSwKLQkJCQluZXcgSW1hZ2VEZXNjcmlwdG9yW11bXSB7IHVwcGVyUmlnaHQsIGxvd2VyUmlnaHQsIGxvd2VyTGVmdCwgdXBwZXJMZWZ0IH0pOwotCQlyZXR1cm4gY29tcERlc2MuY3JlYXRlSW1hZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldExvd2VyTGVmdE92ZXJsYXlzKGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgRl9FUlJPUikgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0VSUk9SX0NPIH07Ci0JCWlmICgoZmxhZ3MgJiBGX1dBUk5JTkcpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19XQVJOSU5HX0NPIH07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yW10gZ2V0VXBwZXJSaWdodE92ZXJsYXlzKGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgRl9BREQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19BRERfQ08gfTsKLQkJaWYgKChmbGFncyAmIEZfREVMKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfREVMX0NPIH07Ci0JCWlmICgoZmxhZ3MgJiBGX1VOQ09ORklHVVJFRCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX1VOQ09ORl9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9MSU5LRUQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19MSU5LRURfQ08gfTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yW10gZ2V0TG93ZXJSaWdodE92ZXJsYXlzKGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgRl9DVVJSRU5UKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ1VSUkVOVF9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9NT0QpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19NT0RfQ08gfTsKLQkJLyoKLQkJaWYgKChmbGFncyAmIEZfQUREKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQUREX0NPIH07Ci0JCWlmICgoZmxhZ3MgJiBGX0RFTCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0RFTF9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9VTkNPTkZJR1VSRUQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19VTkNPTkZfQ08gfTsKLQkJKi8KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yW10gZ2V0VXBwZXJMZWZ0T3ZlcmxheXMoaW50IGZsYWdzKSB7Ci0JCWlmICgoZmxhZ3MgJiBGX1VQREFURUQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19VUERBVEVEX0NPIH07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldFRleHQob2JqKTsKLQl9Ci0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBpbmRleCkgewotCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2VGcm9tVVJMKAotCQlVUkwgaW5zdGFsbFVSTCwKLQkJU3RyaW5nIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCBuZXdVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKTsKLQkJCVN0cmluZyBrZXkgPSBuZXdVUkwudG9TdHJpbmcoKTsKLQkJCWltYWdlID0gKEltYWdlKWltYWdlcy5nZXQoa2V5KTsKLQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXdVUkwpOwotCQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJCWltYWdlcy5wdXQoa2V5LCBpbWFnZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9NYWluUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9NYWluUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1YzhkZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBAc2VlIFByZWZlcmVuY2VQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluUHJlZmVyZW5jZVBhZ2UKLQlleHRlbmRzIFByZWZlcmVuY2VQYWdlCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JLy9wcml2YXRlIExhYmVsIGhpc3RvcnlTaXplTGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IGhpc3RvcnlTaXplVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBjaGVja1NpZ25hdHVyZUNoZWNrYm94OwotCXByaXZhdGUgQnV0dG9uIGVxdWl2YWxlbnRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gY29tcGF0aWJsZUJ1dHRvbjsKLQlwcml2YXRlIFRleHQgdXBkYXRlUG9saWN5VGV4dDsKLQlwcml2YXRlIExhYmVsIGh0dHBQcm94eUhvc3RMYWJlbDsKLQlwcml2YXRlIExhYmVsIGh0dHBQcm94eVBvcnRMYWJlbDsKLQlwcml2YXRlIFRleHQgaHR0cFByb3h5SG9zdFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IGh0dHBQcm94eVBvcnRUZXh0OwotCXByaXZhdGUgQnV0dG9uIGVuYWJsZUh0dHBQcm94eTsKLQotCS8vIHRoZXNlIHR3byB2YWx1ZXMgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGNvZGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVJVkFMRU5UX1ZBTFVFID0gImVxdWl2YWxlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFUSUJMRV9WQUxVRSA9ICJjb21wYXRpYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNYWluUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5NYWluUHJlZmVyZW5jZVBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQltYWluQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCUxhYmVsIGhpc3RvcnlTaXplTGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQloaXN0b3J5U2l6ZUxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNYWluUHJlZmVyZW5jZVBhZ2UuaGlzdG9yeVNpemUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGlzdG9yeVNpemVUZXh0ID0gbmV3IFRleHQobWFpbkNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQloaXN0b3J5U2l6ZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveCA9Ci0JCQluZXcgQnV0dG9uKG1haW5Db21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLmNoZWNrU2lnbmF0dXJlIikpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoY2hlY2tTaWduYXR1cmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSA9PSBmYWxzZSkgewotCQkJCQl3YXJuU2lnbmF0dXJlQ2hlY2soZ2V0U2hlbGwoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljcmVhdGVTcGFjZXIobWFpbkNvbXBvc2l0ZSwgMik7Ci0KLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVZlcnNpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQllcXVpdmFsZW50QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJZXF1aXZhbGVudEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVZlcnNpb25zLmVxdWl2YWxlbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb21wYXRpYmxlQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJY29tcGF0aWJsZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVZlcnNpb25zLmNvbXBhdGlibGUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVTcGFjZXIobWFpbkNvbXBvc2l0ZSwgMik7Ci0KLQkJZ3JvdXAgPSBuZXcgR3JvdXAobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVBvbGljeSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNYWluUHJlZmVyZW5jZVBhZ2UudXBkYXRlUG9saWN5VVJMIikpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZVBvbGljeVRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXVwZGF0ZVBvbGljeVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJY3JlYXRlU3BhY2VyKG1haW5Db21wb3NpdGUsIDIpOwotCQljcmVhdGVIdHRwUHJveHkobWFpbkNvbXBvc2l0ZSwgMik7Ci0JCWluaXRpYWxpemUoKTsKLQkJdXBkYXRlUG9saWN5VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl0ZXh0Q2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIG1haW5Db21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChnZXRDb250cm9sKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwYWNlcihDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1uU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5TcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIdHRwUHJveHkoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtblNwYW4pIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNYWluUHJlZmVyZW5jZVBhZ2UucHJveHlHcm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uU3BhbjsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZW5hYmxlSHR0cFByb3h5ID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJZW5hYmxlSHR0cFByb3h5LnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNYWluUHJlZmVyZW5jZVBhZ2UuZW5hYmxlSHR0cFByb3h5IikpOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZW5hYmxlSHR0cFByb3h5LnNldExheW91dERhdGEoZ2QpOwotCi0JCWh0dHBQcm94eUhvc3RMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQlodHRwUHJveHlIb3N0TGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIk1haW5QcmVmZXJlbmNlUGFnZS5odHRwUHJveHlIb3N0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJaHR0cFByb3h5SG9zdFRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlodHRwUHJveHlIb3N0VGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlodHRwUHJveHlQb3J0TGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJaHR0cFByb3h5UG9ydExhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNYWluUHJlZmVyZW5jZVBhZ2UuaHR0cFByb3h5UG9ydCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWh0dHBQcm94eVBvcnRUZXh0ID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJaHR0cFByb3h5UG9ydFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJZW5hYmxlSHR0cFByb3h5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gZW5hYmxlID0gZW5hYmxlSHR0cFByb3h5LmdldFNlbGVjdGlvbigpOwotCQkJCWh0dHBQcm94eVBvcnRMYWJlbC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJaHR0cFByb3h5SG9zdExhYmVsLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlodHRwUHJveHlQb3J0VGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJaHR0cFByb3h5SG9zdFRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCXByaXZhdGUgaW50IGdldEhpc3RvcnlDb3VudCgpIHsKLQkJdHJ5IHsKLQkJCUludGVnZXIgY291bnQgPSBuZXcgSW50ZWdlcihoaXN0b3J5U2l6ZVRleHQuZ2V0VGV4dCgpKTsKLQkJCXJldHVybiBjb3VudC5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludCgKLQkJCVVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNldE1heGltdW1IaXN0b3J5Q291bnQoCi0JCQkJCQlnZXRIaXN0b3J5Q291bnQoKSk7Ci0JCQkJCVNpdGVNYW5hZ2VyLnNldEh0dHBQcm94eUluZm8oCi0JCQkJCQllbmFibGVIdHRwUHJveHkuZ2V0U2VsZWN0aW9uKCksCi0JCQkJCQlodHRwUHJveHlIb3N0VGV4dC5nZXRUZXh0KCksCi0JCQkJCQlodHRwUHJveHlQb3J0VGV4dC5nZXRUZXh0KCkpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0VmFsdWUoCi0JCQlVcGRhdGVDb3JlLlBfQ0hFQ0tfU0lHTkFUVVJFLAotCQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXByZWZzLnNldFZhbHVlKFVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUsIGhpc3RvcnlTaXplVGV4dC5nZXRUZXh0KCkpOwotCQlwcmVmcy5zZXRWYWx1ZSgKLQkJCVVwZGF0ZUNvcmUuUF9VUERBVEVfVkVSU0lPTlMsCi0JCQllcXVpdmFsZW50QnV0dG9uLmdldFNlbGVjdGlvbigpCi0JCQkJPyBFUVVJVkFMRU5UX1ZBTFVFCi0JCQkJOiBDT01QQVRJQkxFX1ZBTFVFKTsKLQkJcHJlZnMuc2V0VmFsdWUoCi0JCQlVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMLAotCQkJdXBkYXRlUG9saWN5VGV4dC5nZXRUZXh0KCkpOwotCi0JCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXN1cGVyLnBlcmZvcm1BcHBseSgpOwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2l0ZU1hbmFnZXIuc2V0SHR0cFByb3h5SW5mbygKLQkJCQkJZW5hYmxlSHR0cFByb3h5LmdldFNlbGVjdGlvbigpLAotCQkJCQlodHRwUHJveHlIb3N0VGV4dC5nZXRUZXh0KCksCi0JCQkJCWh0dHBQcm94eVBvcnRUZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCVByZWZlcmVuY2VzIHByZWZzID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmcy5zZXRWYWx1ZSgKLQkJCVVwZGF0ZUNvcmUuUF9DSEVDS19TSUdOQVRVUkUsCi0JCQljaGVja1NpZ25hdHVyZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQkJcHJlZnMuc2V0VmFsdWUoVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSwgaGlzdG9yeVNpemVUZXh0LmdldFRleHQoKSk7Ci0JCXByZWZzLnNldFZhbHVlKAotCQkJVXBkYXRlQ29yZS5QX1VQREFURV9WRVJTSU9OUywKLQkJCWVxdWl2YWxlbnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkKLQkJCQk/IEVRVUlWQUxFTlRfVkFMVUUKLQkJCQk6IENPTVBBVElCTEVfVkFMVUUpOwotCQlwcmVmcy5zZXRWYWx1ZSgKLQkJCVVwZGF0ZVV0aWxzLlBfVVBEQVRFX1BPTElDWV9VUkwsCi0JCQl1cGRhdGVQb2xpY3lUZXh0LmdldFRleHQoKSk7Ci0KLQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZW5hYmxlSHR0cFByb3h5LnNldFNlbGVjdGlvbihTaXRlTWFuYWdlci5pc0h0dHBQcm94eUVuYWJsZSgpKTsKLQkJU3RyaW5nIHNlcnZlclZhbHVlID0gU2l0ZU1hbmFnZXIuZ2V0SHR0cFByb3h5U2VydmVyKCk7Ci0JCWlmIChzZXJ2ZXJWYWx1ZSAhPSBudWxsKQotCQkJaHR0cFByb3h5SG9zdFRleHQuc2V0VGV4dChzZXJ2ZXJWYWx1ZSk7Ci0JCVN0cmluZyBwb3J0VmFsdWUgPSBTaXRlTWFuYWdlci5nZXRIdHRwUHJveHlQb3J0KCk7Ci0JCWlmIChwb3J0VmFsdWUgIT0gbnVsbCkKLQkJCWh0dHBQcm94eVBvcnRUZXh0LnNldFRleHQocG9ydFZhbHVlKTsKLQotCQlodHRwUHJveHlQb3J0TGFiZWwuc2V0RW5hYmxlZChlbmFibGVIdHRwUHJveHkuZ2V0U2VsZWN0aW9uKCkpOwotCQlodHRwUHJveHlIb3N0TGFiZWwuc2V0RW5hYmxlZChlbmFibGVIdHRwUHJveHkuZ2V0U2VsZWN0aW9uKCkpOwotCQlodHRwUHJveHlQb3J0VGV4dC5zZXRFbmFibGVkKGVuYWJsZUh0dHBQcm94eS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWh0dHBQcm94eUhvc3RUZXh0LnNldEVuYWJsZWQoZW5hYmxlSHR0cFByb3h5LmdldFNlbGVjdGlvbigpKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5zZXRTZWxlY3Rpb24oCi0JCQlwcmVmcy5nZXRCb29sZWFuKFVwZGF0ZUNvcmUuUF9DSEVDS19TSUdOQVRVUkUpKTsKLQotCQloaXN0b3J5U2l6ZVRleHQuc2V0VGV4dChwcmVmcy5nZXRTdHJpbmcoVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSkpOwotCi0JCWJvb2xlYW4gaXNDb21wYXRpYmxlID0KLQkJCVVwZGF0ZUNvcmUuQ09NUEFUSUJMRV9WQUxVRS5lcXVhbHMoCi0JCQkJcHJlZnMuZ2V0U3RyaW5nKFVwZGF0ZUNvcmUuUF9VUERBVEVfVkVSU0lPTlMpKTsKLQkJZXF1aXZhbGVudEJ1dHRvbi5zZXRTZWxlY3Rpb24oIWlzQ29tcGF0aWJsZSk7Ci0JCWNvbXBhdGlibGVCdXR0b24uc2V0U2VsZWN0aW9uKGlzQ29tcGF0aWJsZSk7Ci0KLQkJU3RyaW5nIHRleHQgPSBwcmVmcy5nZXRTdHJpbmcoVXBkYXRlVXRpbHMuUF9VUERBVEVfUE9MSUNZX1VSTCk7Ci0JCXVwZGF0ZVBvbGljeVRleHQuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGV4dENoYW5nZWQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdXBkYXRlUG9saWN5VGV4dC5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQluZXcgVVJMKHRleHQpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFVwZGF0ZVVJLmdldFN0cmluZygiVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5pbnZhbGlkIikpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXNldFZhbGlkKHRydWUpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJZW5hYmxlSHR0cFByb3h5LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWh0dHBQcm94eUhvc3RUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWh0dHBQcm94eVBvcnRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWh0dHBQcm94eVBvcnRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaHR0cFByb3h5SG9zdExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQlodHRwUHJveHlQb3J0VGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaHR0cFByb3h5SG9zdFRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJdXBkYXRlUG9saWN5VGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNoZWNrU2lnbmF0dXJlQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQloaXN0b3J5U2l6ZVRleHQuc2V0VGV4dCgKLQkJCXByZWZzLmdldERlZmF1bHRTdHJpbmcoVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSkpOwotCQllcXVpdmFsZW50QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJY29tcGF0aWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3YXJuU2lnbmF0dXJlQ2hlY2soU2hlbGwgc2hlbGwpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhzaGVsbCwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJNYWluUHJlZmVyZW5jZVBhZ2UuZGlnaXRhbFNpZ25hdHVyZS50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCVVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLmRpZ2l0YWxTaWduYXR1cmUubWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0MGYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBAc2VlIFByZWZlcmVuY2VQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlCi0JZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZQotCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIFRleHQgbWFwcGluZ3NGaWxlOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlKCkgewotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoIlVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIlVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UubGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWFwcGluZ3NGaWxlID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0KLQkJaW5pdGlhbGl6ZSgpOwotCQltYXBwaW5nc0ZpbGUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdGV4dENoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCW1hcHBpbmdzRmlsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHRleHQgPSBwcmVmLmdldFN0cmluZyhVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMKTsKLQkJbWFwcGluZ3NGaWxlLnNldFRleHQodGV4dCk7Ci0JCXRleHRDaGFuZ2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRleHRDaGFuZ2VkKCkgewotCQlTdHJpbmcgdGV4dCA9IG1hcHBpbmdzRmlsZS5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQluZXcgVVJMKHRleHQpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFVwZGF0ZVVJLmdldFN0cmluZygiVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5pbnZhbGlkIikpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXNldFZhbGlkKHRydWUpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgdGV4dCA9IG1hcHBpbmdzRmlsZS5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkKLQkJCXByZWYuc2V0VmFsdWUoVXBkYXRlVXRpbHMuUF9VUERBVEVfUE9MSUNZX1VSTCwgdGV4dCk7Ci0JCWVsc2UKLQkJCXByZWYuc2V0VG9EZWZhdWx0KFVwZGF0ZVV0aWxzLlBfVVBEQVRFX1BPTElDWV9VUkwpOwotCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCW1hcHBpbmdzRmlsZS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGdldENvbnRyb2woKSk7Ci0JCS8qCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCXBhcmVudCwib3JnLmVjbGlwc2UudXBkYXRlLnVpLkFwcFNlcnZlclByZWZlcmVuY2VQYWdlIik7Ci0JCSovCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0NvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNiZjliLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0NvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci0KLS8qKgotICogQHNlZSBQcm9wZXJ0eVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UoKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgIHsKLQkJSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyID0gKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpZ2V0RWxlbWVudCgpOwotCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCxTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWFkZFByb3BlcnR5KGNvbXBvc2l0ZSwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5wYXRoIiksIGNzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRQcm9wZXJ0eShjb21wb3NpdGUsIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UudHlwZSIpLCBnZXRMb2NhdGlvblR5cGUoY3NpdGUpKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRQcm9wZXJ0eShjb21wb3NpdGUsIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UuZW5hYmxlZCIpLCBjc2l0ZS5pc0VuYWJsZWQoKT9VcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnllcyIpOlVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2Uubm8iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uVHlwZShJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsKLQkJaWYgKGNzaXRlLmlzRXh0ZW5zaW9uU2l0ZSgpKQotCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UuZXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNzaXRlLmlzUHJvZHVjdFNpdGUoKSkKLQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnByb2R1Y3QiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS51bmtub3duIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChrZXkpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQodmFsdWUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZGVmNGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci0KLS8qKgotICogQHNlZSBQcm9wZXJ0eVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJvcGVydHlQYWdlIHsKLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyBGZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlKCkgewotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCUlGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0gKElGZWF0dXJlQWRhcHRlcikgZ2V0RWxlbWVudCgpOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKTsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJCUdyaWREYXRhIGdkID0KLQkJCQluZXcgR3JpZERhdGEoCi0JCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQlnZC53aWR0aEhpbnQgPSBjb21wdXRlV2lkdGhMaW1pdChsYWJlbCwgODApOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCUlVUkxFbnRyeSBjb3B5cmlnaHQgPSBmZWF0dXJlLmdldENvcHlyaWdodCgpOwotCQkJU3RyaW5nIGFubm90YXRpb24gPSAoY29weXJpZ2h0ICE9IG51bGwpID8gY29weXJpZ2h0LmdldEFubm90YXRpb24oKSA6IG51bGw7Ci0KLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwgJiYgYW5ub3RhdGlvbi5sZW5ndGgoKSA+IDApIHsKLQkJCQlsYWJlbC5zZXRUZXh0KGFubm90YXRpb24pOwotCQkJCWZpbmFsIFVSTCB1cmwgPSBjb3B5cmlnaHQuZ2V0VVJMKCk7Ci0JCQkJU3RyaW5nIGZpbGVuYW1lID0gKHVybCAhPSBudWxsKSA/IHVybC5nZXRGaWxlKCkgOiBudWxsOwotCQkJCWlmIChmaWxlbmFtZSAhPSBudWxsCi0JCQkJCSYmIChmaWxlbmFtZS5lbmRzV2l0aCgiLmh0bSIpIHx8IGZpbGVuYW1lLmVuZHNXaXRoKCIuaHRtbCIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQkJCWJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZS5zaG93SW5Ccm93c2VyIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQkJCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYnV0dG9uKTsKLQkJCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCVN0cmluZyB1cmxOYW1lID0gdXJsLmdldFByb3RvY29sKCkgKyAiOiIgKyB1cmwuZ2V0RmlsZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJVXBkYXRlVUkuc2hvd1VSTCh1cmxOYW1lKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZS5ub0NvcHlyaWdodCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVdpZHRoTGltaXQoTGFiZWwgbGFiZWwsIGludCBuY2hhcnMpIHsKLQkJR0MgZ2MgPSBuZXcgR0MobGFiZWwpOwotCQlnYy5zZXRGb250KGxhYmVsLmdldEZvbnQoKSk7Ci0JCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBuY2hhcnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTI0YWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotcHVibGljIGNsYXNzIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlCi0JZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCQkKLQlwdWJsaWMgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UoKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cnkgewotCQkJSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSAoSUZlYXR1cmVBZGFwdGVyKSBnZXRFbGVtZW50KCk7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpOwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQotCQkJYWRkR2VuZXJhbFNlY3Rpb24oZmVhdHVyZSwgY29tcG9zaXRlKTsJCi0JCQlhZGRTdXBwb3J0ZWRQbGF0Zm9ybXNTZWN0aW9uKGZlYXR1cmUsIGNvbXBvc2l0ZSk7Ci0JCQlhZGREZXNjcmlwdGlvbihmZWF0dXJlLCBjb21wb3NpdGUpOwotCQkJCi0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCQkKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkR2VuZXJhbFNlY3Rpb24oSUZlYXR1cmUgZmVhdHVyZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlhZGRGaWVsZChjb21wb3NpdGUsIFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UubmFtZSIpLCBmZWF0dXJlLmdldExhYmVsKCkpOyAvLyROT04tTkxTLTEkCi0JCWFkZEZpZWxkKAotCQkJY29tcG9zaXRlLAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5pZCIpLCAvLyROT04tTkxTLTEkCi0JCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOwotCQlhZGRGaWVsZCgKLQkJCWNvbXBvc2l0ZSwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UudmVyc2lvbiIpLCAvLyROT04tTkxTLTEkCi0JCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCWFkZEZpZWxkKGNvbXBvc2l0ZSwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5wcm92aWRlciIpLCBmZWF0dXJlLmdldFByb3ZpZGVyKCkpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgc2l6ZSA9IGZlYXR1cmUuZ2V0SW5zdGFsbFNpemUoKTsKLQkJaWYgKHNpemUgIT0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFKQotCQkJYWRkRmllbGQoY29tcG9zaXRlLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLnNpemUiKSwgbmV3IExvbmcoc2l6ZSkudG9TdHJpbmcoKSArICIgS0IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFN1cHBvcnRlZFBsYXRmb3Jtc1NlY3Rpb24oSUZlYXR1cmUgZmVhdHVyZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLnBsYXRmb3JtcyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5vcyIpICsgZXh0cmFjdFZhbHVlKGZlYXR1cmUuZ2V0T1MoKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLndzIikgKyBleHRyYWN0VmFsdWUoZmVhdHVyZS5nZXRXUygpKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuYXJjaCIpICsgZXh0cmFjdFZhbHVlKGZlYXR1cmUuZ2V0T1NBcmNoKCkpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5ubCIpICsgZXh0cmFjdFZhbHVlKGZlYXR1cmUuZ2V0TkwoKSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHZhbHVlKSB7Ci0KLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQocHJvcGVydHkpOwotCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodmFsdWUpOwotCQl9Ci0KLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5lcXVhbHMoIioiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuYWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREZXNjcmlwdGlvbihJRmVhdHVyZSBmZWF0dXJlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlVUkxFbnRyeSBkZXNjcmlwdGlvbiA9IGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBhbm5vdGF0aW9uID0gZGVzY3JpcHRpb24uZ2V0QW5ub3RhdGlvbigpOwotCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uLmxlbmd0aCgpID4gMCkgewotCQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQkJCWdyb3VwLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5kZXNjIikpOyAvLyROT04tTkxTLTEkCi0JCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQkJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCQkJZ2Qud2lkdGhIaW50ID0gMzUwOwotCQkJCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJCXRleHQuc2V0VGV4dChhbm5vdGF0aW9uKTsKLQkJCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZTJhNDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCXB1YmxpYyBGZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZSgpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAgewotCQl0cnkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCQlJRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChJRmVhdHVyZUFkYXB0ZXIpZ2V0RWxlbWVudCgpOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKTsJCQkKLQkJCUlVUkxFbnRyeSBsaWNlbnNlID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7Ci0JCQlTdHJpbmcgYW5ub3RhdGlvbiA9IChsaWNlbnNlICE9IG51bGwpID8gbGljZW5zZS5nZXRBbm5vdGF0aW9uKCkgOiBudWxsOwotCQkJCi0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQl0ZXh0LnNldFRleHQoYW5ub3RhdGlvbik7Ci0JCQkJdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkJZmluYWwgVVJMIHVybCA9IGxpY2Vuc2UuZ2V0VVJMKCk7Ci0JCQkJU3RyaW5nIGZpbGVuYW1lID0gKHVybCAhPSBudWxsKSA/IHVybC5nZXRGaWxlKCkgOiBudWxsOwotCQkJCWlmIChmaWxlbmFtZSAhPSBudWxsICYmIChmaWxlbmFtZS5lbmRzV2l0aCgiLmh0bSIpIHx8IHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoIi5odG1sIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCQkJYnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZS5zaG93SW5Ccm93c2VyIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQkJCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYnV0dG9uKTsKLQkJCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCVN0cmluZyB1cmxOYW1lID0gdXJsLmdldFByb3RvY29sKCkgKyAiOiIgKyB1cmwuZ2V0RmlsZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJVXBkYXRlVUkuc2hvd1VSTCh1cmxOYW1lKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2Uubm9MaWNlbnNlIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NzdmMjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLS8qKgotICogQHNlZSBQcm9wZXJ0eVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UKLQlleHRlbmRzIFByb3BlcnR5UGFnZQotCWltcGxlbWVudHMgSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZSgpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0KLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDIwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCQlUZXh0IG1lc3NhZ2UgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQkJCW1lc3NhZ2Uuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLndpZHRoSGludCA9IDM1MDsKLQkJCW1lc3NhZ2Uuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0gKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgZ2V0RWxlbWVudCgpOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQotCQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGZlYXR1cmUpICE9IG51bGwpIHsKLQkJCQltZXNzYWdlLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLnBlbmRpbmdDaGFuZ2VzIikpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJCX0KLQkJCQotCQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRTdGF0dXMoZmVhdHVyZSk7Ci0JCQlpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SCi0JCQkJJiYgZ2V0U3RhdHVzQ29kZShmZWF0dXJlLCBzdGF0dXMpID09IElGZWF0dXJlLlNUQVRVU19IQVBQWSkgewotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJCQltZXNzYWdlLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLmdvb2RDb25maWd1cmF0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCW1lc3NhZ2Uuc2V0VGV4dChzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCWlmIChzZXZlcml0eSAhPSBJU3RhdHVzLk9LICYmIHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCQlTdHJpbmcgcmVhc29uID0gZ2V0UmVhc29uKHN0YXR1cyk7Ci0JCQkJaWYgKHJlYXNvbi5sZW5ndGgoKSA+IDApIHsKLQkJCQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCQljb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCQkJY29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCQkJCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLnJlYXNvbiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCVRleHQgdGV4dCA9Ci0JCQkJCQluZXcgVGV4dChjb21wLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwpOwotCQkJCQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQkJdGV4dC5zZXRUZXh0KHJlYXNvbik7Ci0JCQkJCWdkLndpZHRoSGludCA9IDM1MDsKLQkJCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCQotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQkJCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVhc29uKElTdGF0dXMgc3RhdHVzKSB7Ci0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGNoaWxkcmVuW2ldLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKAotCQkJCQltZXNzYWdlCi0JCQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGdldFN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKLQkJCWludCBzZXZlcml0eTsKLQkJCVN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICgoKE1pc3NpbmdGZWF0dXJlKSBmZWF0dXJlKS5pc09wdGlvbmFsKCkpIHsKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCQkJbWVzc2FnZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5taXNzaW5nT3B0aW9uYWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCQkJbWVzc2FnZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5taXNzaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCBVcGRhdGVVSS5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCXJldHVybiBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRGZWF0dXJlU3RhdHVzKGZlYXR1cmUpOwotCX0KLQotCXByaXZhdGUgaW50IGdldFN0YXR1c0NvZGUoSUZlYXR1cmUgZmVhdHVyZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaW50IGNvZGUgPSBzdGF0dXMuZ2V0Q29kZSgpOwotCQlpZiAoY29kZSA9PSBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSkgewotCQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlTdGF0dXMgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCQkJaWYgKGNoaWxkLmlzTXVsdGlTdGF0dXMoKQotCQkJCQkJfHwgY2hpbGQuZ2V0Q29kZSgpICE9IElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRCkKLQkJCQkJCXJldHVybiBjb2RlOwotCQkJCX0KLQkJCQkvLyBJZiB3ZSBhcmUgaGVyZSwgZ2xvYmFsIHN0YXR1cyBpcyB1bmhhcHB5Ci0JCQkJLy8gYmVjYXVzZSBvbmUgb3IgbW9yZSBpbmNsdWRlZCBmZWF0dXJlcwotCQkJCS8vIGlzIGRpc2FibGVkLgotCQkJCWlmIChVcGRhdGVVdGlscy5oYXNPYnNvbGV0ZVBhdGNoZXMoZmVhdHVyZSkpIHsKLQkJCQkJLy8gVGhlIGRpc2FibGVkIGluY2x1ZGVkIGZlYXR1cmVzCi0JCQkJCS8vIGFyZSBvbGQgcGF0Y2hlcyB0aGF0IGFyZSBub3cKLQkJCQkJLy8gc3Vic3VtZWQgYnkgYmV0dGVyIHZlcnNpb25zIG9mCi0JCQkJCS8vIHRoZSBmZWF0dXJlcyB0aGV5IHdlcmUgZGVzaWduZWQgdG8KLQkJCQkJLy8gcGF0Y2guCi0JCQkJCXJldHVybiBJRmVhdHVyZS5TVEFUVVNfSEFQUFk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0luc3RhbGxDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9JbnN0YWxsQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIwNDcwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0luc3RhbGxDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotLyoqCi0gKiBAc2VlIFByb3BlcnR5UGFnZQotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJvcGVydHlQYWdlIHsKLQkvKioKLQkgKgotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZSgpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlhZGRQcm9wZXJ0eShjb21wb3NpdGUsIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UucGF0aCIpLCBDb25maWd1cmF0b3JVdGlscy5nZXRJbnN0YWxsVVJMKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgYWRkUHJvcGVydHkoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KGtleSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCh2YWx1ZSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9BdXRoZW50aWNhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0F1dGhlbnRpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZDkzYzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0F1dGhlbnRpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eTsKLQotLyoqCi0gKiBLZWVwcyB1c2VyIGFuZCBwYXNzd29yZCBzdHJpbmdzLgotICovCi1wdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb24gewotCXByb3RlY3RlZCBTdHJpbmcgdXNlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhc3N3b3JkOwotCXB1YmxpYyBBdXRoZW50aWNhdGlvbihTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkKXsKLQkJdGhpcy51c2VyID0gdXNlcjsKLQkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFzc3dvcmQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHBhc3N3b3JkOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVzZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2VyKCkgewotCQlyZXR1cm4gdXNlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDU3NTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJWZXJpZmljYXRpb25EaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCi0JcHJpdmF0ZSBJVmVyaWZpY2F0aW9uUmVzdWx0IF9WZXJpZmljYXRpb25SZXN1bHQgPSBudWxsOwotCXByaXZhdGUgSURpYWxvZ1BhZ2UgX0RpYWxvZ1BhZ2U7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFnZUNvbnRhaW5lcjsKLQlwcml2YXRlIEltYWdlIGRlZmF1bHRJbWFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZGVmYXVsdEltYWdlRGVzY3JpcHRvciA9Ci0JCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfVVBEQVRFX1dJWjsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSmFyVmVyaWZpY2F0aW9uRGlhbG9nLgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqLwotCXB1YmxpYyBKYXJWZXJpZmljYXRpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsSURpYWxvZ1BhZ2UgZGlhbG9nUGFnZSwgSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZmljYXRpb25SZXN1bHQpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKFNXVC5USVRMRSB8IFNXVC5CT1JERVIgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwkJCi0JCV9WZXJpZmljYXRpb25SZXN1bHQgPSB2ZXJpZmljYXRpb25SZXN1bHQ7Ci0JCV9EaWFsb2dQYWdlID0gZGlhbG9nUGFnZTsKLQkJaWYgKGRpYWxvZ1BhZ2UgaW5zdGFuY2VvZiBKYXJWZXJpZmljYXRpb25QYWdlKXsKLQkJCSgoSmFyVmVyaWZpY2F0aW9uUGFnZSlfRGlhbG9nUGFnZSkuc2V0VGl0bGVBcmVhRGlhbG9nKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGJ1dHRvbnMgdG8gdGhlIGRpYWxvZydzIGJ1dHRvbiBiYXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKQotCQkJIT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX0NPUlJVUFRFRCkgewotCi0JCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKSkgewotCQkJCWNyZWF0ZUJ1dHRvbigKLQkJCQkJcGFyZW50LAotCQkJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5JbnN0YWxsIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVCdXR0b24oCi0JCQkJCXBhcmVudCwKLQkJCQkJSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ29udGludWUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlmYWxzZSk7CQkJCQotCQkJfQotCi0JCQkvLyBSYWRpbyBidXR0b246IENhbmNlbCBpbnN0YWxsYXRpb24KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJY3JlYXRlQnV0dG9uKAotCQkJCXBhcmVudCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5DYW5jZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCXRydWUpOwkJCQkJCQkKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ2FuY2VsIiksIC8vJE5PTi1OTFMtMSQKLQkJCQl0cnVlKTsKLQkJfQotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpLnNldEZvY3VzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlUGFyZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCXNldFRpdGxlSW1hZ2UodGhpcy5nZXRJbWFnZSgpKTsKLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCV9EaWFsb2dQYWdlLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlUGFyZW50KTsKLQkJcGFnZUNvbnRhaW5lcj0oQ29tcG9zaXRlKV9EaWFsb2dQYWdlLmdldENvbnRyb2woKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcGFnZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcGFnZUNvbnRhaW5lci5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwkJCi0JCQotCQkvLyBCdWlsZCB0aGUgc2VwYXJhdG9yIGxpbmUKLQkJTGFiZWwgc2VwYXJhdG9yPSBuZXcgTGFiZWwoY29tcG9zaXRlUGFyZW50LCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlUGFyZW50OwotCX0KLQkKLQkJLyoqCi0JICogQHNlZSBJRGlhbG9nUGFnZSNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoZGVmYXVsdEltYWdlID09IG51bGwpCi0JCQlkZWZhdWx0SW1hZ2UgPSBkZWZhdWx0SW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0KLQkJcmV0dXJuIGRlZmF1bHRJbWFnZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJLy8gZGlzcG9zZSBvZiBpbWFnZQotCQlpZiAoZGVmYXVsdEltYWdlICE9IG51bGwpIHsKLQkJCWRlZmF1bHRJbWFnZS5kaXNwb3NlKCk7Ci0JCQlkZWZhdWx0SW1hZ2UgPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTQwZTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphclZlcmlmaWNhdGlvblBhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIHsKLQotCXByaXZhdGUgSVZlcmlmaWNhdGlvblJlc3VsdCBfVmVyaWZpY2F0aW9uUmVzdWx0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfZmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9zdHJGZWF0dXJlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3N0cklkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfc3RyUHJvdmlkZXJOYW1lID0gbnVsbDsKLQlwcml2YXRlIFRpdGxlQXJlYURpYWxvZyBfRGlhbG9nOwotCXByaXZhdGUgU3RyaW5nIGNvbXBvbmVudFZlcmlmaWVkOwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSmFyVmVyaWZpY2F0aW9uUGFnZS4KLQkgKi8KLQlwdWJsaWMgSmFyVmVyaWZpY2F0aW9uUGFnZShJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmaWNhdGlvblJlc3VsdCkgewotCQlzdXBlcihVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5WZXJpZmljYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJX2ZpbGVOYW1lID0gdmVyaWZpY2F0aW9uUmVzdWx0LmdldENvbnRlbnRSZWZlcmVuY2UoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCV9WZXJpZmljYXRpb25SZXN1bHQgPSB2ZXJpZmljYXRpb25SZXN1bHQ7Ci0JCV9zdHJJZCA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCV9zdHJGZWF0dXJlTmFtZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0TGFiZWwoKTsKLQkJX3N0clByb3ZpZGVyTmFtZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0UHJvdmlkZXIoKTsKLQkJY29tcG9uZW50VmVyaWZpZWQgPQkodmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSA/ICIuRmVhdHVyZSIgOiAiLkZpbGUiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgY29tcG9zaXRlUGFyZW50KSB7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjb21wb3NpdGVQYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuSmFyVmVyaWZpY2F0aW9uUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIENvbXBvc2l0ZTogQ2xpZW50Ci0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGVDbGllbnQgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZVBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGVDbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZUNsaWVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBUZXh0IEluZm9ybWF0aW9uCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tCQkKLQkJY3JlYXRlVGV4dEFyZWEoY29tcG9zaXRlQ2xpZW50KTsKLQotCQkvLyBDZXJ0aWZpY2F0ZSBBcmVhCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWNyZWF0ZUNlcnRpZmljYXRlQXJlYShjb21wb3NpdGVDbGllbnQpOwotCi0JCS8vIEZpbGUgYW5kIEZlYXR1cmUgSW5mb3JtYXRpb24KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkJCi0JCWNyZWF0ZUluZm9ybWF0aW9uQXJlYShjb21wb3NpdGVDbGllbnQpOwotCi0JCS8vIENob2ljZSBBcmVhCi0JCS8vLS0tLS0tLS0tLS0tCQkKLQkJLy9jcmVhdGVDaG9pY2VBcmVhKGNvbXBvc2l0ZUNsaWVudCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGVQYXJlbnQpOwotCQlyZXR1cm4gY29tcG9zaXRlQ2xpZW50OwotCi0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIHRoZSBJbmZvcm1hdGlvbiB0ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGVDbGllbnQpIHsKLQotCQkvLyBMYWJlbDogSW5mb3JtYXRpb24KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0KLQkJTGFiZWwgbGFiZWxJbmZvcm1hdGlvbiA9Ci0JCQluZXcgTGFiZWwoY29tcG9zaXRlQ2xpZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsSW5mb3JtYXRpb24uc2V0TGF5b3V0RGF0YSgKLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKSkgewotCi0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEIDoKLQkJCQlTdHJpbmcgbXNnID0KLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIkphclZlcmlmaWNhdGlvbkRpYWxvZy5BYm91dFRvSW5zdGFsbCIrIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKTsKLQkJCQlzZXRNZXNzYWdlKG1zZywgV0FSTklORyk7Ci0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuTm90RGlnaXRhbGx5U2lnbmVkIisgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpKTsKLQkJCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ2Fubm90VmVyaWZ5UHJvdmlkZXIiKyAvLyROT04tTkxTLTEkCi0JCQkJCQljb21wb25lbnRWZXJpZmllZCkpOwotLyoJCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSB7Ci0JCQkJCXN0cmIuYXBwZW5kKAotCQkJCQkJVXBkYXRlVUkuZ2V0UmVzb3VyY2VTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5JbnN0YWxsTWF5Q29ycnVwdCIpKTsvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyYi5hcHBlbmQoCi0JCQkJCQlVcGRhdGVVSS5nZXRSZXNvdXJjZVN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvbnRpbnVlTWF5Q29ycnVwdCIpKTsvLyROT04tTkxTLTEkIAkJCQkJCi0JCQkJfQotCQkJCSovCi0JCQkJbGFiZWxJbmZvcm1hdGlvbi5zZXRUZXh0KHN0cmIudG9TdHJpbmcoKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX0NPUlJVUFRFRCA6Ci0JCQkJbXNnID0KLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIkphclZlcmlmaWNhdGlvbkRpYWxvZy5Db3JydXB0ZWRDb250ZW50IisgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpOwotCQkJCXNldE1lc3NhZ2UobXNnLCBFUlJPUik7Ci0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ29tcG9uZW50Tm90SW5zdGFsbGVkIikpOyAvLyROT04tTkxTLTEkCi0JCQkJbGFiZWxJbmZvcm1hdGlvbi5zZXRUZXh0KHN0cmIudG9TdHJpbmcoKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1NJR05FRF9VTlJFQ09HTklaRUQgOgotCQkJCW1zZyA9Ci0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuU2lnbmVkQ29tcG9uZW50IisgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpOwotCQkJCXNldE1lc3NhZ2UobXNnLCBXQVJOSU5HKTsKLQkJCQlzdHJiLmFwcGVuZCgKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIkphclZlcmlmaWNhdGlvbkRpYWxvZy5Vbmtub3duQ2VydGlmaWNhdGUiKyAvLyROT04tTkxTLTEkCi0JCQkJCQljb21wb25lbnRWZXJpZmllZCkpOwotCQkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHJiLmFwcGVuZCgKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIkphclZlcmlmaWNhdGlvbkRpYWxvZy5VbmFibGVUb1ZlcmlmeVByb3ZpZGVyIisgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpKTsKLS8qCQkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKSkgewotCQkJCQlzdHJiLmFwcGVuZCgKLQkJCQkJCVVwZGF0ZVVJLmdldFJlc291cmNlU3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuSW5zdGFsbE1heUNvcnJ1cHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJiLmFwcGVuZCgKLQkJCQkJCVVwZGF0ZVVJLmdldFJlc291cmNlU3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ29udGludWVNYXlDb3JydXB0IikpOy8vJE5PTi1OTFMtMSQgCQkJCQkKLQkJCQl9Ci0JCQkJKi8KLQkJCQlsYWJlbEluZm9ybWF0aW9uLnNldFRleHQoc3RyYi50b1N0cmluZygpKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQgOgotCQkJCW1zZyA9Ci0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuU2lnbmVkQ29tcG9uZW50IisgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpOwotCQkJCXNldE1lc3NhZ2UobXNnLCBXQVJOSU5HKTsKLQkJCQlzdHJiLmFwcGVuZCgKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIkphclZlcmlmaWNhdGlvbkRpYWxvZy5Lbm93bkNlcnRpZmljYXRlIisgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpKTsKLQkJCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuUHJvdmlkZXJLbm93biIrIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKSk7Ci0JCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJbGFiZWxJbmZvcm1hdGlvbi5zZXRUZXh0KHN0cmIudG9TdHJpbmcoKSk7Ci0KLS8vCQkJCWNyZWF0ZUNhdXRpb25BcmVhKGNvbXBvc2l0ZUNsaWVudCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0KLQkvKgotCSAqIFByZXNlbnRzIEZpbGUgJiBGZWF0dXJlIGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUluZm9ybWF0aW9uQXJlYShDb21wb3NpdGUgY29tcG9zaXRlQ2xpZW50KSB7Ci0KLQkJLy8gQ29tcG9zaXRlOiBJbmZvcm1hdGlvbiBsYWJlbHMKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZUluZm9ybWF0aW9uID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGVDbGllbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wb3NpdGVJbmZvcm1hdGlvbi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlSW5mb3JtYXRpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gRmVhdHVyZSBuYW1lCi0JCS8vLS0tLS0tLS0tLS0tLS0tCi0JCUxhYmVsIGtleUxhYmVsID0gbnVsbDsKLQkJQ0xhYmVsIHZhbHVlTGFiZWwgPSBudWxsOwotCQlpZiAoX3N0ckZlYXR1cmVOYW1lICE9IG51bGwgJiYgX3N0ckZlYXR1cmVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCWtleUxhYmVsLnNldFRleHQoCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuRmVhdHVyZU5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJdmFsdWVMYWJlbCA9IG5ldyBDTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCXZhbHVlTGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOwotCQkJdmFsdWVMYWJlbC5zZXRUZXh0KF9zdHJGZWF0dXJlTmFtZSk7Ci0JCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0JCS8vIEZlYXR1cmUgaWRlbnRpZmllcgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlpZiAoX3N0cklkICE9IG51bGwgJiYgX3N0cklkLmxlbmd0aCgpID4gMCkgewotCQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCWtleUxhYmVsLnNldFRleHQoCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuRmVhdHVyZUlkZW50aWZpZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJdmFsdWVMYWJlbCA9IG5ldyBDTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCXZhbHVlTGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOwotCQkJdmFsdWVMYWJlbC5zZXRUZXh0KF9zdHJJZCk7Ci0JCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0JCS8vIFByb3ZpZGVyIG5hbWUKLQkJLy8tLS0tLS0tLS0tLS0tLQotCQlpZiAoX3N0clByb3ZpZGVyTmFtZSAhPSBudWxsICYmIF9zdHJQcm92aWRlck5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQkJa2V5TGFiZWwuc2V0VGV4dCgKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5Qcm92aWRlciIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl2YWx1ZUxhYmVsID0gbmV3IENMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQkJdmFsdWVMYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0JCQl2YWx1ZUxhYmVsLnNldFRleHQoX3N0clByb3ZpZGVyTmFtZSk7Ci0JCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0JCS8vIExhYmVsOiBGaWxlIG5hbWUKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLQotCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQlrZXlMYWJlbC5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuRmlsZU5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl2YWx1ZUxhYmVsID0gbmV3IENMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQl2YWx1ZUxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJdmFsdWVMYWJlbC5zZXRUZXh0KF9maWxlTmFtZSk7Ci0JCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JfQotCi0JLyoKLQkgKiBTaG93IGNlcnRpZmljYXRlIGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNlcnRpZmljYXRlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlQ2xpZW50KSB7Ci0KLQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCi0JCQk9PSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1VOUkVDT0dOSVpFRAotCQkJfHwgX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkKLQkJCQk9PSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQpIHsKLQkJCS8vIEdyb3VwIGJveAotCQkJLy8tLS0tLS0tLS0tCi0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGVDbGllbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWdyb3VwLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ2VydGlmaWNhdGVJbmZvIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIFNpZ25lcgotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQlMYWJlbCBrZXlMYWJlbCA9IG51bGw7Ci0JCQlUZXh0IHZhbHVlVGV4dCA9IG51bGw7Ci0JCQkvL2RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCS8vZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJCS8vdGV4dEluZm9ybWF0aW9uLnNldExheW91dERhdGEoZGF0YSk7CQkJCi0JCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRTaWduZXJJbmZvKCkgIT0gbnVsbCkgewotCQkJCWtleUxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7Ci0JCQkJa2V5TGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5TdWJqZWN0Q0EiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlrZXlMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQkJCXZhbHVlVGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuTVVMVEl8U1dULkJPUkRFUnxTV1QuV1JBUHxTV1QuVl9TQ1JPTEwpOwotCQkJCXZhbHVlVGV4dC5zZXRUZXh0KF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0U2lnbmVySW5mbygpKTsKLQkJCQl2YWx1ZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJCXZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCX0KLQkJCQotCQkJLy8gQXV0aGVudGljYXRvcgotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWVySW5mbygpICE9IG51bGwpIHsKLQkJCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5VTEwpOwotCQkJCWtleUxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuUm9vdENBIikpOyAvLyROT04tTkxTLTEkCi0JCQkJa2V5TGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7CQkJCQotCi0JCQkJdmFsdWVUZXh0ID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5NVUxUSXxTV1QuQk9SREVSfFNXVC5XUkFQfFNXVC5WX1NDUk9MTCk7Ci0JCQkJdmFsdWVUZXh0LnNldFRleHQoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmllckluZm8oKSk7Ci0JCQkJdmFsdWVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQl2YWx1ZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNldHMgdGhlIERpYWxvZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlQXJlYURpYWxvZyhUaXRsZUFyZWFEaWFsb2cgZGlhbG9nKSB7Ci0JCV9EaWFsb2cgPSBkaWFsb2c7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlLCBpbnQgbmV3VHlwZSkgewotCQlzdXBlci5zZXRNZXNzYWdlKG5ld01lc3NhZ2UsIG5ld1R5cGUpOwotCQlpZiAoX0RpYWxvZyAhPSBudWxsKSB7Ci0JCQlfRGlhbG9nLnNldE1lc3NhZ2UobmV3TWVzc2FnZSwgbmV3VHlwZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25TZXJ2aWNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODhmZGYwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEphclZlcmlmaWNhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgewotCi0JLyoKLQkgKiBUaGUgSmFyVmVyaWZpZXIgaXMgYSBpbnN0YW5jZSB2YXJpYWJsZQotCSAqIGJhY2F1c2Ugd2Ugd2FudCB0byByZXVzZSBpdCB1cG9uIG11bHRpcGxlIGNhbGxzCi0JICovCi0KLQkvKgotCSAqIHRoZSBTaGVsbAotCSAqLwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCi0JLyoqCi0JICogUHJvY2Vzc2VkIENvbnRlbnRSZWZlcm5jZXMuICBUaGV5IHdpbGwgYmUgc2tpcHBlZCBpZiBwcm9tcHRlZAotCSAqIHRvIHZlcmlmeSB0aGUgc2FtZSByZWZlcmVuY2UgYWdhaW4uCi0JICovCi0JcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkPW5ldyBIYXNoTWFwKCk7Ci0KLQkvKgotCSAqIElmIG5vIHNoZWxsLCBjcmVhdGUgYSBuZXcgc2hlbGwgCi0JICovCi0JcHVibGljIEphclZlcmlmaWNhdGlvblNlcnZpY2UoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIEphclZlcmlmaWNhdGlvblNlcnZpY2UoU2hlbGwgYVNoZWxsKSB7Ci0JCXNoZWxsID0gYVNoZWxsOwotCi0JCS8vIGZpbmQgdGhlIGRlZmF1bHQgZGlzcGxheSBhbmQgZ2V0IHRoZSBhY3RpdmUgc2hlbGwKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCWZpbmFsIERpc3BsYXkgZGlzcCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaWYgKGRpc3AgPT0gbnVsbCkgewotCQkJCXNoZWxsID0gbmV3IFNoZWxsKG5ldyBEaXNwbGF5KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXNwLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc2hlbGwgPSBkaXNwLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgb3BlbldpemFyZChJVmVyaWZpY2F0aW9uUmVzdWx0IHJlc3VsdCkgewotCQlpbnQgY29kZTsKLQkJSURpYWxvZ1BhZ2UgcGFnZSA9IG5ldyBKYXJWZXJpZmljYXRpb25QYWdlKHJlc3VsdCk7Ci0JCUphclZlcmlmaWNhdGlvbkRpYWxvZyBkaWFsb2cgPQotCQkJCW5ldyBKYXJWZXJpZmljYXRpb25EaWFsb2coc2hlbGwscGFnZSxyZXN1bHQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNjAwLCA1MDApOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLnd0aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cub3BlbigpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBKYXJWZXJpZmljYXRpb25EaWFsb2cuT0spCi0JCQljb2RlID0gQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTOwotCQllbHNlCi0JCQljb2RlID0gQ0hPSUNFX0FCT1JUOwotCi0JCXJldHVybiBjb2RlOwotCi0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IHByb21wdChmaW5hbCBJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmaWNhdGlvblJlc3VsdCl7Ci0JCWlmICghVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oVXBkYXRlQ29yZS5QX0NIRUNLX1NJR05BVFVSRSkpIAotCQkJcmV0dXJuIENIT0lDRV9JTlNUQUxMX1RSVVNUX0FMV0FZUzsKLQotCQlpZiAodmVyaWZpY2F0aW9uUmVzdWx0LmFscmVhZHlTZWVuKCkpIHJldHVybiBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7Ci0JCQotCQlpZihzZWUodmVyaWZpY2F0aW9uUmVzdWx0KSkgcmV0dXJuIENIT0lDRV9JTlNUQUxMX1RSVVNUX0FMV0FZUzsKLQotCQlzd2l0Y2ggKHZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkpIHsKLQkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SIDoKLQkJCQkJcmV0dXJuIENIT0lDRV9FUlJPUjsKLQotCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlZFUklGSUNBVElPTl9DQU5DRUxMRUQ6Ci0JCQkJCXJldHVybiBDSE9JQ0VfQUJPUlQ7Ci0KLQkJCS8vIGNhbm5vdCB2ZXJpZnkgaXQ6IGRvIG5vdCBwcm9tcHQgdXNlci4KLQkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1VOUkVDT0dOSVpFRDogCi0JCQkJcmV0dXJuIENIT0lDRV9JTlNUQUxMX1RSVVNUX0FMV0FZUzsJCQkJCi0JCQkKLQkJCWRlZmF1bHQgOgotCQkJCXsKLQkJCQkJZmluYWwgaW50W10gd2l6YXJkUmVzdWx0ID0gbmV3IGludFsxXTsJCQkJCQotCQkJCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXdpemFyZFJlc3VsdFswXSA9IG9wZW5XaXphcmQodmVyaWZpY2F0aW9uUmVzdWx0KTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCXJldHVybiB3aXphcmRSZXN1bHRbMF07Ci0JCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgZmVhdHVyZSBhcmNoaXZlIGhhcyBiZWVuIHNlZW4gYWxyZWFkeS4KLQkgKiBSZW1lbWJlcnMgdGhlIGZhY3QgdGhhdCBhcmNoaXZlIGlzIGJlaW5nIHNlZW4gbm93LgotCSAqIEBwYXJhbSB2ZXJpZmljYXRpb25SZXN1bHQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFyY2hpdmUgaGFzIGJlZW4gc2VlbiBiZWZvcmUsIGZhbHNlIGlmIGZpcnN0IHRpbWUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2VlKGZpbmFsIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZpY2F0aW9uUmVzdWx0KSB7Ci0JCVN0cmluZyBrZXkgPSB2ZXJpZmljYXRpb25SZXN1bHQuZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpCi0JCQkrIi8iK3ZlcmlmaWNhdGlvblJlc3VsdC5nZXRDb250ZW50UmVmZXJlbmNlKCkuZ2V0SWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkCi0JCUxvbmcgdmFsdWUgPSBuZXcgTG9uZyh2ZXJpZmljYXRpb25SZXN1bHQuZ2V0Q29udGVudFJlZmVyZW5jZSgpLmdldExhc3RNb2RpZmllZCgpKTsKLQkJTG9uZyBjYWNoZWRWYWx1ZSA9IChMb25nKXByb2Nlc3NlZC5nZXQoa2V5KTsKLQkJaWYodmFsdWUuZXF1YWxzKGNhY2hlZFZhbHVlKSl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2V7Ci0JCQlwcm9jZXNzZWQucHV0KGtleSwgdmFsdWUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvVXBkYXRlTWFuYWdlckF1dGhlbnRpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZTVjZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvVXBkYXRlTWFuYWdlckF1dGhlbnRpY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotLyoqCi0gKiBVcGRhdGUgTWFuYWdlciBBdXRoZW50aWNhdG9yIFNhZGx5IHRoZXJlIGNhbiBvbmx5IGJlIG9uZSByZWdpc3RlcmVkIHBlciBWTQotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuYWdlckF1dGhlbnRpY2F0b3IgZXh0ZW5kcyBBdXRoZW50aWNhdG9yIHsKLQlwcml2YXRlIEF1dGhlbnRpY2F0aW9uIHNhdmVkUGFzc3dvcmRBdXRoZW50aWNhdGlvbjsKLQotCS8qCi0JICogQHNlZSBBdXRoZW50aWNhdG9yI2dldFBhc3N3b3JkQXV0aGVudGljYXRpb24oKQotCSAqLwotCXByb3RlY3RlZCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGdldFBhc3N3b3JkQXV0aGVudGljYXRpb24oKSB7Ci0JCS8vIFN0cmluZyBwcm90b2NvbCA9IGdldFJlcXVlc3RpbmdQcm90b2NvbCgpOwotCQlTdHJpbmcgaG9zdCA9IGdldFJlcXVlc3RpbmdIb3N0KCk7IC8vIGNhbiBiZSBudWxsOwotCQlJbmV0QWRkcmVzcyBhZGRyZXNzID0gZ2V0UmVxdWVzdGluZ1NpdGUoKTsgLy8gY2FuIGJlIG51bGw7Ci0JCS8vIGludCBwb3J0ID0gZ2V0UmVxdWVzdGluZ1BvcnQoKTsKLQkJU3RyaW5nIHByb21wdCA9IGdldFJlcXVlc3RpbmdQcm9tcHQoKTsgLy8gcmVhbG0gb3IgbWVzc2FnZSwgbm90IGRvY3VtZW50ZWQgdGhhdCBjYW4gYmUgbnVsbAotCQkvLyBTdHJpbmcgc2NoZW1lID0gZ2V0UmVxdWVzdGluZ1NjaGVtZSgpOyAvLyBub3QgZG9jdW1lbnRlZCB0aGF0IGNhbiBiZSBudWxsCi0KLQkJU3RyaW5nIGhvc3RTdHJpbmcgPSBob3N0OwotCQlpZiAoaG9zdFN0cmluZyA9PSBudWxsICYmIGFkZHJlc3MgIT0gbnVsbCkgewotCQkJYWRkcmVzcy5nZXRIb3N0TmFtZSgpOwotCQl9Ci0JCWlmIChob3N0U3RyaW5nID09IG51bGwpIHsKLQkJCWhvc3RTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBwcm9tcHRTdHJpbmcgPSBwcm9tcHQ7Ci0JCWlmIChwcm9tcHQgPT0gbnVsbCkgewotCQkJcHJvbXB0U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUF1dGhlbnRpY2F0aW9uIGF1dGggPSBVc2VyVmFsaWRhdGlvbkRpYWxvZy5nZXRBdXRoZW50aWNhdGlvbigKLQkJCQlob3N0U3RyaW5nLCBwcm9tcHRTdHJpbmcpOwotCQlpZiAoYXV0aCAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBQYXNzd29yZEF1dGhlbnRpY2F0aW9uKGF1dGguZ2V0VXNlcigpLCBhdXRoCi0JCQkJCS5nZXRQYXNzd29yZCgpLnRvQ2hhckFycmF5KCkpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VzZXJWYWxpZGF0aW9uRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvVXNlclZhbGlkYXRpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1NWM0YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvVXNlclZhbGlkYXRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLS8qKgotICogVXNlciBhdXRoZW50aWNhdGlvbiBkaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFVzZXJWYWxpZGF0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgVGV4dCB1c2VybmFtZUZpZWxkOwotCXByb3RlY3RlZCBUZXh0IHBhc3N3b3JkRmllbGQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGhvc3Q7Ci0JcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOwotCXByb3RlY3RlZCBBdXRoZW50aWNhdGlvbiB1c2VyQXV0aGVudGljYXRpb24gPSBudWxsOwotCS8qKgotCSAqIEdldHMgdXNlciBhbmQgcGFzc3dvcmQgZnJvbSBhIHVzZXIuIE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkCi0JICogCi0JICogQHJldHVybiBVc2VyQXV0aGVudGljYXRpb24gdGhhdCBjb250YWlucyB0aGUgdXNlcmlkIGFuZCB0aGUgcGFzc3dvcmQgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkaWFsb2cgaGFzIGJlZW4gY2FuY2VsbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRoZW50aWNhdGlvbiBnZXRBdXRoZW50aWNhdGlvbihmaW5hbCBTdHJpbmcgaG9zdCwKLQkJCWZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWNsYXNzIFVJT3BlcmF0aW9uIGltcGxlbWVudHMgUnVubmFibGUgewotCQkJcHVibGljIEF1dGhlbnRpY2F0aW9uIGF1dGhlbnRpY2F0aW9uOwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWF1dGhlbnRpY2F0aW9uID0gVXNlclZhbGlkYXRpb25EaWFsb2cuYXNrRm9yQXV0aGVudGljYXRpb24oCi0JCQkJCQlob3N0LCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCi0JCVVJT3BlcmF0aW9uIHVpbyA9IG5ldyBVSU9wZXJhdGlvbigpOwotCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkgewotCQkJdWlvLnJ1bigpOwotCQl9IGVsc2UgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWModWlvKTsKLQkJfQotCQlyZXR1cm4gdWlvLmF1dGhlbnRpY2F0aW9uOwotCX0KLQkvKioKLQkgKiBHZXRzIHVzZXIgYW5kIHBhc3N3b3JkIGZyb20gYSB1c2VyIE11c3QgYmUgY2FsbGVkIGZyb20gVUkgdGhyZWFkCi0JICogCi0JICogQHJldHVybiBVc2VyQXV0aGVudGljYXRpb24gdGhhdCBjb250YWlucyB0aGUgdXNlcmlkIGFuZCB0aGUgcGFzc3dvcmQgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkaWFsb2cgaGFzIGJlZW4gY2FuY2VsbGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBdXRoZW50aWNhdGlvbiBhc2tGb3JBdXRoZW50aWNhdGlvbihTdHJpbmcgaG9zdCwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCVVzZXJWYWxpZGF0aW9uRGlhbG9nIHVpID0gbmV3IFVzZXJWYWxpZGF0aW9uRGlhbG9nKG51bGwsIGhvc3QsIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JCXVpLm9wZW4oKTsKLQkJcmV0dXJuIHVpLmdldEF1dGhlbnRpY2F0aW9uKCk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgVXNlclZhbGlkYXRpb25EaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBwYXJlbnQgU2hlbGwgb3IgbnVsbAotCSAqLwotCXByb3RlY3RlZCBVc2VyVmFsaWRhdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGhvc3QsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuaG9zdCA9IGhvc3Q7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXNldEJsb2NrT25PcGVuKHRydWUpOwotCX0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoVXBkYXRlVUkKLQkJCQkuZ2V0U3RyaW5nKCJVc2VyVmVyaWZpY2F0aW9uRGlhbG9nLlBhc3N3b3JkUmVxdWlyZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJLy9naXZlIGZvY3VzIHRvIHVzZXJuYW1lIGZpZWxkCi0JCXVzZXJuYW1lRmllbGQuc2VsZWN0QWxsKCk7Ci0JCXVzZXJuYW1lRmllbGQuc2V0Rm9jdXMoKTsKLQl9Ci0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBtYWluID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCW1haW4uc2V0TGF5b3V0KGxheW91dCk7Ci0JCW1haW4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobWFpbiwgU1dULldSQVApOwotCQlTdHJpbmcgdGV4dCA9IFVwZGF0ZVVJLmdldFN0cmluZygiVXNlclZlcmlmaWNhdGlvbkRpYWxvZy5Db25uZWN0VG8iKSArIGhvc3Q7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dCArPSAiXG5cbiIgKyBtZXNzYWdlOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljcmVhdGVVc2VybmFtZUZpZWxkcyhtYWluKTsKLQkJY3JlYXRlUGFzc3dvcmRGaWVsZHMobWFpbik7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChtYWluLAotCQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuVXNlclZhbGlkYXRpb25EaWFsb2ciKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbWFpbjsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGhyZWUgd2lkZ2V0cyB0aGF0IHJlcHJlc2VudCB0aGUgdXNlciBuYW1lIGVudHJ5IGFyZWEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFzc3dvcmRGaWVsZHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0VGV4dChVcGRhdGVVSQotCQkJCS5nZXRTdHJpbmcoIlVzZXJWZXJpZmljYXRpb25EaWFsb2cuUGFzc3dvcmQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXNzd29yZEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlBBU1NXT1JEKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuRU5UUllfRklFTERfV0lEVEgpOwotCQlwYXNzd29yZEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvL3NwYWNlcgotCX0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0aHJlZSB3aWRnZXRzIHRoYXQgcmVwcmVzZW50IHRoZSB1c2VyIG5hbWUgZW50cnkgYXJlYS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVc2VybmFtZUZpZWxkcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKS5zZXRUZXh0KFVwZGF0ZVVJCi0JCQkJLmdldFN0cmluZygiVXNlclZlcmlmaWNhdGlvbkRpYWxvZy5Vc2VyTmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVzZXJuYW1lRmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5FTlRSWV9GSUVMRF9XSURUSCk7Ci0JCXVzZXJuYW1lRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7IC8vc3BhY2VyCi0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVzZXJBdXRoZW50aWNhdGlvbiBlbnRlcmVkIGJ5IHRoZSB1c2VyLCBvciBudWxsIGlmIHRoZSB1c2VyCi0JICogY2FuY2VsZWQuCi0JICovCi0JcHVibGljIEF1dGhlbnRpY2F0aW9uIGdldEF1dGhlbnRpY2F0aW9uKCkgewotCQlyZXR1cm4gdXNlckF1dGhlbnRpY2F0aW9uOwotCX0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBvayBidXR0b24gb2YgdGhpcyBkaWFsb2cgaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXVzZXJBdXRoZW50aWNhdGlvbiA9IG5ldyBBdXRoZW50aWNhdGlvbih1c2VybmFtZUZpZWxkLmdldFRleHQoKSwKLQkJCQlwYXNzd29yZEZpZWxkLmdldFRleHQoKSk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uUHJldmlldy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25QcmV2aWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTIwODUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25QcmV2aWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUxvY2FsU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uUHJldmlldyBpbXBsZW1lbnRzIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBTY3JvbGxlZEZvcm0gZm9ybTsKLQlwcml2YXRlIENvbmZpZ3VyYXRpb25WaWV3IHZpZXc7Ci0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCXByaXZhdGUgRm9ybVRleHQgZGVzYzsKLQlwcml2YXRlIEZvcm1UZXh0IHRhc2tMaXN0OwotCXByaXZhdGUgSVByZXZpZXdUYXNrW10gdGFza3M7Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb25QcmV2aWV3KENvbmZpZ3VyYXRpb25WaWV3IHZpZXcpIHsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJbW9kZWwuYWRkVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCW1vZGVsLnJlbW92ZVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl0b29sa2l0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvYmplY3RzQWRkZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQl9Ci0JcHVibGljIHZvaWQgb2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQl9Ci0JcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZm9ybTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdG9vbGtpdCA9IG5ldyBGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJZm9ybSA9IHRvb2xraXQuY3JlYXRlU2Nyb2xsZWRGb3JtKHBhcmVudCk7Ci0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IDEwOwotCQlsYXlvdXQucmlnaHRNYXJnaW4gPSA1OwotCQlsYXlvdXQudG9wTWFyZ2luID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJSUh5cGVybGlua0xpc3RlbmVyIHVybEFjdGlvbiA9IG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHVybCA9IChTdHJpbmcpIGUuZ2V0SHJlZigpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQkJVXBkYXRlVUkuc2hvd1VSTCh1cmwpOwotCQkJfQotCQl9OwotCQlJSHlwZXJsaW5rTGlzdGVuZXIgdGFza0FjdGlvbiA9IG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGluZGV4QXJnID0gKFN0cmluZykgZS5nZXRIcmVmKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IGluZGV4ID0gSW50ZWdlci5wYXJzZUludChpbmRleEFyZyk7Ci0JCQkJCWlmICh0YXNrcyAhPSBudWxsKQotCQkJCQkJdGFza3NbaW5kZXhdLnJ1bigpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCX0KLQkJfTsKLQkJLy90YXNrQWN0aW9uLnNldFN0YXR1c0xpbmVNYW5hZ2VyKHZpZXcuZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotCQlkZXNjID0gdG9vbGtpdC5jcmVhdGVGb3JtVGV4dChmb3JtLmdldEJvZHkoKSwgdHJ1ZSk7Ci0JCWRlc2Muc2V0SHlwZXJsaW5rU2V0dGluZ3ModG9vbGtpdC5nZXRIeXBlcmxpbmtHcm91cCgpKTsKLQkJZGVzYy5hZGRIeXBlcmxpbmtMaXN0ZW5lcih1cmxBY3Rpb24pOwotCQlkZXNjLnNldFRleHQoIiIsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJZGVzYy5zZXRMYXlvdXREYXRhKHRkKTsKLQkJdGFza0xpc3QgPSB0b29sa2l0LmNyZWF0ZUZvcm1UZXh0KGZvcm0uZ2V0Qm9keSgpLCB0cnVlKTsKLQkJdGFza0xpc3Quc2V0SHlwZXJsaW5rU2V0dGluZ3ModG9vbGtpdC5nZXRIeXBlcmxpbmtHcm91cCgpKTsKLQkJdGFza0xpc3QuYWRkSHlwZXJsaW5rTGlzdGVuZXIodGFza0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJdGFza0xpc3Quc2V0VGV4dCgiIiwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkvL2ZhY3Rvcnkuc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZShIeXBlcmxpbmtTZXR0aW5ncy5VTkRFUkxJTkVfUk9MTE9WRVIpOwotCQl0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJdGFza0xpc3Quc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuU2l0ZUZvcm0iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCXRhc2tzID0gdmlldy5nZXRQcmV2aWV3VGFza3Mob2JqZWN0KTsKLQkJU3RyaW5nIHRpdGxlID0gZ2V0T2JqZWN0TGFiZWwob2JqZWN0KTsKLQkJZm9ybS5zZXRUZXh0KHRpdGxlKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2V0T2JqZWN0RGVzY3JpcHRpb24ob2JqZWN0KTsKLQkJYm9vbGVhbiB0YWdzID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgiPGZvcm0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGVzYy5zZXRUZXh0KGRlc2NyaXB0aW9uLCB0YWdzLCAhdGFncyk7Ci0JCVN0cmluZyB0YXNrVGV4dCA9IGdldFRhc2tzVGV4dCgpOwotCQl0YXNrTGlzdC5zZXRUZXh0KHRhc2tUZXh0LCB0cnVlLCBmYWxzZSk7Ci0JCWZvcm0ucmVmbG93KHRydWUpOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRPYmplY3RMYWJlbChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlUcmVlVmlld2VyIHZpZXdlciA9IHZpZXcuZ2V0VHJlZVZpZXdlcigpOwotCQlMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gKExhYmVsUHJvdmlkZXIpIHZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCXJldHVybiBwcm92aWRlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldE9iamVjdERlc2NyaXB0aW9uKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikgewotCQkJcmV0dXJuIGdldEZlYXR1cmVEZXNjcmlwdGlvbigoSUZlYXR1cmVBZGFwdGVyKSBvYmplY3QpOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uUHJldmlld0Zvcm0uaW5zdGFsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKLQkJCXJldHVybiBVcGRhdGVVSQotCQkJCQkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uUHJldmlld0Zvcm0uY29uZmlnRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlRGVzY3JpcHRpb24oSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJdHJ5IHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlJVVJMRW50cnkgZW50cnkgPSBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCVN0cmluZyB0ZXh0ID0gZW50cnkuZ2V0QW5ub3RhdGlvbigpOwotCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJVVJMIHVybCA9IGVudHJ5LmdldFVSTCgpOwotCQkJCQlpZiAodXJsID09IG51bGwpCi0JCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbGluayA9ICIgPGEgaHJlZj1cInVybEhhbmRsZXJcIiBhcmc9XCIiICsgdXJsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyAiXCI+TW9yZSBpbmZvLi4uPC9hPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJU3RyaW5nIGZ1bGxUZXh0ID0gIjxmb3JtPjxwPiIgKyB0ZXh0ICsgbGluayAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgIjwvcD48L2Zvcm0+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlyZXR1cm4gZnVsbFRleHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRUYXNrc1RleHQoKSB7Ci0JCWlmICh0YXNrcyA9PSBudWxsIHx8IHRhc2tzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuICI8Zm9ybS8+IjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIGhhc0VuYWJsZWRUYXNrcyA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGFza3NbaV0uaXNFbmFibGVkKCkpIHsKLQkJCQloYXNFbmFibGVkVGFza3MgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghaGFzRW5hYmxlZFRhc2tzKQotCQkJcmV0dXJuICI8Zm9ybS8+IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCI8Zm9ybT48cD48Yj5BdmFpbGFibGUgVGFza3M8L2I+PC9wPiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpKyspIHsKLQkJCUlQcmV2aWV3VGFzayB0YXNrID0gdGFza3NbaV07Ci0JCQlpZiAodGFzay5pc0VuYWJsZWQoKSA9PSBmYWxzZSkKLQkJCQljb250aW51ZTsKLQkJCWJ1Zi5hcHBlbmQoIjxsaSBzdHlsZT1cInRleHRcIiBpbmRlbnQ9XCIwXCI+PGEgaHJlZj1cIiIgKyBpICsgIlwiPiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgdGFzay5nZXROYW1lKCkgKyAiPC9hPjwvbGk+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlidWYuYXBwZW5kKCI8bGkgc3R5bGU9XCJ0ZXh0XCIgaW5kZW50PVwiMTBcIiB2c3BhY2U9XCJmYWxzZVwiPiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIHRhc2suZ2V0RGVzY3JpcHRpb24oKSArICI8L2xpPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlidWYuYXBwZW5kKCI8L2Zvcm0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJiM2EwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyYW5kaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVmlldwotCWltcGxlbWVudHMKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyLAotCQlJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIsCi0JCUlMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIgewotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByaXZhdGUgRHJpbGxEb3duQWRhcHRlciBkcmlsbERvd25BZGFwdGVyOwotCXByaXZhdGUgQWN0aW9uIGNvbGxhcHNlQWxsQWN0aW9uOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9TSE9XX1VOQ09ORiA9ICJDb25maWd1cmF0aW9uVmlldy5zaG93VW5jb25mIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9TSE9XX1NJVEVTID0gIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dTaXRlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfU0hPV19ORVNURURfRkVBVFVSRVMgPQotCQkiQ29uZmlndXJhdGlvblZpZXcuc2hvd05lc3RlZEZlYXR1cmVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBY3Rpb24gc2hvd1NpdGVzQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbjsKLQlwcml2YXRlIFJlcGxhY2VWZXJzaW9uQWN0aW9uIHN3YXBWZXJzaW9uQWN0aW9uOwotCXByaXZhdGUgRmVhdHVyZVN0YXRlQWN0aW9uIGZlYXR1cmVTdGF0ZUFjdGlvbjsKLQlwcml2YXRlIFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24gdW5pbnN0YWxsRmVhdHVyZUFjdGlvbjsKLQlwcml2YXRlIEluc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24gaW5zdGFsbE9wdEZlYXR1cmVBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uOwotCXByaXZhdGUgUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbiByZXZlcnRBY3Rpb247Ci0JcHJpdmF0ZSBTaG93QWN0aXZpdGllc0FjdGlvbiBzaG93QWN0aXZpdGllc0FjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCXByaXZhdGUgU2l0ZVN0YXRlQWN0aW9uIHNpdGVTdGF0ZUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBpbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIG5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uOwotCXByaXZhdGUgRmluZFVwZGF0ZXNBY3Rpb24gZmluZFVwZGF0ZXNBY3Rpb247Ci0JcHJpdmF0ZSBTYXNoRm9ybSBzcGxpdHRlcjsKLQlwcml2YXRlIENvbmZpZ3VyYXRpb25QcmV2aWV3IHByZXZpZXc7Ci0JcHJpdmF0ZSBIYXNodGFibGUgcHJldmlld1Rhc2tzOwotCi0JcHJpdmF0ZSBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbW9kZWxMaXN0ZW5lcjsKLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaExvY2sgPSBmYWxzZTsKLQlwcml2YXRlIEltYWdlIGVjbGlwc2VJbWFnZTsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdyBjb25maWd1cmF0aW9uV2luZG93OwotCi0JY2xhc3MgQ29uZmlndXJhdGlvblNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IG9iaikgewotCQkJLy8gc2l0ZXMKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0KLQkJCQkJKChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBvYmopLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQkJaWYgKGNzaXRlLmlzUHJvZHVjdFNpdGUoKSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJaWYgKGNzaXRlLmlzRXh0ZW5zaW9uU2l0ZSgpKQotCQkJCQlyZXR1cm4gMjsKLQkJCQlyZXR1cm4gMzsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jYXRlZ29yeShvYmopOwotCQl9Ci0JfQotCi0JY2xhc3MgTG9jYWxTaXRlUHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoCi0JCQlWaWV3ZXIgdmlld2VyLAotCQkJT2JqZWN0IG9sZElucHV0LAotCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlpZiAobmV3SW5wdXQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFVwZGF0ZU1vZGVsKSB7Ci0JCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKLQkJCQlyZXR1cm4gKGxvY2FsU2l0ZSAhPSBudWxsKSA/IG5ldyBPYmplY3RbXSB7IGxvY2FsU2l0ZSB9Ci0JCQkJOiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkgewotCQkJCU9iamVjdFtdIGNzaXRlcyA9IG9wZW5Mb2NhbFNpdGUoKTsKLQkJCQlpZiAoc2hvd1NpdGVzQWN0aW9uLmlzQ2hlY2tlZCgpKQotCQkJCQlyZXR1cm4gY3NpdGVzOwotCQkJCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJYm9vbGVhbiBzaG93VW5jb25mID0gc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb25maWd1cmVkU2l0ZUFkYXB0ZXIgYWRhcHRlciA9Ci0JCQkJCQkoSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgY3NpdGVzW2ldOwotCQkJCQlPYmplY3RbXSByb290cyA9IGdldEZlYXR1cmVzKGFkYXB0ZXIsICFzaG93VW5jb25mKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByb290cy5sZW5ndGg7IGorKykgewotCQkJCQkJcmVzdWx0LmFkZChyb290c1tqXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQkJcmV0dXJuIGdldEZlYXR1cmVzKAotCQkJCQkoSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgcGFyZW50LAotCQkJCQkhc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIKLQkJCQkmJiBzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpIHsKLQkJCQlJRmVhdHVyZUFkYXB0ZXJbXSBuZXN0ZWQgPQotCQkJCQkoKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgcGFyZW50KS5nZXRJbmNsdWRlZEZlYXR1cmVzKAotCQkJCQkJbnVsbCk7Ci0JCQkJaWYgKHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQkJcmV0dXJuIG5lc3RlZDsKLQkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICgoKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgbmVzdGVkW2ldKS5pc0NvbmZpZ3VyZWQoKSkKLQkJCQkJCXJlc3VsdC5hZGQobmVzdGVkW2ldKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChJRmVhdHVyZUFkYXB0ZXJbXSkgcmVzdWx0LnRvQXJyYXkoCi0JCQkJCW5ldyBJRmVhdHVyZUFkYXB0ZXJbcmVzdWx0LnNpemUoKV0pOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQlpZiAoIXNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUlGZWF0dXJlQWRhcHRlcltdIGZlYXR1cmVzID0KLQkJCQkJKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHBhcmVudCkuZ2V0SW5jbHVkZWRGZWF0dXJlcygKLQkJCQkJCW51bGwpOwotCi0JCQkJaWYgKHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQkJcmV0dXJuIGZlYXR1cmVzLmxlbmd0aCA+IDA7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICgoKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgZmVhdHVyZXNbaV0pCi0JCQkJCQkuaXNDb25maWd1cmVkKCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJCUlDb25maWd1cmVkU2l0ZSBzaXRlID0KLQkJCQkJKChDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHBhcmVudCkuZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpZiAoc2l0ZS5pc0VuYWJsZWQoKSkgewotCQkJCQlpZiAoIXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQkJCXJldHVybiBzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aCA+IDA7Ci0JCQkJCXJldHVybiBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCkubGVuZ3RoID4gMDsKLQkJCQl9Ci0JCQkJcmV0dXJuIChzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXQpOwotCQl9Ci0JfQotCi0JY2xhc3MgTG9jYWxTaXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKLQkJCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCQkJCWlmIChwcm9kdWN0ICE9IG51bGwpCi0JCQkJCXJldHVybiBwcm9kdWN0LmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5jdXJyZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPQotCQkJCQkoKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIG9iaikuZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlJU2l0ZSBzaXRlID0gY3NpdGUuZ2V0U2l0ZSgpOwotCQkJCXJldHVybiBuZXcgRmlsZShzaXRlLmdldFVSTCgpLmdldEZpbGUoKSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQl0cnkgewotCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gKChJRmVhdHVyZUFkYXB0ZXIpIG9iaikuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBNaXNzaW5nRmVhdHVyZSkgewotCQkJCQkJcmV0dXJuIFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCQkJIkNvbmZpZ3VyYXRpb25WaWV3Lm1pc3NpbmdGZWF0dXJlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIHZlcnNpb24gPQotCQkJCQkJZmVhdHVyZQotCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwZW5kaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGZlYXR1cmUpCi0JCQkJCQkhPSBudWxsKQotCQkJCQkJcGVuZGluZyA9IFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcucGVuZGluZyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkgKyAiICIgKyB2ZXJzaW9uICsgcGVuZGluZzsgLy8kTk9OLU5MUy0xJAotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5lcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KLQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpCi0JCQkJcmV0dXJuIGVjbGlwc2VJbWFnZTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikKLQkJCQlyZXR1cm4gZ2V0RmVhdHVyZUltYWdlKAotCQkJCQlwcm92aWRlciwKLQkJCQkJKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgb2JqKTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPQotCQkJCQkoKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIG9iaikuZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpbnQgZmxhZ3MgPQotCQkJCQljc2l0ZS5pc1VwZGF0YWJsZSgpID8gMCA6IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9MSU5LRUQ7Ci0JCQkJaWYgKCFjc2l0ZS5pc0VuYWJsZWQoKSkKLQkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX1VOQ09ORklHVVJFRDsKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KAotCQkJCQlwcm92aWRlci5nZXRMb2NhbFNpdGVEZXNjcmlwdG9yKGNzaXRlKSwKLQkJCQkJZmxhZ3MpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIEltYWdlIGdldEZlYXR1cmVJbWFnZSgKLQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIsCi0JCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlcikgewotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKLQkJCQkJaWYgKCgoTWlzc2luZ0ZlYXR1cmUpIGZlYXR1cmUpLmlzT3B0aW9uYWwoKSkKLQkJCQkJCXJldHVybiBwcm92aWRlci5nZXQoCi0JCQkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19OT1RJTlNUX0ZFQVRVUkVfT0JKKTsKLQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldCgKLQkJCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkosCi0JCQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyLkZfRVJST1IpOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gZWZpeCA9IGZlYXR1cmUuaXNQYXRjaCgpOwotCQkJCUltYWdlRGVzY3JpcHRvciBiYXNlRGVzYyA9Ci0JCQkJCWVmaXgKLQkJCQkJCT8gVXBkYXRlVUlJbWFnZXMuREVTQ19FRklYX09CSgotCQkJCQkJOiAoYWRhcHRlci5pc0NvbmZpZ3VyZWQoKQotCQkJCQkJCT8gVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSgotCQkJCQkJCTogVXBkYXRlVUlJbWFnZXMuREVTQ19VTkNPTkZfRkVBVFVSRV9PQkopOwotCi0JCQkJaW50IGZsYWdzID0gMDsKLQkJCQlpZiAoZWZpeCAmJiAhYWRhcHRlci5pc0NvbmZpZ3VyZWQoKSkKLQkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX1VOQ09ORklHVVJFRDsKLQkJCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oZmVhdHVyZSkgPT0gbnVsbCkgewotCQkJCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IGdldExvY2FsU2l0ZSgpOwotCQkJCQlpZiAobG9jYWxTaXRlICE9IG51bGwpIHsKLQkJCQkJCWludCBjb2RlID0KLQkJCQkJCQlnZXRTdGF0dXNDb2RlKAotCQkJCQkJCQlmZWF0dXJlLAotCQkJCQkJCQlsb2NhbFNpdGUuZ2V0RmVhdHVyZVN0YXR1cyhmZWF0dXJlKSk7Ci0JCQkJCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCQkJCQljYXNlIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZIDoKLQkJCQkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX0VSUk9SOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIElGZWF0dXJlLlNUQVRVU19BTUJJR1VPVVMgOgotCQkJCQkJCQlmbGFncyB8PSBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfV0FSTklORzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCWlmIChhZGFwdGVyLmlzQ29uZmlndXJlZCgpCi0JCQkJCQkJCQkmJiBhZGFwdGVyLmlzVXBkYXRlZCgpKQotCQkJCQkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX1VQREFURUQ7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBwcm92aWRlci5nZXQoYmFzZURlc2MsIGZsYWdzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBwcm92aWRlci5nZXQoCi0JCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkosCi0JCQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9FUlJPUik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBQcmV2aWV3VGFzayBpbXBsZW1lbnRzIElQcmV2aWV3VGFzayB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIGRlc2M7Ci0JCXByaXZhdGUgSUFjdGlvbiBhY3Rpb247Ci0JCXB1YmxpYyBQcmV2aWV3VGFzayhTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJCXRoaXMuYWN0aW9uID0gYWN0aW9uOwotCQl9Ci0JCXB1YmxpYyBJQWN0aW9uIGdldEFjdGlvbigpIHsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCXJldHVybiBhY3Rpb24uZ2V0VGV4dCgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gZGVzYzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYykgewotCQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlhY3Rpb24ucnVuKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJcmV0dXJuIGFjdGlvbi5pc0VuYWJsZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlldyhDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdyB3aW5kb3cpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotCQlpbml0aWFsaXplSW1hZ2VzKCk7Ci0JCWNvbmZpZ3VyYXRpb25XaW5kb3c9d2luZG93OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSW1hZ2VzKCkgewotCQlJbWFnZURlc2NyaXB0b3IgZWRlc2MgPSBVcGRhdGVVSUltYWdlcy5ERVNDX0FQUF9PQko7Ci0JCUlQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0JCWlmIChwcm9kdWN0ICE9IG51bGwpIHsKLQkJCVN0cmluZyB3aW5kb3dJbWFnZVVSTCA9IHByb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuV0lORE9XX0lNQUdFKTsKLQkJCWlmICh3aW5kb3dJbWFnZVVSTCA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIHdpbmRvd0ltYWdlc1VybHMgPSBwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldJTkRPV19JTUFHRVMpOwotCQkJCWlmICh3aW5kb3dJbWFnZXNVcmxzICE9IG51bGwgKSB7Ci0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIod2luZG93SW1hZ2VzVXJscywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCQkJd2luZG93SW1hZ2VVUkwgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAod2luZG93SW1hZ2VVUkwgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQllZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwod2luZG93SW1hZ2VVUkwpKTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSwgZmFsc2UpOwotCQkJCX0KLQkJfQotCQllY2xpcHNlSW1hZ2UgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldChlZGVzYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdFByb3ZpZGVycygpIHsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IExvY2FsU2l0ZVByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExvY2FsU2l0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkpOwotCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgQ29uZmlndXJhdGlvblNvcnRlcigpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKLQkJaWYgKGxvY2FsU2l0ZSAhPSBudWxsKQotCQkJbG9jYWxTaXRlLmFkZExvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQltb2RlbExpc3RlbmVyID0gbmV3IElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkJfQotCQkJcHVibGljIHZvaWQgb2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoZmluYWwgT2JqZWN0IG9iaiwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJaWYgKHJlZnJlc2hMb2NrKQotCQkJCQlyZXR1cm47Ci0JCQkJQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotCQkJCWlmICghY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY29udHJvbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKAotCQkJCQkJCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJT3BlcmF0aW9uc01hbmFnZXIuYWRkVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIobW9kZWxMaXN0ZW5lcik7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCWdldENvbnRyb2woKSwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29uZmlndXJhdGlvblZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgSUxvY2FsU2l0ZSBnZXRMb2NhbFNpdGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIG9wZW5Mb2NhbFNpdGUoKSB7Ci0JCWZpbmFsIE9iamVjdFtdW10gYmFnID0gbmV3IE9iamVjdFsxXVtdOwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKLQkJCQlpZiAobG9jYWxTaXRlID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0KLQkJCQkJZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpdGVzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlyZXN1bHRbaV0gPSBuZXcgQ29uZmlndXJlZFNpdGVBZGFwdGVyKGNvbmZpZywgc2l0ZXNbaV0pOwotCQkJCX0KLQkJCQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCQkJCWNvbmZpZy5hZGRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCQkJCUNvbmZpZ3VyYXRpb25WaWV3LnRoaXMpOwotCQkJCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQkJfQotCQkJCWJhZ1swXSA9IHJlc3VsdDsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBiYWdbMF07Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gZ2V0TG9jYWxTaXRlKCk7Ci0JCQlpZiAobG9jYWxTaXRlICE9IG51bGwpIHsKLQkJCQlsb2NhbFNpdGUucmVtb3ZlTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPQotCQkJCQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCQljb25maWcucmVtb3ZlSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCQlpbml0aWFsaXplZCA9IGZhbHNlOwotCQl9Ci0JCU9wZXJhdGlvbnNNYW5hZ2VyLnJlbW92ZVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKG1vZGVsTGlzdGVuZXIpOwotCQlpZiAocHJldmlldyAhPSBudWxsKQotCQkJcHJldmlldy5kaXNwb3NlKCk7Ci0JCS8vc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQljb2xsYXBzZUFsbEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQl0cmVlVmlld2VyLmNvbGxhcHNlVG9MZXZlbCgKLQkJCQkJdHJlZVZpZXdlci5nZXRJbnB1dCgpLAotCQkJCQlUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQkJfTsKLQkJY29sbGFwc2VBbGxBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LmNvbGxhcHNlTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sbGFwc2VBbGxBY3Rpb24uc2V0VG9vbFRpcFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5jb2xsYXBzZVRvb2x0aXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29sbGFwc2VBbGxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09MTEFQU0VfQUxMKTsKLQotCQlkcmlsbERvd25BZGFwdGVyID0gbmV3IERyaWxsRG93bkFkYXB0ZXIodHJlZVZpZXdlcik7Ci0KLQkJZmVhdHVyZVN0YXRlQWN0aW9uID0gbmV3IEZlYXR1cmVTdGF0ZUFjdGlvbigpOwotCi0JCXNpdGVTdGF0ZUFjdGlvbiA9IG5ldyBTaXRlU3RhdGVBY3Rpb24oKTsKLQotCQlyZXZlcnRBY3Rpb24gPSBuZXcgUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnJldmVydExhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCXJldmVydEFjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29maWd1cmF0aW9uVmlld19yZXZlcnRBY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24gPQotCQkJbmV3IEluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24oCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5pbnN0YWxsSGlzdG9yeSIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19ISVNUT1JZX09CSik7Ci0JCWluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uc2V0VG9vbFRpcFRleHQoaW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5nZXRUZXh0KCkpOwotCQkKLQkJbmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24gPQotCQkJbmV3IE5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuZXh0TG9jYXRpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRVNJVEVfT0JKKTsKLQkJCi0JCXByb3BlcnRpZXNBY3Rpb24gPQotCQkJbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKAotCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJdHJlZVZpZXdlcik7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCXByb3BlcnRpZXNBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNvZmlndXJhdGlvblZpZXdfcHJvcGVydGllc0FjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJdW5pbnN0YWxsRmVhdHVyZUFjdGlvbiA9IG5ldyBVbmluc3RhbGxGZWF0dXJlQWN0aW9uKFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcudW5pbnN0YWxsIikpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5zdGFsbE9wdEZlYXR1cmVBY3Rpb24gPQotCQkJbmV3IEluc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24oCi0JCQkJZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5pbnN0YWxsIikpOyAvLyROT04tTkxTLTEkCi0KLQkJc3dhcFZlcnNpb25BY3Rpb24gPSBuZXcgUmVwbGFjZVZlcnNpb25BY3Rpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5hbm90aGVyVmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmRVcGRhdGVzQWN0aW9uID0KLQkJCW5ldyBGaW5kVXBkYXRlc0FjdGlvbihnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5maW5kVXBkYXRlcyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNob3dBY3Rpdml0aWVzQWN0aW9uID0gbmV3IFNob3dBY3Rpdml0aWVzQWN0aW9uKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dBY3Rpdml0aWVzTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJc2hvd0FjdGl2aXRpZXNBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNvZmlndXJhdGlvblZpZXdfc2hvd0FjdGl2aXRpZXNBY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1ha2VTaG93VW5jb25maWd1cmVkRmVhdHVyZXNBY3Rpb24oKTsKLQkJbWFrZVNob3dTaXRlc0FjdGlvbigpOwotCQltYWtlU2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uKCk7Ci0JCW1ha2VQcmV2aWV3VGFza3MoKTsKLQkJY29uZmlndXJhdGlvbldpbmRvdy5zZXRQcm9wZXJ0aWVzQWN0aW9uSGFuZGxlcihwcm9wZXJ0aWVzQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZVNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbigpIHsKLQkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmLnNldERlZmF1bHQoU1RBVEVfU0hPV19ORVNURURfRkVBVFVSRVMsIHRydWUpOwotCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXByZWYuc2V0VmFsdWUoCi0JCQkJCVNUQVRFX1NIT1dfTkVTVEVEX0ZFQVRVUkVTLAotCQkJCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpOwotCQkJfQotCQl9OwotCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dOZXN0ZWRGZWF0dXJlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19TSE9XX0hJRVJBUkNIWSk7Ci0JCXNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfU0hPV19ISUVSQVJDSFlfRCk7Ci0KLQkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLnNldENoZWNrZWQoCi0JCQlwcmVmLmdldEJvb2xlYW4oU1RBVEVfU0hPV19ORVNURURfRkVBVFVSRVMpKTsKLQkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLnNldFRvb2xUaXBUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuc2hvd05lc3RlZFRvb2x0aXAiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZVNob3dTaXRlc0FjdGlvbigpIHsKLQkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmLnNldERlZmF1bHQoU1RBVEVfU0hPV19TSVRFUywgdHJ1ZSk7Ci0JCXNob3dTaXRlc0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcHJlZi5zZXRWYWx1ZShTVEFURV9TSE9XX1NJVEVTLCBzaG93U2l0ZXNBY3Rpb24uaXNDaGVja2VkKCkpOwotCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCX0KLQkJfTsKLQkJc2hvd1NpdGVzQWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5zaG93SW5zdGFsbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzaG93U2l0ZXNBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfTFNJVEVfT0JKKTsKLQkJc2hvd1NpdGVzQWN0aW9uLnNldENoZWNrZWQocHJlZi5nZXRCb29sZWFuKFNUQVRFX1NIT1dfU0lURVMpKTsKLQkJc2hvd1NpdGVzQWN0aW9uLnNldFRvb2xUaXBUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuc2hvd0luc3RhbGxUb29sdGlwIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VTaG93VW5jb25maWd1cmVkRmVhdHVyZXNBY3Rpb24oKSB7Ci0JCWZpbmFsIFByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZi5zZXREZWZhdWx0KFNUQVRFX1NIT1dfVU5DT05GLCBmYWxzZSk7Ci0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJlZi5zZXRWYWx1ZSgKLQkJCQkJU1RBVEVfU0hPV19VTkNPTkYsCi0JCQkJCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSk7Ci0JCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9OwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNvZmlndXJhdGlvblZpZXdfc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5zaG93RGlzYWJsZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcigKLQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfVU5DT05GX0ZFQVRVUkVfT0JKKTsKLQkJc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLnNldENoZWNrZWQocHJlZi5nZXRCb29sZWFuKFNUQVRFX1NIT1dfVU5DT05GKSk7Ci0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRUb29sVGlwVGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dEaXNhYmxlZFRvb2x0aXAiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQWN0aW9uQmFycyhUb29sQmFyTWFuYWdlciB0Ym0pIHsKLQkJdGJtLmFkZChzaG93U2l0ZXNBY3Rpb24pOwotCQl0Ym0uYWRkKHNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbik7Ci0JCXRibS5hZGQoc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uKTsKLQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlkcmlsbERvd25BZGFwdGVyLmFkZE5hdmlnYXRpb25BY3Rpb25zKHRibSk7Ci0JCXRibS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdGJtLmFkZChjb2xsYXBzZUFsbEFjdGlvbik7Ci0JCXRibS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdGJtLmFkZChpbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGVkT2JqZWN0KCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzc2VsLnNpemUoKSA9PSAxKQotCQkJCXJldHVybiBzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQlPYmplY3Qgb2JqID0gZ2V0U2VsZWN0ZWRPYmplY3QoKTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkgewotCQkJbWFuYWdlci5hZGQocmV2ZXJ0QWN0aW9uKTsKLQkJCW1hbmFnZXIuYWRkKGZpbmRVcGRhdGVzQWN0aW9uKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQltYW5hZ2VyLmFkZChzaXRlU3RhdGVBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUKLQkJCXx8IG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQlNZW51TWFuYWdlciBtZ3IgPSBuZXcgTWVudU1hbmFnZXIoVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5uZXciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1nci5hZGQobmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24pOwotCQkJbWFuYWdlci5hZGQobWdyKTsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSB7Ci0JCQl0cnkgewotCQkJCU1lbnVNYW5hZ2VyIG1nciA9IG5ldyBNZW51TWFuYWdlcihVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnJlcGxhY2VXaXRoIikpOyAvLyROT04tTkxTLTEkCi0JCQkJbWdyLmFkZChzd2FwVmVyc2lvbkFjdGlvbik7Ci0JCQkJbWFuYWdlci5hZGQobWdyKTsKLQotCQkJCW1hbmFnZXIuYWRkKGZlYXR1cmVTdGF0ZUFjdGlvbik7Ci0KLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0KLQkJCQkJKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIG9iaikuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE1pc3NpbmdGZWF0dXJlKSB7Ci0JCQkJCW1hbmFnZXIuYWRkKGluc3RhbGxPcHRGZWF0dXJlQWN0aW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQltYW5hZ2VyLmFkZCh1bmluc3RhbGxGZWF0dXJlQWN0aW9uKTsKLQkJCQl9Ci0JCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCQltYW5hZ2VyLmFkZChmaW5kVXBkYXRlc0FjdGlvbik7Ci0JCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJZHJpbGxEb3duQWRhcHRlci5hZGROYXZpZ2F0aW9uQWN0aW9ucyhtYW5hZ2VyKTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkgewotCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1hbmFnZXIuYWRkKGluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcgotCQkJfHwgb2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZQotCQkJfHwgb2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1hbmFnZXIuYWRkKHByb3BlcnRpZXNBY3Rpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbFNpdGVBZGRlZChJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsKLQkJYXN5bmNSZWZyZXNoKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGluc3RhbGxTaXRlUmVtb3ZlZChJQ29uZmlndXJlZFNpdGUgc2l0ZSkgewotCQlhc3luY1JlZnJlc2goKTsKLQl9Ci0JcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWFzeW5jUmVmcmVzaCgpOwotCX0KLQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWFzeW5jUmVmcmVzaCgpOwotCX0KLQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgY3VycmVudEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlhc3luY1JlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnN0YWxsQ29uZmlndXJhdGlvblJlbW92ZWQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJYXN5bmNSZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFzeW5jUmVmcmVzaCgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gU1dUVXRpbC5nZXRTdGFuZGFyZERpc3BsYXkoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldEZlYXR1cmVzKAotCQlmaW5hbCBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIHNpdGVBZGFwdGVyLAotCQlmaW5hbCBib29sZWFuIGNvbmZpZ3VyZWRPbmx5KSB7Ci0JCWZpbmFsIElDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGVBZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCWZpbmFsIE9iamVjdFtdW10gYmFnID0gbmV3IE9iamVjdFsxXVtdOwotCQlyZWZyZXNoTG9jayA9IHRydWU7Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmczsKLQotCQkJCWlmIChjb25maWd1cmVkT25seSkKLQkJCQkJcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJCWVsc2UgewotCQkJCQlJU2l0ZSBzaXRlID0gY3NpdGUuZ2V0U2l0ZSgpOwotCQkJCQlyZWZzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCX0KLQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5sb2FkaW5nIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVmcy5sZW5ndGgpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2socmVmLmdldFVSTCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWZlYXR1cmUgPQotCQkJCQkJCW5ldyBNaXNzaW5nRmVhdHVyZShyZWYuZ2V0U2l0ZSgpLCByZWYuZ2V0VVJMKCkpOwotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlyZXN1bHQuYWRkKAotCQkJCQkJbmV3IENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcigKLQkJCQkJCQlzaXRlQWRhcHRlciwKLQkJCQkJCQlmZWF0dXJlLAotCQkJCQkJCWNzaXRlLmlzQ29uZmlndXJlZChmZWF0dXJlKSwKLQkJCQkJCQlmYWxzZSwKLQkJCQkJCQlmYWxzZSkpOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQliYWdbMF0gPSBnZXRSb290RmVhdHVyZXMocmVzdWx0KTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJaWYgKGNvbmZpZ3VyYXRpb25XaW5kb3cuZ2V0U2hlbGwoKS5pc1Zpc2libGUoKSkKLQkJCQljb25maWd1cmF0aW9uV2luZG93LnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQkJZWxzZQotCQkJCW9wLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlZnJlc2hMb2NrID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGJhZ1swXTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldFJvb3RGZWF0dXJlcyhBcnJheUxpc3QgbGlzdCkgewotCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgY2YgPQotCQkJCQkoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBsaXN0LmdldChpKTsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gY2YuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJCQlhZGRDaGlsZEZlYXR1cmVzKAotCQkJCQkJZmVhdHVyZSwKLQkJCQkJCWNoaWxkcmVuLAotCQkJCQkJY2YuaXNDb25maWd1cmVkKCkpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGNmID0KLQkJCQkJKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgbGlzdC5nZXQoaSk7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gbnVsbAotCQkJCQkmJiBpc0NoaWxkRmVhdHVyZShmZWF0dXJlLCBjaGlsZHJlbikgPT0gZmFsc2UpCi0JCQkJCXJlc3VsdC5hZGQoY2YpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ2hpbGRGZWF0dXJlcygKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJQXJyYXlMaXN0IGNoaWxkcmVuLAotCQlib29sZWFuIGNvbmZpZ3VyZWQpIHsKLQkJdHJ5IHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9Ci0JCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlOwotCQkJCXRyeSB7Ci0JCQkJCWNoaWxkRmVhdHVyZSA9Ci0JCQkJCQlpbmNsdWRlZFtpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQljaGlsZEZlYXR1cmUgPSBuZXcgTWlzc2luZ0ZlYXR1cmUoaW5jbHVkZWRbaV0pOwotCQkJCX0KLQkJCQljaGlsZHJlbi5hZGQoY2hpbGRGZWF0dXJlKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDaGlsZEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IGNoaWxkcmVuKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGNoaWxkID0gKElGZWF0dXJlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoZmVhdHVyZQotCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkuZXF1YWxzKGNoaWxkLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZSkgewotCQlpZiAoZS5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlLmdldFNlbGVjdGlvbigpOwotCQkJT2JqZWN0IG9iaiA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAob2JqIT1udWxsKQotCQkJCXByb3BlcnRpZXNBY3Rpb24ucnVuKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNwbGl0dGVyID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULkhPUklaT05UQUwpOwotCQlzcGxpdHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJQ29tcG9zaXRlIGxlZnRDb250YWluZXIgPSBjcmVhdGVMaW5lQ29udGFpbmVyKHNwbGl0dGVyKTsKLQkJQ29tcG9zaXRlIHJpZ2h0Q29udGFpbmVyID0gY3JlYXRlTGluZUNvbnRhaW5lcihzcGxpdHRlcik7Ci0JCWNyZWF0ZVRyZWVWaWV3ZXIobGVmdENvbnRhaW5lcik7Ci0JCW1ha2VBY3Rpb25zKCk7Ci0JCWNyZWF0ZVZlcnRpY2FsTGluZShsZWZ0Q29udGFpbmVyKTsKLQkJY3JlYXRlVmVydGljYWxMaW5lKHJpZ2h0Q29udGFpbmVyKTsKLQkJcHJldmlldyA9IG5ldyBDb25maWd1cmF0aW9uUHJldmlldyh0aGlzKTsKLQkJcHJldmlldy5jcmVhdGVDb250cm9sKHJpZ2h0Q29udGFpbmVyKTsKLQkJcHJldmlldy5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YSgKLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJc3BsaXR0ZXIuc2V0V2VpZ2h0cyhuZXcgaW50W10geyAyLCAzIH0pOwotCQlmaWxsQWN0aW9uQmFycyhnZXRDb25maWd1cmF0aW9uV2luZG93KCkuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0KLQkJdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJlZVZpZXdlciA9Ci0JCQluZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0cmVlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCWluaXRQcm92aWRlcnMoKTsKLQotCQlNZW51TWFuYWdlciBtZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wdXBNZW51Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJbWFuYWdlci5hZGQobmV3IEdyb3VwTWFya2VyKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmaWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCQl9Ci0JCX0pOwotCi0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUoCi0JCQltZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpKSk7Ci0KLQkJdHJlZVZpZXdlcgotCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRG91YmxlQ2xpY2soZXZlbnQpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCXB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKSB7Ci0JCXJldHVybiB0cmVlVmlld2VyOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUxpbmVDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcnRpY2FsTGluZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULlZFUlRJQ0FMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWdkLndpZHRoSGludCA9IDE7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHNwbGl0dGVyOwotCX0KLQotCXByaXZhdGUgaW50IGdldFN0YXR1c0NvZGUoSUZlYXR1cmUgZmVhdHVyZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaW50IGNvZGUgPSBzdGF0dXMuZ2V0Q29kZSgpOwotCQlpZiAoY29kZSA9PSBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSkgewotCQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlTdGF0dXMgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCQkJaWYgKGNoaWxkLmlzTXVsdGlTdGF0dXMoKQotCQkJCQkJfHwgY2hpbGQuZ2V0Q29kZSgpICE9IElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRCkKLQkJCQkJCXJldHVybiBjb2RlOwotCQkJCX0KLQkJCQkvLyBJZiB3ZSBhcmUgaGVyZSwgZ2xvYmFsIHN0YXR1cyBpcyB1bmhhcHB5Ci0JCQkJLy8gYmVjYXVzZSBvbmUgb3IgbW9yZSBpbmNsdWRlZCBmZWF0dXJlcwotCQkJCS8vIGlzIGRpc2FibGVkLgotCQkJCWlmIChVcGRhdGVVdGlscy5oYXNPYnNvbGV0ZVBhdGNoZXMoZmVhdHVyZSkpIHsKLQkJCQkJLy8gVGhlIGRpc2FibGVkIGluY2x1ZGVkIGZlYXR1cmVzCi0JCQkJCS8vIGFyZSBvbGQgcGF0Y2hlcyB0aGF0IGFyZSBub3cKLQkJCQkJLy8gc3Vic3VtZWQgYnkgYmV0dGVyIHZlcnNpb25zIG9mCi0JCQkJCS8vIHRoZSBmZWF0dXJlcyB0aGV5IHdlcmUgZGVzaWduZWQgdG8KLQkJCQkJLy8gcGF0Y2guCi0JCQkJCXJldHVybiBJRmVhdHVyZS5TVEFUVVNfSEFQUFk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCkgewotCQlPYmplY3Qgb2JqID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikgewotCQkJdHJ5IHsKLQkJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIG9iajsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQotCQkJCWJvb2xlYW4gbWlzc2luZyA9IGZlYXR1cmUgaW5zdGFuY2VvZiBNaXNzaW5nRmVhdHVyZTsKLQkJCQlib29sZWFuIGVuYWJsZSA9ICFtaXNzaW5nICYmICgoYWRhcHRlci5pc09wdGlvbmFsKCkgfHwgIWFkYXB0ZXIuaXNJbmNsdWRlZCgpKSk7Ci0KLQkJCQlmZWF0dXJlU3RhdGVBY3Rpb24uc2V0RmVhdHVyZShhZGFwdGVyKTsKLQkJCQlmZWF0dXJlU3RhdGVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCQotCQkJCXVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uc2V0RmVhdHVyZShhZGFwdGVyKTsKLQkJCQl1bmluc3RhbGxGZWF0dXJlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlICYmIHVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uY2FuVW5pbnN0YWxsKCkpOwotCQkJCWlmIChhZGFwdGVyLmlzQ29uZmlndXJlZCgpKQotCQkJCQlzZXREZXNjcmlwdGlvbk9uVGFzayh1bmluc3RhbGxGZWF0dXJlQWN0aW9uLCBhZGFwdGVyLFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcudW5pbnN0YWxsRGVzYzIiKSk7Ci0JCQkJZWxzZQotCQkJCQlzZXREZXNjcmlwdGlvbk9uVGFzayh1bmluc3RhbGxGZWF0dXJlQWN0aW9uLCBhZGFwdGVyLFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcudW5pbnN0YWxsRGVzYyIpKTsKLQotCQkJCWlmIChlbmFibGUgJiYgYWRhcHRlci5pc0NvbmZpZ3VyZWQoKSkgewotCQkJCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gVXBkYXRlVXRpbHMuZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZSwgZmFsc2UpOwotCQkJCQlzd2FwVmVyc2lvbkFjdGlvbi5zZXRFbmFibGVkKGZlYXR1cmVzLmxlbmd0aCA+IDEpOwotCQkJCQlpZiAoZmVhdHVyZXMubGVuZ3RoID4gMSkgewotCQkJCQkJc3dhcFZlcnNpb25BY3Rpb24uc2V0Q3VycmVudEZlYXR1cmUoZmVhdHVyZSk7Ci0JCQkJCQlzd2FwVmVyc2lvbkFjdGlvbi5zZXRGZWF0dXJlcyhmZWF0dXJlcyk7Ci0JCQkJCX0KLQkJCQkJZmluZFVwZGF0ZXNBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJZmluZFVwZGF0ZXNBY3Rpb24uc2V0RmVhdHVyZShmZWF0dXJlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzd2FwVmVyc2lvbkFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJZmluZFVwZGF0ZXNBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCi0JCQkJaWYgKG1pc3NpbmcpIHsKLQkJCQkJTWlzc2luZ0ZlYXR1cmUgbWYgPSAoTWlzc2luZ0ZlYXR1cmUpIGZlYXR1cmU7Ci0JCQkJCWluc3RhbGxPcHRGZWF0dXJlQWN0aW9uLnNldEVuYWJsZWQoCi0JCQkJCQltZi5pc09wdGlvbmFsKCkgJiYgbWYuZ2V0T3JpZ2luYXRpbmdTaXRlVVJMKCkgIT0gbnVsbCk7Ci0JCQkJCWluc3RhbGxPcHRGZWF0dXJlQWN0aW9uLnNldEZlYXR1cmUobWYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluc3RhbGxPcHRGZWF0dXJlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJTG9jYWxTaXRlKSB7Ci0JCQlwcm9wZXJ0aWVzQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmaW5kVXBkYXRlc0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJZmluZFVwZGF0ZXNBY3Rpb24uc2V0RmVhdHVyZShudWxsKTsKLQkJCUlMb2NhbFNpdGUgc2l0ZSA9IGdldExvY2FsU2l0ZSgpOwotCQkJcmV2ZXJ0QWN0aW9uLnNldEVuYWJsZWQoc2l0ZSAhPSBudWxsICYmIHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGggPiAxKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQlzaXRlU3RhdGVBY3Rpb24uc2V0U2l0ZSgKLQkJCQkoKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIG9iaikuZ2V0Q29uZmlndXJlZFNpdGUoKSk7Ci0JCQlzaXRlU3RhdGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCQlwcmV2aWV3LnNldFNlbGVjdGlvbihzc2VsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZXNjcmlwdGlvbk9uVGFzayhJQWN0aW9uIGFjdGlvbiwgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIsIFN0cmluZyBkZXNjKSB7Ci0JCUlQcmV2aWV3VGFza1tdIHRhc2tzID0gZ2V0UHJldmlld1Rhc2tzKGFkYXB0ZXIpOwotCQlpZiAodGFza3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaT0wOyBpPHRhc2tzLmxlbmd0aDsgaSsrKQotCQkJaWYgKHRhc2tzW2ldLmdldEFjdGlvbigpID09IGFjdGlvbikKLQkJCQl0YXNrc1tpXS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1ha2VQcmV2aWV3VGFza3MoKSB7Ci0JCXByZXZpZXdUYXNrcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJQ2xhc3Mga2V5OwotCQlBcnJheUxpc3QgYXJyYXkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGxvY2FsIHNpdGUgdGFza3MKLQkJa2V5ID0gSUxvY2FsU2l0ZS5jbGFzczsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcucmV2ZXJ0UHJldmlvdXNMYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5yZXZlcnRQcmV2aW91c0Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCXJldmVydEFjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy51cGRhdGVMYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy51cGRhdGVEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlmaW5kVXBkYXRlc0FjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5leHRMb2NMYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5leHRMb2NEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQluZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5pbnN0YWxsSGlzdExhYmVsIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3Lmluc3RhbGxIaXN0RGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJaW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5hY3Rpdml0aWVzTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuYWN0aXZpdGllc0Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCXNob3dBY3Rpdml0aWVzQWN0aW9uKSk7Ci0KLQkJcHJldmlld1Rhc2tzLnB1dChrZXksIGFycmF5LnRvQXJyYXkobmV3IElQcmV2aWV3VGFza1thcnJheS5zaXplKCldKSk7Ci0KLQkJLy8gY29uZmlndXJlZCBzaXRlIHRhc2tzCi0JCWFycmF5LmNsZWFyKCk7Ci0JCWtleSA9IElDb25maWd1cmVkU2l0ZUFkYXB0ZXIuY2xhc3M7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQludWxsLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuZW5hYmxlTG9jRGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJc2l0ZVN0YXRlQWN0aW9uKSk7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LmV4dExvY0xhYmVsIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LmV4dExvY0Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCW5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uKSk7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnByb3BlcnRpZXNMYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5pbnN0YWxsUHJvcERlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCXByb3BlcnRpZXNBY3Rpb24pKTsKLQkJcHJldmlld1Rhc2tzLnB1dChrZXksIGFycmF5LnRvQXJyYXkobmV3IElQcmV2aWV3VGFza1thcnJheS5zaXplKCldKSk7Ci0KLQkJLy8gZmVhdHVyZSBhZGFwdGVyIHRhc2tzCi0JCWFycmF5LmNsZWFyKCk7Ci0JCWtleSA9IElGZWF0dXJlQWRhcHRlci5jbGFzczsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcucmVwbGFjZVZlcnNpb25MYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5yZXBsYWNlVmVyc2lvbkRlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCXN3YXBWZXJzaW9uQWN0aW9uKSk7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQludWxsLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuZW5hYmxlRmVhdHVyZURlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCWZlYXR1cmVTdGF0ZUFjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5pbnN0YWxsT3B0aW9uYWxMYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5pbnN0YWxsT3B0aW9uYWxEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy51bmluc3RhbGxMYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy51bmluc3RhbGxEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQl1bmluc3RhbGxGZWF0dXJlQWN0aW9uKSk7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnNjYW5MYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5zY2FuRGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJZmluZFVwZGF0ZXNBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuZmVhdHVyZVByb3BMYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5mZWF0dXJlUHJvcERlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCXByb3BlcnRpZXNBY3Rpb24pKTsKLQkJcHJldmlld1Rhc2tzLnB1dChrZXksIGFycmF5LnRvQXJyYXkobmV3IElQcmV2aWV3VGFza1thcnJheS5zaXplKCldKSk7Ci0JfQotCi0JcHVibGljIElQcmV2aWV3VGFza1tdIGdldFByZXZpZXdUYXNrcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUlQcmV2aWV3VGFza1tdIHRhc2tzID0gbnVsbDsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZlYXR1cmVBZGFwdGVyKQotCQkJdGFza3MgPSAoSVByZXZpZXdUYXNrW10pIHByZXZpZXdUYXNrcy5nZXQoSUZlYXR1cmVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElMb2NhbFNpdGUpCi0JCQl0YXNrcyA9IChJUHJldmlld1Rhc2tbXSkgcHJldmlld1Rhc2tzLmdldChJTG9jYWxTaXRlLmNsYXNzKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpCi0JCQl0YXNrcyA9Ci0JCQkJKElQcmV2aWV3VGFza1tdKSBwcmV2aWV3VGFza3MuZ2V0KElDb25maWd1cmVkU2l0ZUFkYXB0ZXIuY2xhc3MpOwotCQlyZXR1cm4gKHRhc2tzICE9IG51bGwpID8gdGFza3MgOiBuZXcgSVByZXZpZXdUYXNrWzBdOwotCX0KLQotCUNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93IGdldENvbmZpZ3VyYXRpb25XaW5kb3coKXsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25XaW5kb3c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZVN0YXRlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZVN0YXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTViYTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZlYXR1cmVTdGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIEZlYXR1cmVTdGF0ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJpdmF0ZSBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlcjsKLQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJaWYgKGFkYXB0ZXIuaXNDb25maWd1cmVkKCkpIHsKLQkJCXNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlU3RhdGVBY3Rpb24uZGlzYWJsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVTdGF0ZUFjdGlvbi5lbmFibGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQkKLQkJCWJvb2xlYW4gaXNDb25maWd1cmVkID0gYWRhcHRlci5pc0NvbmZpZ3VyZWQoKTsKLQkJCS8vIEFzayB1c2VyIHRvIGNvbmZpcm0gdGhlIG9wZXJhdGlvbgotCQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJCWlzQ29uZmlndXJlZAotCQkJCQk/IFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXRlQWN0aW9uLmRpc2FibGVRdWVzdGlvbiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJOiBVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVTdGF0ZUFjdGlvbi5FbmFibGVRdWVzdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghY29uZmlybShtZXNzYWdlKSkKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIElmIGN1cnJlbnQgY29uZmlnIGlzIGJyb2tlbiwgY29uZmlybSB3aXRoIHRoZSB1c2VyIHRvIGNvbnRpbnVlCi0JCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVDdXJyZW50U3RhdGUoKSAhPSBudWxsICYmCi0JCQkJCSFjb25maXJtKFVwZGF0ZVVJLmdldFN0cmluZygiQWN0aW9ucy5icm9rZW5Db25maWdRdWVzdGlvbiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCQotCQkJSU9wZXJhdGlvbiB0b2dnbGVPcGVyYXRpb24gPQotCQkJCWlzQ29uZmlndXJlZAotCQkJCQk/IChJT3BlcmF0aW9uKU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCi0JCQkJCQkuY3JlYXRlVW5jb25maWdPcGVyYXRpb24oCi0JCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCksCi0JCQkJCQlhZGFwdGVyLmdldEZlYXR1cmUobnVsbCkpCi0JCQkJCTogT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJCS5jcmVhdGVDb25maWdPcGVyYXRpb24oCi0JCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCksCi0JCQkJCQlhZGFwdGVyLmdldEZlYXR1cmUobnVsbCkpOwotCi0JCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSB0b2dnbGVPcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQludWxsLAotCQkJCWUuZ2V0U3RhdHVzKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb25maXJtKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKAotCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXRlQWN0aW9uLmRpYWxvZ1RpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCW1lc3NhZ2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZpbmRVcGRhdGVzQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmluZFVwZGF0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyN2ZiZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmluZFVwZGF0ZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi1wdWJsaWMgY2xhc3MgRmluZFVwZGF0ZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBJRmVhdHVyZSBmZWF0dXJlOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwdWJsaWMgRmluZFVwZGF0ZXNBY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBJZiBjdXJyZW50IGNvbmZpZyBpcyBicm9rZW4sIGNvbmZpcm0gd2l0aCB0aGUgdXNlciB0byBjb250aW51ZQotCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVDdXJyZW50U3RhdGUoKSAhPSBudWxsICYmCi0JCQkJIWNvbmZpcm0oVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpb25zLmJyb2tlbkNvbmZpZ1F1ZXN0aW9uIikpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCQkKLQkJCi0JCUlGZWF0dXJlIFtdIGZlYXR1cmVzPW51bGw7Ci0JCWlmIChmZWF0dXJlIT1udWxsKQotCQkJZmVhdHVyZXMgPSBuZXcgSUZlYXR1cmVbXSB7IGZlYXR1cmUgfTsKLQkJZmluYWwgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0ID0gVXBkYXRlVXRpbHMuY3JlYXRlTmV3VXBkYXRlc1JlcXVlc3QoZmVhdHVyZXMpOwotCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHNoZWxsLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUluc3RhbGxXaXphcmQgd2l6YXJkID0gbmV3IEluc3RhbGxXaXphcmQoc2VhcmNoUmVxdWVzdCk7Ci0JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBSZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQsIFVwZGF0ZVVJLmdldFN0cmluZygiRmluZFVwZGF0ZXNBY3Rpb24udXBkYXRlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlkaWFsb2cub3BlbigpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjb25maXJtKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKAotCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXRlQWN0aW9uLmRpYWxvZ1RpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCW1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JUHJldmlld1Rhc2suamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JUHJldmlld1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5NmIyNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSVByZXZpZXdUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcmV2aWV3VGFzayB7Ci0JU3RyaW5nIGdldE5hbWUoKTsKLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQl2b2lkIHJ1bigpOwotCWJvb2xlYW4gaXNFbmFibGVkKCk7Ci0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYyk7Ci0JSUFjdGlvbiBnZXRBY3Rpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbE9wdGlvbmFsRmVhdHVyZUFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0luc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzOGIxYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbE9wdGlvbmFsRmVhdHVyZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLQotcHVibGljIGNsYXNzIEluc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT1BUSU9OQUxfSU5TVEFMTF9USVRMRSA9ICJGZWF0dXJlUGFnZS5vcHRpb25hbEluc3RhbGwudGl0bGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1pc3NpbmdGZWF0dXJlIG1pc3NpbmdGZWF0dXJlOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwdWJsaWMgSW5zdGFsbE9wdGlvbmFsRmVhdHVyZUFjdGlvbihTaGVsbCBzaGVsbCwgU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKE1pc3NpbmdGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5taXNzaW5nRmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAobWlzc2luZ0ZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBJZiBjdXJyZW50IGNvbmZpZyBpcyBicm9rZW4sIGNvbmZpcm0gd2l0aCB0aGUgdXNlciB0byBjb250aW51ZQotCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVDdXJyZW50U3RhdGUoKSAhPSBudWxsICYmCi0JCQkJIWNvbmZpcm0oVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpb25zLmJyb2tlbkNvbmZpZ1F1ZXN0aW9uIikpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCQkKLQkJCi0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gbWlzc2luZ0ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQlVUkwgb3JpZ2luYXRpbmdVUkwgPSBtaXNzaW5nRmVhdHVyZS5nZXRPcmlnaW5hdGluZ1NpdGVVUkwoKTsKLQotCQlVcGRhdGVTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBVcGRhdGVTZWFyY2hTY29wZSgpOwotCQlzY29wZS5hZGRTZWFyY2hTaXRlKG9yaWdpbmF0aW5nVVJMLnRvU3RyaW5nKCksIG9yaWdpbmF0aW5nVVJMLCBudWxsKTsKLQotCQlPcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeSBjYXRlZ29yeSA9IG5ldyBPcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeSgpOwotCQljYXRlZ29yeS5hZGRWZXJzaW9uZWRJZGVudGlmaWVyKHZpZCk7Ci0JCWZpbmFsIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCA9Ci0JCQluZXcgVXBkYXRlU2VhcmNoUmVxdWVzdChjYXRlZ29yeSwgc2NvcGUpOwotCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHNoZWxsLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW9wZW5XaXphcmQoc2VhcmNoUmVxdWVzdCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIHZvaWQgb3BlbldpemFyZChVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKLQkJSW5zdGFsbFdpemFyZCB3aXphcmQgPSBuZXcgSW5zdGFsbFdpemFyZChzZWFyY2hSZXF1ZXN0KTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBSZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQsIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfT1BUSU9OQUxfSU5TVEFMTF9USVRMRSkpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjb25maXJtKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKAotCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXRlQWN0aW9uLmRpYWxvZ1RpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCW1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjU3ZmM1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLQotcHVibGljIGNsYXNzIEluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBidWZmUmVhZDsKLQlwcml2YXRlIFByaW50V3JpdGVyIGh0bWxMb2c7Ci0JcHJpdmF0ZSBGaWxlIHRlbXBGaWxlOwotCXByaXZhdGUgU3RyaW5nIHJvd1R5cGU7Ci0JcHJpdmF0ZSBJUGF0aCBwYXRoOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWdodEJsdWUgPSAiI0VFRUVGRiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgd2hpdGUgPSAiI0ZGRkZGRiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGFya0JsdWUgPSAiIzk5QUFERCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgZGVzYykgewotCQlzdXBlcih0ZXh0LCBkZXNjKTsKLQkJU3RyaW5nIGxvY2F0aW9uID0KLQkJCUNvbmZpZ3VyYXRvclV0aWxzCi0JCQkJLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKQotCQkJCS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKQotCQkJCS5nZXRGaWxlKCk7Ci0JCXBhdGggPSBuZXcgUGF0aChsb2NhdGlvbikucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZCgiaW5zdGFsbC5sb2ciKTsgLy8kTk9OLU5MUy0xJAotCQlyb3dUeXBlID0gImxpZ2h0LXJvdyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlvcGVuTG9nKCk7Ci0JCQlwYXJzZUxvZygpOwotCQkJVXBkYXRlVUkuc2hvd1VSTCgiZmlsZToiICsgZ2V0VGVtcEZpbGUoKS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQljbG9zZUxvZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5Mb2coKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlidWZmUmVhZCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihwYXRoLnRvT1NTdHJpbmcoKSkpOwotCQkJaHRtbExvZyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShnZXRUZW1wRmlsZSgpKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvd0NvcmVFeGNlcHRpb24oZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRUZW1wRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHRlbXBGaWxlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJpbnN0YWxsLWxvZyIsICIuaHRtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvd0NvcmVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRlbXBGaWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUxvZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8JCSFDT05GSUdVUkFUSU9OIDxjb25maWd1cmF0aW9uLWRhdGU+Ci0JCS8vCQkhQUNUSVZJVFkgPGRhdGU+IDx0YXJnZXQ+IDxhY3Rpb24+IDxzdGF0dXM+Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyB0eXBlLCBkYXRlLCBzdGF0dXMsIHRhcmdldCwgYWN0aW9uOwotCQkJU3RyaW5nVG9rZW5pemVyIGh0bWxDb2RlOwotCi0JCQlodG1sTG9nLnByaW50bG4oIjxodG1sPiIpOyAvLyROT04tTkxTLTEkCi0JCQlodG1sTG9nLnByaW50bG4oIjxoZWFkPiIpOyAvLyROT04tTkxTLTEkCi0JCQlodG1sTG9nLnByaW50bG4oIjx0aXRsZT5JbnN0YWxsLUxvZzwvdGl0bGU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWFkZENTUygpOwotCQkJaHRtbExvZy5wcmludGxuKCI8L2hlYWQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWh0bWxMb2cucHJpbnRsbigiPGJvZHk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0aXRsZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZGVzYyA9IFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5kZXNjIik7IC8vJE5PTi1OTFMtMSQKLQkJCWh0bWxMb2cucHJpbnRsbigiPGgxIGNsYXNzPXRpdGxlPiIrdGl0bGUrIjwvaDE+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaHRtbExvZy5wcmludGxuKCI8cCBjbGFzcz1ib2R5VGV4dD4iK2Rlc2MrIjwvcD4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCWh0bWxMb2cucHJpbnRsbigiPGNlbnRlcj4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlodG1sTG9nLnByaW50bG4oIjx0YWJsZSB3aWR0aCA9MTAwJSBib3JkZXI9MCBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTI+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJd2hpbGUgKGJ1ZmZSZWFkLnJlYWR5KCkpIHsKLQotCQkJCWh0bWxDb2RlID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmUmVhZC5yZWFkTGluZSgpKTsKLQkJCQl3aGlsZSAoIShodG1sQ29kZS5oYXNNb3JlRWxlbWVudHMoKSkpIHsKLQkJCQkJaWYgKCFidWZmUmVhZC5yZWFkeSgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlodG1sQ29kZSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnVmZlJlYWQucmVhZExpbmUoKSk7Ci0JCQkJfQotCi0JCQkJdHlwZSA9IGh0bWxDb2RlLm5leHRUb2tlbigpOwotCQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZyh0eXBlLmluZGV4T2YoIiEiKSArIDEsIHR5cGUubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlpZiAodHlwZS5lcXVhbHMoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmFjdGl2aXR5IikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFyZ2V0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGF0ZSA9IG5ldyBEYXRlKG5ldyBMb25nKGh0bWxDb2RlLm5leHRUb2tlbigpKS5sb25nVmFsdWUoKSkudG9TdHJpbmcoKTsKLQkJCQkJLy8gaWdub3JlIHN0cmluZyBkYXRlCi0JCQkJCWh0bWxDb2RlLm5leHRUb2tlbigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWh0bWxDb2RlLm5leHRUb2tlbigiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXdoaWxlIChodG1sQ29kZS5jb3VudFRva2VucygpID4gMikKLQkJCQkJCXRhcmdldCA9IHRhcmdldCArICIgIiArIGh0bWxDb2RlLm5leHRUb2tlbigpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJYWN0aW9uID0gaHRtbENvZGUubmV4dFRva2VuKCk7Ci0JCQkJCXN0YXR1cyA9IGh0bWxDb2RlLm5leHRUb2tlbigpOwotCi0JCQkJCWFkZEFjdGl2aXR5KGFjdGlvbiwgZGF0ZSwgc3RhdHVzLCB0YXJnZXQpOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJaHRtbExvZy5wcmludGxuKCk7Ci0JCQkJCWh0bWxMb2cucHJpbnRsbigKLQkJCQkJCSI8dHIgaWQ9c2VwYXJhdG9yPjx0ZCBjb2xzcGFuPTQ+PC90ZD48L3RyPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWh0bWxMb2cucHJpbnRsbigpOwotCQkJCQlkYXRlID0gbmV3IERhdGUobmV3IExvbmcoaHRtbENvZGUubmV4dFRva2VuKCkpLmxvbmdWYWx1ZSgpKS50b1N0cmluZygpOwotLy8JCQkJCWRhdGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCXdoaWxlIChodG1sQ29kZS5jb3VudFRva2VucygpID4gMCkKLS8vCQkJCQkJZGF0ZSA9IGRhdGUgKyAiICIgKyBodG1sQ29kZS5uZXh0VG9rZW4oKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhZGRDb25maWd1cmF0aW9uSGVhZGVyKGRhdGUpOwotCQkJCQlhZGRBY3Rpdml0eUhlYWRlcigpOwotCQkJCX0KLQotCQkJfQotCQkJaHRtbExvZy5wcmludGxuKCI8L3RhYmxlPiIpOyAvLyROT04tTkxTLTEkCi0JCQlodG1sTG9nLnByaW50bG4oIjwvYm9keT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaHRtbExvZy5wcmludGxuKCI8L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3dDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQWN0aXZpdHkoCi0JCVN0cmluZyB0eXBlLAotCQlTdHJpbmcgZGF0ZSwKLQkJU3RyaW5nIHN0YXR1cywKLQkJU3RyaW5nIHRhcmdldCkgewotCQlodG1sTG9nLnByaW50KCI8dHIgY2xhc3M9IiArIHJvd1R5cGUgKyAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy10ZXh0IHdpZHRoPTMwJT4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KGRhdGUpOwotCQlodG1sTG9nLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy10ZXh0IHdpZHRoPTQwJT4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KHRhcmdldCk7Ci0JCWh0bWxMb2cucHJpbnRsbigiPC90ZD4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KCI8dGQgY2xhc3M9bG9nLXRleHQgd2lkdGg9MjAlPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQodHlwZSk7Ci0JCWh0bWxMb2cucHJpbnRsbigiPC90ZD4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KCI8dGQgY2xhc3M9bG9nLXRleHQgd2lkdGg9MTAlPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoc3RhdHVzKTsKLQkJaHRtbExvZy5wcmludGxuKCI8L3RkPjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJdG9nZ2xlUm93Q29sb3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ1NTKCkgewotCQlodG1sTG9nLnByaW50bG4oIjxTVFlMRSB0eXBlPVwidGV4dC9jc3NcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50bG4oIkgxLnRpdGxlIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGNvbG9yOiAjOTlBQUNDIH0iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50bG4oIlAuYm9keVRleHQgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zaXplOiA5cHQ7IH0iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50bG4oCi0JCQkiVEQubG9nLWhlYWRlciB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDlwdDsgY29sb3I6IHdoaXRlfSIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnRsbigKLQkJCSJURC5sb2ctdGV4dCB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBsaWdodGVyOyBmb250LXNpemU6IDhwdDsgY29sb3I6YmxhY2t9Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludGxuKAotCQkvLwkiVEQuY29uZmlnLWxvZy1oZWFkZXIgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiB3aGl0ZTsgO3RleHQtYWxpZ246IHJpZ2h0OyBib3JkZXItdG9wOjEwcHggc29saWQgd2hpdGV9Iik7Ci0JCSJURC5jb25maWctbG9nLWhlYWRlciB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDlwdDsgY29sb3I6IHdoaXRlOyBib3JkZXItdG9wOjEwcHggc29saWQgd2hpdGV9Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludGxuKCJUUi5saWdodC1yb3cge2JhY2tncm91bmQ6IiArIHdoaXRlICsgIn0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWh0bWxMb2cucHJpbnRsbigiVFIuZGFyay1yb3cge2JhY2tncm91bmQ6IiArIGxpZ2h0Qmx1ZSArICJ9Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlodG1sTG9nLnByaW50bG4oIlRSLmhlYWRlciB7YmFja2dyb3VuZDoiICsgZGFya0JsdWUgKyAifSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaHRtbExvZy5wcmludGxuKCI8L1NUWUxFPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEFjdGl2aXR5SGVhZGVyKCkgewotCQlodG1sTG9nLnByaW50KCI8dHIgY2xhc3M9aGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctaGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmRhdGVUaW1lIikpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy1oZWFkZXI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24udGFyZ2V0IikpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy1oZWFkZXI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uYWN0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy1oZWFkZXI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uc3RhdHVzIikpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnRsbigiPC90ZD48L3RyPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbmZpZ3VyYXRpb25IZWFkZXIoU3RyaW5nIGRhdGUpIHsKLQkJaWYgKGRhdGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlodG1sTG9nLnByaW50KCI8dHIgY2xhc3M9aGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1jb25maWctbG9nLWhlYWRlciBjb2xzcGFuPTQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludChkYXRlKTsKLQkJaHRtbExvZy5wcmludGxuKCI8L3RkPjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdG9nZ2xlUm93Q29sb3IoKSB7Ci0JCWlmIChyb3dUeXBlLmVxdWFscygibGlnaHQtcm93IikpIC8vJE5PTi1OTFMtMSQKLQkJCXJvd1R5cGUgPSAiZGFyay1yb3ciOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXJvd1R5cGUgPSAibGlnaHQtcm93IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCB0aHJvd0NvcmVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQluZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwKLQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5lcnJvcnMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvc2VMb2coKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoYnVmZlJlYWQgIT0gbnVsbCkKLQkJCQlidWZmUmVhZC5jbG9zZSgpOwotCQkJaWYgKGh0bWxMb2cgIT0gbnVsbCkKLQkJCQlodG1sTG9nLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCWJ1ZmZSZWFkID0gbnVsbDsKLQkJCWh0bWxMb2cgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjRkMTliLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIE5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXB1YmxpYyBOZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGRlc2MpIHsKLQkJc3VwZXIodGV4dCwgZGVzYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPQotCQkJbmV3IERpcmVjdG9yeURpYWxvZyhVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShVcGRhdGVVSS5nZXRTdHJpbmcoIk5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uLnNlbGVjdEV4dExvY2F0aW9uIikpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGRpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCXdoaWxlIChkaXIgIT0gbnVsbCkgewotCQkJRmlsZSBkaXJGaWxlID0gZ2V0RXh0ZW5zaW9uU2l0ZShuZXcgRmlsZShkaXIpKTsKLQkJCWlmIChkaXJGaWxlICE9IG51bGwpIHsKLQkJCQlpZiAoYWRkRXh0ZW5zaW9uTG9jYXRpb24oZGlyRmlsZSkpCi0JCQkJCXJldHVybjsKLQkJCQllbHNlIHsKLQkJCQkJLy8gcmUtb3BlbiB0aGUgZGlyZWN0b3J5IGRpYWxvZwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXIpOwotCQkJCQlkaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCX0JCi0JCQl9IGVsc2UgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24uZXh0SW5mb1RpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIk5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uLmV4dEluZm9NZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gcmUtb3BlbiB0aGUgZGlyZWN0b3J5IGRpYWxvZwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpcik7Ci0JCQkJZGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRoZSBzaXRlIGZpbGUgKGluY2x1ZGluZyAiZWNsaXBzZSIgcGF0aCkgd2hlbiBkaXJlY3RvcnkgaXMgYW4gZWNsaXBzZSBleHN0ZW5zaW9uLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXN0YXRpYyBGaWxlIGdldEV4dGVuc2lvblNpdGUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJLy8gQ2hlY2sgdGhlIGVjbGlwc2UgZm9sZGVyCi0JCWlmIChkaXJlY3RvcnkuZ2V0TmFtZSgpLmVxdWFscygiZWNsaXBzZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGlmIHdlIHBpY2tlZCB1cCB0aGUgZWNsaXBzZSBkaXJlY3RvcnksIGNoZWNrIGlmIGl0cyBwYXJlbnQgaXMgYSBzaXRlCi0JCQlGaWxlIHNpdGUgPSBnZXRFeHRlbnNpb25TaXRlKGRpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJaWYgKHNpdGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZGlyZWN0b3J5OwotCQkJLy8gb3RoZXJ3aXNlLCBmYWxsIHRocm91Z2gKLQkJfQotCQkKLQkJRmlsZSBlY2xpcHNlID0gbmV3IEZpbGUoZGlyZWN0b3J5LCAiZWNsaXBzZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghZWNsaXBzZS5leGlzdHMoKSB8fCAhZWNsaXBzZS5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgdGhlIG1hcmtlcgotCQlGaWxlIG1hcmtlciA9IG5ldyBGaWxlKGVjbGlwc2UsICIuZWNsaXBzZWV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghbWFya2VyLmV4aXN0cygpIHx8IG1hcmtlci5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlY2xpcHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRFeHRlbnNpb25Mb2NhdGlvbihGaWxlIGRpcikgewotCQl0cnkgewotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjb25maWcuY3JlYXRlTGlua2VkQ29uZmlndXJlZFNpdGUoZGlyKTsKLQkJCWNvbmZpZy5hZGRDb25maWd1cmVkU2l0ZShjc2l0ZSk7Ci0JCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCk7Ci0JCQlVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydChyZXN0YXJ0TmVlZGVkKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyB0aXRsZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmVycm9yLnRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCB0aXRsZSwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSxmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZXBsYWNlVmVyc2lvbkFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1JlcGxhY2VWZXJzaW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjQ2NTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1JlcGxhY2VWZXJzaW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLlJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVZlcnNpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQotCXByaXZhdGUgSUZlYXR1cmUgY3VycmVudEZlYXR1cmU7Ci0JcHJpdmF0ZSBJRmVhdHVyZVtdIGZlYXR1cmVzOwotCQotCXB1YmxpYyBSZXBsYWNlVmVyc2lvbkFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgewotCQljdXJyZW50RmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVzKElGZWF0dXJlW10gZmVhdHVyZXMpIHsKLQkJdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCX0KLQkJCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoY3VycmVudEZlYXR1cmUgPT0gbnVsbCB8fCBmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA8IDIpCi0JCQlyZXR1cm47Ci0JCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZCB3aXphcmQgPSBuZXcgUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkKGN1cnJlbnRGZWF0dXJlLCBmZWF0dXJlcyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLmdldFRleHQoKSk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNDAwLDQwMCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZXZlcnRDb25maWd1cmF0aW9uQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2YzMjdhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZXZlcnRDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBSZXZlcnRDb25maWd1cmF0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwdWJsaWMgUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZCgpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKS5nZXRUZXh0KCkpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDYwMCw1MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaG93QWN0aXZpdGllc0FjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1Nob3dBY3Rpdml0aWVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTgzYTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1Nob3dBY3Rpdml0aWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLlNob3dBY3Rpdml0aWVzRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgU2hvd0FjdGl2aXRpZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCVNoZWxsIHNoZWxsOwotCQotCXB1YmxpYyBTaG93QWN0aXZpdGllc0FjdGlvbihTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JCXRoaXMuc2hlbGwgPSBwYXJlbnRTaGVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTaG93QWN0aXZpdGllc0RpYWxvZyBkaWFsb2cgPSBuZXcgU2hvd0FjdGl2aXRpZXNEaWFsb2coc2hlbGwpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaG93QWN0aXZpdGllc0RpYWxvZy50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaXRlU3RhdGVBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaXRlU3RhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4YWZiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2l0ZVN0YXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIFRvZ2dsZXMgYSBzaXRlJ3MgZW5hYmxlZCBzdGF0ZQotICovCi0KLXB1YmxpYyBjbGFzcyBTaXRlU3RhdGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIHNpdGU7Ci0KLQlwdWJsaWMgU2l0ZVN0YXRlQWN0aW9uKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQkJYm9vbGVhbiBzdGF0ZSA9IHNpdGUuaXNFbmFibGVkKCk7Ci0JCXNldFRleHQoc3RhdGUgPyBVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVTdGF0ZUFjdGlvbi5kaXNhYmxlTGFiZWwiKSA6IFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZVN0YXRlQWN0aW9uLmVuYWJsZUxhYmVsIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCQotCQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCXN0YXR1cyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlib29sZWFuIG9sZFZhbHVlID0gc2l0ZS5pc0VuYWJsZWQoKTsKLQkJCWlmICghY29uZmlybSghb2xkVmFsdWUpKQotCQkJCXJldHVybjsKLQkJCQotCQkJSU9wZXJhdGlvbiB0b2dnbGVTaXRlT3BlcmF0aW9uID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZVRvZ2dsZVNpdGVPcGVyYXRpb24oc2l0ZSk7Ci0JCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSB0b2dnbGVTaXRlT3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQkJCQotCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQocmVzdGFydE5lZWRlZCk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJZS5nZXRTdGF0dXMoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpcm0oYm9vbGVhbiBuZXdTdGF0ZSkgewotCQlTdHJpbmcgbmFtZSA9IHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBlbmFibGVNZXNzYWdlID0gVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiU2l0ZVN0YXRlQWN0aW9uLmVuYWJsZU1lc3NhZ2UiLCBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZyBkaXNhYmxlTWVzc2FnZSA9IFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoIlNpdGVTdGF0ZUFjdGlvbi5kaXNhYmxlTWVzc2FnZSIsIG5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlTdHJpbmcgbWVzc2FnZSA9IG5ld1N0YXRlID8gZW5hYmxlTWVzc2FnZSA6IGRpc2FibGVNZXNzYWdlOwotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCBVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVTdGF0ZUFjdGlvbi5kaWFsb2dUaXRsZSIpLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Vbmluc3RhbGxGZWF0dXJlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc4ZDkxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Vbmluc3RhbGxGZWF0dXJlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBVbmluc3RhbGxGZWF0dXJlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyOwotCi0JcHVibGljIFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJCi0JCQlpZiAoYWRhcHRlciA9PSBudWxsIHx8ICFjb25maXJtKFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVVuaW5zdGFsbEFjdGlvbi51bmluc3RhbGxRdWVzdGlvbiIpKSkgLy8kTk9OLU5MUy0xJCkpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBJZiBjdXJyZW50IGNvbmZpZyBpcyBicm9rZW4sIGNvbmZpcm0gd2l0aCB0aGUgdXNlciB0byBjb250aW51ZQotCQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlQ3VycmVudFN0YXRlKCkgIT0gbnVsbCAmJgotCQkJCQkhY29uZmlybShVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGlvbnMuYnJva2VuQ29uZmlnUXVlc3Rpb24iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0KLQkJCUlPcGVyYXRpb24gdW5pbnN0YWxsT3BlcmF0aW9uID0KLQkJCQkoSU9wZXJhdGlvbikgT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQotCQkJCQkuY3JlYXRlVW5pbnN0YWxsT3BlcmF0aW9uKAotCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCksCi0JCQkJCWFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKSk7Ci0KLQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IHVuaW5zdGFsbE9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQocmVzdGFydE5lZWRlZCk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJZS5nZXRTdGF0dXMoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgotCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oCi0JCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlVW5pbnN0YWxsQWN0aW9uLmRpYWxvZ1RpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCW1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVVbmluc3RhbGxBY3Rpb24udW5pbnN0YWxsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5pbnN0YWxsKCkgewotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLS8vCQlpZiAoYWRhcHRlci5pc0NvbmZpZ3VyZWQoKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCXRyeSB7Ci0JCQlpZiAoSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0KCJmZWF0dXJlXyIrYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgPT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQkKLQkJcmV0dXJuIHRydWU7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0FjdGl2aXRpZXNUYWJsZVZpZXdlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQWN0aXZpdGllc1RhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMmU2OWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQWN0aXZpdGllc1RhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotCi0KLS8qKgotICogVmlld2VyIGZvciBjb25maWd1cmF0aW9uIGFjdGl2aXRpZXMKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXRpZXNUYWJsZVZpZXdlcnsKLQotCXByaXZhdGUgc3RhdGljIEluc3RhbGxMb2dQYXJzZXIgcGFyc2VyOyAKLQkKLQlzdGF0aWMgY2xhc3MgQWN0aXZpdGllc0NvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gc2hvd0N1cnJlbnRPbmx5OwotCQkKLQkJcHVibGljIEFjdGl2aXRpZXNDb250ZW50UHJvdmlkZXIoYm9vbGVhbiBzaG93Q3VycmVudE9ubHkpewotCQkJdGhpcy5zaG93Q3VycmVudE9ubHkgPSBzaG93Q3VycmVudE9ubHk7Ci0JCX0KLQkJcHVibGljIEFjdGl2aXRpZXNDb250ZW50UHJvdmlkZXIoKXsKLQkJCXRoaXMuc2hvd0N1cnJlbnRPbmx5ID0gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IChJbnN0YWxsQ29uZmlndXJhdGlvbillbGVtZW50OwotCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gcGFyc2VyLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlib29sZWFuIGhpdEN1cnJlbnRDb25maWcgPSBmYWxzZTsKLQkJCUFycmF5TGlzdCBhY3Rpdml0aWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpPGNvbmZpZ3MubGVuZ3RoOyBpKyspewotCQkJCWlmIChjb25maWdzW2ldLmVxdWFscyhjdXJyZW50Q29uZmlnKSAmJiAhaGl0Q3VycmVudENvbmZpZykKLQkJCQkJaGl0Q3VycmVudENvbmZpZyA9IHRydWU7Ci0JCQkJaWYgKGhpdEN1cnJlbnRDb25maWcgJiYgc2hvd0N1cnJlbnRPbmx5KQotCQkJCQlyZXR1cm4gY29uZmlnc1tpXS5nZXRBY3Rpdml0aWVzKCk7Ci0JCQkJZWxzZSBpZiAoaGl0Q3VycmVudENvbmZpZyl7Ci0JCQkJCUlBY3Rpdml0eVtdIGFjdGl2aXRpZXMgPSBjb25maWdzW2ldLmdldEFjdGl2aXRpZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGo8YWN0aXZpdGllcy5sZW5ndGg7IGorKykKLQkJCQkJCWFjdGl2aXRpZXNMaXN0LmFkZChhY3Rpdml0aWVzW2pdKTsJCi0JCQkJfQotCQkJCQotCQkJfQotCQkJcmV0dXJuIChJQWN0aXZpdHlbXSlhY3Rpdml0aWVzTGlzdC50b0FycmF5KG5ldyBJQWN0aXZpdHlbYWN0aXZpdGllc0xpc3Quc2l6ZSgpXSk7Ci0JCX0KLQkJCi0JfQotCi0Jc3RhdGljIGNsYXNzIEFjdGl2aXRpZXNMYWJlbFByb3ZpZGVyCi0JCWV4dGVuZHMgTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KLQkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQlzd2l0Y2ggKCgoSUFjdGl2aXR5KSBlbGVtZW50KS5nZXRTdGF0dXMoKSkgewotCQkJCQljYXNlIElBY3Rpdml0eS5TVEFUVVNfT0sgOgotCQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX09LX1NUX09CSiwgMCk7Ci0JCQkJCWNhc2UgSUFjdGl2aXR5LlNUQVRVU19OT0sgOgotCQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX0VSUl9TVF9PQkosIDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUlBY3Rpdml0eSBhY3Rpdml0eSA9IChJQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIFV0aWxpdGllcy5mb3JtYXQoYWN0aXZpdHkuZ2V0RGF0ZSgpKTsKLQkJCQljYXNlIDIgOgotCQkJCQlyZXR1cm4gYWN0aXZpdHkuZ2V0TGFiZWwoKTsKLQkJCQljYXNlIDMgOgotCQkJCQlyZXR1cm4gZ2V0QWN0aW9uTGFiZWwoYWN0aXZpdHkpOwotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXRBY3Rpb25MYWJlbChJQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJCWludCBhY3Rpb24gPSBhY3Rpdml0eS5nZXRBY3Rpb24oKTsKLQkJCXN3aXRjaCAoYWN0aW9uKSB7Ci0JCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRSA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGl2aXRpZXNUYWJsZVZpZXdlci5lbmFibGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9JTlNUQUxMIDoKLQkJCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiQWN0aXZpdGllc1RhYmxlVmlld2VyLmZlYXR1cmVJbnN0YWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX1JFTU9WRSA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGl2aXRpZXNUYWJsZVZpZXdlci5mZWF0dXJlUmVtb3ZlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTCA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGl2aXRpZXNUYWJsZVZpZXdlci5zaXRlSW5zdGFsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fU0lURV9SRU1PVkUgOgotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpdml0aWVzVGFibGVWaWV3ZXIuc2l0ZVJlbW92ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9VTkNPTkZJR1VSRSA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGl2aXRpZXNUYWJsZVZpZXdlci5kaXNhYmxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1JFVkVSVCA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGl2aXRpZXNUYWJsZVZpZXdlci5yZXZlcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9SRUNPTkNJTElBVElPTiA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGl2aXRpZXNUYWJsZVZpZXdlci5yZWNvbmNpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpdml0aWVzVGFibGVWaWV3ZXIudW5rbm93biIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhYmxlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIHNob3dDdXJyZW50T25seSkgewotCQlwYXJzZXIgPSBuZXcgSW5zdGFsbExvZ1BhcnNlcigpOwotCQlwYXJzZXIucGFyc2VJbnN0YWxsYXRpb25Mb2coKTsKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQWN0aXZpdGllc1RhYmxlVmlld2VyLmRhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpdml0aWVzVGFibGVWaWV3ZXIudGFyZ2V0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQWN0aXZpdGllc1RhYmxlVmlld2VyLmFjdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRhYmxlVmlld2VyIGFjdGl2aXRpZXNWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlhY3Rpdml0aWVzVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFjdGl2aXRpZXNMYWJlbFByb3ZpZGVyKCkpOwotCQlhY3Rpdml0aWVzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWN0aXZpdGllc0NvbnRlbnRQcm92aWRlcihzaG93Q3VycmVudE9ubHkpKTsKLQkJcmV0dXJuIGFjdGl2aXRpZXNWaWV3ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9CYW5uZXJQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9CYW5uZXJQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NzhjODMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQmFubmVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYW5uZXJQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JcHJpdmF0ZSBJbWFnZSBiYW5uZXJJbWFnZTsKLQlwcml2YXRlIGJvb2xlYW4gYmFubmVyVmlzaWJsZSA9IGZhbHNlOwotCXB1YmxpYyBCYW5uZXJQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDEwOwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJaWYgKGJhbm5lclZpc2libGUpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQlsYWJlbC5zZXRJbWFnZShnZXRCYW5uZXJJbWFnZSgpKTsKLQkJfQotCi0JCUNvbnRyb2wgY29udGVudHMgPSBjcmVhdGVDb250ZW50cyhjbGllbnQpOwotCQljb250ZW50cy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJc2V0Q29udHJvbChjbGllbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJhbm5lclZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXRoaXMuYmFubmVyVmlzaWJsZSA9IHZpc2libGU7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzQmFubmVkVmlzaWJsZSgpIHsKLQkJcmV0dXJuIGJhbm5lclZpc2libGU7Ci0JfQotCi0JcHJvdGVjdGVkIFVSTCBnZXRCYW5uZXJJbWFnZVVSTCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgSW1hZ2UgZ2V0QmFubmVySW1hZ2UoKSB7Ci0JCVVSTCBpbWFnZVVSTCA9IGdldEJhbm5lckltYWdlVVJMKCk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYgKGltYWdlVVJMID09IG51bGwpIHsKLQkJCS8vIHVzZSBkZWZhdWx0Ci0JCQliYW5uZXJJbWFnZSA9Ci0JCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19JTlNUQUxMX0JBTk5FUi5jcmVhdGVJbWFnZSgpOwotCQkJaW1hZ2UgPSBiYW5uZXJJbWFnZTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGJhbm5lckltYWdlICE9IG51bGwpIHsKLQkJCWJhbm5lckltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0R1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzcxMDEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0R1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIER1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgY29uZmxpY3RzOwotCi0JY2xhc3MgQ29uZmxpY3RDb250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0KTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBcnJheUxpc3QpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBcnJheUxpc3QpCi0JCQkJcmV0dXJuICgoQXJyYXlMaXN0KSBwYXJlbnQpLnRvQXJyYXkoKTsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JfQotCi0JY2xhc3MgQ29uZmxpY3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQXJyYXlMaXN0KSB7Ci0JCQkJQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KSBvYmo7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCUR1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5JZEVudHJ5IGVudHJ5ID0KLQkJCQkJCShEdXBsaWNhdGVDb25mbGljdHNWYWxpZGF0b3IuSWRFbnRyeSkgKGxpc3QpLmdldChpKTsKLQkJCQkJaWYgKGVudHJ5LmlzSW5zdGFsbENhbmRpZGF0ZSgpKQotCQkJCQkJcmV0dXJuIGVudHJ5LmdldEZlYXR1cmUoKS5nZXRMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCWludCBmbGFncyA9IDA7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCWZsYWdzID0gVXBkYXRlTGFiZWxQcm92aWRlci5GX1dBUk5JTkc7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLklkRW50cnkKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBBcnJheUxpc3QpCi0JCQkJcmV0dXJuIFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KAotCQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKLAotCQkJCQlmbGFncyk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBEdXBsaWNhdGVDb25mbGljdHNEaWFsb2coU2hlbGwgc2hlbGwsIEFycmF5TGlzdCBjb25mbGljdHMpIHsKLQkJc3VwZXIoCi0JCQlzaGVsbCwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLnRpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCW51bGwsCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5tZXNzYWdlIiksIC8vJE5PTi1OTFMtMSQKLQkJCVdBUk5JTkcsCi0JCQluZXcgU3RyaW5nW10gewotCQkJCUlEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotCQkJCUlEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwgfSwKLQkJCTApOwotCQl0aGlzLmNvbmZsaWN0cyA9IGNvbmZsaWN0czsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY2xpZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy50cmVlTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY2xpZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWdkLndpZHRoSGludCA9IDMwMDsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDb25mbGljdENvbnRlbnRQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25mbGljdExhYmVsUHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKDEwKTsKLQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJfSk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoY29uZmxpY3RzKTsKLQkJcmV0dXJuIGNsaWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0VkaXRTaXRlRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9FZGl0U2l0ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmUzMmY1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0VkaXRTaXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotCi1wdWJsaWMgY2xhc3MgRWRpdFNpdGVEaWFsb2cgZXh0ZW5kcyBOZXdVcGRhdGVTaXRlRGlhbG9nIHsKLQlTaXRlQm9va21hcmsgYm9va21hcms7Ci0KLQlwdWJsaWMgRWRpdFNpdGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFNpdGVCb29rbWFyayBib29rbWFyaykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuYm9va21hcmsgPSBib29rbWFyazsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmllbGRzKCkgewotCQluYW1lLnNldFRleHQoYm9va21hcmsuZ2V0TmFtZSgpKTsKLQkJdXJsLnNldFRleHQoYm9va21hcmsuZ2V0VVJMKCkudG9TdHJpbmcoKSk7Ci0JCXVybC5zZXRFZGl0YWJsZSghYm9va21hcmsuaXNMb2NhbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXRyeSB7Ci0JCQlib29rbWFyay5zZXROYW1lKG5hbWUuZ2V0VGV4dCgpKTsKLQkJCWJvb2ttYXJrLnNldFVSTChuZXcgVVJMKHVybC5nZXRUZXh0KCkpKTsKLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpcmVPYmplY3RDaGFuZ2VkKGJvb2ttYXJrLCBudWxsKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0ZlYXR1cmVTb3J0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0ZlYXR1cmVTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyZjBhNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9GZWF0dXJlU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIEZlYXR1cmVTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfVkVSU0lPTiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9MQUJFTCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9QUk9WSURFUiA9IDM7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNDRU5ESU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNDRU5ESU5HID0gLTE7Ci0JCi0JcHJpdmF0ZSBpbnQga2V5ID0gRkVBVFVSRV9MQUJFTDsKLQlwcml2YXRlIGludCBsYWJlbE9yZGVyOwotCXByaXZhdGUgaW50IHZlcnNpb25PcmRlcjsKLQlwcml2YXRlIGludCBwcm92aWRlck9yZGVyOwotCQotCXB1YmxpYyBGZWF0dXJlU29ydGVyKCkgewotCQl0aGlzKEZFQVRVUkVfTEFCRUwsIEFTQ0VORElORywgQVNDRU5ESU5HLCBBU0NFTkRJTkcpOwotCX0KLQkKLQlwdWJsaWMgRmVhdHVyZVNvcnRlcihpbnQga2V5LCBpbnQgbGFiZWxPcmRlciwgaW50IHZlcnNpb25PcmRlciwgaW50IHByb3ZpZGVyT3JkZXIpIHsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JCXRoaXMubGFiZWxPcmRlciA9IGxhYmVsT3JkZXI7Ci0JCXRoaXMudmVyc2lvbk9yZGVyID0gdmVyc2lvbk9yZGVyOwotCQl0aGlzLnByb3ZpZGVyT3JkZXIgPSBwcm92aWRlck9yZGVyOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpZiAoIShlMSBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikKLQkJCXx8ICEoZTIgaW5zdGFuY2VvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pKQotCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCQkJCi0JCUlGZWF0dXJlIGYxID0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pZTEpLmdldEZlYXR1cmUoKTsKLQkJSUZlYXR1cmUgZjIgPSAoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbillMikuZ2V0RmVhdHVyZSgpOwotCQkKLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjEgPSBmMS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2MiA9IGYyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7Ci0JCQotCQlTdHJpbmcgbGFiZWwxID0gZjEuZ2V0TGFiZWwoKSA9PSBudWxsID8gIiIgOiBmMS5nZXRMYWJlbCgpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsYWJlbDIgPSBmMi5nZXRMYWJlbCgpID09IG51bGwgPyAiIiA6IGYyLmdldExhYmVsKCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyBwcm92aWRlcjEgPSBmMS5nZXRQcm92aWRlcigpID09IG51bGwgPyAiIiA6IGYxLmdldFByb3ZpZGVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHByb3ZpZGVyMiA9IGYyLmdldFByb3ZpZGVyKCkgPT0gbnVsbCA/ICIiIDogZjIuZ2V0UHJvdmlkZXIoKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChrZXkgPT0gRkVBVFVSRV9WRVJTSU9OKSB7Ci0JCQlyZXN1bHQgPSBjb21wYXJlVmVyc2lvbnModjEsIHYyKSAqIHZlcnNpb25PcmRlcjsKLQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUobGFiZWwxLCBsYWJlbDIpICogbGFiZWxPcmRlcjsKLQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUocHJvdmlkZXIxLCBwcm92aWRlcjIpICogcHJvdmlkZXJPcmRlcjsKLQkJCX0KLQkJfSBlbHNlIGlmIChrZXkgPT0gRkVBVFVSRV9MQUJFTCkgewotCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShsYWJlbDEsIGxhYmVsMikgKiBsYWJlbE9yZGVyOwotCQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQkJcmVzdWx0ID0gY29tcGFyZVZlcnNpb25zKHYxLCB2MikgKiB2ZXJzaW9uT3JkZXI7Ci0JCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKHByb3ZpZGVyMSwgcHJvdmlkZXIyKSAqIHByb3ZpZGVyT3JkZXI7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoa2V5ID09IEZFQVRVUkVfUFJPVklERVIpIHsKLQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUocHJvdmlkZXIxLCBwcm92aWRlcjIpICogcHJvdmlkZXJPcmRlcjsKLQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUobGFiZWwxLCBsYWJlbDIpICogbGFiZWxPcmRlcjsKLQkJCQlpZiAocmVzdWx0ID09IDApCi0JCQkJCXJlc3VsdCA9IGNvbXBhcmVWZXJzaW9ucyh2MSwgdjIpICogdmVyc2lvbk9yZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgaW50IGNvbXBhcmVWZXJzaW9ucyhQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2MSwgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjIpIHsKLQkJaWYgKHYxLmVxdWFscyh2MikpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHYyLmlzR3JlYXRlclRoYW4odjEpID8gLTEgOiAxOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lEeW5hbWljUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSUR5bmFtaWNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNmE5MjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSUR5bmFtaWNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqICBBIGR5bmFtaWMgcGFnZSBpbiB0aGUgaW5zdGFsbCB3aXphcmQKLSAqLwotcHVibGljIGludGVyZmFjZSBJRHluYW1pY1BhZ2UgewotCXB1YmxpYyB2b2lkIHNldEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIFtdIGpvYnMpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JU2VhcmNoUHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lTZWFyY2hQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQ1Y2VmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lTZWFyY2hQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotLyoqCi0gKiBBIHNlYXJjaCByZXF1ZXN0IHByb3ZpZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaFByb3ZpZGVyIHsKLQlVcGRhdGVTZWFyY2hSZXF1ZXN0IGdldFNlYXJjaFJlcXVlc3QoKTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxXaXphcmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQzZDE5Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotcHVibGljIGNsYXNzIEluc3RhbGxXaXphcmQKLQlleHRlbmRzIFdpemFyZAotCWltcGxlbWVudHMgSU9wZXJhdGlvbkxpc3RlbmVyLCBJU2VhcmNoUHJvdmlkZXIgewotCXByaXZhdGUgTW9kZVNlbGVjdGlvblBhZ2UgbW9kZVBhZ2U7Ci0JcHJpdmF0ZSBTaXRlUGFnZSBzaXRlUGFnZTsKLQlwcml2YXRlIFJldmlld1BhZ2UgcmV2aWV3UGFnZTsKLQlwcml2YXRlIExpY2Vuc2VQYWdlIGxpY2Vuc2VQYWdlOwotCXByaXZhdGUgT3B0aW9uYWxGZWF0dXJlc1BhZ2Ugb3B0aW9uYWxGZWF0dXJlc1BhZ2U7Ci0JcHJpdmF0ZSBUYXJnZXRQYWdlIHRhcmdldFBhZ2U7Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgaW50IGluc3RhbGxDb3VudCA9IDA7Ci0JcHJpdmF0ZSBTZWFyY2hSdW5uZXIgc2VhcmNoUnVubmVyOwotCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0OwotCXByaXZhdGUgQXJyYXlMaXN0IGpvYnM7Ci0JcHJpdmF0ZSBib29sZWFuIG5lZWRzUmVzdGFydDsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUnVubmluZzsKLQotCXB1YmxpYyBJbnN0YWxsV2l6YXJkKCkgewotCQl0aGlzKChVcGRhdGVTZWFyY2hSZXF1ZXN0KSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSW5zdGFsbFdpemFyZChVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKLQkJaXNSdW5uaW5nID0gdHJ1ZTsKLQkJdGhpcy5zZWFyY2hSZXF1ZXN0ID0gc2VhcmNoUmVxdWVzdDsKLQkJc2V0RGlhbG9nU2V0dGluZ3MoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX1VQREFURV9XSVopOwotCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQlzZXRXaW5kb3dUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQud3RpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEluc3RhbGxXaXphcmQoVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0LCBBcnJheUxpc3Qgam9icykgewotCQl0aGlzKHNlYXJjaFJlcXVlc3QpOwotCQl0aGlzLmpvYnMgPSBqb2JzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5zdGFsbENvdW50KCkgewotCQlyZXR1cm4gaW5zdGFsbENvdW50OwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RhcnROZWVkZWQoKSB7Ci0JCXJldHVybiBpbnN0YWxsQ291bnQgPiAwICYmIG5lZWRzUmVzdGFydDsgLy8gb3IgPT0gc2VsZWN0ZWRKb2JzLmxlbmd0aAotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCWlzUnVubmluZyA9IGZhbHNlOwotCQlpZiAodGFyZ2V0UGFnZSAhPSBudWxsKQotCQkJdGFyZ2V0UGFnZS5yZW1vdmVBZGRlZFNpdGVzKCk7Ci0JCXJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7Ci0JfQotCS8qKgotCSAqIEBzZWUgV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBzZWxlY3RlZEpvYnMgPQotCQkJCXJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCk7Ci0JCQlpbnN0YWxsQ291bnQgPSAwOwotCi0JCQlzYXZlU2V0dGluZ3MoKTsKLQkJCQotCQkJLy8gQ2hlY2sgZm9yIGR1cGxpY2F0aW9uIGNvbmZsaWN0cwotCQkJQXJyYXlMaXN0IGNvbmZsaWN0cyA9Ci0JCQkJRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoCi0JCQkJCXNlbGVjdGVkSm9icywKLQkJCQkJY29uZmlnKTsKLQkJCWlmIChjb25mbGljdHMgIT0gbnVsbCkgewotCQkJCUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZyBkaWFsb2cgPQotCQkJCQluZXcgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nKGdldFNoZWxsKCksIGNvbmZsaWN0cyk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlmaW5hbCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIgPW5ldyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlKAotCQkJCQlJbnN0YWxsV2l6YXJkLnRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQkvLyBvayB0byBjb250aW51ZQkJCi0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJCQkvLyBzZXR1cCBqb2JzIHdpdGggdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQKLQkJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BlcmF0aW9ucyA9Ci0JCQkJCW5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bc2VsZWN0ZWRKb2JzLmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gc2VsZWN0ZWRKb2JzW2ldOwotCQkJCQkJSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID0gbnVsbDsKLQkJCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcyA9IG51bGw7Ci0JCQkJCQlpZiAoVXBkYXRlVXRpbHMuaGFzT3B0aW9uYWxGZWF0dXJlcyhqb2IuZ2V0RmVhdHVyZSgpKSkgewotCQkJCQkJCW9wdGlvbmFsRmVhdHVyZXMgPQotCQkJCQkJCQlvcHRpb25hbEZlYXR1cmVzUGFnZQotCQkJCQkJCQkJLmdldENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKAotCQkJCQkJCQkJam9iKTsKLQkJCQkJCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID0KLQkJCQkJCQkJb3B0aW9uYWxGZWF0dXJlc1BhZ2UKLQkJCQkJCQkJCS5nZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKAotCQkJCQkJCQkJam9iLAotCQkJCQkJCQkJam9iLmdldFRhcmdldFNpdGUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gb3AgPQotCQkJCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJCQkJLmNyZWF0ZUluc3RhbGxPcGVyYXRpb24oCi0JCQkJCQkJCWpvYi5nZXRUYXJnZXRTaXRlKCksCi0JCQkJCQkJCWpvYi5nZXRGZWF0dXJlKCksCi0JCQkJCQkJCW9wdGlvbmFsRmVhdHVyZXMsCi0JCQkJCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsCi0JCQkJCQkJCXZlcmlmaWNhdGlvbkxpc3RlbmVyKTsKLQkJCQkJCW9wZXJhdGlvbnNbaV0gPSBvcDsKLQkJCQkJfQotCQkJCQlJT3BlcmF0aW9uIGluc3RhbGxPcGVyYXRpb24gPQotCQkJCQkJT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCi0JCQkJCQkJLmNyZWF0ZUJhdGNoSW5zdGFsbE9wZXJhdGlvbigKLQkJCQkJCQlvcGVyYXRpb25zKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5lZWRzUmVzdGFydCA9IGluc3RhbGxPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBJbnN0YWxsV2l6YXJkLnRoaXMpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJCi0JCQlib29sZWFuIHJldHJ5OwotCQkJZG8gewotCQkJCXJldHJ5ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRocm93YWJsZSB0YXJnZXRFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJCQlpZiAodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2YgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24pIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfWVsc2UgaWYodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2YgRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uKXsKLQkJCQkJCQlGZWF0dXJlRG93bmxvYWRFeGNlcHRpb24gZmRlPShGZWF0dXJlRG93bmxvYWRFeGNlcHRpb24pdGFyZ2V0RXhjZXB0aW9uOwotCQkJCQkJCXJldHJ5ID0KLQkJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbigKLQkJCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLnJldHJ5VGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlmZGUuZ2V0TWVzc2FnZSgpKyJcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQucmV0cnkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAocmV0cnkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gd2hpbGUgKHJldHJ5KTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJaXNSdW5uaW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc2VhcmNoUnVubmVyID0gbmV3IFNlYXJjaFJ1bm5lcihnZXRTaGVsbCgpLCBnZXRDb250YWluZXIoKSk7Ci0KLQkJaWYgKHNlYXJjaFJlcXVlc3QgPT0gbnVsbCAmJiBqb2JzID09IG51bGwpIHsKLQkJCW1vZGVQYWdlID0gbmV3IE1vZGVTZWxlY3Rpb25QYWdlKHNlYXJjaFJ1bm5lcik7Ci0JCQlhZGRQYWdlKG1vZGVQYWdlKTsKLQkJCXNpdGVQYWdlID0gbmV3IFNpdGVQYWdlKHNlYXJjaFJ1bm5lcik7Ci0JCQlhZGRQYWdlKHNpdGVQYWdlKTsKLQkJfSBlbHNlIHsKLQkJCXNlYXJjaFJ1bm5lci5zZXRTZWFyY2hQcm92aWRlcih0aGlzKTsKLQkJCWlmIChqb2JzICE9IG51bGwpCi0JCQkJc2VhcmNoUnVubmVyLnNldE5ld1NlYXJjaE5lZWRlZChmYWxzZSk7Ci0JCX0KLQkJcmV2aWV3UGFnZSA9IG5ldyBSZXZpZXdQYWdlKHNlYXJjaFJ1bm5lciwgam9icyk7Ci0JCXNlYXJjaFJ1bm5lci5zZXRSZXN1bHRDb2xsZWN0b3IocmV2aWV3UGFnZSk7Ci0JCWFkZFBhZ2UocmV2aWV3UGFnZSk7Ci0KLQkJdHJ5IHsKLS8vCQkJY29uZmlnID0gVXBkYXRlVXRpbHMuY3JlYXRlSW5zdGFsbENvbmZpZ3VyYXRpb24oKTsKLQkJCWNvbmZpZyA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJbGljZW5zZVBhZ2UgPSBuZXcgTGljZW5zZVBhZ2UodHJ1ZSk7Ci0JCWFkZFBhZ2UobGljZW5zZVBhZ2UpOwotCQlvcHRpb25hbEZlYXR1cmVzUGFnZSA9IG5ldyBPcHRpb25hbEZlYXR1cmVzUGFnZShjb25maWcpOwotCQlhZGRQYWdlKG9wdGlvbmFsRmVhdHVyZXNQYWdlKTsKLQkJdGFyZ2V0UGFnZSA9IG5ldyBUYXJnZXRQYWdlKGNvbmZpZyk7Ci0JCWFkZFBhZ2UodGFyZ2V0UGFnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVTZXR0aW5ncygpIHsKLQkJaWYgKG1vZGVQYWdlICE9IG51bGwpCi0JCQltb2RlUGFnZS5zYXZlU2V0dGluZ3MoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYWdlUmVxdWlyZWQoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpZiAocGFnZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCWlmIChwYWdlLmVxdWFscyhsaWNlbnNlUGFnZSkpIHsKLQkJCXJldHVybiBPcGVyYXRpb25zTWFuYWdlci5oYXNTZWxlY3RlZEpvYnNXaXRoTGljZW5zZXMoCi0JCQkJcmV2aWV3UGFnZS5nZXRTZWxlY3RlZEpvYnMoKSk7Ci0JCX0KLQkJaWYgKHBhZ2UuZXF1YWxzKG9wdGlvbmFsRmVhdHVyZXNQYWdlKSkgewotCQkJcmV0dXJuIE9wZXJhdGlvbnNNYW5hZ2VyLmhhc1NlbGVjdGVkSm9ic1dpdGhPcHRpb25hbEZlYXR1cmVzKAotCQkJCXJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCkpOwotCQl9Ci0JCWlmIChwYWdlLmVxdWFscyh0YXJnZXRQYWdlKSkgewotCQkJcmV0dXJuIHJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCkubGVuZ3RoID4gMDsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQkJYm9vbGVhbiBzdGFydCA9IGZhbHNlOwotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0KLQkJaWYgKG1vZGVQYWdlICE9IG51bGwgJiYgcGFnZS5lcXVhbHMobW9kZVBhZ2UpKSB7Ci0JCQlib29sZWFuIHVwZGF0ZSA9IG1vZGVQYWdlLmlzVXBkYXRlTW9kZSgpOwotCQkJaWYgKHVwZGF0ZSkKLQkJCQlyZXR1cm4gcmV2aWV3UGFnZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gc2l0ZVBhZ2U7Ci0JCX0KLQkJaWYgKHNpdGVQYWdlICE9IG51bGwgJiYgcGFnZS5lcXVhbHMoc2l0ZVBhZ2UpKQotCQkJcmV0dXJuIHJldmlld1BhZ2U7Ci0KLQkJaWYgKHBhZ2UuZXF1YWxzKHJldmlld1BhZ2UpKSB7Ci0JCQl1cGRhdGVEeW5hbWljUGFnZXMoKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwYWdlc1tpXS5lcXVhbHMocGFnZSkpIHsKLQkJCQlzdGFydCA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHN0YXJ0KSB7Ci0JCQkJaWYgKGlzUGFnZVJlcXVpcmVkKHBhZ2VzW2ldKSkgewotCQkJCQluZXh0UGFnZSA9IHBhZ2VzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5leHRQYWdlOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVEeW5hbWljUGFnZXMoKSB7Ci0JCWlmIChsaWNlbnNlUGFnZSAhPSBudWxsKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBsaWNlbnNlSm9icyA9Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0U2VsZWN0ZWRKb2JzV2l0aExpY2Vuc2VzKAotCQkJCQlyZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpKTsKLQkJCWxpY2Vuc2VQYWdlLnNldEpvYnMobGljZW5zZUpvYnMpOwotCQl9Ci0JCWlmIChvcHRpb25hbEZlYXR1cmVzUGFnZSAhPSBudWxsKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcHRpb25hbEpvYnMgPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFNlbGVjdGVkSm9ic1dpdGhPcHRpb25hbEZlYXR1cmVzKAotCQkJCQlyZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpKTsKLQkJCW9wdGlvbmFsRmVhdHVyZXNQYWdlLnNldEpvYnMob3B0aW9uYWxKb2JzKTsKLQkJfQotCQlpZiAodGFyZ2V0UGFnZSAhPSBudWxsKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBpbnN0YWxsSm9icyA9Ci0JCQkJcmV2aWV3UGFnZS5nZXRTZWxlY3RlZEpvYnMoKTsKLQkJCXRhcmdldFBhZ2Uuc2V0Sm9icyhpbnN0YWxsSm9icyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCUlXaXphcmRQYWdlIHBhZ2UgPSBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQlyZXR1cm4gcGFnZS5lcXVhbHModGFyZ2V0UGFnZSkgJiYgcGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVzZXJ2ZU9yaWdpbmF0aW5nVVJMcygKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzKSB7Ci0JCS8vIHdhbGsgdGhlIGhpZWFyYXJjaHkgYW5kIHByZXNlcnZlIHRoZSBvcmlnaW5hdGluZyBVUkwKLQkJLy8gZm9yIGFsbCB0aGUgb3B0aW9uYWwgZmVhdHVyZXMgdGhhdCBhcmUgbm90IGNob3NlbiB0bwotCQkvLyBiZSBpbnN0YWxsZWQuCi0JCVVSTCB1cmwgPSBmZWF0dXJlLmdldFNpdGUoKS5nZXRVUkwoKTsKLQkJdHJ5IHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07Ci0JCQkJYm9vbGVhbiBwcmVzZXJ2ZSA9IGZhbHNlOwotCQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSkgewotCQkJCQlib29sZWFuIG9uVGhlTGlzdCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9wdGlvbmFsRmVhdHVyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChvcHRpb25hbEZlYXR1cmVzW2pdLmVxdWFscyhpcmVmKSkgewotCQkJCQkJCS8vd2FzIG9uIHRoZSBsaXN0Ci0JCQkJCQkJb25UaGVMaXN0ID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIW9uVGhlTGlzdCkKLQkJCQkJCXByZXNlcnZlID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKHByZXNlcnZlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPQotCQkJCQkJCWlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJCQkJCVVwZGF0ZVVJLnNldE9yaWdpbmF0aW5nVVJMKGlkLCB1cmwpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFNpbGVudGx5IGlnbm9yZQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlGZWF0dXJlIGlmZWF0dXJlID0gaXJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQkJcHJlc2VydmVPcmlnaW5hdGluZ1VSTHMoaWZlYXR1cmUsIG9wdGlvbmFsRmVhdHVyZXMpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFNpbGVudGx5IGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbGVudGx5IGlnbm9yZQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkxpc3RlbmVyI2FmdGVyRXhlY3V0ZShvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFmdGVyRXhlY3V0ZShJT3BlcmF0aW9uIG9wZXJhdGlvbiwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKCEob3BlcmF0aW9uIGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSkKLQkJCXJldHVybiB0cnVlOwotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgb3BlcmF0aW9uOwotCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gam9iLmdldE9sZEZlYXR1cmUoKTsKLQkJaWYgKG9sZEZlYXR1cmUgPT0gbnVsbCAmJiBqb2IuZ2V0T3B0aW9uYWxGZWF0dXJlcygpICE9IG51bGwpCi0JCQlwcmVzZXJ2ZU9yaWdpbmF0aW5nVVJMcygKLQkJCQlqb2IuZ2V0RmVhdHVyZSgpLAotCQkJCWpvYi5nZXRPcHRpb25hbEZlYXR1cmVzKCkpOwotCi0JCWluc3RhbGxDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uTGlzdGVuZXIjYmVmb3JlRXhlY3V0ZShvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGJlZm9yZUV4ZWN1dGUoSU9wZXJhdGlvbiBvcGVyYXRpb24sIE9iamVjdCBkYXRhKSB7Ci0JCS8vCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgSUJhdGNoT3BlcmF0aW9uCi0JCS8vCQkJJiYgZGF0YSAhPSBudWxsCi0JCS8vCQkJJiYgZGF0YSBpbnN0YW5jZW9mIEFycmF5TGlzdCkgewotCQkvLwotCQkvLwkJCUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZzIgZGlhbG9nID0KLQkJLy8JCQkJbmV3IER1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZzIoZ2V0U2hlbGwoKSwgKEFycmF5TGlzdCkgZGF0YSk7Ci0JCS8vCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gMCkKLQkJLy8JCQkJcmV0dXJuIGZhbHNlOwotCQkvLwkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSVNlYXJjaFByb3ZpZGVyMiNnZXRTZWFyY2hSZXF1ZXN0KCkKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU2VhcmNoUmVxdWVzdCBnZXRTZWFyY2hSZXF1ZXN0KCkgewotCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzUnVubmluZygpIHsKLQkJcmV0dXJuIGlzUnVubmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9MaWNlbnNlUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTGljZW5zZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4YzZlYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9MaWNlbnNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBMaWNlbnNlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJRHluYW1pY1BhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0MgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQzIgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kZXNjMiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDQ0VQVCA9ICJJbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmFjY2VwdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFQ0xJTkUgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kZWNsaW5lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUNDRVBUMiA9ICJJbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmFjY2VwdDIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERUNMSU5FMiA9ICJJbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmRlY2xpbmUyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBtdWx0aUxpY2Vuc2VNb2RlID0gZmFsc2U7Ci0JcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzOwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCXByaXZhdGUgVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTGljZW5zZVBhZ2UyCi0JICovCi0JcHVibGljIExpY2Vuc2VQYWdlKGJvb2xlYW4gbXVsdGlMaWNlbnNlTW9kZSkgewotCQlzdXBlcigiTGljZW5zZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJdGhpcy5tdWx0aUxpY2Vuc2VNb2RlID0gbXVsdGlMaWNlbnNlTW9kZTsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotCQlzZXREZXNjcmlwdGlvbigKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQltdWx0aUxpY2Vuc2VNb2RlID8gS0VZX0RFU0MyIDogS0VZX0RFU0MpKTsKLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIExpY2Vuc2VQYWdlKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IpIHsKLQkJdGhpcyhmYWxzZSk7Ci0JCXNldEpvYnMobmV3IElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIHsgam9iIH0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgewotCQl0aGlzLmpvYnMgPSBqb2JzOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY2xpZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTGljZW5zZVBhZ2UyIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAobXVsdGlMaWNlbnNlTW9kZSkgewotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0KLQkJCXRhYmxlID0gbmV3IFRhYmxlKGNsaWVudCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0KLQkJCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgZGF0YSA9IGUuaXRlbS5nZXREYXRhKCk7Ci0JCQkJCQl0ZXh0LnNldFRleHQoKGRhdGEgPT0gbnVsbCkgPyAiIiA6IChTdHJpbmcpIGRhdGEpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl9Ci0JCXRleHQgPQotCQkJbmV3IFRleHQoCi0JCQkJY2xpZW50LAotCQkJCVNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpZiAobXVsdGlMaWNlbnNlTW9kZSkKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKHRleHQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OVUxMKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJaWYgKG11bHRpTGljZW5zZU1vZGUpCi0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmaW5hbCBCdXR0b24gYWNjZXB0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5SQURJTyk7Ci0JCWFjY2VwdEJ1dHRvbi5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKG11bHRpTGljZW5zZU1vZGUgPyBLRVlfQUNDRVBUMiA6IEtFWV9BQ0NFUFQpKTsKLQkJYWNjZXB0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShhY2NlcHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJQnV0dG9uIGRlY2xpbmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlJBRElPKTsKLQkJZGVjbGluZUJ1dHRvbi5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKG11bHRpTGljZW5zZU1vZGUgPyBLRVlfREVDTElORTIgOiBLRVlfREVDTElORSkpOwotCQlkZWNsaW5lQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShhY2NlcHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJc2V0Q29udHJvbChjbGllbnQpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7IC8vIFRPIERPOiBPcHRpbWl6ZSBvdXQgdGhlIGNhc2Ugd2hlcmUgYSBmZWF0dXJlIGRvZXMgbm90IGhhdmUgYSBsaWNlbnNlPwotCQlpZiAodmlzaWJsZSkgewotCQkJaWYgKG11bHRpTGljZW5zZU1vZGUpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGpvYnNbaV0uZ2V0RmVhdHVyZSgpOwotCQkJCQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQlTdHJpbmcgbGFiZWwgPQotCQkJCQkJZmVhdHVyZS5nZXRMYWJlbCgpCi0JCQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCWl0ZW0uc2V0VGV4dChsYWJlbCk7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2UoCi0JCQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKLQkJCQkJCQlmZWF0dXJlLmlzUGF0Y2goKQotCQkJCQkJCQk/IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRUZJWF9PQkoKLQkJCQkJCQkJOiBVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKKSk7Ci0JCQkJCVN0cmluZyBsaWNlbnNlID0gZmVhdHVyZS5nZXRMaWNlbnNlKCkuZ2V0QW5ub3RhdGlvbigpOwotCQkJCQkvLyBRdWVzdGlvbjogQ2FuIHRoaXMgZXZlciBiZSBudWxsPyBXaGF0IGlzIHRoZSBydW50aW1lIGNvc3Q/Ci0JCQkJCWl0ZW0uc2V0RGF0YShsaWNlbnNlKTsKLQkJCQl9Ci0KLQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9Ci0JCQlzaG93TGljZW5zZVRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtdWx0aUxpY2Vuc2VNb2RlKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW1zW10gPSB0YWJsZS5nZXRJdGVtcygpOwotCQkJCWZvciAoaW50IGkgPSBpdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQl0YWJsZS5nZXRJdGVtKGkpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd0xpY2Vuc2VUZXh0KCkgewotCQlpZiAoIW11bHRpTGljZW5zZU1vZGUpIHsKLQkJCXRleHQuc2V0VGV4dChqb2JzWzBdLmdldEZlYXR1cmUoKS5nZXRMaWNlbnNlKCkuZ2V0QW5ub3RhdGlvbigpKTsKLQkJCXJldHVybjsKLQkJfQotCQlUYWJsZUl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQl0ZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlPYmplY3QgZGF0YSA9IHNlbGVjdGVkSXRlbXNbMF0uZ2V0RGF0YSgpOwotCQkJdGV4dC5zZXRUZXh0KChkYXRhID09IG51bGwpID8gIiIgOiAoU3RyaW5nKSBkYXRhKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTG9jYWxTaXRlU2VsZWN0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0xvY2FsU2l0ZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOTYwMWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTG9jYWxTaXRlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIExvY2FsU2l0ZVNlbGVjdG9yIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBTdHJpbmcgbGFzdExvY2F0aW9uID0gbnVsbDsKLQlwdWJsaWMgTG9jYWxTaXRlU2VsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU2l0ZUJvb2ttYXJrIGdldExvY2FMU2l0ZShTaGVsbCBwYXJlbnQpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50KTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkxvY2FsU2l0ZVNlbGVjdG9yLmRpYWxvZ01lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgobGFzdExvY2F0aW9uKTsKLQkJU3RyaW5nIGRpciA9IGRpYWxvZy5vcGVuKCk7Ci0KLQkJU2l0ZUJvb2ttYXJrIHNpdGVCb29rbWFyayA9IG51bGw7Ci0JCXdoaWxlIChkaXIgIT0gbnVsbCAmJiBzaXRlQm9va21hcmsgPT0gbnVsbCkgewotCQkJRmlsZSBkaXJGaWxlID0gbmV3IEZpbGUoZGlyKTsKLQkJCWlmIChpc0RpclNpdGUoZGlyRmlsZSkpIHsKLQkJCQlzaXRlQm9va21hcmsgPSBjcmVhdGVEaXJTaXRlKGRpckZpbGUpOwotCQkJCWxhc3RMb2NhdGlvbiA9IGRpcjsKLQkJCX0gZWxzZSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oCi0JCQkJCXBhcmVudCwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJMb2NhbFNpdGVTZWxlY3Rvci5kaXJJbmZvVGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkxvY2FsU2l0ZVNlbGVjdG9yLmRpckluZm9NZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyKTsKLQkJCQlkaXIgPSBkaWFsb2cub3BlbigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaXRlQm9va21hcms7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU2l0ZUJvb2ttYXJrIGdldExvY2FMWmlwcGVkU2l0ZShTaGVsbCBwYXJlbnQpIHsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhwYXJlbnQpOwotCQlkaWFsb2cuc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiTG9jYWxTaXRlU2VsZWN0b3IuZGlhbG9nTWVzc2FnZXppcCIpKTsgLy8kTk9OLU5MUy0xJAotCQkvL2RpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLnppcCIsICIqLmphciIgfSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIiouamFyOyouemlwIiB9KTsgLy8kTk9OLU5MUy0xJAotCi0JCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPSBudWxsOwotCi0JCVN0cmluZyB6aXAgPSBkaWFsb2cub3BlbigpOwotCQl3aGlsZSAoemlwICE9IG51bGwgJiYgc2l0ZUJvb2ttYXJrID09IG51bGwpIHsKLQkJCUZpbGUgemlwRiA9IG5ldyBGaWxlKHppcCk7Ci0JCQlpZiAoaXNaaXBTaXRlKHppcEYpKSB7Ci0JCQkJc2l0ZUJvb2ttYXJrID0gY3JlYXRlWmlwU2l0ZSh6aXBGKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oCi0JCQkJCXBhcmVudCwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJMb2NhbFNpdGVTZWxlY3Rvci56aXBJbmZvVGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkxvY2FsU2l0ZVNlbGVjdG9yLnppcEluZm9NZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJemlwID0gZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2l0ZUJvb2ttYXJrOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgdGhlIHppcCBmaWxlIGNvbnRhaW5zIGFuIHVwZGF0ZSBzaXRlCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNaaXBTaXRlKEZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi56aXAiKSAvLyROT04tTkxTLTEkCi0JCQkmJiAhZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVppcHBlZFNpdGVWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFppcHBlZFNpdGVWYWxpZGF0b3IoZmlsZSk7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKAotCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKS5nZXREaXNwbGF5KCksCi0JCQl2YWxpZGF0b3IpOwotCQlyZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBkaXIgY29udGFpbnMgYW4gdXBkYXRlIHNpdGUKLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzRGlyU2l0ZShGaWxlIGRpcikgewotCQlGaWxlIHNpdGVYTUwgPSBuZXcgRmlsZShkaXIsICJzaXRlLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgZmVhdHVyZXNEaXIgPSBuZXcgRmlsZShkaXIsICJmZWF0dXJlcyIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKGRpciwgInBsdWdpbnMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2l0ZVhNTC5leGlzdHMoKQotCQkJfHwgZmVhdHVyZXNEaXIuZXhpc3RzKCkKLQkJCSYmIGZlYXR1cmVzRGlyLmlzRGlyZWN0b3J5KCkKLQkJCSYmIHBsdWdpbnNEaXIuZXhpc3RzKCkKLQkJCSYmIHBsdWdpbnNEaXIuaXNEaXJlY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYm9va21hcmsgdG8gYSB6aXBwZWQgc2l0ZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBTaXRlQm9va21hcmsgY3JlYXRlWmlwU2l0ZShGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBmaWxlVVJMID0gbmV3IFVSTCgiZmlsZSIsIG51bGwsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgdXJsID0KLQkJCQluZXcgVVJMKAotCQkJCQkiamFyOiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBmaWxlVVJMLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZSgnXFwnLCAnLycpCi0JCQkJCQkrICIhLyIpOyAvLyROT04tTkxTLTEkCi0JCQlTaXRlQm9va21hcmsgc2l0ZSA9IG5ldyBTaXRlQm9va21hcmsoZmlsZS5nZXROYW1lKCksIHVybCwgZmFsc2UpOwotCQkJc2l0ZS5zZXRMb2NhbCh0cnVlKTsKLQkJCXJldHVybiBzaXRlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYm9va21hcmsgdG8gYSBzaXRlIG9uIHRoZSBmaWxlIHN5c3RlbQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBTaXRlQm9va21hcmsgY3JlYXRlRGlyU2l0ZShGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0JCQlTdHJpbmcgc2l0ZU5hbWUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJU2l0ZUJvb2ttYXJrIHNpdGUgPSBuZXcgU2l0ZUJvb2ttYXJrKHNpdGVOYW1lLCB1cmwsIGZhbHNlKTsKLQkJCXNpdGUuc2V0TG9jYWwodHJ1ZSk7Ci0JCQlyZXR1cm4gc2l0ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCXN0YXRpYyBjbGFzcyBaaXBwZWRTaXRlVmFsaWRhdG9yIGltcGxlbWVudHMgUnVubmFibGUgewotCQlGaWxlIGZpbGU7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQkJcHVibGljIFppcHBlZFNpdGVWYWxpZGF0b3IoRmlsZSBmaWxlKSB7Ci0JCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVppcEZpbGUgc2l0ZVppcCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIGNoZWNrIGlmIHRoZSB6aXAgZmlsZSBjb250YWlucyBzaXRlLnhtbAotCQkJCXNpdGVaaXAgPSBuZXcgWmlwRmlsZShmaWxlKTsKLQkJCQlpZiAoc2l0ZVppcC5nZXRFbnRyeSgic2l0ZS54bWwiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsaWQgPSB0cnVlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJYm9vbGVhbiBoYXNGZWF0dXJlcyA9IGZhbHNlOwotCQkJCWJvb2xlYW4gaGFzUGx1Z2lucyA9IGZhbHNlOwotCQkJCWZvciAoRW51bWVyYXRpb24gZW51bSA9IHNpdGVaaXAuZW50cmllcygpOwotCQkJCQllbnVtLmhhc01vcmVFbGVtZW50cygpOwotCQkJCQkpIHsKLQkJCQkJWmlwRW50cnkgekVudHJ5ID0gKFppcEVudHJ5KSBlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQkJCWlmICghaGFzRmVhdHVyZXMKLQkJCQkJCSYmIHpFbnRyeS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiZmVhdHVyZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQloYXNGZWF0dXJlcyA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKCFoYXNQbHVnaW5zCi0JCQkJCQkmJiB6RW50cnkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInBsdWdpbnMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQloYXNQbHVnaW5zID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoaGFzRmVhdHVyZXMgJiYgaGFzUGx1Z2lucykgewotCQkJCQkJdmFsaWQgPSB0cnVlOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHNpdGVaaXAgIT0gbnVsbCkgewotCQkJCQkJc2l0ZVppcC5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsaWQuICovCi0JCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCQlyZXR1cm4gdmFsaWQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL01vZGVTZWxlY3Rpb25QYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9Nb2RlU2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTEyMjFjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL01vZGVTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlU2VsZWN0aW9uUGFnZSBleHRlbmRzIEJhbm5lclBhZ2UgaW1wbGVtZW50cyBJU2VhcmNoUHJvdmlkZXIgewotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVNb2RlPXRydWU7Ci0JcHJpdmF0ZSBCdXR0b24gdXBkYXRlc0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBuZXdGZWF0dXJlc0J1dHRvbjsKLQlwcml2YXRlIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdDsKLQlwcml2YXRlIFNlYXJjaFJ1bm5lciBzZWFyY2hSdW5uZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fSUQgPSAiTW9kZVNlbGVjdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBfTkVXX0ZFQVRVUkVTX01PREUgPSAibmV3LWZlYXR1cmVzLW1vZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIE1vZGVTZWxlY3Rpb25QYWdlKFNlYXJjaFJ1bm5lciBzZWFyY2hSdW5uZXIpIHsKLQkJc3VwZXIoIm1vZGVTZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoIk1vZGVTZWxlY3Rpb25QYWdlLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZygiTW9kZVNlbGVjdGlvblBhZ2UuZGVzYyIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnNlYXJjaFJ1bm5lciA9IHNlYXJjaFJ1bm5lcjsKLQl9Ci0JCi0JcHVibGljIFVwZGF0ZVNlYXJjaFJlcXVlc3QgZ2V0U2VhcmNoUmVxdWVzdCgpIHsKLQkJaW5pdGlhbGl6ZVNlYXJjaCgpOwotCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3MgZ2V0U2V0dGluZ3MoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBtYXN0ZXIgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBtYXN0ZXIuZ2V0U2VjdGlvbihTRUNUSU9OX0lEKTsKLQkJaWYgKHNlY3Rpb249PW51bGwpCi0JCQlzZWN0aW9uID0gbWFzdGVyLmFkZE5ld1NlY3Rpb24oU0VDVElPTl9JRCk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2VhcmNoKCkgewotCQlpZiAoc2VhcmNoUmVxdWVzdCE9bnVsbCkgcmV0dXJuOwotCQlzZWFyY2hSZXF1ZXN0ID0gVXBkYXRlVXRpbHMuY3JlYXRlTmV3VXBkYXRlc1JlcXVlc3QobnVsbCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuQmFubmVyUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXVwZGF0ZXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJdXBkYXRlc0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTW9kZVNlbGVjdGlvblBhZ2UudXBkYXRlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIG5ld0ZlYXR1cmVzTW9kZSA9IGdldFNldHRpbmdzKCkuZ2V0Qm9vbGVhbihQX05FV19GRUFUVVJFU19NT0RFKTsKLQkJdXBkYXRlc0J1dHRvbi5zZXRTZWxlY3Rpb24oIW5ld0ZlYXR1cmVzTW9kZSk7Ci0JCXVwZGF0ZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3dpdGNoTW9kZSgpOwotCQkJfQotCQl9KTsKLQkJbmV3RmVhdHVyZXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJbmV3RmVhdHVyZXNCdXR0b24uc2V0U2VsZWN0aW9uKG5ld0ZlYXR1cmVzTW9kZSk7Ci0JCW5ld0ZlYXR1cmVzQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNb2RlU2VsZWN0aW9uUGFnZS5uZXdGZWF0dXJlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQluZXdGZWF0dXJlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzd2l0Y2hNb2RlKCk7Ci0JCQl9Ci0JCX0pOwkJCi0JCXN3aXRjaE1vZGUoKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjb21wb3NpdGUsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTW9kZVNlbGVjdGlvblBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmVTZXR0aW5ncygpIHsKLQkJYm9vbGVhbiB1cGRhdGVNb2RlID0gdXBkYXRlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJZ2V0U2V0dGluZ3MoKS5wdXQoUF9ORVdfRkVBVFVSRVNfTU9ERSwgIXVwZGF0ZU1vZGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3dpdGNoTW9kZSgpIHsKLQkJdXBkYXRlTW9kZSA9IHVwZGF0ZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh1cGRhdGVNb2RlKQotCQkJc2VhcmNoUnVubmVyLnNldFNlYXJjaFByb3ZpZGVyKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZU1vZGUoKSB7Ci0JCXJldHVybiB1cGRhdGVNb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld1VwZGF0ZVNpdGVEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld1VwZGF0ZVNpdGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlMzA5ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdVcGRhdGVTaXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotCi0KLXB1YmxpYyBjbGFzcyBOZXdVcGRhdGVTaXRlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQkKLQlwcm90ZWN0ZWQgVGV4dCBuYW1lOwotCXByb3RlY3RlZCBUZXh0IHVybDsKLQlwcml2YXRlIEJ1dHRvbiBva0J1dHRvbjsKLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKi8KLQlwdWJsaWMgTmV3VXBkYXRlU2l0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCQljcmVhdGVCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLAotCQkJZmFsc2UpOwotCQkKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzNTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJOZXdVcGRhdGVTaXRlRGlhbG9nLm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCW5hbWUgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQluYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQluYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZlcmlmeUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJOZXdVcGRhdGVTaXRlRGlhbG9nLnVybCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdXJsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdXJsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl1cmwuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmVyaWZ5Q29tcGxldGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0aWFsaXplRmllbGRzKCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJdXJsLnNldFRleHQoImh0dHA6Ly8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXVwZGF0ZSgpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXRyeSB7Ci0JCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gbmV3IFNpdGVCb29rbWFyayhuYW1lLmdldFRleHQoKSwgbmV3IFVSTCh1cmwuZ2V0VGV4dCgpKSwgZmFsc2UpOwotCQkJbW9kZWwuYWRkQm9va21hcmsoYm9va21hcmspOwotCQkJbW9kZWwuc2F2ZUJvb2ttYXJrcygpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wbGV0ZSgpIHsKLQkJaWYgKG9rQnV0dG9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQkKLQkJaWYgKG5hbWUuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwIHx8IHVybC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCXRyeSB7Ci0JCQlVUkwgbmV3VVJMID0gbmV3IFVSTChVUkxEZWNvZGVyLmRlY29kZSh1cmwuZ2V0VGV4dCgpLnRyaW0oKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodXJsLmdldEVkaXRhYmxlKCkpCi0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZCghbmV3VVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIAotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQkKLQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdXZWJTaXRlRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdXZWJTaXRlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwM2VlZWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTmV3V2ViU2l0ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotCi0KLXB1YmxpYyBjbGFzcyBOZXdXZWJTaXRlRGlhbG9nIGV4dGVuZHMgTmV3VXBkYXRlU2l0ZURpYWxvZyB7Ci0KLQlwdWJsaWMgTmV3V2ViU2l0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKLQkJdHJ5IHsKLQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQlTaXRlQm9va21hcmsgYm9va21hcmsgPSBuZXcgU2l0ZUJvb2ttYXJrKG5hbWUuZ2V0VGV4dCgpLCBuZXcgVVJMKHVybC5nZXRUZXh0KCkpLCB0cnVlKTsKLQkJCW1vZGVsLmFkZEJvb2ttYXJrKGJvb2ttYXJrKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvT3B0aW9uYWxGZWF0dXJlc1BhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL09wdGlvbmFsRmVhdHVyZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYTY3YmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvT3B0aW9uYWxGZWF0dXJlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIE9wdGlvbmFsRmVhdHVyZXNQYWdlIGV4dGVuZHMgQmFubmVyUGFnZSBpbXBsZW1lbnRzIElEeW5hbWljUGFnZSB7Ci0JLy8gTkwga2V5cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPQotCQkiSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0MgPQotCQkiSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS5kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFJFRV9MQUJFTCA9Ci0JCSJJbnN0YWxsV2l6YXJkLk9wdGlvbmFsRmVhdHVyZXNQYWdlLnRyZWVMYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVF9BTEwgPQotCQkiSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS5zZWxlY3RBbGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNFTEVDVF9BTEwgPQotCQkiSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS5kZXNlbGVjdEFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJpdmF0ZSBKb2JSb290W10gam9iUm9vdHM7Ci0KLQljbGFzcyBUcmVlQ29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEpvYlJvb3QpIHsKLQkJCQlyZXR1cm4gKChKb2JSb290KSBwYXJlbnQpLmdldEVsZW1lbnRzKCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIHsKLQkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBmZSA9IChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgcGFyZW50OwotCQkJCU9iamVjdCByb290ID0gZmUuZ2V0Um9vdCgpOwotCQkJCWJvb2xlYW4gb2xkRmVhdHVyZSA9IGZhbHNlOwotCQkJCWlmIChyb290IGluc3RhbmNlb2YgSm9iUm9vdCkgewotCQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKChKb2JSb290KXJvb3QpLmdldEpvYigpOwotCQkJCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVXRpbHMuaXNQYXRjaChqb2IuZ2V0RmVhdHVyZSgpKTsKLQkJCQkJb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbDsKLQkJCQkJcmV0dXJuIGZlLmdldENoaWxkcmVuKG9sZEZlYXR1cmUsIHBhdGNoLCBjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihwYXJlbnQpLmxlbmd0aCA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlpZiAoam9iUm9vdHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCXJldHVybiBqb2JSb290czsKLQkJfQotCX0KLQotCWNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSm9iUm9vdCkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoKEpvYlJvb3QpIG9iaikuZ2V0Sm9iKCkuZ2V0RmVhdHVyZSgpOwotCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkKLQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBvYmopLmdldExhYmVsKCk7Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKLQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZXZpZXdQYWdlMgotCSAqLwotCXB1YmxpYyBPcHRpb25hbEZlYXR1cmVzUGFnZShJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKCJPcHRpb25hbEZlYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0MpKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRKb2JzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsKLQkJam9iUm9vdHMgPSBuZXcgSm9iUm9vdFtqb2JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJam9iUm9vdHNbaV0gPSBuZXcgSm9iUm9vdChqb2JzW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJY3JlYXRlQ2hlY2tib3hUcmVlVmlld2VyKGNsaWVudCk7Ci0KLQkJc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihjbGllbnQsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdEFsbCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0VMRUNUX0FMTCkpOwotCQlHcmlkRGF0YSBnZCA9Ci0JCQluZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoc2VsZWN0QWxsQnV0dG9uKTsKLQotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oY2xpZW50LCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdEFsbChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVTRUxFQ1RfQUxMKSk7Ci0JCWdkID0KLQkJCW5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGRlc2VsZWN0QWxsQnV0dG9uKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGNsaWVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5NdWx0aU9wdGlvbmFsRmVhdHVyZXNQYWdlMiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCQotCQlyZXR1cm4gY2xpZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDaGVja2JveFRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RSRUVfTEFCRUwpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdHJlZVZpZXdlciA9Ci0JCQluZXcgQ2hlY2tib3hUcmVlVmlld2VyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVHJlZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUcmVlTGFiZWxQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQloYW5kbGVDaGVja2VkKGUuZ2V0RWxlbWVudCgpLCBlLmdldENoZWNrZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0cmVlVmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbChBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoam9iUm9vdHMpOwotCQkJaW5pdGlhbGl6ZVN0YXRlcygpOwotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRGb2N1cygpOwotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVN0YXRlcygpIHsKLQkJQXJyYXlMaXN0IGNoZWNrZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBncmF5ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBlZGl0YWJsZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYlJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGVja2VkLmFkZChqb2JSb290c1tpXSk7Ci0JCQlncmF5ZWQuYWRkKGpvYlJvb3RzW2ldKTsKLQkJCWJvb2xlYW4gdXBkYXRlID0gam9iUm9vdHNbaV0uZ2V0Sm9iKCkuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGw7Ci0JCQlpbml0aWFsaXplU3RhdGVzKHVwZGF0ZSwgam9iUm9vdHNbaV0uZ2V0RWxlbWVudHMoKSwgY2hlY2tlZCwgZ3JheWVkLCBlZGl0YWJsZSk7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZC50b0FycmF5KCkpOwotCQl0cmVlVmlld2VyLnNldEdyYXllZEVsZW1lbnRzKGdyYXllZC50b0FycmF5KCkpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZS5zaXplKCk+MCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUuc2l6ZSgpPjApOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU3RhdGVzKAotCQlib29sZWFuIHVwZGF0ZSwKLQkJT2JqZWN0W10gZWxlbWVudHMsCi0JCUFycmF5TGlzdCBjaGVja2VkLAotCQlBcnJheUxpc3QgZ3JheWVkLAotCQlBcnJheUxpc3QgZWRpdGFibGUpIHsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0KLQkJCQkoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGVsZW1lbnRzW2ldOwotCQkJaWYgKGVsZW1lbnQuaXNDaGVja2VkKCkpCi0JCQkJY2hlY2tlZC5hZGQoZWxlbWVudCk7Ci0JCQlpZiAoIWVsZW1lbnQuaXNFZGl0YWJsZSgpKQotCQkJCWdyYXllZC5hZGQoZWxlbWVudCk7Ci0JCQllbHNlCi0JCQkJZWRpdGFibGUuYWRkKGVsZW1lbnQpOwotCQkJaW5pdGlhbGl6ZVN0YXRlcyh1cGRhdGUsIGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSwgY2hlY2tlZCwgZ3JheWVkLCBlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0QWxsKGJvb2xlYW4gdmFsdWUpIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYlJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gam9iUm9vdHNbaV0uZ2V0Sm9iKCk7Ci0JCQlzZWxlY3RlZC5hZGQoam9iKTsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gam9iUm9vdHNbaV0uZ2V0RWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0gKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBlbGVtZW50c1tqXTsKLQkJCQlzZWxlY3RBbGwoam9iLmdldE9sZEZlYXR1cmUoKSAhPSBudWxsLCBlbGVtZW50LCBzZWxlY3RlZCwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKHNlbGVjdGVkLnRvQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEFsbCgKLQkJYm9vbGVhbiB1cGRhdGUsCi0JCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IHJlZiwKLQkJQXJyYXlMaXN0IHNlbGVjdGVkLAotCQlib29sZWFuIHZhbHVlKSB7Ci0KLQkJaWYgKCFyZWYuaXNPcHRpb25hbCgpKSB7Ci0JCQlzZWxlY3RlZC5hZGQocmVmKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWYuaXNFZGl0YWJsZSgpKSB7Ci0JCQkJcmVmLnNldENoZWNrZWQodmFsdWUpOwotCQkJCWlmICh2YWx1ZSkKLQkJCQkJc2VsZWN0ZWQuYWRkKHJlZik7Ci0JCQl9IGVsc2UgaWYgKHJlZi5pc0NoZWNrZWQoKSkgewotCQkJCXNlbGVjdGVkLmFkZChyZWYpOwotCQkJfQotCQl9Ci0JCU9iamVjdFtdIGluY2x1ZGVkID0gcmVmLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsKLQkJCXNlbGVjdEFsbCh1cGRhdGUsIChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgaW5jbHVkZWRbaV0sIHNlbGVjdGVkLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hlY2tlZChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSm9iUm9vdCkgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsICFjaGVja2VkKTsKLQkJCXJldHVybjsKLQkJfQotCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBmZSA9IChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgZWxlbWVudDsKLQotCQlpZiAoIWZlLmlzRWRpdGFibGUoKSkKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCAhY2hlY2tlZCk7Ci0JCWVsc2UgewotCQkJLy8gdXBkYXRlIHRoZSByZXN1bHQKLQkJCWZlLnNldENoZWNrZWQoY2hlY2tlZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElGZWF0dXJlW10gZ2V0VW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iLCBJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYlJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoam9iLmVxdWFscyhqb2JSb290c1tpXS5nZXRKb2IoKSkpIHsKLQkJCQlyZXR1cm4gam9iUm9vdHNbaV0uZ2V0VW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyhjb25maWcsIHRhcmdldFNpdGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgSUZlYXR1cmVbMF07Ci0JfQotCQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjdXJyZW50Sm9iKSB7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJSm9iUm9vdCBqb2JSb290ID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYlJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY3VycmVudEpvYi5lcXVhbHMoam9iUm9vdHNbaV0uZ2V0Sm9iKCkpKSB7Ci0JCQkJam9iUm9vdCA9IGpvYlJvb3RzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChqb2JSb290ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlUmVmZXJlbmNlWzBdOwotCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBqb2JSb290LmdldEpvYigpOwotCQlib29sZWFuIHVwZGF0ZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbDsKLQkJYm9vbGVhbiBwYXRjaCA9IFVwZGF0ZVV0aWxzLmlzUGF0Y2goam9iLmdldEZlYXR1cmUoKSk7Ci0JCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZWxlbWVudHMgPSBqb2JSb290LmdldEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWVsZW1lbnRzW2ldLmFkZENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKHVwZGF0ZSwgcGF0Y2gsIGNvbmZpZywgc2V0KTsKLQkJfQotCQlyZXR1cm4gKElGZWF0dXJlUmVmZXJlbmNlW10pIHNldC50b0FycmF5KG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtzZXQuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5OTViYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlJbWFnZXM7Ci0KLQotcHVibGljIGNsYXNzIFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0JcHJpdmF0ZSBSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlIHBhZ2U7Ci0KLQlwdWJsaWMgUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkKElGZWF0dXJlIGN1cnJlbnRGZWF0dXJlLCBJRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCXNldFdpbmRvd1RpdGxlKFVwZGF0ZVVJLmdldFN0cmluZygiUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVVBEQVRFX1dJWik7Ci0JCXBhZ2UgPSBuZXcgUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZShjdXJyZW50RmVhdHVyZSwgZmVhdHVyZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlhZGRQYWdlKHBhZ2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gcGFnZS5wZXJmb3JtRmluaXNoKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYmVlZDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotCi1wdWJsaWMgY2xhc3MgUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCQotCXByaXZhdGUgSUZlYXR1cmUgY3VycmVudEZlYXR1cmU7Ci0JcHJpdmF0ZSBJRmVhdHVyZVtdIGZlYXR1cmVzOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQlwdWJsaWMgUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZShJRmVhdHVyZSBjdXJyZW50RmVhdHVyZSwgSUZlYXR1cmVbXSBmZWF0dXJlcykgewotCQlzdXBlcigiU3dhcEZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoIlJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZFBhZ2UudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlLmRlc2MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5jdXJyZW50RmVhdHVyZSA9IGN1cnJlbnRGZWF0dXJlOwotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0YWJsZUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRhYmxlQ29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlLmxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUodGFibGVDb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciA9Ci0JCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX1VOQ09ORl9GRUFUVVJFX09CSiwgMCk7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBlbGVtZW50OwotCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkgKyAiICIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQkJCi0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmVhdHVyZXM7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2MSA9ICgoSUZlYXR1cmUpZTEpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7Ci0JCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjIgPSAoKElGZWF0dXJlKWUyKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkJCXJldHVybiB2MS5pc0dyZWF0ZXJPckVxdWFsVG8odjIpID8gLTEgOiAxOwotCQkJfQotCQl9KTsKLQkJCi0JCXRhYmxlVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCVN0cmluZyB2ZXJzaW9uID0KLQkJCQkJKChJRmVhdHVyZSkgZWxlbWVudCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJCXJldHVybiAhdmVyc2lvbi5lcXVhbHMoCi0JCQkJCWN1cnJlbnRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc3NlbCA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJSUZlYXR1cmUgY2hvc2VuRmVhdHVyZSA9IChJRmVhdHVyZSlzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCUlTdGF0dXMgdmFsaWRhdGlvblN0YXR1cyA9Ci0JCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ1JlcGxhY2VWZXJzaW9uKGN1cnJlbnRGZWF0dXJlLCBjaG9zZW5GZWF0dXJlKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGlvblN0YXR1cyA9PSBudWxsIHx8IHZhbGlkYXRpb25TdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuV0FSTklORyk7Ci0JCQotCQkJCWlmICh2YWxpZGF0aW9uU3RhdHVzID09IG51bGwpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCX0gZWxzZSBpZiAodmFsaWRhdGlvblN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJc2V0TWVzc2FnZSh2YWxpZGF0aW9uU3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UodmFsaWRhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChjdXJyZW50RmVhdHVyZSk7Ci0JCXRhYmxlVmlld2VyLmdldFRhYmxlKCkuc2VsZWN0KDApOwotCQlzZXRDb250cm9sKHRhYmxlQ29udGFpbmVyKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGFibGVDb250YWluZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlGZWF0dXJlIGNob3NlbkZlYXR1cmUgPSAoSUZlYXR1cmUpc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCi0JCXJldHVybiBzd2FwKGN1cnJlbnRGZWF0dXJlLCBjaG9zZW5GZWF0dXJlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHN3YXAoZmluYWwgSUZlYXR1cmUgY3VycmVudEZlYXR1cmUsIGZpbmFsIElGZWF0dXJlIGFub3RoZXJGZWF0dXJlKSB7Ci0vLwkJSVN0YXR1cyBzdGF0dXMgPQotLy8JCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdSZXBsYWNlVmVyc2lvbihjdXJyZW50RmVhdHVyZSwgYW5vdGhlckZlYXR1cmUpOwotLy8JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotLy8JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0vLwkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotLy8JCQkJbnVsbCwKLS8vCQkJCW51bGwsCi0vLwkJCQlzdGF0dXMpOwotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJSU9wZXJhdGlvbiByZXZlcnRPcGVyYXRpb24gPQotCQkJCQlPcGVyYXRpb25zTWFuYWdlcgotCQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQotCQkJCQkJLmNyZWF0ZVJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbihjdXJyZW50RmVhdHVyZSwgYW5vdGhlckZlYXR1cmUpOwotCQkJCXRyeSB7Ci0JCQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IHJldmVydE9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCQlVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydChyZXN0YXJ0TmVlZGVkKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCB0cnVlLCBvcGVyYXRpb24pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHRhcmdldEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlpZiAodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2YgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Jlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Jlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5ZDNlMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIFJlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2cgZXh0ZW5kcyBXaXphcmREaWFsb2cgewotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmVzaXphYmxlIHdpemFyZCBkaWFsb2cuCi0JICovCi0JcHVibGljIFJlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2coU2hlbGwgcGFyZW50LCBJV2l6YXJkIHdpemFyZCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgd2l6YXJkKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0JCi0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjcmVhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCQotCQlnZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlTV1RVdGlsLnNldERpYWxvZ1NpemUodGhpcywgNjAwLCA1MDApOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I29wZW4oKQotCSAqLwotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5BQk9SVF9JRDsKLQkJfQotCQkKLQkJaW50IHJldHVyblZhbHVlID0gc3VwZXIub3BlbigpOwotCQkKLQkJaWYgKHJldHVyblZhbHVlID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0JCQlVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydCgoKEluc3RhbGxXaXphcmQpZ2V0V2l6YXJkKCkpLmlzUmVzdGFydE5lZWRlZCgpKTsKLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYjg0ZjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotLyoqCi0gKiBAYXV0aG9yIFdhc3NpbSBNZWxoZW0KLSAqLwotcHVibGljIGNsYXNzIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCQotCVJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHBhZ2U7Ci0KLQlwdWJsaWMgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkLnd0aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX0NPTkZJR19XSVopOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJcGFnZSA9IG5ldyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKHBhZ2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiBwYWdlLnBlcmZvcm1GaW5pc2goKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODM2MjAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLQotcHVibGljIGNsYXNzIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGFjdGl2aXRpZXNWaWV3ZXI7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjb25maWdWaWV3ZXI7Ci0JcHVibGljIHN0YXRpYyBDb2xvciBibHVlQkdDb2xvcjsKLQlwcml2YXRlIFNhc2hGb3JtIHNhc2hGb3JtOwotCi0JcHVibGljIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlKCkgewotCQlzdXBlcigiUmV2ZXJ0Q29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFVwZGF0ZVVJLmdldFN0cmluZygiUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5kZXNjIikpOyAvLyROT04tTkxTLTEkCi0JCWJsdWVCR0NvbG9yID0gbmV3IENvbG9yKG51bGwsIDIzOCwyMzgsMjU1KTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJc2FzaEZvcm0uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQljcmVhdGVDb25maWd1cmF0aW9uc1NlY3Rpb24oc2FzaEZvcm0pOwotCQljcmVhdGVBY3Rpdml0aWVzU2VjdGlvbihzYXNoRm9ybSk7Ci0JCXNldENvbnRyb2woc2FzaEZvcm0pOwotCi0JCU9iamVjdCBlbGVtZW50ID0gY29uZmlnVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkJCWNvbmZpZ1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCkpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHNhc2hGb3JtKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29uZmlndXJhdGlvbnNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRhYmxlQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRhYmxlQ29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHRhYmxlQ29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJY29uZmlnVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJY29uZmlnVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KLQkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09ORklHX09CSiwgMCk7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gVXRpbGl0aWVzLmZvcm1hdCgKLQkJCQkJKChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldENyZWF0aW9uRGF0ZSgpKTsKLQkJCX0KLQotCQl9KTsKLQkJY29uZmlnVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gKElMb2NhbFNpdGUpIGVsZW1lbnQ7Ci0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnQgPQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWd1cmF0aW9ucyA9IGxvY2FsU2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpOwotCQkJCWZvciAoaW50IGkgPSBjb25maWd1cmF0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlpZiAoIWN1cnJlbnQuZXF1YWxzKGNvbmZpZ3VyYXRpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0LmFkZChjb25maWd1cmF0aW9uc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZCgKLQkJCQlWaWV3ZXIgdmlld2VyLAotCQkJCU9iamVjdCBvbGRJbnB1dCwKLQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQotCQl9KTsKLQotCQljb25maWdWaWV3ZXIKLQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9CShJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gKEluc3RhbGxDb25maWd1cmF0aW9uKXNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJYWN0aXZpdGllc1ZpZXdlci5zZXRJbnB1dChjdXJyZW50Q29uZmlnKTsKLQkJCQlhY3Rpdml0aWVzVmlld2VyLnJlZnJlc2goKTsKLQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGFjdGl2aXRpZXNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCQkJCWZvciAoaW50IGkgPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspewotCQkJCQlJQWN0aXZpdHkgYWN0aXZpdHkgPSAoSUFjdGl2aXR5KWl0ZW1zW2ldLmdldERhdGEoKTsKLQkJCQkJLy8gZm9yIG5vdywgd2UgdGVzdCBleGFjdCBjb25maWcgbWF0Y2guIElmIG5lZWRlZCwgd2UgY2FuIGFsc28gY29tcGFyZSBkYXRlcywgZXRjLgotCQkJCQlpZiAoKChJbnN0YWxsQ29uZmlndXJhdGlvbilhY3Rpdml0eS5nZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpKS5lcXVhbHMoY3VycmVudENvbmZpZykpCi0JCQkJCQlpdGVtc1tpXS5zZXRCYWNrZ3JvdW5kKGJsdWVCR0NvbG9yKTsKLQkJCQkJZWxzZQotCQkJCQkJaXRlbXNbaV0uc2V0QmFja2dyb3VuZChhY3Rpdml0aWVzVmlld2VyLmdldENvbnRyb2woKS5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdHJ5IHsKLQkJCWNvbmZpZ1ZpZXdlci5zZXRJbnB1dChTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBY3Rpdml0aWVzU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5hY3Rpdml0aWVzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJVGFibGVMYXlvdXRDb21wb3NpdGUgdGxDb21wb3NpdGU9IG5ldyBUYWJsZUxheW91dENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWFjdGl2aXRpZXNWaWV3ZXIgPSBBY3Rpdml0aWVzVGFibGVWaWV3ZXIuY3JlYXRlVmlld2VyKHRsQ29tcG9zaXRlLCBmYWxzZSk7Ci0KLQkJdGxDb21wb3NpdGUuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uUGl4ZWxEYXRhKDIwLCB0cnVlKSk7Ci0JCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMiwgMTUwLCB0cnVlKSk7Ci0JCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNSwgMjAwLCB0cnVlKSk7Ci0JCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNCwgMTAwLCB0cnVlKSk7Ci0KLQkJLy9hY3Rpdml0aWVzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJVGFibGVJdGVtW10gY29uZmlncyA9IGNvbmZpZ1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JCWlmIChjb25maWdzLmxlbmd0aCA+MCkKLQkJCWFjdGl2aXRpZXNWaWV3ZXIuc2V0SW5wdXQoKEluc3RhbGxDb25maWd1cmF0aW9uKWNvbmZpZ3NbMF0uZ2V0RGF0YSgpKTsKLQkJCi0JCWNvbXBvc2l0ZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpbnQgc2FzaEhlaWdodCA9IGdldFNhc2hGb3JtKCkuZ2V0U2l6ZSgpLnk7Ci0JCQkJaW50IHNhc2hXaWR0aCA9IGdldFNhc2hGb3JtKCkuZ2V0U2l6ZSgpLng7Ci0JCQkJaWYgKGNvbXBvc2l0ZS5nZXRTaXplKCkueSA+IChzYXNoSGVpZ2h0KjAuODUpICYmIGNvbXBvc2l0ZS5nZXRTaXplKCkueCA+IChzYXNoV2lkdGgqMC41KSl7Ci0JCQkJCWdldFNhc2hGb3JtKCkuc2V0T3JpZW50YXRpb24oU1dULkhPUklaT05UQUwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWdldFNhc2hGb3JtKCkuc2V0T3JpZW50YXRpb24oU1dULlZFUlRJQ0FMKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJYmx1ZUJHQ29sb3IuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgU2FzaEZvcm0gZ2V0U2FzaEZvcm0oKXsKLQkJcmV0dXJuIHNhc2hGb3JtOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTaGVsbCBzaGVsbCA9IGdldENvbnRhaW5lcigpLmdldFNoZWxsKCk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0KLQkJCU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKAotCQkJCXNoZWxsLAotCQkJCXNoZWxsLmdldFRleHQoKSwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIlJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLnF1ZXN0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcmVzdWx0KQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWJvb2xlYW4gZmluaXNoID0gcGVyZm9ybVJldmVydCgpOwotCQlpZiAoZmluaXNoKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlc3RhcnQoKTsKLQkJfQotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1SZXZlcnQoKSB7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9Ci0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJZmluYWwgSUluc3RhbGxDb25maWd1cmF0aW9uIHRhcmdldCA9Ci0JCQkoSUluc3RhbGxDb25maWd1cmF0aW9uKSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCUlTdGF0dXMgc3RhdHVzID0KLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ1JldmVydCh0YXJnZXQpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJSU9wZXJhdGlvbiByZXZlcnRPcGVyYXRpb24gPQotCQkJCQlPcGVyYXRpb25zTWFuYWdlcgotCQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQotCQkJCQkJLmNyZWF0ZVJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24oCi0JCQkJCQl0YXJnZXQsCi0JCQkJCQluZXcgVUlQcm9ibGVtSGFuZGxlcigpKTsKLQkJCQl0cnkgewotCQkJCQlyZXZlcnRPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCB0cnVlLCBvcGVyYXRpb24pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHRhcmdldEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlpZiAodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2YgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZpZXdQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjFjNTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2aWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7DQotDQotcHVibGljIGNsYXNzIFJldmlld1BhZ2UNCi0JZXh0ZW5kcyBCYW5uZXJQYWdlDQotCWltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciB7DQotDQotCXByaXZhdGUgQXJyYXlMaXN0IGpvYnM7DQotCXByaXZhdGUgTGFiZWwgY291bnRlckxhYmVsOw0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7DQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0aW9uU3RhdHVzOw0KLQlwcml2YXRlIENvbGxlY3Rpb24gcHJvYmxlbWF0aWNGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7DQotCS8vIGZlYXR1cmUgdGhhdCB3YXMgcmVjZW50bHkgc2VsZWN0ZWQgb3IgbnVsbA0KLQlwcml2YXRlIElGZWF0dXJlIG5ld2x5U2VsZWN0ZWRGZWF0dXJlOw0KLQkvLyANCi0JcHJpdmF0ZSBGZWF0dXJlU3RhdHVzIGxhc3REaXNwbGF5ZWRTdGF0dXM7DQotCXByaXZhdGUgUHJvcGVydHlEaWFsb2dBY3Rpb24gcHJvcGVydGllc0FjdGlvbjsNCi0JcHJpdmF0ZSBUZXh0IGRlc2NMYWJlbDsNCi0JcHJpdmF0ZSBCdXR0b24gc3RhdHVzQnV0dG9uOw0KLQlwcml2YXRlIEJ1dHRvbiBtb3JlSW5mb0J1dHRvbjsNCi0JcHJpdmF0ZSBCdXR0b24gcHJvcGVydGllc0J1dHRvbjsNCi0JcHJpdmF0ZSBCdXR0b24gZmlsdGVyQ2hlY2s7DQotCXByaXZhdGUgQ29udGFpbm1lbnRGaWx0ZXIgZmlsdGVyID0gbmV3IENvbnRhaW5tZW50RmlsdGVyKCk7DQotCXByaXZhdGUgU2VhcmNoUnVubmVyIHNlYXJjaFJ1bm5lcjsNCi0JcHJpdmF0ZSBpbnQgTEFCRUxfT1JERVIgPSAxOw0KLQlwcml2YXRlIGludCBWRVJTSU9OX09SREVSID0gMTsNCi0JcHJpdmF0ZSBpbnQgUFJPVklERVJfT1JERVIgPSAxOw0KLQljbGFzcyBKb2JzQ29udGVudFByb3ZpZGVyDQotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXINCi0JCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgew0KLQ0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsNCi0JCQlyZXR1cm4gam9icy50b0FycmF5KCk7DQotCQl9DQotCX0NCi0NCi0JY2xhc3MgSm9ic0xhYmVsUHJvdmlkZXINCi0JCWV4dGVuZHMgU2hhcmVkTGFiZWxQcm92aWRlcg0KLQkJaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsNCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgY29sdW1uKSB7DQotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG9iajsNCi0JCQlJRmVhdHVyZSBmZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsNCi0NCi0JCQlzd2l0Y2ggKGNvbHVtbikgew0KLQkJCQljYXNlIDAgOg0KLQkJCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKTsNCi0JCQkJY2FzZSAxIDoNCi0JCQkJCXJldHVybiBmZWF0dXJlDQotCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQ0KLQkJCQkJCS5nZXRWZXJzaW9uKCkNCi0JCQkJCQkudG9TdHJpbmcoKTsNCi0JCQkJY2FzZSAyIDoNCi0JCQkJCXJldHVybiBmZWF0dXJlLmdldFByb3ZpZGVyKCk7DQotCQkJfQ0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBjb2x1bW4pIHsNCi0JCQlpZiAoY29sdW1uID09IDApIHsNCi0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9ICgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBvYmopLmdldEZlYXR1cmUoKTsNCi0JCQkJYm9vbGVhbiBwYXRjaCA9IGZlYXR1cmUuaXNQYXRjaCgpOw0KLQkJCQkNCi0JCQkJYm9vbGVhbiBwcm9ibGVtYXRpYz1wcm9ibGVtYXRpY0ZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpOw0KLQkJCQkNCi0JCQkJaWYgKHBhdGNoKSB7DQotCQkJCQlyZXR1cm4gZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRUZJWF9PQkosIHByb2JsZW1hdGljPyBGX0VSUk9SIDogMCk7DQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXR1cm4gZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkosIHByb2JsZW1hdGljPyBGX0VSUk9SIDogMCk7DQotCQkJCX0NCi0JCQl9DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCX0NCi0NCi0JY2xhc3MgQ29udGFpbm1lbnRGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgew0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2LCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsNCi0JCQlyZXR1cm4gIWlzQ29udGFpbmVkKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGNoaWxkKTsNCi0JCX0NCi0JCXByaXZhdGUgYm9vbGVhbiBpc0NvbnRhaW5lZChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iKSB7DQotCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBqb2IuZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0NCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMuc2l6ZSgpOyBpKyspIHsNCi0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGNhbmRpZGF0ZSA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGpvYnMuZ2V0KGkpOw0KLQkJCQlpZiAoY2FuZGlkYXRlLmVxdWFscyhqb2IpKQ0KLQkJCQkJY29udGludWU7DQotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBjYW5kaWRhdGUuZ2V0RmVhdHVyZSgpOw0KLQkJCQlpZiAoaW5jbHVkZXMoZmVhdHVyZSwgdmlkLG51bGwpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlcyhJRmVhdHVyZSBmZWF0dXJlLCBWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCwgQXJyYXlMaXN0IGN5Y2xlQ2FuZGlkYXRlcykgew0KLQkJCXRyeSB7DQotCQkJCWlmIChjeWNsZUNhbmRpZGF0ZXMgPT0gbnVsbCkNCi0JCQkJCWN5Y2xlQ2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCQkJaWYgKGN5Y2xlQ2FuZGlkYXRlcy5jb250YWlucyhmZWF0dXJlKSkNCi0JCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5jeWNsZSIsIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQllbHNlDQotCQkJCQljeWNsZUNhbmRpZGF0ZXMuYWRkKGZlYXR1cmUpOw0KLQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGlyZWZzID0NCi0JCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlyZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07DQotCQkJCQlJRmVhdHVyZSBpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaXZpZCA9DQotCQkJCQkJaWZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOw0KLQkJCQkJaWYgKGl2aWQuZXF1YWxzKHZpZCkpDQotCQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCQlpZiAoaW5jbHVkZXMoaWZlYXR1cmUsIHZpZCwgY3ljbGVDYW5kaWRhdGVzKSkNCi0JCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9IGZpbmFsbHkgew0KLQkJCQkvLyBhZnRlciB0aGlzIGZlYXR1cmUgaGFzIGJlZW4gREZTLWVkLCBpdCBpcyBubyBsb25nZXIgYSBjeWNsZSBjYW5kaWRhdGUNCi0JCQkJY3ljbGVDYW5kaWRhdGVzLnJlbW92ZShmZWF0dXJlKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JY2xhc3MgRmVhdHVyZVByb3BlcnR5RGlhbG9nQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlEaWFsb2dBY3Rpb24gew0KLQkJcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247DQotDQotCQlwdWJsaWMgRmVhdHVyZVByb3BlcnR5RGlhbG9nQWN0aW9uKA0KLQkJCVNoZWxsIHNoZWxsLA0KLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgew0KLQkJCXN1cGVyKHNoZWxsLCBwcm92aWRlcik7DQotCQl9DQotDQotCQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpIHsNCi0JCQlyZXR1cm4gc2VsZWN0aW9uOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0JCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsNCi0JCX0NCi0NCi0JfQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFJldmlld1BhZ2UyDQotCSAqLw0KLQlwdWJsaWMgUmV2aWV3UGFnZShTZWFyY2hSdW5uZXIgc2VhcmNoUnVubmVyLCBBcnJheUxpc3Qgam9icykgew0KLQkJc3VwZXIoIlJldmlldyIpOyAvLyROT04tTkxTLTEkDQotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuZGVzYyIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOw0KLQkJdGhpcy5zZWFyY2hSdW5uZXIgPSBzZWFyY2hSdW5uZXI7DQotCQlzZXRCYW5uZXJWaXNpYmxlKGZhbHNlKTsNCi0JCXRoaXMuam9icyA9IGpvYnM7DQotCQlpZiAodGhpcy5qb2JzPT1udWxsKSB0aGlzLmpvYnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsNCi0JCXN1cGVyLmRpc3Bvc2UoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgew0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsNCi0JCQ0KLQkJLy8gd2hlbiBzZWFyY2hpbmcgZm9yIHVwZGF0ZXMsIG9ubHkgbmVzdGVkIHBhdGNoZXMgY2FuIGJlIHNob3duLg0KLQkJLy8gd2hlbiBzZWFyY2hpbmcgZm9yIGZlYXR1cmVzLCBmZWF0dXJlcyBhbmQgcGF0Y2hlcyBjYW4gYmUgc2hvd24NCi0JCVN0cmluZyBmaWx0ZXJUZXh0ID0gZmlsdGVyQ2hlY2suZ2V0VGV4dCgpOw0KLQkJU3RyaW5nIGZpbHRlckZlYXR1cmVzID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuZmlsdGVyRmVhdHVyZXMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIGZpbHRlclBhdGNoZXMgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5maWx0ZXJQYXRjaGVzIik7IC8vJE5PTi1OTFMtMSQNCi0JCWJvb2xlYW4gaXNVcGRhdGVTZWFyY2ggPSBzZWFyY2hSdW5uZXIuZ2V0U2VhcmNoUHJvdmlkZXIoKSBpbnN0YW5jZW9mIE1vZGVTZWxlY3Rpb25QYWdlOw0KLQkJaWYgKGlzVXBkYXRlU2VhcmNoICYmIGZpbHRlclRleHQuZXF1YWxzKGZpbHRlckZlYXR1cmVzKSkNCi0JCQlmaWx0ZXJDaGVjay5zZXRUZXh0KGZpbHRlclBhdGNoZXMpOw0KLQkJZWxzZSBpZiAoICFpc1VwZGF0ZVNlYXJjaCAmJiBmaWx0ZXJUZXh0LmVxdWFscyhmaWx0ZXJQYXRjaGVzKSkNCi0JCQlmaWx0ZXJDaGVjay5zZXRUZXh0KGZpbHRlckZlYXR1cmVzKTsNCi0JCQ0KLQkJaWYgKHZpc2libGUgJiYgc2VhcmNoUnVubmVyLmlzTmV3U2VhcmNoTmVlZGVkKCkpIHsNCi0JCQlqb2JzLmNsZWFyKCk7DQotCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOw0KLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCi0JCQkJCXNlYXJjaFJ1bm5lci5ydW5TZWFyY2goKTsNCi0JCQkJCXBlcmZvcm1Qb3N0U2VhcmNoUHJvY2Vzc2luZygpOw0KLQkJCQl9DQotCQkJfSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1Qb3N0U2VhcmNoUHJvY2Vzc2luZygpIHsNCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQlpZiAodGFibGVWaWV3ZXIgIT0gbnVsbCkgew0KLQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOw0KLQkJCQkJdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5sYXlvdXQodHJ1ZSk7DQotCQkJCQlpZiAoc2VhcmNoUnVubmVyLmdldFNlYXJjaFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBNb2RlU2VsZWN0aW9uUGFnZSkgew0KLQkJCQkJCXNlbGVjdFRydWVVcGRhdGVzKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJcGFnZUNoYW5nZWQoKTsNCi0JCQl9DQotCQl9KTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdFRydWVVcGRhdGVzKCkgew0KLQkJQXJyYXlMaXN0IHRydWVVcGRhdGVzID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJZm9yIChpbnQgaT0wOyBpPGpvYnMuc2l6ZSgpOyBpKyspIHsNCi0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbilqb2JzLmdldChpKTsNCi0JCQlpZiAoIVVwZGF0ZVV0aWxzLmlzUGF0Y2goam9iLmdldEZlYXR1cmUoKSkpDQotCQkJCXRydWVVcGRhdGVzLmFkZChqb2IpOw0KLQkJfQ0KLQkJdGFibGVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKHRydWVVcGRhdGVzLnRvQXJyYXkoKSk7IA0KLQl9CQ0KLQ0KLQkvKioNCi0JICogQHNlZSBEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQ0KLQkgKi8NCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7DQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7DQotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsNCi0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsNCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMjsNCi0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOw0KLQ0KLQkJY3JlYXRlVGFibGUoY2xpZW50KTsNCi0NCi0JCUNvbXBvc2l0ZSBidXR0b25Db250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7DQotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7DQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsNCi0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOw0KLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dChsYXlvdXQpOw0KLQ0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7DQotCQlidXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5zZWxlY3RBbGwiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCWdkID0NCi0JCQluZXcgR3JpZERhdGEoDQotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTA0KLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOw0KLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOw0KLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7DQotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQloYW5kbGVTZWxlY3RBbGwodHJ1ZSk7DQotCQkJfQ0KLQkJfSk7DQotDQotCQlidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOw0KLQkJYnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuZGVzZWxlY3RBbGwiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCWdkID0NCi0JCQluZXcgR3JpZERhdGEoDQotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTA0KLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOw0KLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOw0KLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7DQotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQloYW5kbGVTZWxlY3RBbGwoZmFsc2UpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJbW9yZUluZm9CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOw0KLQkJbW9yZUluZm9CdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5tb3JlSW5mbyIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJZ2QgPQ0KLQkJCW5ldyBHcmlkRGF0YSgNCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMDQotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7DQotCQltb3JlSW5mb0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChtb3JlSW5mb0J1dHRvbik7DQotCQltb3JlSW5mb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJCWhhbmRsZU1vcmVJbmZvKCk7DQotCQkJfQ0KLQkJfSk7DQotCQltb3JlSW5mb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsNCi0JCQ0KLQkJDQotCQlwcm9wZXJ0aWVzQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsNCi0JCXByb3BlcnRpZXNCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkDQotCQlnZCA9DQotCQkJbmV3IEdyaWREYXRhKA0KLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwNCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsNCi0JCXByb3BlcnRpZXNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7DQotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQocHJvcGVydGllc0J1dHRvbik7DQotCQlwcm9wZXJ0aWVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJaGFuZGxlUHJvcGVydGllcygpOw0KLQkJCX0NCi0JCX0pOw0KLQkJcHJvcGVydGllc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsNCi0NCi0JCXN0YXR1c0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7DQotCQlzdGF0dXNCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5zaG93U3RhdHVzIikpOyAvLyROT04tTkxTLTEkDQotCQlnZCA9DQotCQkJbmV3IEdyaWREYXRhKA0KLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwNCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsNCi0JCXN0YXR1c0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChzdGF0dXNCdXR0b24pOw0KLQkJc3RhdHVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJc2hvd1N0YXR1cygpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJLy9uZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7DQotDQotCQljb3VudGVyTGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7DQotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOw0KLQkJY291bnRlckxhYmVsLnNldExheW91dERhdGEoZ2QpOw0KLQ0KLQkJZmlsdGVyQ2hlY2sgPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULkNIRUNLKTsNCi0JCWZpbHRlckNoZWNrLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuZmlsdGVyRmVhdHVyZXMiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCWZpbHRlckNoZWNrLnNldFNlbGVjdGlvbihmYWxzZSk7DQotCQkvL3RhYmxlVmlld2VyLmFkZEZpbHRlcihmaWx0ZXIpOw0KLQkJZmlsdGVyQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQlpZiAoZmlsdGVyQ2hlY2suZ2V0U2VsZWN0aW9uKCkpIHsNCi0JCQkJCS8vIG1ha2Ugc3VyZSBtb2RlbCBpcyBsb2NhbA0KLQkJCQkJaWYgKGRvd25sb2FkSW5jbHVkZWRGZWF0dXJlcygpKSB7DQotCQkJCQkJdGFibGVWaWV3ZXIuYWRkRmlsdGVyKGZpbHRlcik7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCWZpbHRlckNoZWNrLnNldFNlbGVjdGlvbihmYWxzZSk7DQotCQkJCQl9DQotCQkJCX0gZWxzZSB7DQotCQkJCQl0YWJsZVZpZXdlci5yZW1vdmVGaWx0ZXIoZmlsdGVyKTsNCi0JCQkJfQ0KLQkJCQlwYWdlQ2hhbmdlZCgpOw0KLQkJCX0NCi0JCX0pOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMjsNCi0JCWZpbHRlckNoZWNrLnNldExheW91dERhdGEoZ2QpOw0KLQkJcGFnZUNoYW5nZWQoKTsNCi0NCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTXVsdGlSZXZpZXdQYWdlMiIpOyAvLyROT04tTkxTLTEkDQotDQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7DQotDQotCQlyZXR1cm4gY2xpZW50Ow0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7DQotCQlTYXNoRm9ybSBzZm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5WRVJUSUNBTCk7DQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOw0KLQkJZ2Qud2lkdGhIaW50ID0gMjUwOw0KLQkJZ2QuaGVpZ2h0SGludCA9MTAwOw0KLQkJc2Zvcm0uc2V0TGF5b3V0RGF0YShnZCk7DQotDQotCQlUYWJsZUxheW91dENvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBUYWJsZUxheW91dENvbXBvc2l0ZShzZm9ybSwgU1dULk5PTkUpOw0KLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOw0KLQkJdGFibGVWaWV3ZXIgPQ0KLQkJCUNoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KA0KLQkJCQkJY29tcG9zaXRlLA0KLQkJCQlTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsNCi0JCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsNCi0NCi0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7DQotDQotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsNCi0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmZlYXR1cmUiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCWNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJCUxBQkVMX09SREVSICo9IC0xOw0KLQkJCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIoDQotCQkJCQluZXcgRmVhdHVyZVNvcnRlcigNCi0JCQkJCQlGZWF0dXJlU29ydGVyLkZFQVRVUkVfTEFCRUwsDQotCQkJCQkJTEFCRUxfT1JERVIsDQotCQkJCQkJVkVSU0lPTl9PUkRFUiwNCi0JCQkJCQlQUk9WSURFUl9PUkRFUikpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7DQotCQljb2x1bW4uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS52ZXJzaW9uIikpOyAvLyROT04tTkxTLTEkDQotCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQlWRVJTSU9OX09SREVSICo9IC0xOw0KLQkJCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIoDQotCQkJCQluZXcgRmVhdHVyZVNvcnRlcigNCi0JCQkJCQlGZWF0dXJlU29ydGVyLkZFQVRVUkVfVkVSU0lPTiwNCi0JCQkJCQlMQUJFTF9PUkRFUiwNCi0JCQkJCQlWRVJTSU9OX09SREVSLA0KLQkJCQkJCVBST1ZJREVSX09SREVSKSk7DQotCQkJfQ0KLQkJfSk7DQotDQotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsNCi0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnByb3ZpZGVyIikpOyAvLyROT04tTkxTLTEkDQotCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQlQUk9WSURFUl9PUkRFUiAqPSAtMTsNCi0JCQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKA0KLQkJCQkJbmV3IEZlYXR1cmVTb3J0ZXIoDQotCQkJCQkJRmVhdHVyZVNvcnRlci5GRUFUVVJFX1BST1ZJREVSLA0KLQkJCQkJCUxBQkVMX09SREVSLA0KLQkJCQkJCVZFUlNJT05fT1JERVIsDQotCQkJCQkJUFJPVklERVJfT1JERVIpKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCS8vVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7DQotCQljb21wb3NpdGUuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1LCAyNzUsIHRydWUpKTsNCi0JCWNvbXBvc2l0ZS5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDgwLCB0cnVlKSk7DQotCQljb21wb3NpdGUuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1LCA5MCwgdHJ1ZSkpOw0KLQ0KLQkJLy9sYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uUGl4ZWxEYXRhKDIyNSwgdHJ1ZSkpOw0KLQkJLy9sYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uUGl4ZWxEYXRhKDgwLCB0cnVlKSk7DQotCQkvL2xheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5QaXhlbERhdGEoMTQwLCB0cnVlKSk7DQotDQotCQkvL3RhYmxlLnNldExheW91dChsYXlvdXQpOw0KLQ0KLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBKb2JzQ29udGVudFByb3ZpZGVyKCkpOw0KLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSm9ic0xhYmVsUHJvdmlkZXIoKSk7DQotCQl0YWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgew0KLQkJCQluZXdseVNlbGVjdGVkRmVhdHVyZSA9IG51bGw7DQotCQkJCWlmKGV2ZW50LmdldENoZWNrZWQoKSl7DQotCQkJCQkvLyBzYXZlIGNoZWNrZWQgZmVlYXR1cmUsIHNvIGl0cyBlcnJvciBjYW4gYmUgc2hvd24gaWYgYW55DQotCQkJCQlPYmplY3QgY2hlY2tlZCA9IGV2ZW50LmdldEVsZW1lbnQoKTsNCi0JCQkJCWlmKGNoZWNrZWQgaW5zdGFuY2VvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pew0KLQkJCQkJCW5ld2x5U2VsZWN0ZWRGZWF0dXJlPSAoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiljaGVja2VkKS5nZXRGZWF0dXJlKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJdGFibGVWaWV3ZXINCi0JCQkJCS5nZXRDb250cm9sKCkNCi0JCQkJCS5nZXREaXNwbGF5KCkNCi0JCQkJCS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQkJCXBhZ2VDaGFuZ2VkKCk7DQotCQkJCQl9DQotCQkJCX0pOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJdGFibGVWaWV3ZXINCi0JCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsNCi0JCQkJam9iU2VsZWN0ZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlLmdldFNlbGVjdGlvbigpKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCXRhYmxlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsNCi0JCQkJaGFuZGxlUHJvcGVydGllcygpOw0KLQkJCX0NCi0JCX0pOw0KLQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBGZWF0dXJlU29ydGVyKCkpOw0KLQkJTWVudU1hbmFnZXIgbWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigiI1BvcHVwTWVudSIpOyAvLyROT04tTkxTLTEkDQotCQltZW51TWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsNCi0JCW1lbnVNZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgew0KLQkJCQlmaWxsQ29udGV4dE1lbnUobWFuYWdlcik7DQotCQkJfQ0KLQkJfSk7DQotCQl0YWJsZS5zZXRNZW51KG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUodGFibGUpKTsNCi0JCQ0KLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkpOw0KLQkJdGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsNCi0JCQ0KLQkJZGVzY0xhYmVsID0gbmV3IFRleHQoc2Zvcm0sIFNXVC5CT1JERVJ8U1dULldSQVB8U1dULk1VTFRJfFNXVC5WX1NDUk9MTCk7DQotCQlkZXNjTGFiZWwuc2V0RWRpdGFibGUoZmFsc2UpOw0KLQkJDQotCQlzZm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7MTAsIDJ9KTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgew0KLQkJaWYgKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgcmV0dXJuOw0KLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UucHJvcCIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCWhhbmRsZVByb3BlcnRpZXMoKTsNCi0JCQl9DQotCQl9Ow0KLQkJbWFuYWdlci5hZGQoYWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCi0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKS5jcmVhdGVJbnN0YWxsT3BlcmF0aW9uKCBudWxsLCBmZWF0dXJlLG51bGwsIG51bGwsIG51bGwpOw0KLQkJCQlWaWV3ZXJGaWx0ZXJbXSBmaWx0ZXJzID0gdGFibGVWaWV3ZXIuZ2V0RmlsdGVycygpOw0KLQkJCQlib29sZWFuIHZpc2libGUgPSB0cnVlOw0KLQ0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJCVZpZXdlckZpbHRlciBmaWx0ZXIgPSBmaWx0ZXJzW2ldOw0KLQkJCQkJaWYgKCFmaWx0ZXIuc2VsZWN0KHRhYmxlVmlld2VyLCBudWxsLCBqb2IpKSB7DQotCQkJCQkJdmlzaWJsZSA9IGZhbHNlOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWlmICh2aXNpYmxlKSB7DQotCQkJCQl0YWJsZVZpZXdlci5hZGQoam9iKTsNCi0JCQkJCXVwZGF0ZUl0ZW1Db3VudCgwLCAtMSk7DQotCQkJCX0NCi0JCQkJam9icy5hZGQoam9iKTsNCi0JCQl9DQotCQl9KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgam9iU2VsZWN0ZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOw0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IGpvYiAhPSBudWxsID8gam9iLmdldEZlYXR1cmUoKSA6IG51bGw7DQotCQlJVVJMRW50cnkgZGVzY0VudHJ5ID0gZmVhdHVyZSAhPSBudWxsID8gZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpIDogbnVsbDsNCi0JCVN0cmluZyBkZXNjID0gbnVsbDsNCi0JCWlmIChkZXNjRW50cnkgIT0gbnVsbCkNCi0JCQlkZXNjID0gZGVzY0VudHJ5LmdldEFubm90YXRpb24oKTsNCi0JCWlmIChkZXNjID09IG51bGwpDQotCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkDQotCQlkZXNjTGFiZWwuc2V0VGV4dChkZXNjKTsNCi0JCXByb3BlcnRpZXNCdXR0b24uc2V0RW5hYmxlZChmZWF0dXJlICE9IG51bGwpOw0KLQkJbW9yZUluZm9CdXR0b24uc2V0RW5hYmxlZChqb2IgIT0gbnVsbCAmJiBnZXRNb3JlSW5mb1VSTChqb2IpICE9IG51bGwpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcGFnZUNoYW5nZWQoKSB7DQotCQlPYmplY3RbXSBjaGVja2VkID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7DQotCQlpbnQgdG90YWxDb3VudCA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCk7DQotCQl1cGRhdGVJdGVtQ291bnQoY2hlY2tlZC5sZW5ndGgsIHRvdGFsQ291bnQpOw0KLQkJaWYgKGNoZWNrZWQubGVuZ3RoID4gMCkgew0KLQkJCXZhbGlkYXRlU2VsZWN0aW9uKCk7DQotCQl9IGVsc2Ugew0KLQkJCWxhc3REaXNwbGF5ZWRTdGF0dXMgPSBudWxsOw0KLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsNCi0JCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOw0KLQkJCXZhbGlkYXRpb25TdGF0dXMgPSBudWxsOw0KLQkJCXByb2JsZW1hdGljRmVhdHVyZXMuY2xlYXIoKTsNCi0JCX0NCi0JCXRhYmxlVmlld2VyLnVwZGF0ZShqb2JzLnRvQXJyYXkoKSwgbnVsbCk7DQotCQlzdGF0dXNCdXR0b24uc2V0RW5hYmxlZCh2YWxpZGF0aW9uU3RhdHVzICE9IG51bGwpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB1cGRhdGVJdGVtQ291bnQoaW50IGNoZWNrZWRDb3VudCwgaW50IHRvdGFsQ291bnQpIHsNCi0JCWlmIChjaGVja2VkQ291bnQgPT0gLTEpIHsNCi0JCQlPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSB0YWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsNCi0JCQljaGVja2VkQ291bnQgPSBjaGVja2VkRWxlbWVudHMubGVuZ3RoOw0KLQkJfQ0KLQkJaWYgKHRvdGFsQ291bnQgPT0gLTEpIHsNCi0JCQl0b3RhbENvdW50ID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKTsNCi0JCX0NCi0JCVN0cmluZyB0b3RhbCA9ICIiICsgdG90YWxDb3VudDsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIHNlbGVjdGVkID0gIiIgKyBjaGVja2VkQ291bnQ7IC8vJE5PTi1OTFMtMSQNCi0JCWNvdW50ZXJMYWJlbC5zZXRUZXh0KA0KLQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoDQotCQkJCSJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuY291bnRlciIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJbmV3IFN0cmluZ1tdIHsgc2VsZWN0ZWQsIHRvdGFsIH0pKTsNCi0JCWNvdW50ZXJMYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsKGJvb2xlYW4gc2VsZWN0KSB7DQotCQl0YWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHNlbGVjdCk7DQotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQlwYWdlQ2hhbmdlZCgpOw0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVQcm9wZXJ0aWVzKCkgew0KLQkJZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0NCi0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOw0KLQ0KLQkJZmluYWwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9DQotCQkJKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOw0KLQkJaWYgKHByb3BlcnRpZXNBY3Rpb24gPT0gbnVsbCkgew0KLQkJCXByb3BlcnRpZXNBY3Rpb24gPQ0KLQkJCQluZXcgRmVhdHVyZVByb3BlcnR5RGlhbG9nQWN0aW9uKGdldFNoZWxsKCksIHRhYmxlVmlld2VyKTsNCi0JCX0NCi0NCi0JCUJ1c3lJbmRpY2F0b3INCi0JCQkuc2hvd1doaWxlKHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsNCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCVNpbXBsZUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPQ0KLQkJCQkJbmV3IFNpbXBsZUZlYXR1cmVBZGFwdGVyKGpvYi5nZXRGZWF0dXJlKCkpOw0KLQkJCQlwcm9wZXJ0aWVzQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoDQotCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhZGFwdGVyKSk7DQotCQkJCXByb3BlcnRpZXNBY3Rpb24ucnVuKCk7DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TW9yZUluZm9VUkwoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgew0KLQkJSVVSTEVudHJ5IGRlc2MgPSBqb2IuZ2V0RmVhdHVyZSgpLmdldERlc2NyaXB0aW9uKCk7DQotCQlpZiAoZGVzYyAhPSBudWxsKSB7DQotCQkJVVJMIHVybCA9IGRlc2MuZ2V0VVJMKCk7DQotCQkJcmV0dXJuICh1cmwgPT0gbnVsbCkgPyBudWxsIDogdXJsLnRvU3RyaW5nKCk7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlTW9yZUluZm8oKSB7DQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPQ0KLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7DQotCQlmaW5hbCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gc2VsZWN0ZWRKb2IgPQ0KLQkJCShJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsNCi0JCUJ1c3lJbmRpY2F0b3INCi0JCQkuc2hvd1doaWxlKHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsNCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCVN0cmluZyB1cmxOYW1lID0gZ2V0TW9yZUluZm9VUkwoc2VsZWN0ZWRKb2IpOw0KLQkJCQlVcGRhdGVVSS5zaG93VVJMKHVybE5hbWUpOw0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBnZXRTZWxlY3RlZEpvYnMoKSB7DQotCQlPYmplY3RbXSBzZWxlY3RlZCA9IHRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOw0KLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gcmVzdWx0ID0gbmV3IElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltzZWxlY3RlZC5sZW5ndGhdOw0KLQkJU3lzdGVtLmFycmF5Y29weShzZWxlY3RlZCwgMCwgcmVzdWx0LCAwLCBzZWxlY3RlZC5sZW5ndGgpOw0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlbGVjdGlvbigpIHsNCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMgPSBnZXRTZWxlY3RlZEpvYnMoKTsNCi0JCXZhbGlkYXRpb25TdGF0dXMgPQ0KLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoam9icyk7DQotCQlwcm9ibGVtYXRpY0ZlYXR1cmVzLmNsZWFyKCk7DQotCQlpZiAodmFsaWRhdGlvblN0YXR1cyAhPSBudWxsKSB7DQotCQkJSVN0YXR1c1tdIHN0YXR1cyA9IHZhbGlkYXRpb25TdGF0dXMuZ2V0Q2hpbGRyZW4oKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1cy5sZW5ndGg7IGkrKykgew0KLQkJCQlJU3RhdHVzIHNpbmdsZVN0YXR1cyA9IHN0YXR1c1tpXTsNCi0JCQkJaWYoaXNTcGVjaWZpY1N0YXR1cyhzaW5nbGVTdGF0dXMpKXsNCi0JCQkJCUlGZWF0dXJlIGYgPSAoKEZlYXR1cmVTdGF0dXMpIHNpbmdsZVN0YXR1cykuZ2V0RmVhdHVyZSgpOw0KLQkJCQkJcHJvYmxlbWF0aWNGZWF0dXJlcy5hZGQoZik7CQkJCQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRpb25TdGF0dXMgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLldBUk5JTkcpOw0KLQkJDQotCQl1cGRhdGVXaXphcmRNZXNzYWdlKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHNob3dTdGF0dXMoKSB7DQotCQlpZiAodmFsaWRhdGlvblN0YXR1cyAhPSBudWxsKSB7DQotCQkJbmV3IFN0YXR1c0RpYWxvZygpLm9wZW4oKTsNCi0JCX0NCi0NCi0JfQ0KLQkvKioNCi0JICogQ2hlY2sgd2hldGhlciBzdGF0dXMgaXMgcmVsZXZhbnQgdG8gc2hvdyBmb3INCi0JICogYSBzcGVjaWZpYyBmZWF0dXJlIG9yIGlzIGEgb3RoZXIgcHJvYmxlbQ0KLQkgKiBAcGFyYW0gc3RhdHVzDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdGF0dXMgaXMgRmVhdHVyZVN0YXR1cyB3aXRoDQotCSAqIHNwZWNpZmllZCBmZWF0dXJlIGFuZCBjZXJ0YWluIGVycm9yIGNvZGVzDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNTcGVjaWZpY1N0YXR1cyhJU3RhdHVzIHN0YXR1cyl7DQotCQlpZighKHN0YXR1cyBpbnN0YW5jZW9mIEZlYXR1cmVTdGF0dXMpKXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9SVN0YXR1cy5FUlJPUil7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJRmVhdHVyZVN0YXR1cyBmZWF0dXJlU3RhdHVzID0gKEZlYXR1cmVTdGF0dXMpIHN0YXR1czsNCi0JCWlmKGZlYXR1cmVTdGF0dXMuZ2V0RmVhdHVyZSgpPT1udWxsKXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlyZXR1cm4gMCE9IChmZWF0dXJlU3RhdHVzLmdldENvZGUoKQ0KLQkJCQkmIEZlYXR1cmVTdGF0dXMuQ09ERV9DWUNMRQ0KLQkJCQkrIEZlYXR1cmVTdGF0dXMuQ09ERV9FTlZJUk9OTUVOVA0KLQkJCQkrIEZlYXR1cmVTdGF0dXMuQ09ERV9FWENMVVNJVkUNCi0JCQkJKyBGZWF0dXJlU3RhdHVzLkNPREVfT1BUSU9OQUxfQ0hJTEQNCi0JCQkJKyBGZWF0dXJlU3RhdHVzLkNPREVfUFJFUkVRX0ZFQVRVUkUNCi0JCQkJKyBGZWF0dXJlU3RhdHVzLkNPREVfUFJFUkVRX1BMVUdJTik7DQotCX0NCi0JLyoqDQotCSAqIFVwZGF0ZSBzdGF0dXMgaW4gdGhlIHdpemFyZCBzdGF0dXMgYXJlYQ0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpemFyZE1lc3NhZ2UoKSB7DQotCQlpZiAodmFsaWRhdGlvblN0YXR1cyA9PSBudWxsKSB7DQotCQkJbGFzdERpc3BsYXllZFN0YXR1cz1udWxsOw0KLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsNCi0JCX0gZWxzZSBpZiAodmFsaWRhdGlvblN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7DQotCQkJbGFzdERpc3BsYXllZFN0YXR1cz1udWxsOw0KLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsNCi0JCQlzZXRNZXNzYWdlKHZhbGlkYXRpb25TdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOw0KLQkJfSBlbHNlIHsNCi0JCQkvLyAxLiAgRmVhdHVyZSBzZWxlY3RlZCwgY3JlYXRpbmcgYSBwcm9ibGVtIGZvciBpdCwgc2hvdyBzdGF0dXMgZm9yIGl0DQotCQkJaWYobmV3bHlTZWxlY3RlZEZlYXR1cmUgIT1udWxsKXsNCi0JCQkJSVN0YXR1c1tdIHN0YXR1cyA9IHZhbGlkYXRpb25TdGF0dXMuZ2V0Q2hpbGRyZW4oKTsNCi0JCQkJZm9yKGludCBzID0wOyBzPCBzdGF0dXMubGVuZ3RoOyBzKyspew0KLQkJCQkJaWYoaXNTcGVjaWZpY1N0YXR1cyhzdGF0dXNbc10pKXsNCi0JCQkJCQlGZWF0dXJlU3RhdHVzIGZlYXR1cmVTdGF0dXMgPSAoRmVhdHVyZVN0YXR1cylzdGF0dXNbc107DQotCQkJCQkJaWYobmV3bHlTZWxlY3RlZEZlYXR1cmUuZXF1YWxzKGZlYXR1cmVTdGF0dXMuZ2V0RmVhdHVyZSgpKSl7DQotCQkJCQkJCWxhc3REaXNwbGF5ZWRTdGF0dXM9ZmVhdHVyZVN0YXR1czsNCi0JCQkJCQkJc2V0RXJyb3JNZXNzYWdlKGZlYXR1cmVTdGF0dXMuZ2V0TWVzc2FnZSgpKTsNCi0JCQkJCQkJcmV0dXJuOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQkvLyAyLiAgc2hvdyBvbGQgc3RhdHVzIGlmIHBvc3NpYmxlIChpdCBpcyBzdGlsbCB2YWxpZCkNCi0JCQlpZihsYXN0RGlzcGxheWVkU3RhdHVzICE9bnVsbCl7DQotCQkJCUlTdGF0dXNbXSBzdGF0dXMgPSB2YWxpZGF0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7DQotCQkJCWZvcihpbnQgaT0wOyBpPHN0YXR1cy5sZW5ndGg7IGkrKyl7DQotCQkJCQlpZihsYXN0RGlzcGxheWVkU3RhdHVzLmVxdWFscyhzdGF0dXNbaV0pKXsNCi0JCQkJCQkvL2xhc3REaXNwbGF5ZWRTdGF0dXM9bGFzdERpc3BsYXllZFN0YXR1czsNCi0JCQkJCQkvL3NldEVycm9yTWVzc2FnZShzdGF0dXNbaV0uZ2V0TWVzc2FnZSgpKTsNCi0JCQkJCQlyZXR1cm47DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJbGFzdERpc3BsYXllZFN0YXR1cyA9IG51bGw7DQotCQkJfQ0KLQkJCQ0KLQkJCS8vIDMuICBwaWNrIHRoZSBmaXJzdCBwcm9ibGVtIHRoYXQgaXMgc3BlY2lmaWMgdG8gc29tZSBmZWF0dXJlDQotCQkJSVN0YXR1c1tdIHN0YXR1cyA9IHZhbGlkYXRpb25TdGF0dXMuZ2V0Q2hpbGRyZW4oKTsNCi0JCQlmb3IoaW50IHMgPTA7IHM8IHN0YXR1cy5sZW5ndGg7IHMrKyl7DQotCQkJCWlmKGlzU3BlY2lmaWNTdGF0dXMoc3RhdHVzW3NdKSl7DQotCQkJCQlsYXN0RGlzcGxheWVkU3RhdHVzID0gKEZlYXR1cmVTdGF0dXMpc3RhdHVzW3NdOw0KLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1c1tzXS5nZXRNZXNzYWdlKCkpOw0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJfQ0KLQkJCQkNCi0JCQkvLyA0LiAgZGlzcGxheSB0aGUgZmlyc3QgcHJvYmxlbSAobm8gcHJvYmxlbXMgc3BlY2lmeSBhIGZlYXR1cmUpDQotCQkJaWYoc3RhdHVzLmxlbmd0aD4wKXsNCi0JCQkJSVN0YXR1cyBzaW5nbGVTdGF0dXM9c3RhdHVzWzBdOw0KLQkJCQlzZXRFcnJvck1lc3NhZ2Uoc2luZ2xlU3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQkJfWVsc2V7DQotCQkJLy8gNS4gbm90IG11bHRpIG9yIGVtcHR5IG11bHRpIHN0YXR1cw0KLQkJCQlzZXRFcnJvck1lc3NhZ2UoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuaW52YWxpZC5sb25nIikpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCWNsYXNzIFN0YXR1c0RpYWxvZyBleHRlbmRzIEVycm9yRGlhbG9nIHsNCi0vLwkJQnV0dG9uIGRldGFpbHNCdXR0b247DQotCQlwdWJsaWMgU3RhdHVzRGlhbG9nKCkgew0KLQkJCXN1cGVyKFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIFVwZGF0ZVVJDQotCQkJCQkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuaW52YWxpZC5zaG9ydCIpLCBudWxsLCAvLyROT04tTkxTLTEkDQotCQkJCQl2YWxpZGF0aW9uU3RhdHVzLCBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPDQotCQkJCQkJCXwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUik7DQotCQl9DQotLy8JCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKA0KLS8vCQkJCUNvbXBvc2l0ZSBwYXJlbnQsDQotLy8JCQkJaW50IGlkLA0KLS8vCQkJCVN0cmluZyBsYWJlbCwNCi0vLwkJCQlib29sZWFuIGRlZmF1bHRCdXR0b24pIHsNCi0vLwkJCUJ1dHRvbiBiID0gc3VwZXIuY3JlYXRlQnV0dG9uKHBhcmVudCwgaWQsIGxhYmVsLCBkZWZhdWx0QnV0dG9uKTsNCi0vLwkJCWlmKElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCA9PSBpZCl7DQotLy8JCQkJZGV0YWlsc0J1dHRvbiA9IGI7DQotLy8JCQl9DQotLy8JCQlyZXR1cm4gYjsNCi0vLwkJfQ0KLQkJcHVibGljIHZvaWQgY3JlYXRlKCkgew0KLQkJCXN1cGVyLmNyZWF0ZSgpOw0KLQkJCWJ1dHRvblByZXNzZWQoSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEKTsNCi0vLwkJCWlmKGRldGFpbHNCdXR0b24hPW51bGwpew0KLS8vCQkJCWRldGFpbHNCdXR0b24uZGlzcG9zZSgpOw0KLS8vCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRydWUsIGlmIGNvbXBsZXRlZCwgZmFsc2UgaWYgY2FuY2VsZWQgYnkgdGhlIHVzZXINCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBkb3dubG9hZEluY2x1ZGVkRmVhdHVyZXMoKSB7DQotCQl0cnkgew0KLQkJCURvd25sb2FkZXIgZG93bmxvYWRlciA9IG5ldyBEb3dubG9hZGVyKGpvYnMpOw0KLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBkb3dubG9hZGVyKTsNCi0JCQlyZXR1cm4gIWRvd25sb2FkZXIuaXNDYW5jZWxlZCgpOw0KLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsNCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7DQotCQl9DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKioNCi0JICogUnVubmFibGUgdG8gcmVzb2x2ZSBpbmNsdWRlZCBmZWF0dXJlIHJlZmVyZW5jZXMuDQotCSAqLw0KLQljbGFzcyBEb3dubG9hZGVyIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsNCi0JCWJvb2xlYW4gY2FuY2VsZWQgPSBmYWxzZTsNCi0JCS8qKg0KLQkJICogTGlzdCBvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24NCi0JCSAqLw0KLQkJQXJyYXlMaXN0IG9wZXJhdGlvbnM7DQotCQlwdWJsaWMgRG93bmxvYWRlcihBcnJheUxpc3QgaW5zdGFsbE9wZXJhdGlvbnMpIHsNCi0JCQlvcGVyYXRpb25zID0gaW5zdGFsbE9wZXJhdGlvbnM7DQotCQl9DQotCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgew0KLQkJCXJldHVybiBjYW5jZWxlZDsNCi0JCX0NCi0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLnNpemUoKTsgaSsrKSB7DQotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjYW5kaWRhdGUgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBvcGVyYXRpb25zDQotCQkJCQkJLmdldChpKTsNCi0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNhbmRpZGF0ZS5nZXRGZWF0dXJlKCk7DQotCQkJCXRyeSB7DQotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGlyZWZzID0gZmVhdHVyZQ0KLQkJCQkJCQkuZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCQkJZm9yIChpbnQgZiA9IDA7IGYgPCBpcmVmcy5sZW5ndGg7IGYrKykgew0KLQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJCQljYW5jZWxlZCA9IHRydWU7DQotCQkJCQkJCXJldHVybjsNCi0JCQkJCQl9DQotCQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ZdOw0KLQkJCQkJCUlGZWF0dXJlIGlmZWF0dXJlID0gaXJlZi5nZXRGZWF0dXJlKG1vbml0b3IpOw0KLQkJCQkJfQ0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJY2FuY2VsZWQgPSB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TZWFyY2hSdW5uZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1NlYXJjaFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2MxOGJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1NlYXJjaFJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICogUnVucyBhIHNlYXJjaCBxdWVyeQotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoUnVubmVyIHsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgSVNlYXJjaFByb3ZpZGVyIHNlYXJjaFByb3ZpZGVyOwotCXByaXZhdGUgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3I7Ci0JcHJpdmF0ZSBib29sZWFuIG5ld1NlYXJjaE5lZWRlZDsKLQkKLQlwdWJsaWMgU2VhcmNoUnVubmVyKFNoZWxsIHNoZWxsLCBJUnVubmFibGVDb250ZXh0IGNvbnRleHQpIHsKLQkJdGhpcy5zaGVsbCA9IHNoZWxsOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDb2xsZWN0b3IoSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IpIHsKLQkJdGhpcy5jb2xsZWN0b3IgPSBjb2xsZWN0b3I7Ci0JfQotCQotCXB1YmxpYyBJU2VhcmNoUHJvdmlkZXIgZ2V0U2VhcmNoUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBzZWFyY2hQcm92aWRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoUHJvdmlkZXIoSVNlYXJjaFByb3ZpZGVyIHNlYXJjaFByb3ZpZGVyKSB7Ci0JCWlmICh0aGlzLnNlYXJjaFByb3ZpZGVyIT1zZWFyY2hQcm92aWRlcikKLQkJCW5ld1NlYXJjaE5lZWRlZCA9IHRydWU7Ci0JCXRoaXMuc2VhcmNoUHJvdmlkZXIgPSBzZWFyY2hQcm92aWRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmV3U2VhcmNoTmVlZGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJbmV3U2VhcmNoTmVlZGVkID0gdmFsdWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTmV3U2VhcmNoTmVlZGVkKCkgewotCQlyZXR1cm4gbmV3U2VhcmNoTmVlZGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1blNlYXJjaCgpIHsKLQkJaWYgKHNlYXJjaFByb3ZpZGVyPT1udWxsKSByZXR1cm47Ci0JCXRyeSB7Ci0JCQljb250ZXh0LnJ1bih0cnVlLCB0cnVlLCBnZXRTZWFyY2hPcGVyYXRpb24oY29sbGVjdG9yKSk7Ci0JCQluZXdTZWFyY2hOZWVkZWQ9ZmFsc2U7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWlmICghImNhbmNlbCIuZXF1YWxzKGUuZ2V0TWVzc2FnZSgpKSkKLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQluZXdTZWFyY2hOZWVkZWQ9dHJ1ZTsKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgdCA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQlDb3JlRXhjZXB0aW9uIGNlID0gKENvcmVFeGNlcHRpb24pdDsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotCQkJCWlmIChzdGF0dXMhPW51bGwgJiYKLQkJCQkJc3RhdHVzLmdldENvZGUoKT09SVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OKSB7Ci0JCQkJCS8vIEp1c3Qgc2hvdyB0aGlzIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9uCi0JCQkJCS8vIGJlY2F1c2UgdGhlcmUgbWF5IGJlIHJlc3VsdHMgYW55d2F5LgotCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZWFyY2hSdW5uZXIuY29ubmVjdGlvbkVycm9yIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW51bGwsIAotCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFNlYXJjaE9wZXJhdGlvbihmaW5hbCBJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvcikgewotCQlmaW5hbCBVcGRhdGVTZWFyY2hSZXF1ZXN0IHJlcXVlc3QgPSBzZWFyY2hQcm92aWRlci5nZXRTZWFyY2hSZXF1ZXN0KCk7Ci0JCQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzICgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVxdWVzdC5wZXJmb3JtU2VhcmNoKGNvbGxlY3RvciwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCW5ld1NlYXJjaE5lZWRlZCA9IHRydWU7Ci0JCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oImNhbmNlbCIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlyZXR1cm4gb3A7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2hvd0FjdGl2aXRpZXNEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Nob3dBY3Rpdml0aWVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNzAxNTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2hvd0FjdGl2aXRpZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2hvd0FjdGl2aXRpZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByaXZhdGUgVGFibGVWaWV3ZXIgYWN0aXZpdGllc1ZpZXdlcjsKLQotCS8vIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24KLQlwcml2YXRlIElEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5nczsKLQlwcml2YXRlIFBvaW50IGRpYWxvZ0xvY2F0aW9uOwotCXByaXZhdGUgUG9pbnQgZGlhbG9nU2l6ZTsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqLwotCXB1YmxpYyBTaG93QWN0aXZpdGllc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoU1dULlJFU0laRSB8IFNXVC5NSU4gfCBTV1QuTUFYIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJcmVhZENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJLy8gZGlhbG9nIGxvY2F0aW9uIAotCQlpZiAoZGlhbG9nTG9jYXRpb24gIT0gbnVsbCkKLQkJCWdldFNoZWxsKCkuc2V0TG9jYXRpb24oZGlhbG9nTG9jYXRpb24pOwotCQkKLQkJLy8gZGlhbG9nIHNpemUKLQkJaWYgKGRpYWxvZ1NpemUgIT0gbnVsbCkKLQkJCWdldFNoZWxsKCkuc2V0U2l6ZShkaWFsb2dTaXplKTsKLQkJZWxzZQotCQkJZ2V0U2hlbGwoKS5zZXRTaXplKDUwMCw1MDApOwotCQkKLQkJCi0JCWFwcGx5RGlhbG9nRm9udChidXR0b25CYXIpOwotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOwotCQljcmVhdGVEZXNjcmlwdGlvblNlY3Rpb24oY29udGFpbmVyKTsKLQkJY3JlYXRlQWN0aXZpdGllc1ZpZXdlcihjb250YWluZXIpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbnRhaW5lcik7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGVzY3JpcHRpb25TZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRyeSB7Ci0JCQlMYWJlbCB0YXJnZXRMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJCXRhcmdldExhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaG93QWN0aXZpdGllc0RpYWxvZy5kYXRlIikpOyAvLyROT04tTkxTLTEkCi0JCQlMYWJlbCB0YXJnZXQgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCQl0YXJnZXQuc2V0VGV4dChTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldExhYmVsKCkpOwotCQkJCi0JCQlMYWJlbCB1cmxMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJCXVybExhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaG93QWN0aXZpdGllc0RpYWxvZy5sb2MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxhYmVsIHVybCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJCXVybC5zZXRUZXh0KCgoSW5zdGFsbENvbmZpZ3VyYXRpb24pU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJCQotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUFjdGl2aXRpZXNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gNDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotLy8JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotLy8JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiU2hvd0FjdGl2aXRpZXNEaWFsb2cubGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aXZpdGllc1ZpZXdlciA9IEFjdGl2aXRpZXNUYWJsZVZpZXdlci5jcmVhdGVWaWV3ZXIoY29tcG9zaXRlLCB0cnVlKTsKLQotCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoOCwgMjAsIGZhbHNlKSk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCAxNjAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIDE4MywgdHJ1ZSkpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgMTAwLCB0cnVlKSk7Ci0KLQkJYWN0aXZpdGllc1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotCQl0cnkgewotCQkJYWN0aXZpdGllc1ZpZXdlci5zZXRJbnB1dChTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgT0sgYnV0dG9uIG9ubHkgYnkgZGVmYXVsdAotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJc3RvcmVTZXR0aW5ncygpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RvcmVzIHRoZSBjdXJyZW50IHN0YXRlIGluIHRoZSBkaWFsb2cgc2V0dGluZ3MuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVNldHRpbmdzKCkgewotCQl3cml0ZUNvbmZpZ3VyYXRpb24oKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlhbG9nIHNldHRpbmdzIG9iamVjdCB1c2VkIHRvIHNoYXJlIHN0YXRlCi0JICogYmV0d2VlbiBzZXZlcmFsIGV2ZW50IGRldGFpbCBkaWFsb2dzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBzZXR0aW5ncyB0byBiZSB1c2VkCi0JICovCi0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlkaWFsb2dTZXR0aW5ncyA9IHNldHRpbmdzLmdldFNlY3Rpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlpZiAoZGlhbG9nU2V0dGluZ3MgPT0gbnVsbCkKLQkJCWRpYWxvZ1NldHRpbmdzPSBzZXR0aW5ncy5hZGROZXdTZWN0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGRpYWxvZ1NldHRpbmdzOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGl0c2VsZiBmcm9tIHRoZSBkaWFsb2cgc2V0dGluZ3Mgd2l0aCB0aGUgc2FtZSBzdGF0ZQotCSAqIGFzIGF0IHRoZSBwcmV2aW91cyBpbnZvY2F0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWFkQ29uZmlndXJhdGlvbigpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHM9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCXRyeSB7Ci0JCQlpbnQgeD0gcy5nZXRJbnQoIngiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHk9IHMuZ2V0SW50KCJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWRpYWxvZ0xvY2F0aW9uPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCQkKLQkJCXggPSBzLmdldEludCgid2lkdGgiKTsgLy8kTk9OLU5MUy0xJAotCQkJeSA9IHMuZ2V0SW50KCJoZWlnaHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlhbG9nU2l6ZSA9IG5ldyBQb2ludCh4LHkpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJZGlhbG9nTG9jYXRpb249IG51bGw7Ci0JCQlkaWFsb2dTaXplID0gbnVsbDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVDb25maWd1cmF0aW9uKCl7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJUG9pbnQgbG9jYXRpb24gPSBnZXRTaGVsbCgpLmdldExvY2F0aW9uKCk7Ci0JCXMucHV0KCJ4IiwgbG9jYXRpb24ueCk7IC8vJE5PTi1OTFMtMSQKLQkJcy5wdXQoInkiLCBsb2NhdGlvbi55KTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJUG9pbnQgc2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQlzLnB1dCgid2lkdGgiLCBzaXplLngpOyAvLyROT04tTkxTLTEkCi0JCXMucHV0KCJoZWlnaHQiLCBzaXplLnkpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2l0ZVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1NpdGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NTJlZjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2l0ZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi1wdWJsaWMgY2xhc3MgU2l0ZVBhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIGltcGxlbWVudHMgSVNlYXJjaFByb3ZpZGVyIHsKLQotCWNsYXNzIFRyZWVDb250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlyZXR1cm4gZ2V0QWxsU2l0ZUJvb2ttYXJrcygpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKGZpbmFsIE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLQkJCQlmaW5hbCBTaXRlQm9va21hcmsgYm9va21hcmsgPSAoU2l0ZUJvb2ttYXJrKSBwYXJlbnQ7Ci0JCQkJaWYgKGJvb2ttYXJrLmlzVW5hdmFpbGFibGUoKSkKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQkJZmluYWwgT2JqZWN0W10gY2hpbGRyZW4gPQotCQkJCQlnZXRTaXRlQ2F0YWxvZ1dpdGhJbmRpY2F0b3IoCi0JCQkJCQlib29rbWFyaywKLQkJCQkJCSFib29rbWFyay5pc1NpdGVDb25uZWN0ZWQoKSk7Ci0JCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPiAwKQotCQkJCQkJCWhhbmRsZVNpdGVFeHBhbmRlZChib29rbWFyaywgY2hpbGRyZW4pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuICgoU2l0ZUNhdGVnb3J5KSBlbGVtZW50KS5nZXRCb29rbWFyaygpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKTsKLQkJfQotCi0JfQotCi0JY2xhc3MgVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfU0lURV9PQkopOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ0FURUdPUllfT0JKKTsKLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmopOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLQkJCQlyZXR1cm4gKChTaXRlQm9va21hcmspIG9iaikuZ2V0TGFiZWwoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCX0KLQl9Ci0KLQljbGFzcyBNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJY2hlY2tJdGVtcygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgb2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCWNoZWNrSXRlbXMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCWNoZWNrSXRlbXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIERpc2NvdmVyeUZvbGRlciBkaXNjb3ZlcnlGb2xkZXIgPSBuZXcgRGlzY292ZXJ5Rm9sZGVyKCk7Ci0JcHJpdmF0ZSBDaGVja2JveFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRTaXRlQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGFkZExvY2FsQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGFkZExvY2FsWmlwcGVkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGVudkZpbHRlckNoZWNrOwotCXByaXZhdGUgU2VhcmNoUnVubmVyIHNlYXJjaFJ1bm5lcjsKLQlwcml2YXRlIEVudmlyb25tZW50RmlsdGVyIGVudkZpbHRlcjsKLQlwcml2YXRlIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdDsKLQlwcml2YXRlIE1vZGVsTGlzdGVuZXIgbW9kZWxMaXN0ZW5lcjsKLQotCi0JcHVibGljIFNpdGVQYWdlKFNlYXJjaFJ1bm5lciBzZWFyY2hSdW5uZXIpIHsKLQkJc3VwZXIoIlNpdGVQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVQYWdlLmRlc2MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotCQlzZWFyY2hSZXF1ZXN0ID0KLQkJCW5ldyBVcGRhdGVTZWFyY2hSZXF1ZXN0KAotCQkJCW5ldyBTaXRlU2VhcmNoQ2F0ZWdvcnkoKSwKLQkJCQluZXcgVXBkYXRlU2VhcmNoU2NvcGUoKSk7Ci0JCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBCYWNrTGV2ZWxGaWx0ZXIoKSk7Ci0JCWVudkZpbHRlciA9IG5ldyBFbnZpcm9ubWVudEZpbHRlcigpOwotCQl0aGlzLnNlYXJjaFJ1bm5lciA9IHNlYXJjaFJ1bm5lcjsKLQkJbW9kZWxMaXN0ZW5lciA9IG5ldyBNb2RlbExpc3RlbmVyKCk7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpLmFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKAotCQkJbW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZUVudkZpbHRlcihib29sZWFuIGFkZCkgewotCQlpZiAoYWRkKQotCQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIoZW52RmlsdGVyKTsKLQkJZWxzZQotCQkJc2VhcmNoUmVxdWVzdC5yZW1vdmVGaWx0ZXIoZW52RmlsdGVyKTsKLQkJc2VhcmNoUnVubmVyLnNldE5ld1NlYXJjaE5lZWRlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0JCVVwZGF0ZVVJCi0JCQkuZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0VXBkYXRlTW9kZWwoKQotCQkJLnJlbW92ZVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKAotCQkJbW9kZWxMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgQHNlZQotCSAqIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLkJhbm5lclBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWNyZWF0ZVRyZWVWaWV3ZXIoY2xpZW50KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OVUxMKTsKLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlhZGRTaXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJYWRkU2l0ZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZVBhZ2UuYWRkVXBkYXRlU2l0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRTaXRlQnV0dG9uLnNldExheW91dERhdGEoCi0JCQluZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChhZGRTaXRlQnV0dG9uKTsKLQkJYWRkU2l0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVBZGRTaXRlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZExvY2FsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJYWRkTG9jYWxCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVQYWdlLmFkZExvY2FsU2l0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRMb2NhbEJ1dHRvbi5zZXRMYXlvdXREYXRhKAotCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYWRkTG9jYWxCdXR0b24pOwotCQlhZGRMb2NhbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVBZGRMb2NhbCgpOwotCQkJfQotCQl9KTsKLQotCQlhZGRMb2NhbFppcHBlZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWFkZExvY2FsWmlwcGVkQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5hZGRMb2NhbFppcHBlZFNpdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkTG9jYWxaaXBwZWRCdXR0b24uc2V0TGF5b3V0RGF0YSgKLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGFkZExvY2FsWmlwcGVkQnV0dG9uKTsKLQkJYWRkTG9jYWxaaXBwZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQWRkTG9jYWxaaXBwZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWVkaXRCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVQYWdlLmVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGVkaXRCdXR0b24pOwotCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUVkaXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5yZW1vdmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YSgKLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KHJlbW92ZUJ1dHRvbik7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVSZW1vdmUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZW52RmlsdGVyQ2hlY2sgPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULkNIRUNLKTsKLQkJZW52RmlsdGVyQ2hlY2suc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVQYWdlLmlnbm9yZSIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnZGaWx0ZXJDaGVjay5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXRvZ2dsZUVudkZpbHRlcih0cnVlKTsKLQkJZW52RmlsdGVyQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdG9nZ2xlRW52RmlsdGVyKGVudkZpbHRlckNoZWNrLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZW52RmlsdGVyQ2hlY2suc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuU2l0ZVBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBjbGllbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cmVlVmlld2VyID0KLQkJCW5ldyBDaGVja2JveFRyZWVWaWV3ZXIoCi0JCQkJcGFyZW50LAotCQkJCVNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkpOwotCi0JCWluaXRpYWxpemVJdGVtcygpOwotCi0JCXRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBlLmdldEVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykKLQkJCQkJaGFuZGxlU2l0ZUNoZWNrZWQoKFNpdGVCb29rbWFyaykgZWxlbWVudCwgZS5nZXRDaGVja2VkKCkpOwotCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKLQkJCQkJaGFuZGxlQ2F0ZWdvcnlDaGVja2VkKAotCQkJCQkJKFNpdGVDYXRlZ29yeSkgZWxlbWVudCwKLQkJCQkJCWUuZ2V0Q2hlY2tlZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXRyZWVWaWV3ZXIKLQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQotLy8JCXRyZWVWaWV3ZXIuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0vLwkJCXB1YmxpYyBib29sZWFuIHNlbGVjdCgKLS8vCQkJCVZpZXdlciB2aWV3ZXIsCi0vLwkJCQlPYmplY3QgcGFyZW50RWxlbWVudCwKLS8vCQkJCU9iamVjdCBlbGVtZW50KSB7Ci0vLwkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykKLS8vCQkJCQlyZXR1cm4gISgoU2l0ZUJvb2ttYXJrKSBlbGVtZW50KS5pc1dlYkJvb2ttYXJrKCk7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSXRlbXMoKSB7Ci0JCWNoZWNrSXRlbXMoKTsKLQkJdXBkYXRlU2VhcmNoUmVxdWVzdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0l0ZW1zKCkgewotCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgaXRlbXNbaV0uZ2V0RGF0YSgpOwotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGJvb2ttYXJrLCBib29rbWFyay5pc1NlbGVjdGVkKCkpOwotCQkJU3RyaW5nW10gaWdub3JlZENhdHMgPSBib29rbWFyay5nZXRJZ25vcmVkQ2F0ZWdvcmllcygpOwotCQkJdHJlZVZpZXdlci5zZXRHcmF5ZWQoYm9va21hcmssIGlnbm9yZWRDYXRzLmxlbmd0aCA+IDAKLQkJCQkJJiYgYm9va21hcmsuaXNTZWxlY3RlZCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVBZGRTaXRlKCkgewotCQlOZXdVcGRhdGVTaXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBOZXdVcGRhdGVTaXRlRGlhbG9nKGdldFNoZWxsKCkpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5uZXciKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gTmV3VXBkYXRlU2l0ZURpYWxvZy5PSykKLQkJCXVwZGF0ZVNlYXJjaFJlcXVlc3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkTG9jYWwoKSB7Ci0JCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPSBMb2NhbFNpdGVTZWxlY3Rvci5nZXRMb2NhTFNpdGUoZ2V0U2hlbGwoKSk7Ci0JCWlmIChzaXRlQm9va21hcmsgIT0gbnVsbCkgewotCQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJCW1vZGVsLmFkZEJvb2ttYXJrKHNpdGVCb29rbWFyayk7Ci0JCQltb2RlbC5zYXZlQm9va21hcmtzKCk7Ci0JCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVBZGRMb2NhbFppcHBlZCgpIHsKLQkJU2l0ZUJvb2ttYXJrIHNpdGVCb29rbWFyayA9Ci0JCQlMb2NhbFNpdGVTZWxlY3Rvci5nZXRMb2NhTFppcHBlZFNpdGUoZ2V0U2hlbGwoKSk7Ci0JCWlmIChzaXRlQm9va21hcmsgIT0gbnVsbCkgewotCQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJCW1vZGVsLmFkZEJvb2ttYXJrKHNpdGVCb29rbWFyayk7Ci0JCQltb2RlbC5zYXZlQm9va21hcmtzKCk7Ci0JCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmUoKSB7Ci0JCUJ1c3lJbmRpY2F0b3IKLQkJCS5zaG93V2hpbGUodHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVXBkYXRlTW9kZWwgdXBkYXRlTW9kZWwgPQotCQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0KLQkJCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCVNpdGVCb29rbWFyayBib29rbWFyayA9IChTaXRlQm9va21hcmspIHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKCFib29rbWFyay5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJdXBkYXRlTW9kZWwucmVtb3ZlQm9va21hcmsoYm9va21hcmspOwotCQkJCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRWRpdCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9Ci0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCVNpdGVCb29rbWFyayBib29rbWFyayA9IChTaXRlQm9va21hcmspIHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCVVSTCBvbGRVUkwgPSBib29rbWFyay5nZXRVUkwoKTsKLQkJRWRpdFNpdGVEaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRTaXRlRGlhbG9nKGdldFNoZWxsKCksIGJvb2ttYXJrKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlTdHJpbmcgdGl0bGUgPSBib29rbWFyay5pc0xvY2FsKCkgPyBVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVQYWdlLmRpYWxvZ0VkaXRMb2NhbCIpIDogVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5kaWFsb2dFZGl0VXBkYXRlU2l0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0yJAotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gRWRpdFNpdGVEaWFsb2cuT0sgKSB7Ci0JCQlVUkwgbmV3VVJMID0gYm9va21hcmsuZ2V0VVJMKCk7Ci0JCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG9sZFVSTCwgbmV3VVJMKSkgewotCQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQkJbW9kZWwuZmlyZU9iamVjdENoYW5nZWQoYm9va21hcmssIG51bGwpOwotCQkJCXVwZGF0ZVNlYXJjaFJlcXVlc3QoKTsJCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2l0ZUNoZWNrZWQoU2l0ZUJvb2ttYXJrIGJvb2ttYXJrLCBib29sZWFuIGNoZWNrZWQpIHsKLQkJaWYgKGJvb2ttYXJrLmlzVW5hdmFpbGFibGUoKSkgewotCQkJYm9va21hcmsuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGJvb2ttYXJrLCBmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2ttYXJrLnNldFNlbGVjdGVkKGNoZWNrZWQpOwotCQlpZiAoY2hlY2tlZCkKLQkJCWJvb2ttYXJrLnNldElnbm9yZWRDYXRlZ29yaWVzKG5ldyBTdHJpbmdbMF0pOwotCQkJCi0JCWlmIChjaGVja2VkIHx8IGJvb2ttYXJrLmlzU2l0ZUNvbm5lY3RlZCgpKQotCQkJdHJlZVZpZXdlci5zZXRTdWJ0cmVlQ2hlY2tlZChib29rbWFyaywgY2hlY2tlZCk7Ci0JCS8vIGF0IHRoaXMgcG9pbnQsIHdlIG1heSByZWFsaXplIHRoZSBzaXRlIGlzIG5vdCBhdmFpbGFibGUKLQkJaWYgKGJvb2ttYXJrLmlzVW5hdmFpbGFibGUoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGJvb2ttYXJrLCBmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCQotCQl0cmVlVmlld2VyLnNldEdyYXllZChib29rbWFyaywgZmFsc2UpOwotCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNpdGVFeHBhbmRlZChTaXRlQm9va21hcmsgYm9va21hcmssIE9iamVjdFtdIGNhdHMpIHsKLQkJaWYgKCFib29rbWFyay5pc1NlbGVjdGVkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoYm9va21hcmssIGZhbHNlKTsKLQkJCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2F0c1tpXSBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgewotCQkJCQlyZXN1bHQuYWRkKCgoU2l0ZUNhdGVnb3J5KSBjYXRzW2ldKS5nZXRGdWxsTmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlib29rbWFyay5zZXRJZ25vcmVkQ2F0ZWdvcmllcygKLQkJCQkoU3RyaW5nW10pIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ1tdIGlnbm9yZWQgPSBib29rbWFyay5nZXRJZ25vcmVkQ2F0ZWdvcmllcygpOwotCQkJSGFzaFNldCBpbWFwID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlZC5sZW5ndGg7IGkrKykgewotCQkJCWltYXAuYWRkKGlnbm9yZWRbaV0pOwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2F0c1tpXSBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgewotCQkJCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KSBjYXRzW2ldOwotCQkJCQl0cmVlVmlld2VyLnNldENoZWNrZWQoCi0JCQkJCQljYXRlZ29yeSwKLQkJCQkJCSFpbWFwLmNvbnRhaW5zKGNhdGVnb3J5LmdldEZ1bGxOYW1lKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0cmVlVmlld2VyLnNldEdyYXllZCgKLQkJCQlib29rbWFyaywKLQkJCQlpZ25vcmVkLmxlbmd0aCA+IDAgJiYgaWdub3JlZC5sZW5ndGggPCBjYXRzLmxlbmd0aCk7Ci0JCX0KLQkJc2VhcmNoUnVubmVyLnNldE5ld1NlYXJjaE5lZWRlZCh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2F0ZWdvcnlDaGVja2VkKAotCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnksCi0JCWJvb2xlYW4gY2hlY2tlZCkgewotCQlTaXRlQm9va21hcmsgYm9va21hcmsgPSBjYXRlZ29yeS5nZXRCb29rbWFyaygpOwotCQkKLQkJQXJyYXlMaXN0IGFycmF5ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChib29rbWFyay5pc1NlbGVjdGVkKCkpIHsKLQkJCVN0cmluZ1tdIGlnbm9yZWQgPSBib29rbWFyay5nZXRJZ25vcmVkQ2F0ZWdvcmllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZ25vcmVkLmxlbmd0aDsgaSsrKSAKLQkJCQlhcnJheS5hZGQoaWdub3JlZFtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3RbXSBjYXRlZ3MgPQotCQkJCWdldFNpdGVDYXRhbG9nV2l0aEluZGljYXRvcihib29rbWFyaywgIWJvb2ttYXJrLmlzU2l0ZUNvbm5lY3RlZCgpKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjYXRlZ3MubGVuZ3RoOyBpKyspCi0JCQkJYXJyYXkuYWRkKCgoU2l0ZUNhdGVnb3J5KWNhdGVnc1tpXSkuZ2V0RnVsbE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWlmIChjaGVja2VkKSB7Ci0JCQlhcnJheS5yZW1vdmUoY2F0ZWdvcnkuZ2V0RnVsbE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhcnJheS5hZGQoY2F0ZWdvcnkuZ2V0RnVsbE5hbWUoKSk7Ci0JCX0KLQotCQlib29rbWFyay5zZXRJZ25vcmVkQ2F0ZWdvcmllcygKLQkJCShTdHJpbmdbXSkgYXJyYXkudG9BcnJheShuZXcgU3RyaW5nW2FycmF5LnNpemUoKV0pKTsKLQkJc2VhcmNoUnVubmVyLnNldE5ld1NlYXJjaE5lZWRlZCh0cnVlKTsKLQotCQlPYmplY3RbXSBjaGlsZHJlbiA9ICgoVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSkKLQkJCQkJLmdldENoaWxkcmVuKGNhdGVnb3J5LmdldEJvb2ttYXJrKCkpOwotCQl0cmVlVmlld2VyLnNldENoZWNrZWQoYm9va21hcmssIGFycmF5LnNpemUoKSA8IGNoaWxkcmVuLmxlbmd0aCk7Ci0JCWJvb2ttYXJrLnNldFNlbGVjdGVkKGFycmF5LnNpemUoKSA8IGNoaWxkcmVuLmxlbmd0aCk7Ci0JCXRyZWVWaWV3ZXIuc2V0R3JheWVkKAotCQkJYm9va21hcmssCi0JCQlhcnJheS5zaXplKCkgPiAwICYmIGFycmF5LnNpemUoKSA8IGNoaWxkcmVuLmxlbmd0aCk7Ci0JCXVwZGF0ZVNlYXJjaFJlcXVlc3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsKSB7Ci0JCWJvb2xlYW4gZW5hYmxlID0gZmFsc2U7Ci0JCU9iamVjdCBpdGVtID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLQkJCWVuYWJsZSA9ICEoKFNpdGVCb29rbWFyaykgaXRlbSkuaXNSZWFkT25seSgpOwotCQl9Ci0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlYXJjaFJlcXVlc3QoKSB7Ci0JCU9iamVjdFtdIGNoZWNrZWQgPSB0cmVlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCi0JCVVwZGF0ZVNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCk7Ci0JCWludCBuc2l0ZXMgPSAwOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNoZWNrZWRbaV0gaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLQkJCQlTaXRlQm9va21hcmsgYm9va21hcmsgPSAoU2l0ZUJvb2ttYXJrKSBjaGVja2VkW2ldOwotCQkJCXNjb3BlLmFkZFNlYXJjaFNpdGUoCi0JCQkJCWJvb2ttYXJrLmdldExhYmVsKCksCi0JCQkJCWJvb2ttYXJrLmdldFVSTCgpLAotCQkJCQlib29rbWFyay5nZXRJZ25vcmVkQ2F0ZWdvcmllcygpKTsKLQkJCQluc2l0ZXMrKzsKLQkJCX0KLQkJfQotCQlzZWFyY2hSZXF1ZXN0LnNldFNjb3BlKHNjb3BlKTsKLQkJc2VhcmNoUnVubmVyLnNldE5ld1NlYXJjaE5lZWRlZCh0cnVlKTsKLQkJc2V0UGFnZUNvbXBsZXRlKG5zaXRlcyA+IDApOwotCX0KLQotCXB1YmxpYyBVcGRhdGVTZWFyY2hSZXF1ZXN0IGdldFNlYXJjaFJlcXVlc3QoKSB7Ci0JCXJldHVybiBzZWFyY2hSZXF1ZXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2YWx1ZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZhbHVlKTsKLQkJaWYgKHZhbHVlKSB7Ci0JCQlzZWFyY2hSdW5uZXIuc2V0U2VhcmNoUHJvdmlkZXIodGhpcyk7Ci0JCQkvLyBSZXNldCBhbGwgdW5hdmFpbGFibGUgc2l0ZXMsIHNvIHRoZXkgY2FuIGJlIHRyaWVkIGFnYWluIGlmIHRoZSB1c2VyIHdhbnRzIGl0Ci0JCQlTaXRlQm9va21hcmtbXSBib29rbWFya3MgPSBnZXRBbGxTaXRlQm9va21hcmtzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Ym9va21hcmtzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGJvb2ttYXJrc1tpXS5pc1VuYXZhaWxhYmxlKCkpCi0JCQkJCWJvb2ttYXJrc1tpXS5zZXRVbmF2YWlsYWJsZShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBDYXRhbG9nQmFnIHsKLQkJT2JqZWN0W10gY2F0YWxvZzsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldFNpdGVDYXRhbG9nV2l0aEluZGljYXRvcigKLQkJZmluYWwgU2l0ZUJvb2ttYXJrIGJvb2ttYXJrLAotCQlmaW5hbCBib29sZWFuIGNvbm5lY3QpIHsKLQkJZmluYWwgQ2F0YWxvZ0JhZyBiYWcgPSBuZXcgQ2F0YWxvZ0JhZygpOwotCi0JCWlmIChib29rbWFyay5pc1VuYXZhaWxhYmxlKCkpCi0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCQkJaWYgKGNvbm5lY3QpCi0JCQkJCQlib29rbWFyay5jb25uZWN0KG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQllbHNlCi0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJYmFnLmNhdGFsb2cgPQotCQkJCQkJYm9va21hcmsuZ2V0Q2F0YWxvZygKLQkJCQkJCQl0cnVlLAotCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJcmV0dXJuIChiYWcuY2F0YWxvZyA9PSBudWxsKSA/IG5ldyBPYmplY3RbMF0gOiBiYWcuY2F0YWxvZzsKLQl9Ci0JCi0JcHJpdmF0ZSBTaXRlQm9va21hcmtbXSBnZXRBbGxTaXRlQm9va21hcmtzKCkgewotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQlPYmplY3RbXSBib29rbWFya3MgPSBtb2RlbC5nZXRCb29rbWFya0xlYWZzKCk7Ci0JCU9iamVjdFtdIHNpdGVzVG9WaXNpdCA9Ci0JCQlkaXNjb3ZlcnlGb2xkZXIuZ2V0Q2hpbGRyZW4oZGlzY292ZXJ5Rm9sZGVyKTsKLQkJU2l0ZUJvb2ttYXJrW10gYWxsID0gbmV3IFNpdGVCb29rbWFya1tib29rbWFya3MubGVuZ3RoICsgc2l0ZXNUb1Zpc2l0Lmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYm9va21hcmtzLCAwLCBhbGwsIDAsIGJvb2ttYXJrcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJc2l0ZXNUb1Zpc2l0LAotCQkJMCwKLQkJCWFsbCwKLQkJCWJvb2ttYXJrcy5sZW5ndGgsCi0JCQlzaXRlc1RvVmlzaXQubGVuZ3RoKTsKLQkJcmV0dXJuIGFsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5OTdmOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGF5b3V0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblBpeGVsRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci0KLS8qKgotICogQSBzcGVjaWFsIGNvbXBvc2l0ZSB0byBsYXlvdXQgY29sdW1ucyBpbnNpZGUgYSB0YWJsZS4gVGhlIGNvbXBvc2l0ZSBpcyBuZWVkZWQgc2luY2Ugd2UgaGF2ZQotICogdG8gbGF5b3V0IHRoZSBjb2x1bW5zICJiZWZvcmUiIHRoZSBhY3R1YWwgdGFibGUgZ2V0cyBsYXlvdXRlZC4gSGVuY2Ugd2UgY2FuJ3QgdXNlIGEgbm9ybWFsCi0gKiBsYXlvdXQgbWFuYWdlci4KLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTGF5b3V0Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByaXZhdGUgTGlzdCBjb2x1bW5zPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhYmxlTGF5b3V0Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVGFibGVMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBhZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgYXJlYT0gZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIFRhYmxlIHRhYmxlPSAoVGFibGUpZ2V0Q2hpbGRyZW4oKVswXTsKLSAgICAgICAgICAgICAgICBQb2ludCBwcmVmZXJyZWRTaXplPSBjb21wdXRlVGFibGVTaXplKHRhYmxlKTsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGg9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4gd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICBQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICB3aWR0aCAtPSB2QmFyU2l6ZS54OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsYXlvdXRUYWJsZSh0YWJsZSwgd2lkdGgsIGFyZWEsIHRhYmxlLmdldFNpemUoKS54IDwgYXJlYS53aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGEgbmV3IGNvbHVtbiBvZiBkYXRhIHRvIHRoaXMgdGFibGUgbGF5b3V0LgotCSAqCi0JICogQHBhcmFtIGRhdGEgdGhlIGNvbHVtbiBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbHVtbkRhdGEoQ29sdW1uTGF5b3V0RGF0YSBkYXRhKSB7Ci0JCWNvbHVtbnMuYWRkKGRhdGEpOwotCX0KLQkKLQkvLy0tLS0gSGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlVGFibGVTaXplKFRhYmxlIHRhYmxlKSB7Ci0JCVBvaW50IHJlc3VsdD0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCi0JCWludCB3aWR0aD0gMDsKLQkJaW50IHNpemU9IGNvbHVtbnMuc2l6ZSgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQlDb2x1bW5MYXlvdXREYXRhIGxheW91dERhdGE9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChsYXlvdXREYXRhIGluc3RhbmNlb2YgQ29sdW1uUGl4ZWxEYXRhKSB7Ci0JCQkJQ29sdW1uUGl4ZWxEYXRhIGNvbD0gKENvbHVtblBpeGVsRGF0YSkgbGF5b3V0RGF0YTsKLQkJCQl3aWR0aCArPSBjb2wud2lkdGg7Ci0JCQl9IGVsc2UgaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJQ29sdW1uV2VpZ2h0RGF0YSBjb2w9IChDb2x1bW5XZWlnaHREYXRhKSBsYXlvdXREYXRhOwotCQkJCXdpZHRoICs9IGNvbC5taW5pbXVtV2lkdGg7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKHdpZHRoID4gcmVzdWx0LngpCi0JCQlyZXN1bHQueD0gd2lkdGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsYXlvdXRUYWJsZShUYWJsZSB0YWJsZSwgaW50IHdpZHRoLCBSZWN0YW5nbGUgYXJlYSwgYm9vbGVhbiBpbmNyZWFzZSkgewotCQkvLyBYWFg6IExheW91dCBpcyBiZWluZyBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlIHRoZSBmaXJzdCB0aW1lCi0JCS8vIGl0IGlzIGJlaW5nIGNhbGxlZCBvbiBMaW51eC4gVGhpcyBtZXRob2QgcmVzZXRzIHRoZQotCQkvLyBMYXlvdXQgdG8gbnVsbCBzbyB3ZSBtYWtlIHN1cmUgd2UgcnVuIGl0IG9ubHkgd2hlbgotCQkvLyB0aGUgdmFsdWUgaXMgT0suCi0JCWlmICh3aWR0aCA8PSAxKQotCQkJcmV0dXJuOwotCi0JCVRhYmxlQ29sdW1uW10gdGFibGVDb2x1bW5zPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCWludCBzaXplPSBNYXRoLm1pbihjb2x1bW5zLnNpemUoKSwgdGFibGVDb2x1bW5zLmxlbmd0aCk7Ci0JCWludFtdIHdpZHRocz0gbmV3IGludFtzaXplXTsKLQkJaW50IGZpeGVkV2lkdGg9IDA7Ci0JCWludCBudW1iZXJPZldlaWdodENvbHVtbnM9IDA7Ci0JCWludCB0b3RhbFdlaWdodD0gMDsKLQotCQkvLyBGaXJzdCBjYWxjIHNwYWNlIG9jY3VwaWVkIGJ5IGZpeGVkIGNvbHVtbnMKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5QaXhlbERhdGEpIHsKLQkJCQlpbnQgcGl4ZWxzPSAoKENvbHVtblBpeGVsRGF0YSkgY29sKS53aWR0aDsKLQkJCQl3aWR0aHNbaV09IHBpeGVsczsKLQkJCQlmaXhlZFdpZHRoICs9IHBpeGVsczsKLQkJCX0gZWxzZSBpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCUNvbHVtbldlaWdodERhdGEgY3c9IChDb2x1bW5XZWlnaHREYXRhKSBjb2w7Ci0JCQkJbnVtYmVyT2ZXZWlnaHRDb2x1bW5zKys7Ci0JCQkJLy8gZmlyc3QgdGltZSwgdXNlIHRoZSB3ZWlnaHQgc3BlY2lmaWVkIGJ5IHRoZSBjb2x1bW4gZGF0YSwgb3RoZXJ3aXNlIHVzZSB0aGUgYWN0dWFsIHdpZHRoIGFzIHRoZSB3ZWlnaHQKLQkJCQkvLyBpbnQgd2VpZ2h0ID0gZmlyc3RUaW1lID8gY3cud2VpZ2h0IDogdGFibGVDb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJaW50IHdlaWdodD0gY3cud2VpZ2h0OwotCQkJCWZpeGVkV2lkdGgrPWN3Lm1pbmltdW1XaWR0aDsKLQkJCQl0b3RhbFdlaWdodCArPSB3ZWlnaHQ7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBEbyB3ZSBoYXZlIGNvbHVtbnMgdGhhdCBoYXZlIGEgd2VpZ2h0Ci0JCWlmIChudW1iZXJPZldlaWdodENvbHVtbnMgPiAwKSB7Ci0JCQkvLyBOb3cgZGlzdHJpYnV0ZSB0aGUgcmVzdCB0byB0aGUgY29sdW1ucyB3aXRoIHdlaWdodC4KLQkJCWludCByZXN0PSB3aWR0aCAtIGZpeGVkV2lkdGg7Ci0JCQlpbnQgdG90YWxEaXN0cmlidXRlZD0gMDsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJCUNvbHVtbldlaWdodERhdGEgY3c9IChDb2x1bW5XZWlnaHREYXRhKSBjb2w7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB3ZWlnaHQgYXMgYWJvdmUKLQkJCQkJLy8gaW50IHdlaWdodCA9IGZpcnN0VGltZSA/IGN3LndlaWdodCA6IHRhYmxlQ29sdW1uc1tpXS5nZXRXaWR0aCgpOwotCQkJCQlpbnQgd2VpZ2h0PSBjdy53ZWlnaHQ7Ci0JCQkJCWludCBzcGFyZVBpeGVscz0gdG90YWxXZWlnaHQgPT0gMCA/IDAgOiB3ZWlnaHQgKiByZXN0IC8gdG90YWxXZWlnaHQ7Ci0JCQkJCWludCBuZXdXaWR0aCA9IGN3Lm1pbmltdW1XaWR0aDsKLQkJCQkJaWYgKHNwYXJlUGl4ZWxzID4wICkKLQkJCQkJCW5ld1dpZHRoICs9IHNwYXJlUGl4ZWxzOwotCQkJCQl0b3RhbERpc3RyaWJ1dGVkICs9IG5ld1dpZHRoOwotCQkJCQl3aWR0aHNbaV09IG5ld1dpZHRoOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gRGlzdHJpYnV0ZSBhbnkgcmVtYWluaW5nIHBpeGVscyB0byBjb2x1bW5zIHdpdGggd2VpZ2h0LgotCQkJaW50IGRpZmY9IHJlc3QgLSB0b3RhbERpc3RyaWJ1dGVkOwotCQkJZm9yIChpbnQgaT0gMDsgZGlmZiA+IDA7ICsraSkgewotCQkJCWlmIChpID09IHNpemUpCi0JCQkJCWk9IDA7Ci0JCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCQkrK3dpZHRoc1tpXTsKLQkJCQkJLS1kaWZmOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGluY3JlYXNlKSB7Ci0JCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0YWJsZUNvbHVtbnNbaV0uc2V0V2lkdGgod2lkdGhzW2ldKTsKLQkJfQotCQlpZiAoIWluY3JlYXNlKSB7Ci0JCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9UYXJnZXRQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9UYXJnZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZjc1MTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFyZ2V0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsNCi0NCi1wdWJsaWMgY2xhc3MgVGFyZ2V0UGFnZSBleHRlbmRzIEJhbm5lclBhZ2UgaW1wbGVtZW50cyBJRHluYW1pY1BhZ2Ugew0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGpvYlZpZXdlcjsNCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzaXRlVmlld2VyOw0KLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7DQotCXByaXZhdGUgQ29uZmlnTGlzdGVuZXIgY29uZmlnTGlzdGVuZXI7DQotCXByaXZhdGUgTGFiZWwgcmVxdWlyZWRTcGFjZUxhYmVsOw0KLQlwcml2YXRlIExhYmVsIGF2YWlsYWJsZVNwYWNlTGFiZWw7DQotCXByaXZhdGUgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9iczsNCi0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOw0KLQlwcml2YXRlIEJ1dHRvbiBkZWxldGVCdXR0b247DQotCXByaXZhdGUgSGFzaFNldCBhZGRlZDsNCi0NCi0JY2xhc3MgSm9ic0NvbnRlbnRQcm92aWRlcg0KLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyDQotCQlpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsNCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7DQotCQkJcmV0dXJuIGpvYnM7DQotCQl9DQotCX0NCi0NCi0JY2xhc3MgU2l0ZXNDb250ZW50UHJvdmlkZXINCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcg0KLQkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7DQotDQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgew0KLQkJCXJldHVybiBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQl9DQotCX0NCi0NCi0JY2xhc3MgSm9ic0xhYmVsUHJvdmlkZXINCi0JCWV4dGVuZHMgTGFiZWxQcm92aWRlcg0KLQkJaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsNCi0JCQkNCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgY29sKSB7DQotCQkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7DQotDQotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG9iajsNCi0JCQlJbWFnZURlc2NyaXB0b3IgYmFzZSA9DQotCQkJCWpvYi5nZXRGZWF0dXJlKCkuaXNQYXRjaCgpDQotCQkJCQk/IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRUZJWF9PQkoNCi0JCQkJCTogVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSjsNCi0JCQlpbnQgZmxhZ3MgPSAwOw0KLQkJCWlmIChqb2IuZ2V0VGFyZ2V0U2l0ZSgpID09IG51bGwpDQotCQkJCWZsYWdzID0gVXBkYXRlTGFiZWxQcm92aWRlci5GX0VSUk9SOw0KLQkJCXJldHVybiBwcm92aWRlci5nZXQoYmFzZSwgZmxhZ3MpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2wpIHsNCi0JCQlpZiAoY29sID09IDApIHsNCi0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9ICgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBvYmopLmdldEZlYXR1cmUoKTsNCi0JCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKQ0KLQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJA0KLQkJCQkJKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsNCi0JCQl9DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCX0NCi0JDQotCWNsYXNzIFNpdGVzTGFiZWxQcm92aWRlcg0KLQlleHRlbmRzIExhYmVsUHJvdmlkZXINCi0JaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsNCi0JCQ0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBjb2wpIHsNCi0JCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsNCi0JCQlyZXR1cm4gcHJvdmlkZXIuZ2V0TG9jYWxTaXRlSW1hZ2UoKElDb25maWd1cmVkU2l0ZSkgb2JqKTsNCi0JCX0NCi0JDQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbCkgew0KLQkJCWlmIChjb2wgPT0gMCkgew0KLQkJCQlJU2l0ZSBzaXRlID0gKChJQ29uZmlndXJlZFNpdGUpIG9iaikuZ2V0U2l0ZSgpOw0KLQkJCQlyZXR1cm4gbmV3IEZpbGUoc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpLnRvU3RyaW5nKCk7DQotCQkJfQ0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotDQotCWNsYXNzIENvbmZpZ0xpc3RlbmVyIGltcGxlbWVudHMgSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyIHsNCi0JCXB1YmxpYyB2b2lkIGluc3RhbGxTaXRlQWRkZWQoSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7DQotCQkJc2l0ZVZpZXdlci5hZGQoY3NpdGUpOw0KLQkJCWlmIChhZGRlZCA9PSBudWxsKQ0KLQkJCQlhZGRlZCA9IG5ldyBIYXNoU2V0KCk7DQotCQkJYWRkZWQuYWRkKGNzaXRlKTsNCi0JCQkNCi0JCQkvLyBzZXQgdGhlIHNpdGUgYXMgdGFyZ2V0IGZvciBhbGwgam9icyB3aXRob3V0IGEgdGFyZ2V0DQotCQkJZm9yIChpbnQgaT0wOyBqb2JzICE9IG51bGwgJiYgaTxqb2JzLmxlbmd0aDsgaSsrKQ0KLQkJCQlpZiAoam9ic1tpXS5nZXRUYXJnZXRTaXRlKCkgPT0gbnVsbCAmJiBnZXRTaXRlVmlzaWJpbGl0eShjc2l0ZSwgam9ic1tpXSkpIHsNCi0JCQkJCWpvYnNbaV0uc2V0VGFyZ2V0U2l0ZShjc2l0ZSk7DQotCQkJCX0NCi0NCi0JCQlqb2JWaWV3ZXIucmVmcmVzaCgpOw0KLQkJCQ0KLQkJCXNpdGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNzaXRlKSk7DQotCQkJc2l0ZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIGluc3RhbGxTaXRlUmVtb3ZlZChJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsNCi0JCQlzaXRlVmlld2VyLnJlbW92ZShjc2l0ZSk7DQotCQkJaWYgKGFkZGVkICE9IG51bGwpDQotCQkJCWFkZGVkLnJlbW92ZShjc2l0ZSk7DQotCQkJDQotCQkJLy8gcmVtb3ZlIHRoZSB0YXJnZXQgc2l0ZSBmb3IgYWxsIGpvYnMgdGhhdCB1c2UgaXQNCi0JCQkvLyBzZXQgdGhlIHNpdGUgYXMgdGFyZ2V0IGZvciBhbGwgam9icyB3aXRob3V0IGEgdGFyZ2V0DQotCQkJYm9vbGVhbiByZWZyZXNoSm9icyA9IGZhbHNlOw0KLQkJCWZvciAoaW50IGk9MDsgam9icyAhPSBudWxsICYmIGk8am9icy5sZW5ndGg7IGkrKykNCi0JCQkJaWYgKGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpID09IGNzaXRlKSB7DQotCQkJCQlqb2JzW2ldLnNldFRhcmdldFNpdGUobnVsbCk7DQotCQkJCQlyZWZyZXNoSm9icyA9IHRydWU7DQotCQkJCX0NCi0JCQkJDQotCQkJcGFnZUNoYW5nZWQoKTsNCi0JCQkNCi0JCQlqb2JWaWV3ZXIucmVmcmVzaCgpOw0KLQkJCWlmIChyZWZyZXNoSm9icykgew0KLQkJCQlqb2JWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7DQotCQkJfSBlbHNlDQotCQkJCXNpdGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBSZXZpZXdQYWdlMg0KLQkgKi8NCi0JcHVibGljIFRhcmdldFBhZ2UoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgew0KLQkJc3VwZXIoIlRhcmdldCIpOyAvLyROT04tTkxTLTEkDQotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UuZGVzYyIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy5jb25maWcgPSBjb25maWc7DQotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7DQotCQljb25maWdMaXN0ZW5lciA9IG5ldyBDb25maWdMaXN0ZW5lcigpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgew0KLQkJdGhpcy5qb2JzID0gam9iczsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOw0KLQkJY29uZmlnLnJlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbmZpZ0xpc3RlbmVyKTsNCi0JCXN1cGVyLmRpc3Bvc2UoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7DQotCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsNCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JCWxheW91dC5udW1Db2x1bW5zID0gMzsNCi0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOw0KLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOw0KLQ0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7DQotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmpvYnNMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7DQotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnNpdGVMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQ0KLQkJY3JlYXRlSm9iVmlld2VyKGNsaWVudCk7DQotCQljcmVhdGVTaXRlVmlld2VyKGNsaWVudCk7DQotDQotCQlDb21wb3NpdGUgYnV0dG9uQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OVUxMKTsNCi0JCUdyaWRMYXlvdXQgYmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCQlibGF5b3V0Lm1hcmdpbldpZHRoID0gYmxheW91dC5tYXJnaW5IZWlnaHQgPSAwOw0KLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dChibGF5b3V0KTsNCi0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7DQotCQkNCi0JCWFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7DQotCQlhZGRCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5uZXciKSk7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJCWFkZFRhcmdldExvY2F0aW9uKCk7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7DQotCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsNCi0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChhZGRCdXR0b24pOw0KLQkJDQotCQlkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOw0KLQkJZGVsZXRlQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UuZGVsZXRlIikpOyAvLyROT04tTkxTLTEkDQotCQlkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQl0cnkgew0KLQkJCQkJcmVtb3ZlU2VsZWN0aW9uKCk7DQotCQkJCX0NCi0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsNCi0JCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihleCk7DQotCQkJCX0NCi0JCQl9DQotCQl9KTsNCi0JCWRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsNCi0JCWRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUikpOw0KLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGRlbGV0ZUJ1dHRvbik7CQkNCi0JCQ0KLQkJCQkNCi0JCUNvbXBvc2l0ZSBzdGF0dXMgPSBuZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMzsNCi0JCXN0YXR1cy5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7DQotCQlzdGF0dXMuc2V0TGF5b3V0KGxheW91dCk7DQotCQlsYWJlbCA9IG5ldyBMYWJlbChzdGF0dXMsIFNXVC5OVUxMKTsNCi0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UucmVxdWlyZWRTcGFjZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVxdWlyZWRTcGFjZUxhYmVsID0gbmV3IExhYmVsKHN0YXR1cywgU1dULk5VTEwpOw0KLQkJcmVxdWlyZWRTcGFjZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOw0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoc3RhdHVzLCBTV1QuTlVMTCk7DQotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmF2YWlsYWJsZVNwYWNlIikpOyAvLyROT04tTkxTLTEkDQotCQlhdmFpbGFibGVTcGFjZUxhYmVsID0gbmV3IExhYmVsKHN0YXR1cywgU1dULk5VTEwpOw0KLQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsNCi0NCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTXVsdGlUYXJnZXRQYWdlMiIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsNCi0JCQ0KLQkJcmV0dXJuIGNsaWVudDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSm9iVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCWpvYlZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsNCi0JCWdkLndpZHRoSGludCA9IDE1MDsNCi0JCWpvYlZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZ2QpOw0KLQkJam9iVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSm9ic0NvbnRlbnRQcm92aWRlcigpKTsNCi0JCWpvYlZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBKb2JzTGFiZWxQcm92aWRlcigpKTsNCi0NCi0JCWpvYlZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCi0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsNCi0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsNCi0JCQkJaWYgKGpvYiAhPSBudWxsKSB7DQotCQkJCQlzaXRlVmlld2VyLnNldElucHV0KGpvYik7DQotCQkJCQkvL0lDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPSBVcGRhdGVVdGlscy5nZXRBZmZpbml0eVNpdGUoY29uZmlnLCBqb2IuZ2V0RmVhdHVyZSgpKTsNCi0JCQkJCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPSBVcGRhdGVVdGlscy5nZXREZWZhdWx0VGFyZ2V0U2l0ZShjb25maWcsIGpvYiwgdHJ1ZSk7DQotCQkJCQlhZGRCdXR0b24uc2V0RW5hYmxlZChhZmZpbml0eVNpdGUgPT0gbnVsbCk7DQotCQkJCQlpZiAoam9iLmdldFRhcmdldFNpdGUoKSAhPSBudWxsKSB7DQotCQkJCQkJc2l0ZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oam9iLmdldFRhcmdldFNpdGUoKSkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNpdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJc2l0ZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsNCi0JCWdkLndpZHRoSGludCA9IDIwMDsNCi0JCXNpdGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCXNpdGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBTaXRlc0NvbnRlbnRQcm92aWRlcigpKTsNCi0JCXNpdGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgU2l0ZXNMYWJlbFByb3ZpZGVyKCkpOw0KLQkJc2l0ZVZpZXdlci5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHYsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBvYmopIHsNCi0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNpdGVWaWV3ZXIuZ2V0SW5wdXQoKTsNCi0JCQkJcmV0dXJuIGdldFNpdGVWaXNpYmlsaXR5KChJQ29uZmlndXJlZFNpdGUpIG9iaiwgam9iKTsNCi0JCQl9DQotCQl9KTsNCi0JCXNpdGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7DQotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOw0KLQkJCQlzZWxlY3RUYXJnZXRTaXRlKHNzZWwpOw0KLQkJCQl1cGRhdGVEZWxldGVCdXR0b24oc3NlbCk7DQotCQkJfQ0KLQkJfSk7DQotDQotCQlpZiAoY29uZmlnICE9IG51bGwpDQotCQkJY29uZmlnLmFkZEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbmZpZ0xpc3RlbmVyKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURlbGV0ZUJ1dHRvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0JCWJvb2xlYW4gZW5hYmxlID0gYWRkZWQgIT0gbnVsbCAmJiAhYWRkZWQuaXNFbXB0eSgpOw0KLQkJaWYgKGVuYWJsZSkgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0JCQkJaWYgKCFhZGRlZC5jb250YWlucyhpdGVyLm5leHQoKSkpIHsNCi0JCQkJCWVuYWJsZSA9IGZhbHNlOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7DQotCQlpZiAodmlzaWJsZSkgew0KLQkJCWluaXRpYWxpemVEZWZhdWx0VGFyZ2V0U2l0ZXMoKTsNCi0JCQlqb2JWaWV3ZXIuc2V0SW5wdXQoam9icyk7DQotCQkJaWYgKGpvYlZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkgJiYgam9icy5sZW5ndGggPiAwKQ0KLQkJCQlqb2JWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGpvYnNbMF0pKTsNCi0JCX0NCi0JCQ0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm90RW1wdHkoYm9vbGVhbiBlbXB0eSkgew0KLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7DQotCQlpZiAoZW1wdHkpDQotCQkJZXJyb3JNZXNzYWdlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZW1wdHkiKTsgLy8kTk9OLU5MUy0xJA0KLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7DQotCQlzZXRQYWdlQ29tcGxldGUoIWVtcHR5KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgc2VsZWN0VGFyZ2V0U2l0ZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gKElDb25maWd1cmVkU2l0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOw0KLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNpdGVWaWV3ZXIuZ2V0SW5wdXQoKTsNCi0JCWlmIChqb2IgIT0gbnVsbCkgew0KLQkJCWlmIChzaXRlICE9IG51bGwpDQotCQkJCWpvYi5zZXRUYXJnZXRTaXRlKHNpdGUpOw0KLQkJCXBhZ2VDaGFuZ2VkKCk7DQotCQl9DQotCQl1cGRhdGVTdGF0dXMoc2l0ZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGFkZFRhcmdldExvY2F0aW9uKCkgew0KLQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpKTsNCi0JCWRkLnNldE1lc3NhZ2UoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24ubWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIHBhdGggPSBkZC5vcGVuKCk7DQotCQlpZiAocGF0aCAhPSBudWxsKSB7DQotCQkJYWRkQ29uZmlndXJlZFNpdGUoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwgY29uZmlnLCBuZXcgRmlsZShwYXRoKSk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZW1vdmVTZWxlY3Rpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNpdGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7DQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKSBpdGVyLm5leHQoKTsNCi0JCQljb25maWcucmVtb3ZlQ29uZmlndXJlZFNpdGUodGFyZ2V0U2l0ZSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgYWRkQ29uZmlndXJlZFNpdGUoDQotCQlTaGVsbCBzaGVsbCwNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsDQotCQlGaWxlIGZpbGUpIHsNCi0JCXRyeSB7DQotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY29uZmlnLmNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOw0KLQkJCUlTdGF0dXMgc3RhdHVzID0gY3NpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7DQotCQkJaWYgKHN0YXR1cy5pc09LKCkpDQotCQkJCWNvbmZpZy5hZGRDb25maWd1cmVkU2l0ZShjc2l0ZSk7DQotCQkJZWxzZSANCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsNCi0JCQkNCi0JCQlyZXR1cm4gY3NpdGU7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlTdHJpbmcgdGl0bGUgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5lcnJvci50aXRsZSIpOyAvLyROT04tTkxTLTEkDQotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7DQotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOw0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXMoT2JqZWN0IGVsZW1lbnQpIHsNCi0JCWlmIChlbGVtZW50ID09IG51bGwpIHsNCi0JCQlyZXF1aXJlZFNwYWNlTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlhdmFpbGFibGVTcGFjZUxhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKSBlbGVtZW50Ow0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsNCi0JCWxvbmcgYXZhaWxhYmxlID0gTG9jYWxTeXN0ZW1JbmZvLmdldEZyZWVTcGFjZShmaWxlKTsNCi0JCWxvbmcgcmVxdWlyZWQgPSBjb21wdXRlUmVxdWlyZWRTaXplRm9yKHNpdGUpOw0KLQkJaWYgKHJlcXVpcmVkID09IC0xKQ0KLQkJCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnVua25vd25TaXplIikpOyAvLyROT04tTkxTLTEkDQotCQllbHNlDQotCQkJcmVxdWlyZWRTcGFjZUxhYmVsLnNldFRleHQoDQotCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5zaXplIiwgIiIgKyByZXF1aXJlZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JCWlmIChhdmFpbGFibGUgPT0gTG9jYWxTeXN0ZW1JbmZvLlNJWkVfVU5LTk9XTikNCi0JCQlhdmFpbGFibGVTcGFjZUxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UudW5rbm93blNpemUiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCWVsc2UNCi0JCQlhdmFpbGFibGVTcGFjZUxhYmVsLnNldFRleHQoDQotCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5zaXplIiwgIiIgKyBhdmFpbGFibGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0NCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVSZXF1aXJlZFNpemVGb3IoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsNCi0JCWxvbmcgdG90YWxTaXplID0gMDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChzaXRlLmVxdWFscyhqb2JzW2ldLmdldFRhcmdldFNpdGUoKSkpIHsNCi0JCQkJbG9uZyBqb2JTaXplID0gc2l0ZS5nZXRTaXRlKCkuZ2V0SW5zdGFsbFNpemVGb3Ioam9ic1tpXS5nZXRGZWF0dXJlKCkpOw0KLQkJCQlpZiAoam9iU2l6ZSA9PSAtMSkNCi0JCQkJCXJldHVybiAtMTsNCi0JCQkJdG90YWxTaXplICs9IGpvYlNpemU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHRvdGFsU2l6ZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcGFnZUNoYW5nZWQoKSB7DQotCQlib29sZWFuIGVtcHR5ID0gZmFsc2U7DQotCQlmb3IgKGludCBpPTA7IGpvYnMhPW51bGwgJiYgaTxqb2JzLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpID09IG51bGwpIHsNCi0JCQkJZW1wdHkgPSB0cnVlOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkNCi0JCQlJRmVhdHVyZSBmZWF0dXJlID0gam9ic1tpXS5nZXRGZWF0dXJlKCk7DQotCQkJaWYgKGZlYXR1cmUuaXNQYXRjaCgpKSB7DQotCQkJCS8vIFBhdGNoZXMgbXVzdCBnbyB0b2dldGhlciB3aXRoIHRoZSBmZWF0dXJlcw0KLQkJCQkvLyB0aGV5IGFyZSBwYXRjaGluZy4NCi0JCQkJDQotCQkJCS8vIENoZWNrIGN1cnJlbnQgam9icw0KLQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gcGF0Y2hlZEZlYXR1cmVKb2IgPSBmaW5kUGF0Y2hlZEZlYXR1cmUoZmVhdHVyZSk7DQotCQkJCWlmIChwYXRjaGVkRmVhdHVyZUpvYiAhPSBudWxsDQotCQkJCQkmJiBwYXRjaGVkRmVhdHVyZUpvYi5nZXRUYXJnZXRTaXRlKCkgIT0gbnVsbA0KLQkJCQkJJiYgIWpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpLmVxdWFscyhwYXRjaGVkRmVhdHVyZUpvYi5nZXRUYXJnZXRTaXRlKCkpKSB7DQotCQkJCQlTdHJpbmcgbXNnID0gVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgNCi0JCQkJCQkiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnBhdGNoRXJyb3IiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJbmV3IFN0cmluZ1tdIHsNCi0JCQkJCQkJZmVhdHVyZS5nZXRMYWJlbCgpLA0KLQkJCQkJCQlwYXRjaGVkRmVhdHVyZUpvYi5nZXRGZWF0dXJlKCkuZ2V0TGFiZWwoKX0pOw0KLQkJCQkJc2V0RXJyb3JNZXNzYWdlKG1zZyk7DQotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOw0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCS8vIENoZWNrIGluc3RhbGxlZCBmZWF0dXJlcw0KLQkJCQlJRmVhdHVyZSBwYXRjaGVkRmVhdHVyZSA9IFVwZGF0ZVV0aWxzLmdldFBhdGNoZWRGZWF0dXJlKGZlYXR1cmUpOw0KLQkJCQlpZiAocGF0Y2hlZEZlYXR1cmUgIT0gbnVsbCAgDQotCQkJCQkmJiAham9ic1tpXS5nZXRUYXJnZXRTaXRlKCkuZXF1YWxzKHBhdGNoZWRGZWF0dXJlLmdldFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSkpIHsNCi0JCQkJCVN0cmluZyBtc2cgPSBVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKA0KLQkJCQkJCQkiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnBhdGNoRXJyb3IyIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQluZXcgU3RyaW5nW10gew0KLQkJCQkJCQkJZmVhdHVyZS5nZXRMYWJlbCgpLA0KLQkJCQkJCQkJcGF0Y2hlZEZlYXR1cmUuZ2V0TGFiZWwoKSwNCi0JCQkJCQkJCXBhdGNoZWRGZWF0dXJlLmdldFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpfSk7DQotCQkJCQlzZXRFcnJvck1lc3NhZ2UobXNnKTsNCi0JCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7DQotCQkJCQlyZXR1cm47DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQl2ZXJpZnlOb3RFbXB0eShlbXB0eSk7DQotCX0NCi0JDQotCXZvaWQgcmVtb3ZlQWRkZWRTaXRlcygpIHsNCi0JCWlmIChhZGRlZCAhPSBudWxsKSB7DQotCQkJd2hpbGUgKCFhZGRlZC5pc0VtcHR5KCkpIHsNCi0JCQkJSXRlcmF0b3IgaXQgPSBhZGRlZC5pdGVyYXRvcigpOyANCi0JCQkJaWYgKGl0Lmhhc05leHQoKSkNCi0JCQkJCWNvbmZpZy5yZW1vdmVDb25maWd1cmVkU2l0ZSgoSUNvbmZpZ3VyZWRTaXRlKSBpdC5uZXh0KCkpOw0KLQkJCX0NCi0JCX0NCi0JCQkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSAgYm9vbGVhbiBnZXRTaXRlVmlzaWJpbGl0eShJQ29uZmlndXJlZFNpdGUgc2l0ZSwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgew0KLQkJLy8gRG8gbm90IGFsbG93IGluc3RhbGxpbmcgaW50byBhIG5vbi11cGRhdGVhYmxlIHNpdGUNCi0JCWlmICghc2l0ZS5pc1VwZGF0YWJsZSgpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCQ0KLQkJLy8gSWYgYWZmaW5pdHkgc2l0ZSBpcyBrbm93biwgb25seSBpdCBzaG91bGQgYmUgc2hvd24NCi0JCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPSBVcGRhdGVVdGlscy5nZXRBZmZpbml0eVNpdGUoY29uZmlnLCBqb2IuZ2V0RmVhdHVyZSgpKTsNCi0JCWlmIChhZmZpbml0eVNpdGUgIT0gbnVsbCkgew0KLQkJCS8vIE11c3QgY29tcGFyZSByZWZlcmVuY2VkIHNpdGVzIGJlY2F1c2UNCi0JCQkvLyBjb25maWd1cmVkIHNpdGVzIHRoZW1zZWx2ZXMgbWF5IGNvbWUgZnJvbSANCi0JCQkvLyBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMNCi0JCQlyZXR1cm4gc2l0ZS5nZXRTaXRlKCkuZXF1YWxzKGFmZmluaXR5U2l0ZS5nZXRTaXRlKCkpOw0KLQkJfQ0KLQkJDQotCQkvLyBDby1sb2NhdGUgdXBkYXRlcyB3aXRoIHRoZSBvbGQgZmVhdHVyZQ0KLQkJaWYgKGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbCkgew0KLQkJCUlDb25maWd1cmVkU2l0ZSBvbGRTaXRlID0gVXBkYXRlVXRpbHMuZ2V0U2l0ZVdpdGhGZWF0dXJlKGNvbmZpZywgam9iLmdldE9sZEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsNCi0JCQlyZXR1cm4gKHNpdGUgPT0gb2xkU2l0ZSk7DQotCQl9DQotDQotCQkvLyBBbGxvdyBpbnN0YWxsaW5nIGludG8gYW55IHNpdGUgdGhhdCBpcyB1cGRhdGVhYmxlIGFuZCB0aGVyZSBpcyBubyBhZmZpbml0eSBzcGVjaWZpZWQNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRUYXJnZXRTaXRlcygpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChqb2JzW2ldLmdldFRhcmdldFNpdGUoKSAhPSBudWxsKQ0KLQkJCQljb250aW51ZTsNCi0JCQkNCi0JCQlJQ29uZmlndXJlZFNpdGUgYWZmaW5pdHlTaXRlID0JVXBkYXRlVXRpbHMuZ2V0QWZmaW5pdHlTaXRlKGNvbmZpZywgam9ic1tpXS5nZXRGZWF0dXJlKCkpOw0KLQkJCWlmIChhZmZpbml0eVNpdGUgIT0gbnVsbCkgew0KLQkJCQlqb2JzW2ldLnNldFRhcmdldFNpdGUoYWZmaW5pdHlTaXRlKTsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQ0KLQkJCUlDb25maWd1cmVkU2l0ZSBkZWZhdWx0U2l0ZSA9IFVwZGF0ZVV0aWxzLmdldERlZmF1bHRUYXJnZXRTaXRlKGNvbmZpZywgam9ic1tpXSwgZmFsc2UpOw0KLQkJCWlmIChkZWZhdWx0U2l0ZSAhPSBudWxsKSB7DQotCQkJCWpvYnNbaV0uc2V0VGFyZ2V0U2l0ZShkZWZhdWx0U2l0ZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0NCi0JCQlqb2JzW2ldLnNldFRhcmdldFNpdGUoZ2V0Rmlyc3RUYXJnZXRTaXRlKGpvYnNbaV0pKTsNCi0NCi0JCX0NCi0JfQ0KLQkNCi0NCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgZ2V0Rmlyc3RUYXJnZXRTaXRlKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IpIHsNCi0JCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgew0KLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGVzW2ldOw0KLQkJCWlmIChnZXRTaXRlVmlzaWJpbGl0eShjc2l0ZSwgam9iKSkgDQotCQkJCXJldHVybiBjc2l0ZTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGZpbmRQYXRjaGVkRmVhdHVyZShJRmVhdHVyZSBwYXRjaCkgew0KLQkJZm9yIChpbnQgaT0wOyBpPGpvYnMubGVuZ3RoOyBpKyspIHsNCi0JCQlJRmVhdHVyZSB0YXJnZXQgPSBqb2JzW2ldLmdldEZlYXR1cmUoKTsNCi0JCQlpZiAoIXRhcmdldC5lcXVhbHMocGF0Y2gpICYmIFVwZGF0ZVV0aWxzLmlzUGF0Y2godGFyZ2V0LCBwYXRjaCkpDQotCQkJCXJldHVybiBqb2JzW2ldOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVUlQcm9ibGVtSGFuZGxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVUlQcm9ibGVtSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzc1NjkxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1VJUHJvYmxlbUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVUlQcm9ibGVtSGFuZGxlciBpbXBsZW1lbnRzIElQcm9ibGVtSGFuZGxlciB7Ci0KLQkvKgotCSAqIEBzZWUgSVByb2JsZW1IYW5kbGVyI3JlcG9ydFByb2JsZW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlcG9ydFByb2JsZW0oU3RyaW5nIHByb2JsZW1UZXh0KSB7Ci0JCVN0cmluZyB0aXRsZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiUmV2ZXJ0LlByb2JsZW1EaWFsb2cudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgdGl0bGUsIHByb2JsZW1UZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvVXBkYXRlTWFuYWdlclVJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvVXBkYXRlTWFuYWdlclVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWFkMTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL1VwZGF0ZU1hbmFnZXJVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7Ci0KLS8qKgotICogRW50cnkgcG9pbnQgaW50byB1cGRhdGUgbWFuYWdlciBVSS4KLSAqIENsaWVudHMgY2FuIHVzZSB0aGlzIGNsYXNzIHRvIGxhdW5jaCB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VyIHdpbmRvdyBvciB0aGUgaW5zdGFsbCB3aXphcmQuCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5hZ2VyVUkgewotCi0JLyoqCi0JICogT3BlbnMgdGhlIGNvbmZpZ3VyYXRpb24gbWFuYWdlciB3aW5kb3cuIFRoaXMgaXMgdXNlZCB0byBtYW5hZ2UgYSBjdXJyZW50IGluc3RhbGxhdGlvbiAKLQkgKiBjb25maWd1cmF0aW9uOiBicm93c2VyIHNpdGVzLCBlbmFibGUvZGlzYWJsZSBmZWF0dXJlcywgZXRjLgotCSAqIEBwYXJhbSBzaGVsbCB0aGUgcGFyZW50IHNoZWxsIHRvIHVzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuQ29uZmlndXJhdGlvbk1hbmFnZXIoU2hlbGwgc2hlbGwpIHsKLQotCQlBcHBsaWNhdGlvbldpbmRvdyBhcHBXaW5kb3cgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3coc2hlbGwpOwotCQlhcHBXaW5kb3cuY3JlYXRlKCk7Ci0JCWFwcFdpbmRvdy5vcGVuKCk7Ci0JfQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBpbnN0YWxsIHdpemFyZCBkaWFsb2cuIFRoaXMgd2l6YXJkIGlzIHVzZWQgdG8gZmluZCBhbmQgaW5zdGFsbCB1cGRhdGVzIHRvIGV4aXN0aW5nCi0JICogZmVhdHVyZXMsIG9yIHRvIGZpbmQgYW5kIGluc3RhbGwgbmV3IGZlYXR1cmVzLgotCSAqIEBwYXJhbSBzaGVsbCB0aGUgZGlhbG9nIHBhcmVudCBzaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuSW5zdGFsbGVyKFNoZWxsIHNoZWxsKSB7Ci0JCUluc3RhbGxXaXphcmQgd2l6YXJkID0gbmV3IEluc3RhbGxXaXphcmQoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBSZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQsIFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZEFjdGlvbi50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9JbnN0YWxsU2VydmxldC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9JbnN0YWxsU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ3MDMyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvSW5zdGFsbFNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZXJ2bGV0czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotLyoqCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbFNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0JcHJpdmF0ZSBTZXJ2bGV0Q29uZmlnIHNlcnZsZXRDb25maWc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9OQU1FID0gIi9JbnN0YWxsU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKLQkJdGhpcy5zZXJ2bGV0Q29uZmlnID0gY29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0JfQotCi0JcHVibGljIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpIHsKLQkJcmV0dXJuIHNlcnZsZXRDb25maWc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0SW5mbygpIHsKLQkJcmV0dXJuICJFY2xpcHNlIEluc3RhbGwgc2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJ2aWNlKAotCQlIdHRwU2VydmxldFJlcXVlc3Qgc2VydmxldFJlcXVlc3QsCi0JCUh0dHBTZXJ2bGV0UmVzcG9uc2Ugc2VydmxldFJlc3BvbnNlKQotCQl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlQcmludFdyaXRlciB3cml0ZXIgPQotCQkJU2VydmxldHNVdGlsLmNyZWF0ZVJlc3BvbnNlUHJvbG9ndWUoc2VydmxldFJlc3BvbnNlKTsKLQkJZXhlY3V0ZSh3cml0ZXIsIHNlcnZsZXRSZXF1ZXN0KTsKLQkJU2VydmxldHNVdGlsLmNyZWF0ZVJlc3BvbnNlRXBpbG9ndWUoCi0JCQlzZXJ2bGV0UmVxdWVzdCwKLQkJCXNlcnZsZXRSZXNwb25zZSwKLQkJCXdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGV4ZWN1dGUuCi0JICogQHBhcmFtIHNlcnZsZXRSZXF1ZXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoCi0JCVByaW50V3JpdGVyIHdyaXRlciwKLQkJSHR0cFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0KSB7Ci0JCVN0cmluZyBzZXJ2ZXJVUkwgPSBzZXJ2bGV0UmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlcnZlciIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaWNlbnNlID0gc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJsaWNlbnNlIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UgPSB0cnVlOwotCQlpZiAobGljZW5zZSAhPSBudWxsICYmIGxpY2Vuc2UuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJbmVlZExpY2Vuc2VQYWdlID0gZmFsc2U7Ci0KLQkJU3RyaW5nW10gdmVyc2lvbmVkSWRzID0gc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKCJmZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoc2VydmVyVVJMID09IG51bGwpIHsKLQkJCWNyZWF0ZVBhZ2VFcnJvcih3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFNlcnZsZXQudW5rbm93blNlcnZlclVSTCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh2ZXJzaW9uZWRJZHMgPT0gbnVsbCkgewotCQkJY3JlYXRlUGFnZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsU2VydmxldC5ub0ZlYXR1cmVzIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmlzSW5Qcm9ncmVzcygpKSB7Ci0JCQlTZXJ2bGV0c1V0aWwuY3JlYXRlRXJyb3Iod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LmluUHJvZ3Jlc3MiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotLy8JCWlmIChEZXRhaWxzRm9ybS5pc0luUHJvZ3Jlc3MoKSkgewotLy8JCQlTZXJ2bGV0c1V0aWwuY3JlYXRlRXJyb3Iod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LmluUHJvZ3Jlc3MiKSwgbnVsbCk7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChzZXJ2ZXJVUkwpOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllcltdIHZpZHMgPQotCQkJCWNvbXB1dGVWZXJzaW9uZWRJZGVudGlmaWVycyh2ZXJzaW9uZWRJZHMpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0KLQkJCQlleGVjdXRlSW5zdGFsbCh3cml0ZXIsIHVybCwgdmlkcywgbmVlZExpY2Vuc2VQYWdlKTsKLQkJCWlmIChzdWNjZXNzKQotCQkJCVNlcnZsZXRzVXRpbC5jcmVhdGVJbmZvKHdyaXRlcik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQljcmVhdGVQYWdlRXJyb3Iod3JpdGVyLCBVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKCJJbnN0YWxsU2VydmxldC5pbmNvcnJlY3RVUkxGb3JtYXQiLCAvLyROT04tTkxTLTEkCi0JCQlzZXJ2ZXJVUkwudG9TdHJpbmcoKSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhZ2VFcnJvcihQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBwcm9ibGVtKSB7Ci0JCVNlcnZsZXRzVXRpbC5jcmVhdGVFcnJvcih3cml0ZXIsIHByb2JsZW0sIFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFNlcnZsZXQuY29udGFjdFdlYm1hc3RlciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgVmVyc2lvbmVkSWRlbnRpZmllcltdIGNvbXB1dGVWZXJzaW9uZWRJZGVudGlmaWVycyhTdHJpbmdbXSBhcnJheSkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgaWRfdmVyc2lvbiA9IGFycmF5W2ldOwotCQkJaW50IHNlcCA9IGlkX3ZlcnNpb24ubGFzdEluZGV4T2YoJ18nKTsKLQkJCWlmIChzZXAgPT0gLTEpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgaWQgPSBpZF92ZXJzaW9uLnN1YnN0cmluZygwLCBzZXApOwotCQkJU3RyaW5nIHZlcnNpb24gPSBpZF92ZXJzaW9uLnN1YnN0cmluZyhzZXAgKyAxKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoaWQsIHZlcnNpb24pOwotCQkJcmVzdWx0LmFkZCh2aWQpOwotCQl9Ci0JCXJldHVybiAoVmVyc2lvbmVkSWRlbnRpZmllcltdKSByZXN1bHQudG9BcnJheSgKLQkJCW5ldyBWZXJzaW9uZWRJZGVudGlmaWVyW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZUluc3RhbGwoCi0JCWZpbmFsIFByaW50V3JpdGVyIHdyaXRlciwKLQkJZmluYWwgVVJMIHNpdGVVUkwsCi0JCWZpbmFsIFZlcnNpb25lZElkZW50aWZpZXJbXSB2aWRzLAotCQlmaW5hbCBib29sZWFuIG5lZWRMaWNlbnNlUGFnZSkgewotCi0JCURpc3BsYXkgZGlzcGxheSA9IFNXVFV0aWwuZ2V0U3RhbmRhcmREaXNwbGF5KCk7Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhbltdIHsgZmFsc2UgfTsKLQotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaW5hbCBTaGVsbCBzaGVsbCA9IFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCk7Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoc2hlbGwuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXJlc3VsdFswXSA9Ci0JCQkJCQkJZG9FeGVjdXRlSW5zdGFsbCgKLQkJCQkJCQkJd3JpdGVyLAotCQkJCQkJCQlzaGVsbCwKLQkJCQkJCQkJc2l0ZVVSTCwKLQkJCQkJCQkJdmlkcywKLQkJCQkJCQkJbmVlZExpY2Vuc2VQYWdlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZG9FeGVjdXRlSW5zdGFsbCgKLQkJUHJpbnRXcml0ZXIgd3JpdGVyLAotCQlmaW5hbCBTaGVsbCBzaGVsbCwKLQkJVVJMIHNpdGVVUkwsCi0JCVZlcnNpb25lZElkZW50aWZpZXJbXSB2aWRzLAotCQlmaW5hbCBib29sZWFuIG5lZWRMaWNlbnNlUGFnZSkgewotCQkJCi0JCXNoZWxsLmZvcmNlQWN0aXZlKCk7Ci0KLQkJVXBkYXRlU2VhcmNoU2NvcGUgc2VhcmNoU2NvcGUgPSBuZXcgVXBkYXRlU2VhcmNoU2NvcGUoKTsKLQkJc2VhcmNoU2NvcGUuYWRkU2VhcmNoU2l0ZSgKLQkJCXNpdGVVUkwudG9TdHJpbmcoKSwKLQkJCXNpdGVVUkwsCi0JCQluZXcgU3RyaW5nWzBdKTsKLQotCQlmaW5hbCBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QgPQotCQkJbmV3IFVwZGF0ZVNlYXJjaFJlcXVlc3QoCi0JCQkJbmV3IFNpdGVTZWFyY2hDYXRlZ29yeSgpLAotCQkJCXNlYXJjaFNjb3BlKTsKLQkKLQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXJzRmlsdGVyKHZpZHMpKTsKLQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEVudmlyb25tZW50RmlsdGVyKCkpOwotCQlzZWFyY2hSZXF1ZXN0LmFkZEZpbHRlcihuZXcgQmFja0xldmVsRmlsdGVyKCkpOwotCi0JCXNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW9wZW5XaXphcmQoc2hlbGwsIHNlYXJjaFJlcXVlc3QpOwotCQkJfQotCQl9KTsJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaXphcmQoU2hlbGwgc2hlbGwsIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCkgewotCQlJbnN0YWxsV2l6YXJkIHdpemFyZCA9IG5ldyBJbnN0YWxsV2l6YXJkKHNlYXJjaFJlcXVlc3QpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFJlc2l6YWJsZVdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotLy8JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoCi0vLwkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfT1BUSU9OQUxfSU5TVEFMTF9USVRMRSkpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDYwMCwgNTAwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHdpemFyZC5pc1N1Y2Nlc3NmdWxJbnN0YWxsKCkpCi0JCQlVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvU2VydmxldHNVdGlsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL1NlcnZsZXRzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhlZmYyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvU2VydmxldHNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VydmxldHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuYm9vdC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRzVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJJbmZvKEh0dHBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCkgewotCQlTdHJpbmcgaG9zdCA9IHNlcnZsZXRSZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKLQkJaW50IHBvcnQgPSBzZXJ2bGV0UmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk7Ci0JCVN0cmluZyBjb250ZXh0ID0gc2VydmxldFJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKLQotCQlFbnVtZXJhdGlvbiBhdHRzID0gc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoOyBhdHRzLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGF0dE5hbWUgPSAoU3RyaW5nKSBhdHRzLm5leHRFbGVtZW50KCk7Ci0JCQlPYmplY3QgYXR0VmFsdWUgPSBzZXJ2bGV0UmVxdWVzdC5nZXRQYXJhbWV0ZXIoYXR0TmFtZSk7Ci0JCQlidWZmLmFwcGVuZChhdHROYW1lICsgIj0iICsgIlwiIiArIGF0dFZhbHVlICsgIlwiKyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXJldHVybiBob3N0ICsgIjoiICsgcG9ydCArIGNvbnRleHQgKyAiPyIgKyBidWZmLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJpbnRXcml0ZXIgY3JlYXRlUmVzcG9uc2VQcm9sb2d1ZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7Ci0JCVN0cmluZyB0aXRsZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnJlc3BvbnNlVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigKLQkJCSIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCIgLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTlwiPiIgLy8kTk9OLU5MUy0xJAotCQkJCSsgIlxuIDxIVE1MPiBcbiA8SEVBRD4gXG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrICI8VElUTEU+Iit0aXRsZSsiPC9USVRMRT5cbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJKyAiPE1FVEEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLThcIj5cbiIgLy8kTk9OLU5MUy0xJAotCQkJCSsgIjwvSEVBRD4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiIDxCT0RZIHRvcG1hcmdpbj1cIjBcIiBsZWZ0bWFyZ2luPVwiMFwiPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB3cml0ZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUVycm9yKAotCQlQcmludFdyaXRlciB3cml0ZXIsCi0JCVN0cmluZyBwcm9ibGVtLAotCQlTdHJpbmcgcmVzb2x1dGlvbikgewotCQljcmVhdGVIZWFkaW5nKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwudXBkYXRlRmFpbGVkIikpOyAvLyROT04tTkxTLTEkCi0JCXN0YXJ0VGV4dEFyZWEod3JpdGVyKTsKLQkJY3JlYXRlUGFyYWdyYXBoKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwucHJvYmxlbSIpLCBwcm9ibGVtKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzb2x1dGlvbiAhPSBudWxsKSB7Ci0JCQl3cml0ZXIucHJpbnRsbigiPHA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZVBhcmFncmFwaCh3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLndoYXRUb0RvIiksIHJlc29sdXRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZW5kVGV4dEFyZWEod3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUGFyYWdyYXBoKAotCQlQcmludFdyaXRlciB3cml0ZXIsCi0JCVN0cmluZyBoZWFkaW5nLAotCQlTdHJpbmcgdGV4dCkgewotCQl3cml0ZXIucHJpbnQoIjxiPjxmb250IGNvbG9yPVwiIzVCNzhBQ1wiPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludChoZWFkaW5nKTsKLQkJd3JpdGVyLnByaW50bG4oIjwvYj48L2ZvbnQ+PGJyPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKHRleHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVJbmZvKFByaW50V3JpdGVyIHdyaXRlcikgewotCQljcmVhdGVIZWFkaW5nKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwudXBkYXRlSW5Qcm9ncmVzcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFydFRleHRBcmVhKHdyaXRlcik7Ci0JCXdyaXRlci5wcmludGxuKAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwudXBkYXRlSW5pdGlhdGVkIikpOyAvLyROT04tTkxTLTEkCi0JCWVuZFRleHRBcmVhKHdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXaW4zMigpIHsKLQkJcmV0dXJuIEJvb3RMb2FkZXIuZ2V0V1MoKS5lcXVhbHMoIndpbjMyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHN0YXJ0VGV4dEFyZWEoUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlci5wcmludGxuKAotCQkJIjx0YWJsZSBib3JkZXI9XCIwXCIgd2lkdGg9XCIxMDAlXCIgY2VsbHNwYWNpbmc9XCI1XCIgY2VsbHBhZGRpbmc9XCI1XCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjx0cj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnQoIjx0ZCB3aWR0aD1cIjEwMCVcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNXaW4zMigpKQotCQkJd3JpdGVyLnByaW50bG4oIjxmb250IGZhY2U9XCJNUyBTYW5zIFNlcmlmXCIgc2l6ZT1cIjFcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQl3cml0ZXIucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmRUZXh0QXJlYShQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKGlzV2luMzIoKSkKLQkJCXdyaXRlci5wcmludGxuKCI8L2ZvbnQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGFibGU+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSGVhZGluZyhQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyB0aXRsZSkgewotCQl3cml0ZXIucHJpbnRsbigKLQkJCSI8dGFibGUgY29scz0xIHdpZHRoPVwiNTg4XCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIwXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjx0cj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigKLQkJCSI8dGQgYmFja2dyb3VuZD1cImltYWdlcy9mb3JtX2Jhbm5lci5qcGdcIiB3aWR0aD1cIjU4MFwiIGhlaWdodD1cIjMwXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50KCI8cD48Yj48Zm9udCBzaXplPVwiM1wiIGZhY2U9XCJUYWhvbWFcIj4mbmJzcDsiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnQodGl0bGUpOwotCQl3cml0ZXIucHJpbnRsbigiPC9mb250PjwvYj48L3A+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQl3cml0ZXIucHJpbnRsbigiPHRyPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKAotCQkJIjx0ZCB3aWR0aD1cIjU4MFwiPjxpbWcgYm9yZGVyPVwiMFwiIHNyYz1cImltYWdlcy9mb3JtX3VuZGVybGluZS5qcGdcIiB3aWR0aD1cIjYwMFwiIGhlaWdodD1cIjE1XCI+PC90ZD4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiPC90ZD4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiPC90cj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiPC90YWJsZT4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVSZXNwb25zZUVwaWxvZ3VlKAotCQlIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKLQkJUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0KLQkJU3RyaW5nIGJhY2tVUkwgPSBnZXRPcmlnaW5hdGluZ1VSTChyZXF1ZXN0KTsKLQkJaWYgKGJhY2tVUkwgIT0gbnVsbCkgewotCQkJc3RhcnRUZXh0QXJlYSh3cml0ZXIpOwotCQkJU3RyaW5nIGJhY2tUZXh0ID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwuYmFjayIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnQoIjxpbWcgYm9yZGVyPVwiMFwiIHNyYz1cImltYWdlcy9iYWNrd2FyZF9uYXYuZ2lmXCIvPjxhIGhyZWY9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KGdldE9yaWdpbmF0aW5nVVJMKHJlcXVlc3QpKTsKLQkJCXdyaXRlci5wcmludCgiXCI+IitiYWNrVGV4dCsiPC9hPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWVuZFRleHRBcmVhKHdyaXRlcik7Ci0JCX0KLQkJd3JpdGVyLnByaW50bG4oIiA8L0JPRFk+ICIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L0hUTUw+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JfQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hdGluZ1VSTChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImJhY2tVUkwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjA3ZTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY2xhc3NlcwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi9saWIvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvbGliLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjkyYTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi9saWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXVwZGF0ZS1zZXJ2bGV0cy5qYXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4NDc3NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci0KLQotPCFET0NUWVBFIHdlYi1hcHAKLSAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiIKLSAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yLjIuZHRkIj4KLQotPHdlYi1hcHA+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5pbnN0YWxsPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZXJ2bGV0cy5JbnN0YWxsU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8L3NlcnZsZXQ+Ci0gICAgCi0JPHNlcnZsZXQtbWFwcGluZz4KLQkJPHNlcnZsZXQtbmFtZT5pbnN0YWxsPC9zZXJ2bGV0LW5hbWU+Ci0JCTx1cmwtcGF0dGVybj4vaW5zdGFsbDwvdXJsLXBhdHRlcm4+Ci0JPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLTwvd2ViLWFwcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvYmFja3dhcmRfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9iYWNrd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTE4OGI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9iYWNrd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2Zvcm1fYmFubmVyLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX2Jhbm5lci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1M2UyZDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2Zvcm1fYmFubmVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX3VuZGVybGluZS5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvZm9ybV91bmRlcmxpbmUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmYzZDBiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX3VuZGVybGluZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjUzMWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIgcm9vdHBhdGg9IkpSRV9TUkNST09UIiBzb3VyY2VwYXRoPSJKUkVfU1JDIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIKLSAgICAgICAgcGF0aD0iRUNMSVBTRV9IT01FL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ib290L2Jvb3QuamFyIiBzb3VyY2VwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLmJvb3QvYm9vdHNyYy56aXAiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIgotICAgICAgICBwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcnVudGltZS5qYXIiIHNvdXJjZXBhdGg9IkVDTElQU0VfSE9NRS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS9ydW50aW1lc3JjLnppcCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiCi0gICAgICAgIHBhdGg9IkVDTElQU0VfSE9NRS9wbHVnaW5zL29yZy5lY2xpcHNlLnN3dC9zd3QuamFyIiBzb3VyY2VwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS5zd3Qvc3d0c3JjLnppcCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiCi0gICAgICAgIHBhdGg9IkVDTElQU0VfSE9NRS9wbHVnaW5zL29yZy5lY2xpcHNlLnVpL3dvcmtiZW5jaC5qYXIiIHNvdXJjZXBhdGg9IkVDTElQU0VfSE9NRS9wbHVnaW5zL29yZy5lY2xpcHNlLnVpL3dvcmtiZW5jaHNyYy56aXAiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS53ZWJkYXYvd2ViZGF2LmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8udmNtX21ldGEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy52Y21fbWV0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1NWY4ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy52Y21fbWV0YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdC1kZXNjcmlwdGlvbj4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8bmF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIi8+DQotCTxidWlsZGVyIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyIj4NCi0JPC9idWlsZGVyPg0KLTwvcHJvamVjdC1kZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMTVlNWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPGh0bWw+DQotPGhlYWQ+DQotPHRpdGxlPkFib3V0PC90aXRsZT4NCi08c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLXAsIHRhYmxlLCB0ZCwgdGggeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHR9DQotcHJlIHsgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm87IGZvbnQtc2l6ZTogMTBwdH0NCi1oMiB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMThwdDsgZm9udC13ZWlnaHQ6IGJvbGQgOyBsaW5lLWhlaWdodDogMTRweH0NCi1jb2RlIHsgZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm87IGZvbnQtc2l6ZTogMTBwdH0NCi1zdXAgeyBmb250LWZhbWlseTogYXJpYWwsaGVsdmV0aWNhLGdlbmV2YTsgZm9udC1zaXplOiAxMHB4fQ0KLWgzIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZH0NCi1saSB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0NCi1oMSB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMjhweDsgZm9udC13ZWlnaHQ6IGJvbGR9DQotYm9keSB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdDsgY2xpcDogcmVjdCggICApOyBtYXJnaW4tdG9wOiA1bW07IG1hcmdpbi1sZWZ0OiAzbW19DQotPC9zdHlsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGJvZHkgbGFuZz1FTi1VUyBsaW5rPWJsdWUgdmxpbms9cHVycGxlPg0KLTx0YWJsZSBib3JkZXI9MCBjZWxsc3BhY2luZz01IGNlbGxwYWRkaW5nPTIgd2lkdGg9IjEwMCUiID4NCi0gIDx0cj4gDQotICAgIDx0ZCBhbGlnbj1MRUZUIHZhbGlnbj1UT1AgY29sc3Bhbj0iMiIgYmdjb2xvcj0iIzAwODBDMCI+PGI+PGZvbnQgY29sb3I9IiNGRkZGRkYiIGZhY2U9IkFyaWFsLEhlbHZldGljYSI+QWJvdXQgVGhpcyBQbHVnLWluPC9mb250PjwvYj48L3RkPg0KLSAgPC90cj4NCi0gIDx0cj4gDQotICAgIDx0ZD4gDQotPHA+MXN0IE5vdmVtYmVyLCAyMDAxPC9wPgkNCi08aDM+TGljZW5zZTwvaDM+DQotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbi4gIFRoZSBwbHVnLWluIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlDQotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwiPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDAuNTwvYT4uICBGb3IgcHVycG9zZXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIHBsdWctaW4uPC9wPg0KLTwvdGQ+PC90cj48L3RhYmxlPg0KLTwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzdkYTAzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotc291cmNlLnVwZGF0ZS5qYXI9c3JjLw0KLWJpbi5pbmNsdWRlcz1wbHVnaW4ueG1sLGljb25zLyxwbHVnaW4ucHJvcGVydGllcywqLmphcixhYm91dC5odG1sDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC9jdG9vbDE2L25ldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNmQ1YjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9pY29ucy9mdWxsL2N0b29sMTYvbmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC9jdG9vbDE2L3VwZGF0ZS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvY3Rvb2wxNi91cGRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDExZDhhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC9jdG9vbDE2L3VwZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvd2l6YmFuL25ldy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvd2l6YmFuL25ldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMGM3OTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9pY29ucy9mdWxsL3dpemJhbi9uZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9pY29ucy9mdWxsL3dpemJhbi9yZXZlcnQuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9pY29ucy9mdWxsL3dpemJhbi9yZXZlcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzQwMmEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC93aXpiYW4vcmV2ZXJ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC93aXpiYW4vdXBkYXRlLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC93aXpiYW4vdXBkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmMTVkYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvd2l6YmFuL3VwZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwNTJlZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1TX0VjbGlwc2VfVXBkYXRlX01hbmFnZXJfUGx1Z2luID0gSW5zdGFsbC9VcGRhdGUgTWFuYWdlcg0KLVNfU29mdHdhcmVfVXBkYXRlcyA9ICZTb2Z0d2FyZSBVcGRhdGVzDQotU19Tb2Z0d2FyZV9VcGRhdGVzX1ByZWZlcmVuY2VzID0gU29mdHdhcmUgVXBkYXRlcw0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmODc4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0gRmlsZSB3cml0dGVuIGJ5IFBERSAxLjAgLS0+DQotPHBsdWdpbg0KLSAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUiDQotICAgbmFtZT0iJVNfRWNsaXBzZV9VcGRhdGVfTWFuYWdlcl9QbHVnaW4iDQotICAgdmVyc2lvbj0iMS4wIg0KLSAgIHByb3ZpZGVyLW5hbWU9IkludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4iDQotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJQbHVnaW4iPg0KLTxyZXF1aXJlcz4NCi0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+DQotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+DQotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndlYmRhdiIvPg0KLTwvcmVxdWlyZXM+DQotDQotPHJ1bnRpbWU+DQotICAgPGxpYnJhcnkgbmFtZT0idXBkYXRlLmphciIvPg0KLTwvcnVudGltZT4NCi0NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tIFVwZGF0ZSBNYW5hZ2VyIEhlbHAgTWVudSBBY3Rpb24gU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi08ZXh0ZW5zaW9uDQotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPg0KLSAgIDxhY3Rpb25TZXQNCi0gICAgICAgICBsYWJlbD0iJVNfU29mdHdhcmVfVXBkYXRlcyINCi0gICAgICAgICB2aXNpYmxlPSJmYWxzZSINCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZU1hbmFnZXJBY3Rpb25TZXQiPg0KLSAgICAgIDxhY3Rpb24NCi0gICAgICAgICAgICBsYWJlbD0iJVNfU29mdHdhcmVfVXBkYXRlcyINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVNRGlhbG9nQWN0aW9uIg0KLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJoZWxwL2hlbHBFbmQiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVNYW5hZ2VyQWN0aW9uIj4NCi0gICAgICA8L2FjdGlvbj4NCi0gICA8L2FjdGlvblNldD4NCi08L2V4dGVuc2lvbj4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSBVcGRhdGUgTWFuYWdlciBBcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotPGV4dGVuc2lvbg0KLSAgICAgIGlkPSJ1cGRhdGVNYW5hZ2VyIg0KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4NCi0gICA8YXBwbGljYXRpb24+DQotICAgICAgPHJ1bg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVU1BcHBsaWNhdGlvblVzZXJJbnRlcmZhY2UiPg0KLSAgICAgIDwvcnVuPg0KLSAgIDwvYXBwbGljYXRpb24+DQotPC9leHRlbnNpb24+DQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9wbHVnaW4ueG1sLm9mZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvcGx1Z2luLnhtbC5vZmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODM4MzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9wbHVnaW4ueG1sLm9mZgorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyIFBsdWdpbiAtLT4NCi0NCi08cGx1Z2luDQotICAgIGlkICAgICAgICAgID0gIm9yZy5lY2xpcHNlLnVwZGF0ZSINCi0gICAgbmFtZSAgICAgICAgPSAiJVNfRWNsaXBzZV9VcGRhdGVfTWFuYWdlcl9QbHVnaW4iDQotICAgIHZlcnNpb24gICAgID0gIjEuMCINCi0gICAgcHJvdmlkZXItbmFtZSA9ICJJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIg0KLSAgICBjbGFzcyAgICAgICA9ICJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyUGx1Z2luIj4NCi0NCi0gICAgPHJlcXVpcmVzPg0KLSAgICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPg0KLSAgICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+DQotICAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud2ViZGF2Ii8+DQotICAgIDwvcmVxdWlyZXM+DQotDQotICAgIDxydW50aW1lPg0KLSAgICAgICAgPGxpYnJhcnkgbmFtZT0idXBkYXRlLmphciIgLz4NCi0gICAgPC9ydW50aW1lPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gVXBkYXRlIE1hbmFnZXIgUHJlZmVyZW5jZSBQYWdlIFNldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+DQotICAgICAgICA8cGFnZSBpZCAgICAgICA9ICJVTVByZWZlcmVuY2VQYWdlU2V0dGluZ3MiDQotICAgICAgICAgICAgICBuYW1lICAgICA9ICIlU19Tb2Z0d2FyZV9VcGRhdGVzX1ByZWZlcmVuY2VzIg0KLSAgICAgICAgICAgICAgY2xhc3MgICAgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVNUHJlZmVyZW5jZVBhZ2VTZXR0aW5ncyI+DQotICAgICAgICA8L3BhZ2U+DQotICAgIDwvZXh0ZW5zaW9uPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gVXBkYXRlIE1hbmFnZXIgSGVscCBNZW51IEFjdGlvbiBTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPg0KLSAgICAgICAgPGFjdGlvblNldA0KLSAgICAgICAgICAgIGlkICAgICAgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZU1hbmFnZXJBY3Rpb25TZXQiDQotICAgICAgICAgICAgbGFiZWwgICA9ICIlU19Tb2Z0d2FyZV9VcGRhdGVzIg0KLSAgICAgICAgICAgIHZpc2libGUgPSAidHJ1ZSI+DQotICAgICAgICAgICAgPGFjdGlvbiBpZCAgICAgICAgICA9ICJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlTWFuYWdlckFjdGlvbiINCi0gICAgICAgICAgICAgICAgICAgIG1lbnViYXJQYXRoID0gImhlbHAvaGVscEVuZCINCi0gICAgICAgICAgICAgICAgICAgIGxhYmVsICAgICAgID0gIiVTX1NvZnR3YXJlX1VwZGF0ZXMiDQotICAgICAgICAgICAgICAgICAgICBjbGFzcyAgICAgICA9ICJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVU1EaWFsb2dBY3Rpb24iLz4NCi0gICAgICAgIDwvYWN0aW9uU2V0Pg0KLSAgICA8L2V4dGVuc2lvbj4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgPCEtLSBVcGRhdGUgTWFuYWdlciBBcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPGV4dGVuc2lvbiBpZD0idXBkYXRlTWFuYWdlciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPg0KLSAgICAgICAgPGFwcGxpY2F0aW9uPg0KLSAgICAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VTUFwcGxpY2F0aW9uVXNlckludGVyZmFjZSI+DQotICAgICAgICAgICAgPC9ydW4+DQotICAgICAgICA8L2FwcGxpY2F0aW9uPg0KLSAgICA8L2V4dGVuc2lvbj4NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JU2Vzc2lvbkRlZmluZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0lTZXNzaW9uRGVmaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjZjYTA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0lTZXNzaW9uRGVmaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi0vKioNCi0gKi8NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS4qOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlc3Npb25EZWZpbmVyIHsNCi0vKioNCi0gKiBDcmVhdGVzIG9uZSBvciBtb3JlIG9wZXJhdGlvbnMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uDQotICovDQotdm9pZCBkZWZpbmVPcGVyYXRpb25zKCBVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbiBzZXNzaW9uLCBJSW5zdGFsbGFibGVbXSBkZXNjcmlwdG9ycywgYm9vbGVhbiBiVmVyaWZ5SmFycyApOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JVU1Mb2NrLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JVU1Mb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWM5MDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVVNTG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi0vKioNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElVTUxvY2sgew0KLS8qKg0KLSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIFVNTG9jayBmaWxlIGlzIHRoZXJlLiAgSWYgeWVzLCByZXR1cm5zIHRydWUNCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBleGlzdHMoKTsNCi0vKioNCi0gKi8NCi12b2lkIHJlbW92ZSgpOw0KLS8qKg0KLSAqLw0KLXZvaWQgc2V0KCk7DQotLyoqDQotICovDQotdm9pZCBzZXQoU3RyaW5nIG1zZyk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNTG9jay5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1Mb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDhkOWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1Mb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLw0KLQ0KLS8qKg0KLSAqLw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLio7DQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1wdWJsaWMgY2xhc3MgVU1Mb2NrIGltcGxlbWVudHMgSVVNTG9jayB7DQotCUZpbGUgZmlsZSA9IG51bGw7DQotLyoqDQotICogVU1Mb2NrIGNvbnN0cnVjdG9yIGNvbW1lbnQuDQotICovDQotcHVibGljIFVNTG9jaygpIHsNCi0Jc3VwZXIoKTsNCi0JVVJMIGxvY2tmaWxlVVJMID0gbnVsbDsNCi0JdHJ5IHsNCi0JCWxvY2tmaWxlVVJMID0gbmV3IFVSTChVTUVjbGlwc2VUcmVlLmdldEluc3RhbGxUcmVlVVJMKCksIElNYW5pZmVzdEF0dHJpYnV0ZXMuVU1fTE9DSyk7DQotCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQl9DQotCWZpbGUgPSBnZXRGaWxlKGxvY2tmaWxlVVJMKTsNCi19DQotLyoqDQotICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgVU1Mb2NrIGZpbGUgaXMgdGhlcmUuICBJZiB5ZXMsIHJldHVybnMgdHJ1ZQ0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsNCi0JDQotCWlmIChmaWxlICE9IG51bGwpIHsNCi0JCWlmIChmaWxlLmV4aXN0cygpID09IHRydWUpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLS8qKg0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRGaWxlKFVSTCB1cmwpIHsNCi0JRmlsZSBmaWxlID0gbnVsbDsNCi0JaWYgKHVybCAhPSBudWxsKSB7DQotDQotCQkvLyBDb252ZXJ0IHRoZSBVUkwgdG8gYSBzdHJpbmcNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJU3RyaW5nIHN0ckZpbGVzcGVjID0gVU1FY2xpcHNlVHJlZS5nZXRGaWxlSW5QbGF0Zm9ybVN0cmluZyh1cmwpOw0KLQ0KLQkJZmlsZSA9IG5ldyBGaWxlKHN0ckZpbGVzcGVjKTsNCi0JfQ0KLQlyZXR1cm4gZmlsZTsNCi19DQotLyoqDQotICovDQotcHVibGljIHZvaWQgcmVtb3ZlKCkgew0KLQlpZiAoZXhpc3RzKCkpDQotCQlmaWxlLmRlbGV0ZSgpOw0KLQkJDQotfQ0KLS8qKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldCgpIHsNCi0Jc2V0KCIiKTsNCi19DQotLyoqDQotICovDQotcHVibGljIHZvaWQgc2V0KFN0cmluZyBtc2cpIHsNCi0JVVJMIGxvY2tmaWxlVVJMID0gbnVsbDsNCi0JdHJ5IHsNCi0JCWxvY2tmaWxlVVJMID0gbmV3IFVSTChVTUVjbGlwc2VUcmVlLmdldEluc3RhbGxUcmVlVVJMKCksIElNYW5pZmVzdEF0dHJpYnV0ZXMuVU1fTE9DSyk7DQotCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQl9DQotCQ0KLQkvLyBDcmVhdGUgYSBsb2NrIGZpbGUNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUxvZyBsb2NrZmlsZSA9IG5ldyBMb2coKTsNCi0NCi0JdHJ5IHsNCi0JCWxvY2tmaWxlLmxvYWQobG9ja2ZpbGVVUkwpOwkJLy8gY3JlYXRlcyBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QNCi0JfQ0KLQljYXRjaCAoTG9nU3RvcmVFeGNlcHRpb24gZXgpIHsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQkvLyBBZGQgYW4gZW50cnkNCi0JLy8tLS0tLS0tLS0tLS0tDQotCUxvZ0VudHJ5IGxvY2tFbnRyeSA9IG5ldyBMb2dFbnRyeSggbG9ja2ZpbGUsIG1zZyApOw0KLQlsb2NrZmlsZS5hZGRDaGlsZEVudHJ5KCBsb2NrRW50cnkgKTsNCi0NCi0NCi0JdHJ5IHsNCi0JCWxvY2tmaWxlLnNhdmUobG9ja2ZpbGVVUkwpOw0KLQl9DQotCWNhdGNoIChMb2dTdG9yZUV4Y2VwdGlvbiBleCkgew0KLQkJcmV0dXJuOw0KLQl9DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25EZWZpbmVyUmVmZXJlbmNlVXBkYXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25EZWZpbmVyUmVmZXJlbmNlVXBkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MDA5MWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uRGVmaW5lclJlZmVyZW5jZVVwZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotLyoqDQotICovDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LkxhdW5jaEluZm87DQotDQotcHVibGljIGNsYXNzIFVNU2Vzc2lvbkRlZmluZXJSZWZlcmVuY2VVcGRhdGUgaW1wbGVtZW50cyBJU2Vzc2lvbkRlZmluZXIgew0KLS8qKg0KLSAqIFVNVXBkYXRlckNhY2hlZCBjb25zdHJ1Y3RvciBjb21tZW50Lg0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25EZWZpbmVyUmVmZXJlbmNlVXBkYXRlKCkgew0KLQlzdXBlcigpOw0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIG9uZSBvciBtb3JlIG9wZXJhdGlvbnMgZm9yIHRoZSBjdXJyZW50IHBhcmNlbC4NCi0gKi8NCi1wdWJsaWMgdm9pZCBkZWZpbmVDb21wb25lbnRPcGVyYXRpb24oVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBwYXJjZWwsIElJbnN0YWxsYWJsZSBkZXNjcmlwdG9yLCBib29sZWFuIGJWZXJpZnlKYXJzKSB7DQotDQotCUlDb21wb25lbnREZXNjcmlwdG9yIGNvbXBvbmVudERlc2NyaXB0b3IgPSBudWxsOw0KLQ0KLQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIElDb21wb25lbnREZXNjcmlwdG9yKSB7DQotCQljb21wb25lbnREZXNjcmlwdG9yID0gKElDb21wb25lbnREZXNjcmlwdG9yKSBkZXNjcmlwdG9yOw0KLQl9DQotCWVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSB7DQotCQljb21wb25lbnREZXNjcmlwdG9yID0gKChJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRDb21wb25lbnREZXNjcmlwdG9yKCk7DQotCX0NCi0JaWYgKGNvbXBvbmVudERlc2NyaXB0b3IgPT0gbnVsbCkNCi0JCXJldHVybjsgDQotDQotCVVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsNCi0NCi0JLy8gQ3JlYXRlIGRvd25sb2FkIG9wZXJhdGlvbg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCW9wZXJhdGlvbiA9IHBhcmNlbC5jcmVhdGVPcGVyYXRpb24oKTsNCi0Jb3BlcmF0aW9uLnNldEFjdGlvbihVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9DT1BZKTsNCi0Jb3BlcmF0aW9uLnNldElkKGNvbXBvbmVudERlc2NyaXB0b3IuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsNCi0Jb3BlcmF0aW9uLnNldFNvdXJjZShjb21wb25lbnREZXNjcmlwdG9yLmdldERvd25sb2FkVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7DQotCVN0cmluZyBkb3dubG9hZFRhcmdldCA9IFVNRWNsaXBzZVRyZWUuZ2V0U3RhZ2luZ0FyZWEoKS50b0V4dGVybmFsRm9ybSgpICsgY29tcG9uZW50RGVzY3JpcHRvci5nZXREaXJOYW1lKCkgKyAiLmphciI7DQotCW9wZXJhdGlvbi5zZXRUYXJnZXQoZG93bmxvYWRUYXJnZXQpOw0KLQlvcGVyYXRpb24uc2V0RGF0YShkZXNjcmlwdG9yKTsNCi0NCi0JLy8gQ3JlYXRlIGphciB2ZXJpZmljYXRpb24gb3BlcmF0aW9uDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoYlZlcmlmeUphcnMgPT0gdHJ1ZSkgew0KLQkJb3BlcmF0aW9uID0gcGFyY2VsLmNyZWF0ZU9wZXJhdGlvbigpOw0KLQkJb3BlcmF0aW9uLnNldEFjdGlvbihVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9WRVJJRllfSkFSKTsNCi0JCW9wZXJhdGlvbi5zZXRJZChjb21wb25lbnREZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7DQotCQlvcGVyYXRpb24uc2V0U291cmNlKGRvd25sb2FkVGFyZ2V0KTsNCi0JCW9wZXJhdGlvbi5zZXRUYXJnZXQobnVsbCk7DQotCQlvcGVyYXRpb24uc2V0RGF0YShkZXNjcmlwdG9yKTsNCi0JfQ0KLQ0KLQkvLyBDcmVhdGUgYXBwbHkgb3BlcmF0aW9uIGZvciBjb21wb25lbnQgZmlsZXMgKGZpbGVzIG5vdCBpbiBwbHVnaW5zLyBkaXIgc3RydWN0dXJlKQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlvcGVyYXRpb24gPSBwYXJjZWwuY3JlYXRlT3BlcmF0aW9uKCk7DQotCW9wZXJhdGlvbi5zZXRBY3Rpb24oVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfSU5TVEFMTCk7DQotCW9wZXJhdGlvbi5zZXRJZChjb21wb25lbnREZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7DQotCW9wZXJhdGlvbi5zZXRTb3VyY2UoZG93bmxvYWRUYXJnZXQpOw0KLQlTdHJpbmcgYXBwbHlUYXJnZXQgPSBVTUVjbGlwc2VUcmVlLmdldEJhc2VJbnN0YWxsVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JLy8JU3RyaW5nIGFwcGx5VGFyZ2V0ID0gImZpbGU6Ly8vYzovdGVtcC94LyIgOw0KLQlvcGVyYXRpb24uc2V0VGFyZ2V0KGFwcGx5VGFyZ2V0KTsNCi0Jb3BlcmF0aW9uLnNldERhdGEoZGVzY3JpcHRvcik7DQotDQotCS8vIENyZWF0ZSBhcHBseSBvcGVyYXRpb24gZm9yIHBsdWctaW5zCQkNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JSVBsdWdpbkVudHJ5RGVzY3JpcHRvcltdIHBsdWdpbnMgPSBjb21wb25lbnREZXNjcmlwdG9yLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JSUZyYWdtZW50RW50cnlEZXNjcmlwdG9yW10gZnJhZ21lbnRzID0gY29tcG9uZW50RGVzY3JpcHRvci5nZXRGcmFnbWVudEVudHJpZXMoKTsNCi0JaWYgKChwbHVnaW5zLmxlbmd0aCA+IDApIHx8IChmcmFnbWVudHMubGVuZ3RoID4wKSkgew0KLQkJb3BlcmF0aW9uID0gcGFyY2VsLmNyZWF0ZU9wZXJhdGlvbigpOw0KLQkJb3BlcmF0aW9uLnNldEFjdGlvbihVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9QTFVHSU5TKTsNCi0JCW9wZXJhdGlvbi5zZXRJZChjb21wb25lbnREZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7DQotCQlvcGVyYXRpb24uc2V0U291cmNlKGRvd25sb2FkVGFyZ2V0KTsNCi0JCS8vIGJ5IHNwZWNpZml5aW5nIHRoZSBpbnN0YWxsIGRpciB3aXRoIGEgdHJhaWxpbmcgc2xhc2gsIHRoZSB1bnppcCBtZXRob2QNCi0JCS8vIHdpbGwganVzdCB1bnppcCB0aGUgY29udGVudHMgb2YgdGhlIGphciBpbnRvIHRoZSBkaXINCi0JCWFwcGx5VGFyZ2V0ID0gVU1FY2xpcHNlVHJlZS5nZXRCYXNlSW5zdGFsbFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkvLwlhcHBseVRhcmdldCA9ICJmaWxlOi8vL2M6L3RlbXAveC8iIDsNCi0JCW9wZXJhdGlvbi5zZXRUYXJnZXQoYXBwbHlUYXJnZXQpOw0KLQkJb3BlcmF0aW9uLnNldERhdGEoZGVzY3JpcHRvcik7DQotCX0NCi0NCi19DQotLyoqDQotICogQ3JlYXRlcyBvbmUgb3IgbW9yZSBvcGVyYXRpb25zIGZvciB0aGUgY3VycmVudCBzZXNzaW9uLg0KLSAqLw0KLXB1YmxpYyB2b2lkIGRlZmluZU9wZXJhdGlvbnMoVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbiwgSUluc3RhbGxhYmxlW10gZGVzY3JpcHRvcnMsIGJvb2xlYW4gYlZlcmlmeUphcnMpIHsNCi0NCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7ICsraSkgew0KLQ0KLQkJLy8gUHJvZHVjdHMNCi0JCS8vLS0tLS0tLS0tDQotCQlpZiAoZGVzY3JpcHRvcnNbaV0gaW5zdGFuY2VvZiBJUHJvZHVjdERlc2NyaXB0b3IpIHsNCi0NCi0JCQlVTVNlc3Npb25NYW5hZ2VyUGFyY2VsIHBhcmNlbCA9IG51bGw7DQotDQotCQkJLy8gQ3JlYXRlIHBhcmNlbA0KLQkJCS8vLS0tLS0tLS0tLS0tLS0NCi0JCQlwYXJjZWwgPSBzZXNzaW9uLmNyZWF0ZVBhcmNlbCgpOw0KLQkJCXBhcmNlbC5zZXRUeXBlKElNYW5pZmVzdEF0dHJpYnV0ZXMuUFJPRFVDVCk7DQotCQkJcGFyY2VsLnNldEFjdGlvbihVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9BQ1RJT05fSU5TVEFMTCk7DQotCQkJcGFyY2VsLnNldElkKCgoSVByb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yc1tpXSkuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsNCi0JCQlwYXJjZWwuc2V0RGF0YSgoSVByb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yc1tpXSk7DQotDQotCQkJZGVmaW5lUHJvZHVjdE9wZXJhdGlvbihwYXJjZWwsIGRlc2NyaXB0b3JzW2ldLCBiVmVyaWZ5SmFycyk7DQotCQl9DQotDQotCQkvLyBDb21wb25lbnRzDQotCQkvLy0tLS0tLS0tLS0tDQotCQllbHNlIGlmIChkZXNjcmlwdG9yc1tpXSBpbnN0YW5jZW9mIElDb21wb25lbnREZXNjcmlwdG9yKSB7DQotDQotCQkJVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBwYXJjZWwgPSBudWxsOw0KLQ0KLQkJCS8vIENyZWF0ZSBwYXJjZWwNCi0JCQkvLy0tLS0tLS0tLS0tLS0tDQotCQkJcGFyY2VsID0gc2Vzc2lvbi5jcmVhdGVQYXJjZWwoKTsNCi0JCQlwYXJjZWwuc2V0VHlwZShJTWFuaWZlc3RBdHRyaWJ1dGVzLkNPTVBPTkVOVCk7DQotCQkJcGFyY2VsLnNldEFjdGlvbihVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9BQ1RJT05fSU5TVEFMTCk7DQotCQkJcGFyY2VsLnNldElkKCgoSUNvbXBvbmVudERlc2NyaXB0b3IpIGRlc2NyaXB0b3JzW2ldKS5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOw0KLQkJCXBhcmNlbC5zZXREYXRhKChJQ29tcG9uZW50RGVzY3JpcHRvcikgZGVzY3JpcHRvcnNbaV0pOw0KLQ0KLQkJCWRlZmluZUNvbXBvbmVudE9wZXJhdGlvbihwYXJjZWwsIGRlc2NyaXB0b3JzW2ldLCBiVmVyaWZ5SmFycyk7DQotCQl9DQotDQotCQkvLyBDb21wb25lbnQgRW50cmllcw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWVsc2UgaWYgKGRlc2NyaXB0b3JzW2ldIGluc3RhbmNlb2YgSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgew0KLQ0KLQkJCVVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgcGFyY2VsID0gbnVsbDsNCi0NCi0JCQkvLyBDcmVhdGUgcGFyY2VsDQotCQkJLy8tLS0tLS0tLS0tLS0tLQ0KLQkJCXBhcmNlbCA9IHNlc3Npb24uY3JlYXRlUGFyY2VsKCk7DQotCQkJcGFyY2VsLnNldFR5cGUoSU1hbmlmZXN0QXR0cmlidXRlcy5DT01QT05FTlQpOw0KLQkJCXBhcmNlbC5zZXRBY3Rpb24oVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fQUNUSU9OX0lOU1RBTEwpOw0KLQkJCXBhcmNlbC5zZXRJZCgoKElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzW2ldKS5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOw0KLQkJCXBhcmNlbC5zZXREYXRhKChJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9yc1tpXSk7DQotDQotCQkJZGVmaW5lQ29tcG9uZW50T3BlcmF0aW9uKHBhcmNlbCwgZGVzY3JpcHRvcnNbaV0sIGJWZXJpZnlKYXJzKTsNCi0JCX0NCi0JfQ0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIG9uZSBvciBtb3JlIG9wZXJhdGlvbnMgZm9yIHRoZSBjdXJyZW50IHBhcmNlbC4NCi0gKi8NCi1wdWJsaWMgdm9pZCBkZWZpbmVQcm9kdWN0T3BlcmF0aW9uKFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgcGFyY2VsLCBJSW5zdGFsbGFibGUgZGVzY3JpcHRvciwgYm9vbGVhbiBiVmVyaWZ5SmFycykgew0KLQ0KLQlJUHJvZHVjdERlc2NyaXB0b3IgcHJvZHVjdERlc2NyaXB0b3IgPSAoSVByb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yOw0KLQlVTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG51bGw7DQotDQotCS8vIENyZWF0ZSBkb3dubG9hZCBvcGVyYXRpb24NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlvcGVyYXRpb24gPSBwYXJjZWwuY3JlYXRlT3BlcmF0aW9uKCk7DQotCW9wZXJhdGlvbi5zZXRBY3Rpb24oVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fQ09QWSk7DQotCW9wZXJhdGlvbi5zZXRJZChwcm9kdWN0RGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOw0KLQlvcGVyYXRpb24uc2V0U291cmNlKHByb2R1Y3REZXNjcmlwdG9yLmdldERvd25sb2FkVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7DQotCVN0cmluZyBkb3dubG9hZFRhcmdldCA9IFVNRWNsaXBzZVRyZWUuZ2V0U3RhZ2luZ0FyZWEoKS50b1N0cmluZygpICsgcHJvZHVjdERlc2NyaXB0b3IuZ2V0RGlyTmFtZSgpICsgIi5qYXIiOw0KLQlvcGVyYXRpb24uc2V0VGFyZ2V0KGRvd25sb2FkVGFyZ2V0KTsNCi0Jb3BlcmF0aW9uLnNldERhdGEocHJvZHVjdERlc2NyaXB0b3IpOw0KLQ0KLQkvLyBDcmVhdGUgamFyIHZlcmlmaWNhdGlvbiBvcGVyYXRpb24NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChiVmVyaWZ5SmFycyA9PSB0cnVlKSB7DQotCQlvcGVyYXRpb24gPSBwYXJjZWwuY3JlYXRlT3BlcmF0aW9uKCk7DQotCQlvcGVyYXRpb24uc2V0QWN0aW9uKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1ZFUklGWV9KQVIpOw0KLQkJb3BlcmF0aW9uLnNldElkKHByb2R1Y3REZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7DQotCQlvcGVyYXRpb24uc2V0U291cmNlKGRvd25sb2FkVGFyZ2V0KTsNCi0JCW9wZXJhdGlvbi5zZXRUYXJnZXQobnVsbCk7DQotCQlvcGVyYXRpb24uc2V0RGF0YShwcm9kdWN0RGVzY3JpcHRvcik7DQotCX0NCi0NCi0JLy8gQ3JlYXRlIGFwcGx5IG9wZXJhdGlvbiBmb3IgcHJvZHVjdCBmaWxlcyAgICAgDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0Jb3BlcmF0aW9uID0gcGFyY2VsLmNyZWF0ZU9wZXJhdGlvbigpOw0KLQlvcGVyYXRpb24uc2V0QWN0aW9uKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0lOU1RBTEwpOw0KLQlvcGVyYXRpb24uc2V0SWQocHJvZHVjdERlc2NyaXB0b3IuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsNCi0Jb3BlcmF0aW9uLnNldFNvdXJjZShkb3dubG9hZFRhcmdldCk7DQotCVN0cmluZyBhcHBseVRhcmdldCA9IFVNRWNsaXBzZVRyZWUuZ2V0QmFzZUluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpOw0KLQlvcGVyYXRpb24uc2V0VGFyZ2V0KGFwcGx5VGFyZ2V0KTsNCi0Jb3BlcmF0aW9uLnNldERhdGEocHJvZHVjdERlc2NyaXB0b3IpOw0KLQ0KLQkvLyBDcmVhdGUgY29tcG9uZW50IHN1Yi1wYXJjZWxzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcltdIGVudHJpZXMgPSBwcm9kdWN0RGVzY3JpcHRvci5nZXRDb21wb25lbnRFbnRyaWVzKCk7DQotCWZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7ICsraikgew0KLQkJaWYgKGVudHJpZXNbal0uaXNTZWxlY3RlZCgpKSB7DQotDQotCQkJVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBzdWJwYXJjZWwgPSBudWxsOw0KLQkJCS8vIENyZWF0ZSBwYXJjZWwgZm9yIGVhY2ggY29tcG9uZW50DQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQlzdWJwYXJjZWwgPSBwYXJjZWwuY3JlYXRlUGFyY2VsKCk7DQotCQkJc3VicGFyY2VsLnNldFR5cGUoSU1hbmlmZXN0QXR0cmlidXRlcy5DT01QT05FTlQpOw0KLQkJCXN1YnBhcmNlbC5zZXRBY3Rpb24oVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fQUNUSU9OX0lOU1RBTEwpOw0KLQkJCXN1YnBhcmNlbC5zZXRJZChlbnRyaWVzW2pdLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7DQotCQkJc3VicGFyY2VsLnNldERhdGEoZW50cmllc1tqXSk7DQotDQotCQkJZGVmaW5lQ29tcG9uZW50T3BlcmF0aW9uKHN1YnBhcmNlbCwgZW50cmllc1tqXSwgYlZlcmlmeUphcnMpOw0KLQkJfQ0KLQl9DQotDQotCS8vIENyZWF0ZSBhcHBseSBvcGVyYXRpb24gZm9yIHByb2R1Y3QgZmlsZXMgICAgIA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVN0cmluZyBhcHAgPSBMYXVuY2hJbmZvLmdldEN1cnJlbnQoKS5nZXRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb25JZGVudGlmaWVyKCk7DQotCWlmICgoYXBwICE9IG51bGwpICYmIChhcHAuZXF1YWxzKHByb2R1Y3REZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSkpKSB7IAkvLyBkb21pbmFudCBhcHA/DQotCQlvcGVyYXRpb24gPSBwYXJjZWwuY3JlYXRlT3BlcmF0aW9uKCk7DQotCQlvcGVyYXRpb24uc2V0QWN0aW9uKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0JJTkRJUik7DQotCQlvcGVyYXRpb24uc2V0SWQocHJvZHVjdERlc2NyaXB0b3IuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsNCi0JCW9wZXJhdGlvbi5zZXRTb3VyY2UoZG93bmxvYWRUYXJnZXQpOw0KLQkJb3BlcmF0aW9uLnNldFRhcmdldChhcHBseVRhcmdldCk7DQotCQlvcGVyYXRpb24uc2V0RGF0YShwcm9kdWN0RGVzY3JpcHRvcik7DQotCX0NCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzNzliNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuKjsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi0vKioNCi0gKiBTZXNzaW9uIE1hbmFnZXIgZXhlY3V0ZXMgZGVmaW5lZCBzZXNzaW9ucywgYW5kIG1hbmFnZXMgdGhlIHVwZGF0ZSBhbmQgdXBkYXRlIGhpc3RvcnkgbG9ncy4NCi0gKiBMb2dzIGxvb2sgbGlrZSB0aGlzOg0KLSAqDQotICogPHNlc3Npb24gdGltZXN0YW1wPSJ4eHh4IiBzdGF0dXM9ImNvbXBsZXRlIiBhdHRlbXB0cz0iMSI+DQotICogICA8b3BlcmF0aW9uIGFjdGlvbj0idXJsdG9jYWNoZSIgc3RhdHVzPSJjb21wbGV0ZSIgYXR0ZW1wdHM9IjEiPg0KLSAqICAgICAgPHBhcmNlbCB0eXBlPSJjb21wb25lbnQiIGlkPSJ4eHgiIGFjdGlvbj0iYWRkIiBzdGF0dXM9ImNvbXBsZXRlIiBhdHRlbXB0cz0iMSI+DQotICogICAgICAgICA8aXRlbSBpZD0ieHh4IiBzb3VyY2U9ImZpbGU6Ly8vQzovdGVtcC9zYW1wbGVfaW4uamF2YSIgdGFyZ2V0PSJmaWxlOi8vL0M6L3RlbXAvc2FtcGxlX291dC5qYXZhIiBzdGF0dXM9ImNvbXBsZXRlIiBhdHRlbXB0cz0iMSI+DQotICogICAgICAgICAgICA8bWVzc2FnZSB0ZXh0PSJzdWNjZXNzZnVsIiB0aW1lc3RhbXA9IlRodSBNYXIgMDEgMDk6NTY6NDkgRVNUIDIwMDEiIC8+DQotICogICAgICAgICA8L2l0ZW0+DQotICogICAgICA8L3BhcmNlbD4NCi0gKiAgIDwvb3BlcmF0aW9uPg0KLSAqIDwvc2Vzc2lvbj4NCi0gKg0KLSAqDQotICogIEVhY2ggZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhbiBVcGRhdGVNYW5hZ2VyWHl6IGNsYXNzIGFuZCBoYXZlIHNwZWNpZmljDQotICogbWVtYmVyIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIGRvbWFpbiBzcGVjaWZpYyBhdHRyaWJ1dGVzIGFuZCBjaGlsZCBlbGVtZW50cy4NCi0gKiBUaGUgInN0YXR1cyIgYXR0cmlidXRlIGNhbiBiZSBvbmUgb2YgInBlbmRpbmciLCAiZmFpbGVkIiwgb3IgImNvbXBsZXRlIi4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVU1TZXNzaW9uTWFuYWdlciB7DQotCQ0KLQlwcm90ZWN0ZWQgTG9nIF9sb2dVcGRhdGUgID0gbnVsbDsNCi0JcHJvdGVjdGVkIExvZyBfbG9nSGlzdG9yeSA9IG51bGw7DQotCQ0KLQlwcm90ZWN0ZWQgVVJMIF91cmxVcGRhdGUgID0gbnVsbDsNCi0JcHJvdGVjdGVkIFVSTCBfdXJsSGlzdG9yeSA9IG51bGw7DQotDQotCXByb3RlY3RlZCBBcnJheUxpc3QgX2FsVXBkYXRlU2Vzc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotLyoqDQotICogQ29uc3RydWN0cyBhbiBVcGRhdGVNYW5hZ2VyIHdpdGggdGhlIHVwZGF0ZSBsb2cgYW5kIGhpc3RvcnkgbG9nIFVSTHMuDQotICogVGhlIGJvb2xlYW4gc3BlY2lmaWVzIHdoZXRoZXIgYW4gZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gaWYgb25lIG9mDQotICogdGhlIGxvZ3MgaXMgbm90IGZvdW5kLg0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyKFVSTCB1cmxVcGRhdGVMb2csIFVSTCB1cmxIaXN0b3J5TG9nLCBib29sZWFuIG5vdGlmeUlmTG9nTm90Rm91bmQpIHRocm93cyBMb2dTdG9yZUV4Y2VwdGlvbiB7DQotDQotCV91cmxVcGRhdGUgPSB1cmxVcGRhdGVMb2c7DQotCV91cmxIaXN0b3J5ID0gdXJsSGlzdG9yeUxvZzsNCi0NCi0JLy8gQXR0ZW1wdCB0byBvcGVuIHRoZSB0d28gbG9ncw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCV9sb2dVcGRhdGUgPSBuZXcgTG9nKCk7DQotCV9sb2dIaXN0b3J5ID0gbmV3IExvZygpOw0KLQ0KLQkvLyBJZiB0aGUgZmlsZXMgZG8gbm90IGV4aXN0DQotCS8vIG5vdGlmeSBpZiByZXF1aXJlZC4gIE90aGVyd2lzZSBhc3N1bWUgbmV3IGZpbGVzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCXRyeSB7DQotCQlfbG9nVXBkYXRlLmxvYWQoX3VybFVwZGF0ZSk7DQotCX0NCi0JY2F0Y2ggKExvZ1N0b3JlRXhjZXB0aW9uIGV4KSB7DQotLy8JCV9sb2dVcGRhdGUucHJpbnRFbnRyeVRyZWUoMCk7DQotCQlpZiAobm90aWZ5SWZMb2dOb3RGb3VuZCA9PSB0cnVlKSB7DQotCQkJdGhyb3cgZXg7DQotCQl9DQotCX0NCi0NCi0JLy8gQ3JlYXRlIHRoZSB1cGRhdGUgc2Vzc2lvbiBzdHJ1Y3R1cmUgZnJvbSB0aGUgbG9nDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlidWlsZFRyZWVGcm9tTG9nKCBfbG9nVXBkYXRlICk7DQotDQotLyoJDQotCXRyeSB7DQotCQlfbG9nSGlzdG9yeS5sb2FkKF91cmxVcGRhdGUpOw0KLQl9DQotCWNhdGNoIChMb2dTdG9yZUV4Y2VwdGlvbiBleCkgew0KLQkJDQotCQlpZiAobm90aWZ5SWZMb2dOb3RGb3VuZCA9PSB0cnVlKSB7DQotCQkJdGhyb3cgZXg7DQotCQl9DQotCX0NCi0NCi0JX2xvZ0hpc3RvcnkucHJpbnRFbnRyeVRyZWUoMCk7DQotKi8NCi19DQotLyoqDQotICogQ3JlYXRlcyBhIHRyZWUgb2Ygc2Vzc2lvbnMgZnJvbSB0aGUgZ2l2ZW4gbG9nLg0KLSAqIEBwYXJhbSBsb2dVcGRhdGUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTG9nDQotICogQHBhcmFtIGFsVXBkYXRlIGphdmEudXRpbC5BcnJheUxpc3QNCi0gKi8NCi1wcml2YXRlIHZvaWQgYnVpbGRUcmVlRnJvbUxvZyhMb2cgbG9nVXBkYXRlICkgew0KLQkNCi0JSUxvZ0VudHJ5W10gZW50cnlDaGlsZHJlbiA9IGxvZ1VwZGF0ZS5nZXRDaGlsZEVudHJpZXMoKTsNCi0NCi0JVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbiA9IG51bGw7DQotCQ0KLQlmb3IoIGludCBpPTA7IGk8ZW50cnlDaGlsZHJlbi5sZW5ndGg7ICsraSApDQotCXsNCi0JCXNlc3Npb24gPSBuZXcgVU1TZXNzaW9uTWFuYWdlclNlc3Npb24oIGVudHJ5Q2hpbGRyZW5baV0gKTsNCi0NCi0JCV9hbFVwZGF0ZVNlc3Npb25zLmFkZCggc2Vzc2lvbiApOw0KLQkJDQotCQlzZXNzaW9uLmJ1aWxkVHJlZUZyb21Mb2coIGVudHJ5Q2hpbGRyZW5baV0gKTsNCi0JfQ0KLQkNCi0JcmV0dXJuOw0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIGEgbmV3IHVwZGF0ZSBzZXNzaW9uIHdoZXJlIHBlbmRpbmcgb3BlcmF0aW9ucyBtYXkgYmUgZGVmaW5lZCBmb3INCi0gKiBjb21wbGV0aW9uLg0KLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVU1TZXNzaW9uTWFuYWdlclNlc3Npb24NCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gY3JlYXRlVXBkYXRlU2Vzc2lvbigpIHsNCi0NCi0JVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gdW1TZXNzaW9uID0gbnVsbDsNCi0JDQotCWlmKCBfbG9nVXBkYXRlICE9IG51bGwgKQ0KLQl7DQotCQlJTG9nRW50cnkgZW50cnlTZXNzaW9uID0gbmV3IExvZ0VudHJ5KCBfbG9nVXBkYXRlLCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19TRVNTSU9OICk7DQotCQkNCi0JCV9sb2dVcGRhdGUuYWRkQ2hpbGRFbnRyeSggZW50cnlTZXNzaW9uICk7DQotDQotCQl1bVNlc3Npb24gPSBuZXcgVU1TZXNzaW9uTWFuYWdlclNlc3Npb24oIGVudHJ5U2Vzc2lvbiApOw0KLQ0KLQkJdW1TZXNzaW9uLmJ1aWxkVHJlZUZyb21Mb2coIGVudHJ5U2Vzc2lvbiApOw0KLQ0KLQkJX2FsVXBkYXRlU2Vzc2lvbnMuYWRkKCB1bVNlc3Npb24gKTsNCi0JfQ0KLQkNCi0JcmV0dXJuIHVtU2Vzc2lvbjsNCi19DQotLyoqDQotICogUnVucyBhbGwgc2Vzc2lvbnMNCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlUGVuZGluZ1Nlc3Npb25zKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotDQotCS8vIFJ1biBlYWNoIG9mIHRoZSBmYWlsZWQgc2Vzc2lvbnMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlib29sZWFuIGJTdWNjZXNzID0gdHJ1ZTsNCi0NCi0JVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbiA9IG51bGw7DQotDQotCUl0ZXJhdG9yIGl0ZXIgPSBfYWxVcGRhdGVTZXNzaW9ucy5pdGVyYXRvcigpOw0KLQ0KLQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgPT0gdHJ1ZSkgew0KLQ0KLQkJc2Vzc2lvbiA9IChVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbikgaXRlci5uZXh0KCk7DQotDQotCQlpZiAoc2Vzc2lvbi5nZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfUEVORElORykgPT0gdHJ1ZSkgew0KLQkJCWlmIChzZXNzaW9uLmV4ZWN1dGUocHJvZ3Jlc3NNb25pdG9yKSA9PSBmYWxzZSkgew0KLQkJCQliU3VjY2VzcyA9IGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlyZXR1cm4gYlN1Y2Nlc3M7DQotfQ0KLS8qKg0KLSAqIFJ1bnMgb25lIHNlc3Npb24NCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlU2Vzc2lvbihVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbiBzZXNzaW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQlpZiAoc2Vzc2lvbiA9PSBudWxsKQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkvLyBSdW4gdGhlIHNlc3Npb24NCi0JLy8tLS0tLS0tLS0tLS0tLS0tDQotCXJldHVybiBzZXNzaW9uLmV4ZWN1dGUocHJvZ3Jlc3NNb25pdG9yKTsNCi19DQotLyoqDQotICogUnVucyBvbmUgc2Vzc2lvbg0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGV4ZWN1dGVTZXNzaW9uVW5kbyhVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbiBzZXNzaW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQlpZiAoc2Vzc2lvbiA9PSBudWxsKQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkvLyBSdW4gdGhlIHNlc3Npb24NCi0JLy8tLS0tLS0tLS0tLS0tLS0tDQotCXJldHVybiBzZXNzaW9uLmV4ZWN1dGVVbmRvKHByb2dyZXNzTW9uaXRvcik7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc2Vzc2lvbnMgdGhhdCBhcmUgY29tcGxldGUuDQotICogQHJldHVybiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbltdDQotICovDQotcHJpdmF0ZSBVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbltdIGdldFVwZGF0ZVNlc3Npb25zQ29tcGxldGVkKCkgew0KLQ0KLQkvLyBPYnRhaW4gdGhlIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgc2Vzc2lvbnMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIHNlc3Npb24gPSBudWxsOw0KLQ0KLQlBcnJheUxpc3QgYWxTZXNzaW9uc0NvbXBsZXRlZCA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0JSXRlcmF0b3IgaXRlciA9IF9hbFVwZGF0ZVNlc3Npb25zLml0ZXJhdG9yKCk7DQotDQotCXdoaWxlIChpdGVyLmhhc05leHQoKSA9PSB0cnVlKSB7DQotDQotCQlzZXNzaW9uID0gKFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uKSBpdGVyLm5leHQoKTsNCi0NCi0JCWlmIChzZXNzaW9uLmlzQ29tcGxldGUoKSA9PSB0cnVlKSB7DQotCQkJYWxTZXNzaW9uc0NvbXBsZXRlZC5hZGQoc2Vzc2lvbik7DQotCQl9DQotCX0NCi0NCi0JT2JqZWN0W10gb2JqQXJyYXkgPSBhbFNlc3Npb25zQ29tcGxldGVkLnRvQXJyYXkoKTsNCi0JVU1TZXNzaW9uTWFuYWdlclNlc3Npb25bXSBzZXNzaW9ucyA9IG5ldyBVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbltvYmpBcnJheS5sZW5ndGhdOw0KLQlTeXN0ZW0uYXJyYXljb3B5KG9iakFycmF5LCAwLCBzZXNzaW9ucywgMCwgb2JqQXJyYXkubGVuZ3RoKTsNCi0NCi0JcmV0dXJuIHNlc3Npb25zOw0KLX0NCi0vKioNCi0gKiBSZW1vdmVzIGFuIGV4aXN0aW5nIHVwZGF0ZSBzZXNzaW9uDQotICoNCi0gKi8NCi1wcml2YXRlIGJvb2xlYW4gcmVtb3ZlVXBkYXRlU2Vzc2lvbihVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbiBzZXNzaW9uKSB7DQotDQotCWlmIChzZXNzaW9uICE9IG51bGwgJiYgX2xvZ1VwZGF0ZSAhPSBudWxsKSB7DQotDQotCSAgICAvLyBFbnN1cmUgc2Vzc2lvbiBleGlzdHMNCi0JICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKF9hbFVwZGF0ZVNlc3Npb25zLmNvbnRhaW5zKHNlc3Npb24pID09IGZhbHNlKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJLy8gUmVtb3ZlIHRoZSBsb2cgZW50cnkNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAoc2Vzc2lvbi5nZXRMb2dFbnRyeSgpICE9IG51bGwpIHsNCi0NCi0JCQlpZiAoX2xvZ1VwZGF0ZS5yZW1vdmVDaGlsZEVudHJ5KHNlc3Npb24uZ2V0TG9nRW50cnkoKSkgPT0gZmFsc2UpIHsNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0NCi0JCQkvLyBSZW1vdmUgdGhlIHNlc3Npb24NCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQlfYWxVcGRhdGVTZXNzaW9ucy5yZW1vdmUoc2Vzc2lvbik7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KLSAqIFNhdmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB1cGRhdGUgbG9nLg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNhdmVVcGRhdGVMb2coKSB0aHJvd3MgTG9nU3RvcmVFeGNlcHRpb24gew0KLQlfbG9nVXBkYXRlLnNhdmUoIF91cmxVcGRhdGUgKTsNCi19DQotLyoqDQotICogTW92ZXMgYWxsIGNvbXBsZXRlZCBzZXNzaW9ucyBpbiB0aGUgdXBkYXRlIGxvZyB0byB0aGUgaGlzdG9yeSBsb2cuDQotICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGFyc2UgdGhlIGhpc3RvcnkgZmlsZS4gIFNlc3Npb25zIGFyZSB3cml0dGVuIHRvDQotICogdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBsb2cgYW5kIHJlbW92ZWQgZnJvbSB0aGUgdXBkYXRlIGxvZyB0cmVlLCBhbmQgdXBkYXRlDQotICogc2Vzc2lvbiB0cmVlLiAgVGhlIHVwZGF0ZSBsb2cgaXMgc2F2ZWQuDQotICovDQotcHVibGljIHZvaWQgdXBkYXRlQW5kU2F2ZUxvZ3MoKSB0aHJvd3MgTG9nU3RvcmVFeGNlcHRpb24gew0KLQ0KLQkvLyBDaGVjayBmb3IgaGlzdG9yeSBsb2cgVVJMDQotCS8vIElmIG5vbmUsIHNhdmUgdGhlIHVwZGF0ZSBsb2cNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoX3VybEhpc3RvcnkgPT0gbnVsbCkgew0KLQkJc2F2ZVVwZGF0ZUxvZygpOw0KLQkJcmV0dXJuOw0KLQl9DQotDQotCS8vIE9idGFpbiBhIGxpc3Qgb2YgY29tcGxldGVkIHVwZGF0ZSBzZXNzaW9ucw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JVU1TZXNzaW9uTWFuYWdlclNlc3Npb25bXSBzZXNzaW9uc0NvbXBsZXRlZCA9IGdldFVwZGF0ZVNlc3Npb25zQ29tcGxldGVkKCk7DQotDQotCS8vIElmIHRoZXJlIGFyZSBub25lLCBzYXZlIHRoZSB1cGRhdGUgbG9nDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChzZXNzaW9uc0NvbXBsZXRlZC5sZW5ndGggPD0gMCkgew0KLQkJc2F2ZVVwZGF0ZUxvZygpOw0KLQkJcmV0dXJuOw0KLQl9DQotDQotCS8vIEF0dGVtcHQgdG8gb3BlbiB0aGUgb3V0cHV0IGxvZw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JU3RyaW5nIHN0ckZpbGVzcGVjID0gVU1FY2xpcHNlVHJlZS5nZXRGaWxlSW5QbGF0Zm9ybVN0cmluZyhfdXJsSGlzdG9yeSk7DQotCQ0KLQ0KLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzdHJGaWxlc3BlYyk7DQotDQotCWJvb2xlYW4gYkV4aXN0cyA9IGZpbGUuZXhpc3RzKCk7DQotDQotCWlmIChiRXhpc3RzID09IGZhbHNlKSB7DQotCQl0cnkgew0KLQkJCWJFeGlzdHMgPSBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsNCi0JCX0NCi0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBDcmVhdGUgYSBmaWxlIHdyaXRlciBhbmQgc2VlayB0byB0aGUgZW5kIG9mIHRoZSBmaWxlDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JUmFuZG9tQWNjZXNzRmlsZSBmaWxlV3JpdGVyID0gbnVsbDsNCi0NCi0JaWYgKGJFeGlzdHMgPT0gdHJ1ZSkgew0KLQkJdHJ5IHsNCi0JCQlmaWxlV3JpdGVyID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZSwgInJ3Iik7DQotCQkJbG9uZyBsTGVuZ3RoID0gZmlsZVdyaXRlci5sZW5ndGgoKTsNCi0JCQlmaWxlV3JpdGVyLnNlZWsobExlbmd0aCk7DQotCQl9DQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCQlmaWxlV3JpdGVyID0gbnVsbDsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBXcml0ZSBvdXQgZWFjaCBzZXNzaW9uIGxvZyB0byB0aGUgaGlzdG9yeSBsb2cNCi0JLy8gUmVtb3ZlIHRoZSBzZXNzaW9uIGxvZyBmcm9tIHRoZSB1cGRhdGUgbG9nDQotCS8vIFNhdmUgYm90aCBsb2dzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0NCi0JaWYgKGZpbGVXcml0ZXIgIT0gbnVsbCkgew0KLQ0KLQkJSUxvZ0VudHJ5IGxvZ0VudHJ5ID0gbnVsbDsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnNDb21wbGV0ZWQubGVuZ3RoOyArK2kpIHsNCi0NCi0JCQlsb2dFbnRyeSA9IHNlc3Npb25zQ29tcGxldGVkW2ldLmdldExvZ0VudHJ5KCk7DQotDQotCQkJaWYgKGxvZ0VudHJ5ICE9IG51bGwpIHsNCi0JCQkJbG9nRW50cnkucHJpbnRQZXJzaXN0ZW50RW50cnlTdHJpbmcoc3RyYiwgMCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSBmaWxlDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChzdHJiLmxlbmd0aCgpID4gMCkgew0KLQkJdHJ5IHsNCi0JCQlmaWxlV3JpdGVyLndyaXRlKHN0cmIudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsNCi0JCQlmaWxlV3JpdGVyLmNsb3NlKCk7DQotCQl9DQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0NCi0JCX0NCi0JfQ0KLQ0KLQkvLyBSZW1vdmUgdGhlIHVwZGF0ZSBzZXNzaW9ucyBmcm9tIHRoZSB1cGRhdGUgbG9nDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZXNzaW9uc0NvbXBsZXRlZC5sZW5ndGg7ICsraSkgew0KLQkJcmVtb3ZlVXBkYXRlU2Vzc2lvbihzZXNzaW9uc0NvbXBsZXRlZFtpXSk7DQotCX0NCi0NCi0JLy8gU2F2ZSB0aGUgdXBkYXRlIGxvZyB0byBrZWVwIGxvZ3MgaW4gc3luYw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCXNhdmVVcGRhdGVMb2coKTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJFbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uTWFuYWdlckVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNjE2YzguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uTWFuYWdlckVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuKjsNCi0vKioNCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgdXBkYXRlIG1hbmFnZXIgb2JqZWN0cyB0aGF0IGhhdmUgYW4gSUxvZ0VudHJ5DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFVNU2Vzc2lvbk1hbmFnZXJFbnRyeSB7DQotCXByb3RlY3RlZCBJTG9nRW50cnkgX2xvZ0VudHJ5ID0gbnVsbDsNCi0JcHJvdGVjdGVkIElMb2dFbnRyeVByb3BlcnR5IF9wcm9wZXJ0eVN0YXR1cyA9IG51bGw7DQotCXByb3RlY3RlZCBJTG9nRW50cnlQcm9wZXJ0eSBfcHJvcGVydHlBdHRlbXB0cyA9IG51bGw7DQotCXByb3RlY3RlZCBPYmplY3QgICAgICAgICAgICBfb2JqRGF0YSA9IG51bGw7DQotLyoqDQotICogVXBkYXRlTWFuYWdlckVudHJ5IGNvbnN0cnVjdG9yIGNvbW1lbnQuDQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJFbnRyeSggSUxvZ0VudHJ5IGxvZ0VudHJ5ICkgew0KLQlfbG9nRW50cnkgPSBsb2dFbnRyeTsNCi0NCi0JLy8gU3RhdHVzDQotCS8vLS0tLS0tLQ0KLQlfcHJvcGVydHlTdGF0dXMgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfU1RBVFVTKTsNCi0NCi0JaWYgKF9wcm9wZXJ0eVN0YXR1cyA9PSBudWxsKSB7DQotCQlfcHJvcGVydHlTdGF0dXMgPSBuZXcgTG9nRW50cnlQcm9wZXJ0eShsb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfU1RBVFVTLCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19QRU5ESU5HICk7DQotCQlsb2dFbnRyeS5hZGRQcm9wZXJ0eSggX3Byb3BlcnR5U3RhdHVzICk7DQotCX0NCi0NCi0JLy8gQXR0ZW1wdHMNCi0JLy8tLS0tLS0tLS0NCi0JX3Byb3BlcnR5QXR0ZW1wdHMgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfQVRURU1QVFMpOw0KLQ0KLQlpZiAoX3Byb3BlcnR5QXR0ZW1wdHMgPT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5QXR0ZW1wdHMgPSBuZXcgTG9nRW50cnlQcm9wZXJ0eShsb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfQVRURU1QVFMsIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HXzAgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlBdHRlbXB0cyApOw0KLQl9DQotDQotfQ0KLS8qKg0KLSAqIEBwYXJhbSBsb2dFbnRyeSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JTG9nRW50cnkNCi0gKi8NCi1wdWJsaWMgdm9pZCBidWlsZFRyZWVGcm9tTG9nKElMb2dFbnRyeSBsb2dFbnRyeSkgew0KLQkNCi0JLy8gQXR0ZW1wdHMNCi0JLy8tLS0tLS0tLS0NCi0JSUxvZ0VudHJ5UHJvcGVydHkgcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfQVRURU1QVFMpOw0KLQ0KLQlpZiAocHJvcGVydHkgIT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5QXR0ZW1wdHMgPSBwcm9wZXJ0eTsNCi0JfQ0KLQkNCi0JLy8gU3RhdHVzDQotCS8vLS0tLS0tLQ0KLQlwcm9wZXJ0eSA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19TVEFUVVMpOw0KLQ0KLQlpZiAocHJvcGVydHkgIT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5U3RhdHVzID0gcHJvcGVydHk7DQotCX0NCi19DQotLyoqDQotICogDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICogQHBhcmFtIHN0clByZWZpeCBqYXZhLmxhbmcuU3RyaW5nDQotICogQHBhcmFtIGV4IGphdmEubGFuZy5FeGNlcHRpb24NCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGNyZWF0ZU1lc3NhZ2VTdHJpbmcoU3RyaW5nIHN0clByZWZpeCwgRXhjZXB0aW9uIGV4KSB7DQotDQotCVN0cmluZ0J1ZmZlciBzdHJiID0gbmV3IFN0cmluZ0J1ZmZlcihzdHJQcmVmaXgpOw0KLQ0KLQlpZiAoZXggIT0gbnVsbCkgew0KLQkJaWYgKGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSAhPSBudWxsKSB7DQotCQkJc3RyYi5hcHBlbmQoIjogIiArIGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7DQotCQl9DQotDQotCQllbHNlIGlmIChleC50b1N0cmluZygpICE9IG51bGwgJiYgZXgudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsNCi0JCQlzdHJiLmFwcGVuZCgiOiAiICsgZXgudG9TdHJpbmcoKSk7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHN0cmIudG9TdHJpbmcoKTsNCi19DQotLyoqDQotICogRXhlY3V0ZSBhbnkgcGVuZGluZyBvciBmYWlsZWQgdXBkYXRlcy4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciApOw0KLS8qKg0KLSAqIEV4ZWN1dGUgYW55IHBlbmRpbmcgb3IgZmFpbGVkIHVwZGF0ZXMuDQotICovDQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZVVuZG8oIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yICk7DQotLyoqDQotICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0DQotICovDQotcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RGF0YSgpIHsNCi0JcmV0dXJuIF9vYmpEYXRhOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSBsb2cgZW50cnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbiBvYmplY3QuDQotICogQHJldHVybiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JTG9nRW50cnkNCi0gKi8NCi1wdWJsaWMgSUxvZ0VudHJ5IGdldExvZ0VudHJ5KCkgew0KLQlyZXR1cm4gX2xvZ0VudHJ5Ow0KLX0NCi0vKioNCi0gKg0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgew0KLQ0KLQlyZXR1cm4gX3Byb3BlcnR5U3RhdHVzLmdldFZhbHVlKCk7DQotfQ0KLS8qKg0KLSAqIEBwYXJhbSBzdHJiIGphdmEubGFuZy5TdHJpbmdCdWZmZXINCi0gKiBAcGFyYW0gaUluZGVudGF0aW9uIGludA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldFN0YXR1c1N0cmluZyhTdHJpbmdCdWZmZXIgc3RyYiwgaW50IGlJbmRlbnRhdGlvbik7DQotLyoqDQotICogSW5jcmVtZW50cyB0aGUgdmFsdWUgb2YgdGhlIG51bWJlciBvZiBhdHRlbXB0cw0KLSAqLw0KLXB1YmxpYyB2b2lkIGluY3JlbWVudEF0dGVtcHRDb3VudCgpIHsNCi0NCi0JaW50IGlBdHRlbXB0cyA9IDA7DQotDQotCXRyeSB7DQotCQlpQXR0ZW1wdHMgPSBuZXcgSW50ZWdlcihfcHJvcGVydHlBdHRlbXB0cy5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOw0KLQl9DQotCWNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0JfQ0KLQ0KLQlfcHJvcGVydHlBdHRlbXB0cy5zZXRWYWx1ZSggSW50ZWdlci50b1N0cmluZyggKytpQXR0ZW1wdHMgKSApOw0KLX0NCi0vKioNCi0gKiBAcGFyYW0gc3RyYiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyDQotICogQHBhcmFtIGlJbmRlbnRhdGlvbiBpbnQNCi0gKi8NCi1wdWJsaWMgdm9pZCBpbmRlbnQoU3RyaW5nQnVmZmVyIHN0cmIsIGludCBpSW5kZW50YXRpb24pIHsNCi0NCi0JLy8gTGluZSBmZWVkDQotCS8vLS0tLS0tLS0tLQ0KLQlzdHJiLmFwcGVuZCggIlxuIiApOw0KLQ0KLQkvLyBJbmRlbnRhdGlvbiBzcGFjZXMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWZvciggaW50IGk9MDsgaTxpSW5kZW50YXRpb247ICsraSApew0KLQkJc3RyYi5hcHBlbmQoICIgIiApOw0KLQl9DQotfQ0KLS8qKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0QXR0ZW1wdENvdW50KCkgew0KLQlfcHJvcGVydHlBdHRlbXB0cy5zZXRWYWx1ZSggVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfMCApOw0KLX0NCi0vKioNCi0gKiBTdG9yZXMgSU1hbmlmZXN0RGVzY3JpcHRvcg0KLSAqIEBwYXJhbSBuZXdEYXRhIGphdmEubGFuZy5PYmplY3QNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXREYXRhKGphdmEubGFuZy5PYmplY3Qgb2JqRGF0YSkgew0KLQlfb2JqRGF0YSA9IG9iakRhdGE7DQotfQ0KLS8qKg0KLSAqIEV2ZXJ5IGVudHJ5IGhhcyBhIHN0YXR1cyBwcm9wZXJ0eS4NCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKiBAcGFyYW0gc3RhdHVzIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIHN0clN0YXR1cykgew0KLQ0KLQlfcHJvcGVydHlTdGF0dXMuc2V0VmFsdWUoIHN0clN0YXR1cyAhPSBudWxsID8gc3RyU3RhdHVzIDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTljOWI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLio7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGZhaWx1cmUgbWVzc2FnZSBhbmQgY29uc2lzdHMgb2YgYSB0aW1lc3RhbXAgYW5kIHRleHQuDQotICoNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2Ugew0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5IF9sb2dFbnRyeSA9IG51bGw7DQotCXByb3RlY3RlZCBJTG9nRW50cnlQcm9wZXJ0eSBfcHJvcGVydHlUaW1lc3RhbXAgPSBudWxsOw0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5UHJvcGVydHkgX3Byb3BlcnR5VGV4dCAgICAgID0gbnVsbDsNCi0vKioNCi0gKg0KLSAqIEBwYXJhbSBsb2dFbnRyeSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JTG9nRW50cnkNCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2UoSUxvZ0VudHJ5IGxvZ0VudHJ5KSB7DQotDQotCV9sb2dFbnRyeSA9IGxvZ0VudHJ5Ow0KLQkNCi0JLy8gVGV4dA0KLQkvLy0tLS0tDQotCV9wcm9wZXJ0eVRleHQgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVEVYVCk7DQotDQotCWlmIChfcHJvcGVydHlUZXh0ID09IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVRleHQgPSBuZXcgTG9nRW50cnlQcm9wZXJ0eShsb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVEVYVCwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlUZXh0ICk7DQotCX0NCi0NCi0JLy8gVGltZXN0YW1wDQotCS8vLS0tLS0tLS0tLQ0KLQlfcHJvcGVydHlUaW1lc3RhbXAgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVElNRVNUQU1QKTsNCi0NCi0JaWYgKF9wcm9wZXJ0eVRpbWVzdGFtcCA9PSBudWxsKSB7DQotCQlfcHJvcGVydHlUaW1lc3RhbXAgPSBuZXcgTG9nRW50cnlQcm9wZXJ0eShsb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVElNRVNUQU1QLCBuZXcgRGF0ZSgpLnRvU3RyaW5nKCkgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlUaW1lc3RhbXAgKTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBAcGFyYW0gbG9nRW50cnkgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTG9nRW50cnkNCi0gKi8NCi1wdWJsaWMgdm9pZCBidWlsZFRyZWVGcm9tTG9nKElMb2dFbnRyeSBsb2dFbnRyeSkgew0KLQkJDQotCS8vIFRleHQNCi0JLy8tLS0tLQ0KLQlJTG9nRW50cnlQcm9wZXJ0eSBwcm9wZXJ0eSA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19URVhUKTsNCi0NCi0JaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVRleHQgPSBwcm9wZXJ0eTsNCi0JfQ0KLQ0KLQkvLyBTb3VyY2UNCi0JLy8tLS0tLS0tDQotCXByb3BlcnR5ID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1RJTUVTVEFNUCk7DQotDQotCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7DQotCQlfcHJvcGVydHlUaW1lc3RhbXAgPSBwcm9wZXJ0eTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotCQ0KLQlyZXR1cm4gX3Byb3BlcnR5VGV4dC5nZXRWYWx1ZSgpOw0KLX0NCi0vKioNCi0gKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldFRleHQoIFN0cmluZyBzdHJJRCApIHsNCi0JX3Byb3BlcnR5VGV4dC5zZXRWYWx1ZSggc3RySUQgIT0gbnVsbCA/IHN0cklEIDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhYWRkNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53ZWJkYXYuaHR0cC5jbGllbnQuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC5MYXVuY2hJbmZvOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS4qOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBvcGVyYXRpb24gc3VjaCBhcyAiY29weSIgb3IgInVuemlwIi4NCi0gKiBBdHRyaWJ1dGVzIGFyZSBpZCwgc3RhdHVzIChwZW5kaW5nL2NvbXBsZXRlKSwgYWN0aW9uLA0KLSAqIHNvdXJjZSwgdGFyZ2V0LiAgQ2hpbGRyZW4gYXJlIG1lc3NhZ2VzLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBVTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uIGV4dGVuZHMgVU1TZXNzaW9uTWFuYWdlckVudHJ5IHsNCi0JCQ0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0ICAgICAgICAgX2FsTWVzc2FnZXMgICAgID0gbmV3IEFycmF5TGlzdCgpOw0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5UHJvcGVydHkgX3Byb3BlcnR5QWN0aW9uID0gbnVsbDsNCi0JcHJvdGVjdGVkIElMb2dFbnRyeVByb3BlcnR5IF9wcm9wZXJ0eUlEICAgICA9IG51bGw7DQotCXByb3RlY3RlZCBJTG9nRW50cnlQcm9wZXJ0eSBfcHJvcGVydHlTb3VyY2UgPSBudWxsOw0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5UHJvcGVydHkgX3Byb3BlcnR5VGFyZ2V0ID0gbnVsbDsNCi0vKioNCi0gKiBVcGRhdGVNYW5hZ2VyT3BlcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuDQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24oIElMb2dFbnRyeSBsb2dFbnRyeSApIHsNCi0Jc3VwZXIoIGxvZ0VudHJ5ICk7DQotDQotCS8vIEFjdGlvbg0KLQkvLy0tLS0tLS0NCi0JX3Byb3BlcnR5QWN0aW9uID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0FDVElPTik7DQotDQotCWlmIChfcHJvcGVydHlBY3Rpb24gPT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5QWN0aW9uID0gbmV3IExvZ0VudHJ5UHJvcGVydHkobG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0FDVElPTiwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlBY3Rpb24gKTsNCi0JfQ0KLQ0KLQkvLyBJZA0KLQkvLy0tLQ0KLQlfcHJvcGVydHlJRCA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19JRCk7DQotDQotCWlmIChfcHJvcGVydHlJRCA9PSBudWxsKSB7DQotCQlfcHJvcGVydHlJRCA9IG5ldyBMb2dFbnRyeVByb3BlcnR5KGxvZ0VudHJ5LCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19JRCwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlJRCApOw0KLQl9DQotDQotCS8vIFNvdXJjZQ0KLQkvLy0tLS0tLS0NCi0JX3Byb3BlcnR5U291cmNlID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1NPVVJDRSk7DQotDQotCWlmIChfcHJvcGVydHlTb3VyY2UgPT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5U291cmNlID0gbmV3IExvZ0VudHJ5UHJvcGVydHkobG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1NPVVJDRSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlTb3VyY2UgKTsNCi0JfQ0KLQ0KLQkvLyBUYXJnZXQNCi0JLy8tLS0tLS0tDQotCV9wcm9wZXJ0eVRhcmdldCA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19UQVJHRVQpOw0KLQ0KLQlpZiAoX3Byb3BlcnR5VGFyZ2V0ID09IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVRhcmdldCA9IG5ldyBMb2dFbnRyeVByb3BlcnR5KGxvZ0VudHJ5LCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19UQVJHRVQsIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotCQlsb2dFbnRyeS5hZGRQcm9wZXJ0eSggX3Byb3BlcnR5VGFyZ2V0KTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBAcGFyYW0gbG9nRW50cnkgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTG9nRW50cnkNCi0gKi8NCi1wdWJsaWMgdm9pZCBidWlsZFRyZWVGcm9tTG9nKElMb2dFbnRyeSBsb2dFbnRyeSkgew0KLQkNCi0Jc3VwZXIuYnVpbGRUcmVlRnJvbUxvZyggbG9nRW50cnkgKTsNCi0JDQotCS8vIEFjdGlvbg0KLQkvLy0tLS0tLS0NCi0JSUxvZ0VudHJ5UHJvcGVydHkgcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfQUNUSU9OKTsNCi0NCi0JaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCV9wcm9wZXJ0eUFjdGlvbiA9IHByb3BlcnR5Ow0KLQl9DQotCQ0KLQ0KLQkvLyBJZA0KLQkvLy0tLQ0KLQlwcm9wZXJ0eSA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19JRCk7DQotDQotCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7DQotCQlfcHJvcGVydHlJRCA9IHByb3BlcnR5Ow0KLQl9DQotDQotCS8vIFNvdXJjZQ0KLQkvLy0tLS0tLS0NCi0JcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfU09VUkNFKTsNCi0NCi0JaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVNvdXJjZSA9IHByb3BlcnR5Ow0KLQl9DQotDQotCS8vIFRhcmdldA0KLQkvLy0tLS0tLS0NCi0JcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVEFSR0VUKTsNCi0NCi0JaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVRhcmdldCA9IHByb3BlcnR5Ow0KLQl9DQotDQotDQotCUlMb2dFbnRyeVtdIGVudHJpZXMgPSBsb2dFbnRyeS5nZXRDaGlsZEVudHJpZXMoKTsNCi0NCi0JLy8gTWVzc2FnZXMNCi0JLy8tLS0tLS0tLS0NCi0JaW50IGlJbmRleCA9IDA7DQotCVVNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOw0KLQkNCi0JZm9yKCBpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7DQotCQlpZiAoZW50cmllc1tpXSAhPSBudWxsICYmIGVudHJpZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19NRVNTQUdFKSA9PSB0cnVlKSB7DQotCQkJbWVzc2FnZSA9IG5ldyBVTVNlc3Npb25NYW5hZ2VyTWVzc2FnZSggZW50cmllc1tpXSApOwkJCQ0KLQkgICAgICAgIF9hbE1lc3NhZ2VzLmFkZCggbWVzc2FnZSApOw0KLQ0KLQkgICAgICAgIG1lc3NhZ2UuYnVpbGRUcmVlRnJvbUxvZyggZW50cmllc1tpXSApOw0KLQkJfQ0KLQl9DQotfQ0KLS8qKg0KLSAqIENvcGllcyBhbGwgZGF0YSBmcm9tIGlucHV0IHN0cmVhbSB0byBvdXRwdXQgc3RyZWFtLg0KLSAqIEBwYXJhbSBpbnB1dFN0cmVhbSBqYXZhLmlvLklucHV0U3RyZWFtDQotICogQHBhcmFtIG91dHB1dFN0cmVhbSBqYXZhLmlvLk91dHB1dFN0cmVhbQ0KLSAqLw0KLXB1YmxpYyBTdHJpbmcgY29weVN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW1JbnB1dCwgT3V0cHV0U3RyZWFtIHN0cmVhbU91dHB1dCwgbG9uZyBsQ29udGVudExlbmd0aCwgU3RyaW5nIHN0clRhc2tOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgYm9vbGVhbiBiU3VidGFzaykgew0KLQ0KLQlTdHJpbmcgc3RyRXJyb3JNZXNzYWdlID0gbnVsbDsNCi0NCi0JLy8gQWxsb2NhdGUgYnVmZmVyDQotCS8vLS0tLS0tLS0tLS0tLS0tLSANCi0JYnl0ZVtdIGJ5dGVBcnJheSA9IG51bGw7DQotDQotCWlmIChzdHJlYW1JbnB1dCAhPSBudWxsICYmIHN0cmVhbU91dHB1dCAhPSBudWxsKSB7DQotCQlieXRlQXJyYXkgPSBuZXcgYnl0ZVs2NDAwMF07DQotCX0NCi0NCi0JaWYgKGJ5dGVBcnJheSAhPSBudWxsKSB7DQotDQotCQkvLyBDb3B5DQotCQkvLy0tLS0tDQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsNCi0JCQlpZiAoYlN1YnRhc2sgPT0gZmFsc2UpIHsNCi0JCQkJaWYgKGxDb250ZW50TGVuZ3RoID4gMCAmJiBsQ29udGVudExlbmd0aCA8IEludGVnZXIuTUFYX1ZBTFVFKQ0KLQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfQ29weSIpICsgIjogIiArc3RyVGFza05hbWUsIChpbnQpIGxDb250ZW50TGVuZ3RoKTsNCi0JCQkJZWxzZQ0KLQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfQ29weSIpICsgIjogIiAgKyBzdHJUYXNrTmFtZSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19Db3B5IikgKyAiOiAiICArIHN0clRhc2tOYW1lKTsNCi0JCQl9DQotCQl9DQotDQotCQlpbnQgaUJ5dGVzUmVjZWl2ZWQgPSAwOw0KLQ0KLQkJZG8gew0KLQkJCS8vIFJlYWQNCi0JCQkvLy0tLS0tDQotCQkJdHJ5IHsNCi0JCQkJaUJ5dGVzUmVjZWl2ZWQgPSBzdHJlYW1JbnB1dC5yZWFkKGJ5dGVBcnJheSk7DQotCQkJfQ0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0JCQkJaUJ5dGVzUmVjZWl2ZWQgPSAwOw0KLQkJCQlzdHJFcnJvck1lc3NhZ2UgPSBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfRXJyb3JfcmVhZGluZ19mcm9tX2lucHV0X3N0cmVhbSIpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKTsNCi0JCQl9DQotDQotCQkJLy8gV3JpdGUNCi0JCQkvLy0tLS0tLQ0KLQkJCWlmIChpQnl0ZXNSZWNlaXZlZCA+IDApIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXN0cmVhbU91dHB1dC53cml0ZShieXRlQXJyYXksIDAsIGlCeXRlc1JlY2VpdmVkKTsNCi0NCi0JCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBiU3VidGFzayA9PSBmYWxzZSkNCi0JCQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKGlCeXRlc1JlY2VpdmVkKTsNCi0JCQkJfQ0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCQkJCWlCeXRlc1JlY2VpdmVkID0gMDsNCi0JCQkJCXN0ckVycm9yTWVzc2FnZSA9IFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19FcnJvcl93cml0aW5nX3RvX291dHB1dF9zdHJlYW0iKSArICI6ICIgKyBleC5nZXRNZXNzYWdlKCk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQl3aGlsZSAoaUJ5dGVzUmVjZWl2ZWQgPiAwKTsNCi0NCi0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBiU3VidGFzayA9PSBmYWxzZSkgew0KLQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHN0ckVycm9yTWVzc2FnZTsNCi19DQotLyoqDQotICoNCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlDQotICogQHBhcmFtIGFjdGlvblR5cGUgamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgew0KLQ0KLQkvLyBDcmVhdGUgYSBuZXcgbG9nIGVudHJ5DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JSUxvZ0VudHJ5IGxvZ0VudHJ5Q2hpbGQgPSBuZXcgTG9nRW50cnkoIF9sb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfTUVTU0FHRSApOw0KLQlfbG9nRW50cnkuYWRkQ2hpbGRFbnRyeSggbG9nRW50cnlDaGlsZCApOw0KLQ0KLQkvLyBDcmVhdGUgdGhlIG9wZXJhdGlvbiBvYmplY3QNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVVNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2UoIGxvZ0VudHJ5Q2hpbGQgKTsNCi0JDQotCW1lc3NhZ2UuYnVpbGRUcmVlRnJvbUxvZyggbG9nRW50cnlDaGlsZCApOw0KLQkNCi0JX2FsTWVzc2FnZXMuYWRkKCBtZXNzYWdlICk7DQotCQ0KLQlyZXR1cm4gbWVzc2FnZTsNCi19DQotLyoqDQotICoNCi0gKiANCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBkb0NvcHkoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JU3RyaW5nIHN0ckVycm9yTWVzc2FnZSA9IG51bGw7DQotDQotCS8vIElucHV0IFVSTA0KLQkvLy0tLS0tLS0tLS0NCi0JVVJMIHVybElucHV0ID0gbnVsbDsNCi0NCi0JdHJ5IHsNCi0JCXVybElucHV0ID0gbmV3IFVSTChnZXRTb3VyY2UoKSk7DQotCX0NCi0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfU291cmNlX1VSTF9pc19tYWxmb3JtZWQiKSwgZXgpOw0KLQl9DQotDQotCVVSTCB1cmxPdXRwdXQgPSBudWxsOw0KLQ0KLQkvLyBPdXRwdXQgVVJMDQotCS8vLS0tLS0tLS0tLS0NCi0JdHJ5IHsNCi0JCXVybE91dHB1dCA9IG5ldyBVUkwoZ2V0VGFyZ2V0KCkpOw0KLQl9DQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1RhcmdldF9VUkxfaXNfbWFsZm9ybWVkIiksIGV4KTsNCi0JfQ0KLQ0KLQkvLyBJbnB1dA0KLQkvLy0tLS0tLS0NCi0JSW5wdXRTdHJlYW0gc3RyZWFtSW5wdXQgPSBudWxsOw0KLQ0KLQlsb25nIGxDb250ZW50TGVuZ3RoID0gMDsNCi0NCi0JaWYgKHVybElucHV0ICE9IG51bGwgJiYgdXJsT3V0cHV0ICE9IG51bGwpIHsNCi0NCi0JCS8vIElucHV0IHN0cmVhbQ0KLQkJLy8tLS0tLS0tLS0tLS0tDQotCQl0cnkgew0KLQkJCVVSTEhhbmRsZXIuUmVzcG9uc2UgcmVzcG9uc2UgPSAoVVJMSGFuZGxlci5SZXNwb25zZSlVUkxIYW5kbGVyLm9wZW4odXJsSW5wdXQpOw0KLQkJCWxDb250ZW50TGVuZ3RoID0gcmVzcG9uc2UuZ2V0Q29udGVudExlbmd0aCgpOw0KLQkJCWlmKCByZXNwb25zZS5nZXRSZXNwb25zZUNvZGUoKSA9PSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX09LICkNCi0JCQkJc3RyZWFtSW5wdXQgPSByZXNwb25zZS5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJfQ0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQotCQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfVW5hYmxlX3RvX29idGFpbl9zb3VyY2VfaW5wdXRfc3RyZWFtIiksIGV4KTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvLyBPdXRwdXQNCi0JLy8tLS0tLS0tDQotCU91dHB1dFN0cmVhbSBzdHJlYW1PdXRwdXQgPSBudWxsOw0KLQ0KLQlpZiAoc3RyZWFtSW5wdXQgIT0gbnVsbCkgew0KLQ0KLQkJLy8gT3V0cHV0IGNvbm5lY3Rpb24NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb25PdXRwdXQgPSBudWxsOw0KLQkJDQotCQl0cnkgew0KLQkJCXVybENvbm5lY3Rpb25PdXRwdXQgPSB1cmxPdXRwdXQub3BlbkNvbm5lY3Rpb24oKTsNCi0JCQl1cmxDb25uZWN0aW9uT3V0cHV0LnNldERvT3V0cHV0KHRydWUpOw0KLQkJfQ0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQotCQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyggVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19jb25uZWN0IiksIGV4ICk7DQotCQl9DQotDQotCQkvLyBPdXRwdXQgc3RyZWFtDQotCQkvLy0tLS0tLS0tLS0tLS0tDQotCQlpZiAodXJsQ29ubmVjdGlvbk91dHB1dCAhPSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJc3RyZWFtT3V0cHV0ID0gdXJsQ29ubmVjdGlvbk91dHB1dC5nZXRPdXRwdXRTdHJlYW0oKTsNCi0JCQl9DQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQotCQkJCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fb2J0YWluX3RhcmdldF9vdXRwdXRfc3RyZWFtIiksIGV4ICk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gQXR0ZW1wdCB0byBjcmVhdGUgYSBmaWxlIG91dHB1dCBzdHJlYW0NCi0JCS8vIFRoaXMgaXMgdXNlZCB3aGVuIHByb3RvY29sIGlzIGZpbGU6IG9yIHZhbG9hZGVyOg0KLQkJLy8gdGh1cyBvdXIgbG9jYWwgd3JpdGVzIGFyZSBhbGwgZmlsZSBJL08gY3VycmVudGx5DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWlmIChzdHJlYW1PdXRwdXQgPT0gbnVsbCkgew0KLQkgICAgICAgIHRyeQ0KLQkgICAgICAgIHsNCi0JCSAJCXN0cmVhbU91dHB1dCA9IGdldEZpbGVPdXRwdXRTdHJlYW0odXJsT3V0cHV0KTsNCi0JICAgICAgICB9DQotCSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4KXsNCi0JCQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyggVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19jcmVhdGVfZmlsZSIpLCBleCApOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlpZiggc3RyZWFtSW5wdXQgIT0gbnVsbCAmJiBzdHJlYW1PdXRwdXQgIT0gbnVsbCApDQotCXsNCi0JICAgIHN0ckVycm9yTWVzc2FnZSA9IGNvcHlTdHJlYW0oIHN0cmVhbUlucHV0LCBzdHJlYW1PdXRwdXQsIGxDb250ZW50TGVuZ3RoLCB1cmxJbnB1dC50b0V4dGVybmFsRm9ybSgpLCBwcm9ncmVzc01vbml0b3IsIGZhbHNlICk7DQotCX0gICAgDQotDQotCS8vIENsb3NlIGlucHV0IHN0cmVhbQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYgKHN0cmVhbUlucHV0ICE9IG51bGwpIHsNCi0JCXRyeSB7DQotCQkJc3RyZWFtSW5wdXQuY2xvc2UoKTsNCi0JCX0NCi0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KLQkJfQ0KLQl9DQotDQotCS8vIENsb3NlIG91dHB1dCBzdHJlYW0NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyZWFtT3V0cHV0ICE9IG51bGwpIHsNCi0JCXRyeSB7DQotCQkJc3RyZWFtT3V0cHV0LmZsdXNoKCk7DQotCQkJc3RyZWFtT3V0cHV0LmNsb3NlKCk7DQotCQl9DQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKCBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfRXJyb3JfY2xvc2luZ19vdXRwdXRfc3RyZWFtIiksIGV4ICk7DQotCQl9DQotCX0NCi0JDQotCS8vIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWluY3JlbWVudEF0dGVtcHRDb3VudCgpOw0KLQ0KLQkvLyBFcnJvciByZXR1cm4NCi0JLy8tLS0tLS0tLS0tLS0tDQotCWlmIChzdHJFcnJvck1lc3NhZ2UgIT0gbnVsbCkgew0KLQkJVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2UgbWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2UoKTsNCi0JCW1lc3NhZ2Uuc2V0VGV4dChzdHJFcnJvck1lc3NhZ2UpOw0KLQkJc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX0ZBSUxFRCk7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLy8gU3VjY2Vzc2Z1bCByZXR1cm4NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0NCi0Jc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCk7DQotDQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCi0gKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGRvVW56aXAoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JU3RyaW5nIHN0ckVycm9yTWVzc2FnZSA9IG51bGw7DQotCWludCByYyA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVU5ERUZJTkVEX0NPTlRFTlRTOw0KLQ0KLQkvLyBJbnB1dCBVUkwNCi0JLy8tLS0tLS0tLS0tDQotCVVSTCB1cmxJbnB1dCA9IG51bGw7DQotCXRyeSB7DQotCQl1cmxJbnB1dCA9IG5ldyBVUkwoZ2V0U291cmNlKCkpOw0KLQl9DQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1NvdXJjZV9VUkxfaXNfbWFsZm9ybWVkIiksIGV4KTsNCi0JfQ0KLQ0KLQkvLyBPdXRwdXQgVVJMDQotCS8vLS0tLS0tLS0tLS0NCi0JVVJMIHVybE91dHB1dCA9IG51bGw7DQotCXRyeSB7DQotCQl1cmxPdXRwdXQgPSBuZXcgVVJMKGdldFRhcmdldCgpKTsNCi0JfQ0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7DQotCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19UYXJnZXRfVVJMX2lzX21hbGZvcm1lZCIpLCBleCk7DQotCX0NCi0NCi0JLy8gRm9yIHVuemlwcGluZyBwbHVnaW5zIG9yIGNvbXBvbmVudC9jb25maWd1cmF0aW9uIGphciwgDQotCS8vIHNldCB1cCB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBsb29rIGZvciwgYWxzbyBjYWxsDQotCS8vIExhdW5jaEluZm8uaW5zdGFsbFBlbmRpbmcNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlWZWN0b3IgZGlyTmFtZXMgPSBuZXcgVmVjdG9yKCk7DQotCVZlY3RvciBkaXJOYW1lc0luc3RhbGxlZCA9IG5ldyBWZWN0b3IoKTsvLyBrZWVwIHRyYWNrIG9mIHBsdWdpbnMvZnJhZ21lbnRzIHVuemlwcGVkDQotCVZlY3RvciBkaXJOYW1lc1VuZXhwZWN0ZWQgPSBuZXcgVmVjdG9yKCk7CS8vIGtlZXAgdHJhY2sgb2YgdW5leHBlY3RlZCBwbHVnaW5zL2ZyYWdtZW50cyBkaXINCi0JQXJyYXlMaXN0IHByb2R1Y3RWSURzID0gbmV3IEFycmF5TGlzdCgpOw0KLQlBcnJheUxpc3QgY29tcG9uZW50VklEcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JQXJyYXlMaXN0IHBsdWdpblZJRHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCUFycmF5TGlzdCBmcmFnbWVudFZJRHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotCWlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9QTFVHSU5TICkgew0KLQkJSUNvbXBvbmVudERlc2NyaXB0b3IgY29tcCA9IG51bGw7DQotCQlpZiAoZ2V0RGF0YSgpIGluc3RhbmNlb2YgSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgew0KLQkJCWNvbXAgPSAoKElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIGdldERhdGEoKSkuZ2V0Q29tcG9uZW50RGVzY3JpcHRvcigpOw0KLQkJfSBlbHNlIHsNCi0JCQljb21wID0gKElDb21wb25lbnREZXNjcmlwdG9yKSBnZXREYXRhKCk7DQotCQl9DQotCQlpZiAoY29tcCAhPSBudWxsKSB7DQotCQkJSVBsdWdpbkVudHJ5RGVzY3JpcHRvcltdIHBsdWdpbnMgPSBjb21wLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8cGx1Z2lucy5sZW5ndGg7IGkrKykgew0KLQkJCQlkaXJOYW1lcy5hZGRFbGVtZW50KCBVTUVjbGlwc2VUcmVlLlBMVUdJTlNfRElSICsgIi8iICsgcGx1Z2luc1tpXS5nZXREaXJOYW1lKCkpOw0KLQkJCQlwbHVnaW5WSURzLmFkZChuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKHBsdWdpbnNbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBwbHVnaW5zW2ldLmdldFZlcnNpb25TdHIoKSkpOw0KLQkJCX0NCi0JCQlJRnJhZ21lbnRFbnRyeURlc2NyaXB0b3JbXSBmcmFnbWVudHMgPSBjb21wLmdldEZyYWdtZW50RW50cmllcygpOw0KLQkJCWZvciAoaW50IGk9MDsgaTxmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQkJZGlyTmFtZXMuYWRkRWxlbWVudCggVU1FY2xpcHNlVHJlZS5GUkFHTUVOVFNfRElSICsgIi8iICsgZnJhZ21lbnRzW2ldLmdldERpck5hbWUoKSk7CQ0KLQkJCQlmcmFnbWVudFZJRHMuYWRkKG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIocGx1Z2luc1tpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCksIHBsdWdpbnNbaV0uZ2V0VmVyc2lvblN0cigpKSk7DQotCQkJfQ0KLQkJfSBlbHNlIHsNCi0JCQlzdHJFcnJvck1lc3NhZ2UgPSBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfRXJyb3JfaW5fcmVnaXN0cnkiKTsNCi0JCX0NCi0JfSBlbHNlIGlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9JTlNUQUxMKSB7DQotCQlyYyA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuSU5TVEFMTF9YTUxfTUlTU0lORzsNCi0JCWlmIChnZXREYXRhKCkgaW5zdGFuY2VvZiBJUHJvZHVjdERlc2NyaXB0b3IpIHsNCi0JCQlJUHJvZHVjdERlc2NyaXB0b3IgZGVzYyA9IChJUHJvZHVjdERlc2NyaXB0b3IpIGdldERhdGEoKTsNCi0JCQlkaXJOYW1lcy5hZGRFbGVtZW50KFVNRWNsaXBzZVRyZWUuSU5TVEFMTF9ESVIgKyAiLyIgKyBVTUVjbGlwc2VUcmVlLlBST0RVQ1RTX0RJUiArICIvIiArIGRlc2MuZ2V0RGlyTmFtZSgpKTsNCi0JCQlwcm9kdWN0VklEcy5hZGQobmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihkZXNjLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgZGVzYy5nZXRWZXJzaW9uU3RyKCkpKTsNCi0JCX0gZWxzZSB7IA0KLQkJCUlDb21wb25lbnREZXNjcmlwdG9yIGRlc2MgPSBudWxsOw0KLQkJCWlmIChnZXREYXRhKCkgaW5zdGFuY2VvZiBJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSB7DQotCQkJCWRlc2MgPSAoKElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIGdldERhdGEoKSkuZ2V0Q29tcG9uZW50RGVzY3JpcHRvcigpOw0KLQkJCX0gZWxzZSB7DQotCQkJCWRlc2MgPSAoSUNvbXBvbmVudERlc2NyaXB0b3IpIGdldERhdGEoKTsNCi0JCQl9DQotCQkJZGlyTmFtZXMuYWRkRWxlbWVudChVTUVjbGlwc2VUcmVlLklOU1RBTExfRElSICsgIi8iICsgVU1FY2xpcHNlVHJlZS5DT01QT05FTlRTX0RJUiArICIvIiArIGRlc2MuZ2V0RGlyTmFtZSgpKTsNCi0JCQljb21wb25lbnRWSURzLmFkZChuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKGRlc2MuZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBkZXNjLmdldFZlcnNpb25TdHIoKSkpOw0KLQkJfQ0KLQl9DQotCWlmICghTGF1bmNoSW5mby5nZXRDdXJyZW50KCkuaW5zdGFsbFBlbmRpbmcocHJvZHVjdFZJRHMsIGNvbXBvbmVudFZJRHMsIHBsdWdpblZJRHMsIGZyYWdtZW50VklEcykpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19FcnJvcl9vY2N1cnJlZF9kdXJpbmdfaW5zdGFsbGF0aW9uX3NldHVwIik7DQotCX0NCi0JDQotCQ0KLQkvLyBDcmVhdGUgYSBmaWxlIHNwZWNpZmljYXRpb24gZnJvbSB0aGUgaW5wdXQgVVJMDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JU3RyaW5nIHN0ckZpbGVzcGVjID0gVU1FY2xpcHNlVHJlZS5nZXRGaWxlSW5QbGF0Zm9ybVN0cmluZyh1cmxJbnB1dCk7DQotDQotCUphckZpbGUgamFyRmlsZSA9IG51bGw7DQotDQotCXRyeSB7DQotCQlqYXJGaWxlID0gbmV3IEphckZpbGUoc3RyRmlsZXNwZWMpOw0KLQl9DQotCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KLQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfVW5hYmxlX3RvX29wZW5fSmFyX2ZpbGUiKSwgZXgpOw0KLQl9DQotDQotCWlmICgoamFyRmlsZSAhPSBudWxsKSAmJiAoc3RyRXJyb3JNZXNzYWdlID09IG51bGwpKSB7DQotDQotCQlKYXJFbnRyeSBlbnRyeSA9IG51bGw7DQotCQlJbnB1dFN0cmVhbSBzdHJlYW1JbnB1dEVudHJ5ID0gbnVsbDsNCi0NCi0JCWludCBpQ291bnQgPSBqYXJGaWxlLnNpemUoKTsNCi0JCQ0KLQkJLy8gU2V0IHVwIHByb2dyZXNzIG1vbml0b3INCi0JCS8vIENvbXB1dGUgdGhlIGZpbGVuYW1lIHdpdGhvdXQgdGhlIHBhdGggaW5mb3JtYXRpb24NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVN0cmluZyBzdHJGaWxlbmFtZSA9IHN0ckZpbGVzcGVjOw0KLQkJaW50IGlJbmRleCA9IHN0ckZpbGVzcGVjLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7DQotCQkNCi0JCWlmIChpSW5kZXggPj0gMCAmJiBpSW5kZXggPCBzdHJGaWxlc3BlYy5sZW5ndGgoKSAtIDEpIHsNCi0JCQlzdHJGaWxlbmFtZSA9IHN0ckZpbGVzcGVjLnN1YnN0cmluZyhpSW5kZXggKyAxKTsNCi0JCX0NCi0NCi0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgew0KLQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0luc3RhbGwiKSArICI6ICIgKyBzdHJGaWxlbmFtZSwgaUNvdW50KTsNCi0JCX0NCi0NCi0NCi0JCS8vIERvIGVhY2ggamFyIGZpbGUgZW50cnkNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCUVudW1lcmF0aW9uIGVudW0gPSBqYXJGaWxlLmVudHJpZXMoKTsNCi0JCXdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpID09IHRydWUpIHsNCi0JCQllbnRyeSA9IChKYXJFbnRyeSkgZW51bS5uZXh0RWxlbWVudCgpOw0KLQkJCVN0cmluZyBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7DQotCQkJDQotCQkJaWYgKGdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX1BMVUdJTlMgKSB7DQotCQkJCS8vIFVuemlwIHBsdWdpbnMgYW5kIGZyYWdtZW50cy4gIFNraXAgZW50cmllcyBub3QgdW5kZXIgcGx1Z2lucy8gIG9yIGZyYWdtZW50cy8gdHJlZXMNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlpZiAoKCFlbnRyeU5hbWUuc3RhcnRzV2l0aChVTUVjbGlwc2VUcmVlLlBMVUdJTlNfRElSKSAmJg0KLQkJCQkJIWVudHJ5TmFtZS5zdGFydHNXaXRoKFVNRWNsaXBzZVRyZWUuRlJBR01FTlRTX0RJUikpIA0KLQkJCQkJfHwgZW50cnlOYW1lLmVuZHNXaXRoKCIvIikpIHsNCi0JCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCVN0cmluZyBwcmVmaXggPSBlbnRyeU5hbWU7DQotCQkJCWludCBzZWNvbmRfc2xhc2ggPSBlbnRyeU5hbWUuaW5kZXhPZigiLyIsIChlbnRyeU5hbWUuaW5kZXhPZigiLyIpKzEpKTsNCi0JCQkJaWYgKHNlY29uZF9zbGFzaCA+IDApIA0KLQkJCQkJcHJlZml4ID0gZW50cnlOYW1lLnN1YnN0cmluZygwLHNlY29uZF9zbGFzaCk7DQotCQkJCWludCBtYXRjaCA9IGRpck5hbWVzLmluZGV4T2YocHJlZml4KTsNCi0JCQkJaWYgKG1hdGNoIDwgMCkgeyAgIC8vIG5vdCBhIHZhbGlkIHBsdWdpbg0KLQkJCQkJaWYgKCFkaXJOYW1lc1VuZXhwZWN0ZWQuY29udGFpbnMocHJlZml4KSkNCi0JCQkJCQlkaXJOYW1lc1VuZXhwZWN0ZWQuYWRkRWxlbWVudChwcmVmaXgpOw0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJLy8gZ290IGFuIGVudHJ5IHdpdGggbWF0Y2hpbmcgZGlyZWN0b3J5IA0KLQkJCQkvLyBrZWVwIHRyYWNrIG9mIHdoaWNoIG9uZXMgdGhleSBhcmUNCi0JCQkJaWYgKCFkaXJOYW1lc0luc3RhbGxlZC5jb250YWlucyhwcmVmaXgpKQ0KLQkJCQkJZGlyTmFtZXNJbnN0YWxsZWQuYWRkRWxlbWVudChwcmVmaXgpOw0KLQkJCX0gZWxzZSBpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfSU5TVEFMTCkgew0KLQkJCQkvLyBTa2lwIG92ZXIgZW50cmllcyB0aGF0IGRvbid0IHN0YXJ0IHdpdGggdGhlIHJpZ2h0IGRpciBuYW1pbmcgY29udmVudGlvbiAoaWRfdmVyc2lvbikNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCWlmICghZW50cnlOYW1lLnN0YXJ0c1dpdGgoKFN0cmluZylkaXJOYW1lcy5maXJzdEVsZW1lbnQoKSkgfHwgZW50cnlOYW1lLmVuZHNXaXRoKCIvIikpIHsNCi0JCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCS8vIGdvdCBhbiBlbnRyeSAtIGFzIGxvbmcgYXMgd2UgaGF2ZSBpbnN0YWxsLnhtbCB3ZSdyZSBoYXBweQ0KLQkJCQlpZiAoZW50cnlOYW1lLmVxdWFscygoU3RyaW5nKWRpck5hbWVzLmZpcnN0RWxlbWVudCgpKyIvIitJTWFuaWZlc3RBdHRyaWJ1dGVzLklOU1RBTExfTUFOSUZFU1QpKQ0KLQkJCQkJcmMgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9LOw0KLQkJCX0gZWxzZSBpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfQklORElSKSB7DQotCQkJCS8vIFVuemlwIHRoZSBiaW4gZGlyZWN0b3J5LCBpZiBpdCBleGlzdHMNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlpZiAoIWVudHJ5TmFtZS5zdGFydHNXaXRoKFVNRWNsaXBzZVRyZWUuQklOX0RJUikgfHwgZW50cnlOYW1lLmVuZHNXaXRoKCIvIikpIHsNCi0JCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCS8vIGdvdCBiaW4gZGlyDQotCQkJCXJjID0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PSzsNCi0JCQl9DQotCQkJdHJ5IHsNCi0JCQkJc3RyZWFtSW5wdXRFbnRyeSA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOw0KLQkJCX0NCi0JCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCQkJc3RyZWFtSW5wdXRFbnRyeSA9IG51bGw7DQotCQkJCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19vcGVuX2phcl9lbnRyeV9pbnB1dF9zdHJlYW0iKSwgZXgpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7DQotCQkJCXN0cmVhbUlucHV0RW50cnkgPSBudWxsOw0KLQkJCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19FbmNvdW50ZXJlZF9qYXJfZW50cnlfc2VjdXJpdHlfZXhjZXB0aW9uIiksIGV4KTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQ0KLQ0KLQkJCS8vIENyZWF0ZSBhbiBvdXRwdXQgVVJMDQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQlVUkwgdXJsT3V0cHV0RmlsZSA9IG51bGw7DQotDQotCQkJaWYgKHN0cmVhbUlucHV0RW50cnkgIT0gbnVsbCkgew0KLQkJCQl0cnkgew0KLQkJCQkJLy8gRW5zdXJlIGZpbGUgc2VwYXJhdG9yIGJldHdlZW4gdGFyZ2V0IGRpcmVjdG9yeSwgYW5kIHNvdXJjZSBmaWxlIHBhdGgNCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQlTdHJpbmdCdWZmZXIgc3RyYlRhcmdldCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGFyZ2V0KCkpOw0KLQkJCQkJaWYgKGdldFRhcmdldCgpLmVuZHNXaXRoKCIvIikgPT0gZmFsc2UpIHsNCi0JCQkJCQlzdHJiVGFyZ2V0LmFwcGVuZCgnLycpOw0KLQkJCQkJfQ0KLQkJCQkJc3RyYlRhcmdldC5hcHBlbmQoZW50cnlOYW1lKTsNCi0JCQkJCXVybE91dHB1dEZpbGUgPSBuZXcgVVJMKHN0cmJUYXJnZXQudG9TdHJpbmcoKSk7DQotCQkJCQlGaWxlIGZUYXJnZXQgPSBuZXcgRmlsZShVTUVjbGlwc2VUcmVlLmdldEZpbGVJblBsYXRmb3JtU3RyaW5nKHVybE91dHB1dEZpbGUpKTsNCi0JCQkJCWlmIChmVGFyZ2V0LmV4aXN0cygpICYmDQotCQkJCQkJKGdldEFjdGlvbigpICE9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0JJTkRJUikpIHsJCQ0KLQkJCQkJCS8vIHdlIHdpbGwgbm90IG92ZXJyaWRlIGV4aXN0aW5nIGZpbGVzLCBleGNlcHQgaW4gYmluLw0KLQkJCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCQljb250aW51ZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7DQotCQkJCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fY3JlYXRlX2phcl9lbnRyeV9VUkwiKSwgZXgpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9DQotDQotDQotCQkJLy8gQ3JlYXRlIGEgZmlsZSBvdXRwdXQgc3RyZWFtDQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJT3V0cHV0U3RyZWFtIHN0cmVhbU91dHB1dEZpbGUgPSBudWxsOw0KLQ0KLQkJCWlmICh1cmxPdXRwdXRGaWxlICE9IG51bGwpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXN0cmVhbU91dHB1dEZpbGUgPSBnZXRGaWxlT3V0cHV0U3RyZWFtKHVybE91dHB1dEZpbGUpOw0KLQkJCQl9DQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KLQkJCQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfVW5hYmxlX3RvX2NyZWF0ZV9vdXRwdXRfZmlsZV9mb3JfSmFyX2VudHJ5IikgKyAiOiAiICsgdXJsT3V0cHV0RmlsZS50b0V4dGVybmFsRm9ybSgpLCBleCk7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvLyBDb3B5IGZyb20gaW5wdXQgdG8gb3V0cHV0IHN0cmVhbQ0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJaWYgKHN0cmVhbUlucHV0RW50cnkgIT0gbnVsbCAmJiBzdHJlYW1PdXRwdXRGaWxlICE9IG51bGwpIHsNCi0NCi0JICAgICAgICAgICAgLy8gRG8gbm90IGFsdGVyIHByb2dyZXNzIG1vbml0b3INCi0JICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJc3RyRXJyb3JNZXNzYWdlID0gY29weVN0cmVhbShzdHJlYW1JbnB1dEVudHJ5LCBzdHJlYW1PdXRwdXRGaWxlLCAwLCBlbnRyeU5hbWUsIG51bGwsIHRydWUgKTsNCi0JCQkJaWYgKHN0ckVycm9yTWVzc2FnZSAhPSBudWxsKSB7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0JCQl0cnkgew0KLQkJCQlpZiAoc3RyZWFtSW5wdXRFbnRyeSAhPSBudWxsKSAJc3RyZWFtSW5wdXRFbnRyeS5jbG9zZSgpOw0KLQkJCQlpZiAoc3RyZWFtT3V0cHV0RmlsZSAhPSBudWxsKSAJc3RyZWFtT3V0cHV0RmlsZS5jbG9zZSgpOw0KLQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsNCi0JCQkJLy8gdW5jaGVja2VkDQotCQkJfQ0KLQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCX0JLy8gd2hpbGUNCi0vLwkJc3RyRXJyb3JNZXNzYWdlID0gIkVycm9yIEluamVjdGVkISI7DQotCQl0cnkgew0KLQkJCWphckZpbGUuY2xvc2UoKTsNCi0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsNCi0JCQkvLyB1bmNoZWNrZWQNCi0JCX0JCQ0KLQl9CS8vIGlmIGphckZpbGUgaXMgbm90IG51bGwNCi0NCi0JLy8gdGFsbHkgdXAgd2hhdCdzIHVuemlwcGVkIGFuZCB3aGF0J3Mgbm90DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChzdHJFcnJvck1lc3NhZ2UgPT0gbnVsbCkgew0KLQkJaWYgKGdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX1BMVUdJTlMgKSB7DQotCQkJaWYgKGRpck5hbWVzVW5leHBlY3RlZC5zaXplKCkgPiAwKSB7DQotCQkJCXJjID0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5VTkRFRklORURfQ09OVEVOVFM7DQotCQkJCXN0ckVycm9yTWVzc2FnZSA9IFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmRlZmluZWRfY29udGVudHNfZm91bmRfaW5fSmFyIik7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKCFkaXJOYW1lc0luc3RhbGxlZC5jb250YWluc0FsbChkaXJOYW1lcykpIHsNCi0JCQkJcmMgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk1JU1NJTkdfQ09OVEVOVFM7DQotCQkJCXN0ckVycm9yTWVzc2FnZSA9IFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fZmluZF9kZWZpbmVkX2NvbnRlbnRzX2luX0phciIpOw0KLQkJCX0gDQotCQl9IGVsc2UgaWYgKGdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0lOU1RBTEwpIHsNCi0JCQlpZiAocmMgIT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PSykNCi0JCQkJc3RyRXJyb3JNZXNzYWdlID0gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19maW5kX2luc3RhbGxfbWFuaWZlc3RfZmlsZV9pbl9KYXIiKTsNCi0JCX0NCi0JfQkJDQotCQ0KLQkvLyBDYWxsIExhdW5jaEluZm8uaW5zdGFsbENvbmZpcm1lZCBpZiBhbGwgY2xlYW4NCi0JLy8gT3RoZXJ3aXNlLCBjYWxsIGFmdGVyIHdlJ3ZlIGNsZWFuZWQgdXAgKHVuZG8qKQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChzdHJFcnJvck1lc3NhZ2UgPT0gbnVsbCkgew0KLQkJaWYgKCFMYXVuY2hJbmZvLmdldEN1cnJlbnQoKS5pbnN0YWxsQ29uZmlybWVkKHByb2R1Y3RWSURzLCBjb21wb25lbnRWSURzLCBwbHVnaW5WSURzLCBmcmFnbWVudFZJRHMpKSB7DQotCQkJc3RyRXJyb3JNZXNzYWdlID0gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0Vycm9yX29jY3VycmVkX2R1cmluZ19pbnN0YWxsYXRpb25fY29tcGxldGlvbiIpOw0KLQkJfQ0KLQl9DQotCQ0KLQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci5kb25lKCk7DQotDQotCS8vIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWluY3JlbWVudEF0dGVtcHRDb3VudCgpOw0KLQ0KLQkvLyBFcnJvciByZXR1cm4NCi0JLy8tLS0tLS0tLS0tLS0tDQotCWlmIChzdHJFcnJvck1lc3NhZ2UgIT0gbnVsbCkgew0KLQkJVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2UgbWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2UoKTsNCi0JCW1lc3NhZ2Uuc2V0VGV4dChzdHJFcnJvck1lc3NhZ2UpOw0KLQkJc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX0ZBSUxFRCk7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLy8gU3VjY2Vzc2Z1bCByZXR1cm4NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0NCi0Jc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCk7DQotDQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCi0gKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGRvVmVyaWZ5KElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotDQotCVN0cmluZyBzdHJFcnJvck1lc3NhZ2UgPSBudWxsOw0KLQ0KLQkvLyBJbnB1dCBVUkwNCi0JLy8tLS0tLS0tLS0tDQotCVVSTCB1cmxJbnB1dCA9IG51bGw7DQotDQotCXRyeSB7DQotCQl1cmxJbnB1dCA9IG5ldyBVUkwoZ2V0U291cmNlKCkpOw0KLQl9DQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1NvdXJjZV9VUkxfaXNfbWFsZm9ybWVkIiksIGV4KTsNCi0JfQ0KLQ0KLQlJSW5zdGFsbGFibGUgaW5zdGFsbGFibGUgPSAoSUluc3RhbGxhYmxlKSBnZXREYXRhKCk7DQotDQotCVN0cmluZyBzdHJOYW1lID0gaW5zdGFsbGFibGUuZ2V0TGFiZWwoKTsNCi0JU3RyaW5nIHN0cklkID0gbnVsbDsNCi0JU3RyaW5nIHN0clByb3ZpZGVyTmFtZSA9IG51bGw7DQotDQotCWlmIChpbnN0YWxsYWJsZSBpbnN0YW5jZW9mIElQcm9kdWN0RGVzY3JpcHRvcikgew0KLQkJc3RySWQgPSAoKElQcm9kdWN0RGVzY3JpcHRvcikgaW5zdGFsbGFibGUpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsNCi0JCXN0clByb3ZpZGVyTmFtZSA9ICgoSVByb2R1Y3REZXNjcmlwdG9yKSBpbnN0YWxsYWJsZSkuZ2V0UHJvdmlkZXJOYW1lKCk7DQotCX0NCi0JZWxzZSBpZiAoaW5zdGFsbGFibGUgaW5zdGFuY2VvZiBJQ29tcG9uZW50RGVzY3JpcHRvcikgew0KLQkJc3RySWQgPSAoKElDb21wb25lbnREZXNjcmlwdG9yKSBpbnN0YWxsYWJsZSkuZ2V0VW5pcXVlSWRlbnRpZmllcigpOw0KLQkJc3RyUHJvdmlkZXJOYW1lID0gKChJQ29tcG9uZW50RGVzY3JpcHRvcikgaW5zdGFsbGFibGUpLmdldFByb3ZpZGVyTmFtZSgpOw0KLQl9DQotCWVsc2UgaWYgKGluc3RhbGxhYmxlIGluc3RhbmNlb2YgSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgew0KLQkJc3RySWQgPSAoKElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIGluc3RhbGxhYmxlKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7DQotCX0NCi0JZWxzZSBpZiAoaW5zdGFsbGFibGUgaW5zdGFuY2VvZiBJUGx1Z2luRW50cnlEZXNjcmlwdG9yKSB7DQotCQlzdHJJZCA9ICgoSVBsdWdpbkVudHJ5RGVzY3JpcHRvcikgaW5zdGFsbGFibGUpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsNCi0JfQ0KLQllbHNlIGlmIChpbnN0YWxsYWJsZSBpbnN0YW5jZW9mIElGcmFnbWVudEVudHJ5RGVzY3JpcHRvcikgew0KLQkJc3RySWQgPSAoKElGcmFnbWVudEVudHJ5RGVzY3JpcHRvcikgaW5zdGFsbGFibGUpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsNCi0JfQ0KLQ0KLQlKYXJWZXJpZmljYXRpb25TZXJ2aWNlIHZlcmlmaWVyID0gVXBkYXRlTWFuYWdlci5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRKYXJWZXJpZmllcigpOw0KLQ0KLQlKYXJWZXJpZmljYXRpb25SZXN1bHQgcmVzdWx0ID0gdmVyaWZpZXIub2tUb0luc3RhbGwobmV3IEZpbGUodXJsSW5wdXQuZ2V0RmlsZSgpKSwgc3RySWQsIHN0ck5hbWUsIHN0clByb3ZpZGVyTmFtZSwgcHJvZ3Jlc3NNb25pdG9yKTsNCi0NCi0JaWYgKHJlc3VsdC5nZXRSZXN1bHRDb2RlKCkgPT0gSmFyVmVyaWZpY2F0aW9uUmVzdWx0LkNBTkNFTF9JTlNUQUxMKSB7DQotCQlFeGNlcHRpb24gZXggPSByZXN1bHQuZ2V0UmVzdWx0RXhjZXB0aW9uKCk7DQotCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19JbnN0YWxsYXRpb25fY2FuY2VsbGVkX2J5X3VzZXIiKSwgZXgpOw0KLQl9DQotDQotCS8vIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWluY3JlbWVudEF0dGVtcHRDb3VudCgpOw0KLQ0KLQkvLyBFcnJvciByZXR1cm4NCi0JLy8tLS0tLS0tLS0tLS0tDQotCWlmIChzdHJFcnJvck1lc3NhZ2UgIT0gbnVsbCkgew0KLQkJVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2UgbWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2UoKTsNCi0JCW1lc3NhZ2Uuc2V0VGV4dChzdHJFcnJvck1lc3NhZ2UpOw0KLQkJc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX0ZBSUxFRCk7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLy8gU3VjY2Vzc2Z1bCByZXR1cm4NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0NCi0Jc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCk7DQotDQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCi0gKiBFeGVjdXRlIGNvcHkgZnJvbSBzb3VyY2UgVVJMIHRvIHRhcmdldCBVUkwuDQotICovDQotcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQlpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfSU5TVEFMTCB8fA0KLQkJZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfUExVR0lOUyB8fA0KLQkJZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfQklORElSKSB7DQotCQlyZXR1cm4gZG9VbnppcChwcm9ncmVzc01vbml0b3IpOw0KLQl9DQotCQ0KLQllbHNlIGlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9DT1BZKSB7DQotCQlyZXR1cm4gZG9Db3B5KHByb2dyZXNzTW9uaXRvcik7DQotCX0NCi0JZWxzZSBpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVkVSSUZZX0pBUikgew0KLQkJcmV0dXJuIGRvVmVyaWZ5KHByb2dyZXNzTW9uaXRvcik7DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0vKioNCi0gKiBFeGVjdXRlIGFueSBwZW5kaW5nIG9yIGZhaWxlZCB1cGRhdGVzLg0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGV4ZWN1dGVVbmRvKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotDQotCS8vIFVuZG8gYWxsIHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCBvcGVyYXRpb25zDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChnZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfUEVORElORykgPT0gZmFsc2UpIHsNCi0JCWlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9JTlNUQUxMIHx8DQotCQkJZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfUExVR0lOUykgew0KLQkJCXJldHVybiB1bmRvVW56aXAocHJvZ3Jlc3NNb25pdG9yKTsNCi0JCX0NCi0JCWVsc2UgaWYgKGdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX0NPUFkpIHsNCi0JCQlyZXR1cm4gdW5kb0NvcHkocHJvZ3Jlc3NNb25pdG9yKTsNCi0JCX0NCi0JCWVsc2UgaWYgKGdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1ZFUklGWV9KQVIpew0KLQkJCXJldHVybiB1bmRvVmVyaWZ5KHByb2dyZXNzTW9uaXRvcik7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KLSAqIA0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgew0KLQkNCi0JcmV0dXJuIF9wcm9wZXJ0eUFjdGlvbi5nZXRWYWx1ZSgpOw0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIGEgZmlsZSBvdXRwdXQgc3RyZWFtIGZyb20gdGhlIFVSTC4NCi0gKiBAcGFyYW0gdXJsIGphdmEubmV0LlVSTA0KLSAqLw0KLXByaXZhdGUgRmlsZU91dHB1dFN0cmVhbSBnZXRGaWxlT3V0cHV0U3RyZWFtKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotDQotCS8vIENvbnZlcnQgdGhlIFVSTCB0byBhIHN0cmluZw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JU3RyaW5nIHN0ckZpbGVzcGVjID0gVU1FY2xpcHNlVHJlZS5nZXRGaWxlSW5QbGF0Zm9ybVN0cmluZyh1cmwpOw0KLQ0KLQ0KLQkvLyBDcmVhdGUgZGlyZWN0b3J5IHN0cnVjdHVyZQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpbnQgaUluZGV4ID0gc3RyRmlsZXNwZWMubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOw0KLQlpZiAoaUluZGV4ID49IDApIHsNCi0JCVN0cmluZyBzdHJQYXRoID0gc3RyRmlsZXNwZWMuc3Vic3RyaW5nKDAsIGlJbmRleCsxKTsNCi0NCi0JCUZpbGUgZmlsZURpcmVjdG9yeSA9IG5ldyBGaWxlKHN0clBhdGgpOw0KLQkJaWYgKGZpbGVEaXJlY3RvcnkuZXhpc3RzKCkgPT0gZmFsc2UpIHsNCi0JCQlmaWxlRGlyZWN0b3J5Lm1rZGlycygpOw0KLQkJfQ0KLQl9DQotDQotCS8vIE9wZW4gLyBjcmVhdGUgdGhlIGZpbGUNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzdHJGaWxlc3BlYyk7DQotCWJvb2xlYW4gYkV4aXN0cyA9IGZpbGUuZXhpc3RzKCk7DQotDQotCWlmIChiRXhpc3RzID09IGZhbHNlKSB7DQotCQliRXhpc3RzID0gZmlsZS5jcmVhdGVOZXdGaWxlKCk7DQotCX0NCi0NCi0JLy8gQ3JlYXRlIHRoZSBvdXRwdXQgc3RyZWFtDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlyZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7DQotfQ0KLS8qKg0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7DQotCQ0KLQlyZXR1cm4gX3Byb3BlcnR5SUQuZ2V0VmFsdWUoKTsNCi19DQotLyoqDQotICoNCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsNCi0JDQotCXJldHVybiBfcHJvcGVydHlTb3VyY2UuZ2V0VmFsdWUoKTsNCi19DQotLyoqDQotICogQHBhcmFtIHN0cmIgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcg0KLSAqIEBwYXJhbSBpSW5kZW50YXRpb24gaW50DQotICovDQotcHVibGljIHZvaWQgZ2V0U3RhdHVzU3RyaW5nKGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyYiwgaW50IGlJbmRlbnRhdGlvbikgew0KLQ0KLQlpZiAoZ2V0U3RhdHVzKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCkgPT0gdHJ1ZSkgew0KLQkJcmV0dXJuOw0KLQl9DQotCWVsc2UgaWYgKGdldFN0YXR1cygpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19QRU5ESU5HKSA9PSB0cnVlKSB7DQotCQlyZXR1cm47DQotCX0NCi0NCi0JZWxzZSB7DQotCQlpZiAoZ2V0QWN0aW9uKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX0NPUFkpID09IHRydWUpIHsNCi0JCQlpbmRlbnQoc3RyYiwgaUluZGVudGF0aW9uKTsNCi0JCQlzdHJiLmFwcGVuZChVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfQ29weSIpICsgIjogIiArIGdldFNvdXJjZSgpKTsNCi0JCX0NCi0JCWVsc2UgaWYgKGdldEFjdGlvbigpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9JTlNUQUxMKSB8fA0KLQkJCQlnZXRBY3Rpb24oKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfUExVR0lOUykgPT0gdHJ1ZSkgew0KLQkJCWluZGVudChzdHJiLCBpSW5kZW50YXRpb24pOw0KLQkJCXN0cmIuYXBwZW5kKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19JbnN0YWxsIikgKyAiOiAiICsgZ2V0U291cmNlKCkpOw0KLQkJfQ0KLQ0KLQkJLy8gT2J0YWluIG1lc3NhZ2VzDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgX2FsTWVzc2FnZXMuc2l6ZSgpOyArK2kpIHsNCi0JCQlpbmRlbnQoc3RyYiwgaUluZGVudGF0aW9uICsgMik7DQotCQkJc3RyYi5hcHBlbmQoKChVTVNlc3Npb25NYW5hZ2VyTWVzc2FnZSkgX2FsTWVzc2FnZXMuZ2V0KGkpKS5nZXRUZXh0KCkpOw0KLQkJfQ0KLQl9DQotfQ0KLS8qKg0KLSAqDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7DQotCQ0KLQlyZXR1cm4gX3Byb3BlcnR5VGFyZ2V0LmdldFZhbHVlKCk7DQotfQ0KLS8qKg0KLSAqDQotICogQHBhcmFtIGFjdGlvblR5cGUgamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgc3RyQWN0aW9uKSB7DQotCV9wcm9wZXJ0eUFjdGlvbi5zZXRWYWx1ZSggc3RyQWN0aW9uICE9IG51bGwgPyBzdHJBY3Rpb24gOiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19FTVBUWSApOw0KLX0NCi0vKioNCi0gKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldElkKCBTdHJpbmcgc3RySUQgKSB7DQotCV9wcm9wZXJ0eUlELnNldFZhbHVlKCBzdHJJRCAhPSBudWxsID8gc3RySUQgOiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19FTVBUWSApOw0KLX0NCi0vKioNCi0gKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldFNvdXJjZSggU3RyaW5nIHN0clNvdXJjZSApIHsNCi0JX3Byb3BlcnR5U291cmNlLnNldFZhbHVlKCBzdHJTb3VyY2UgIT0gbnVsbCA/IHN0clNvdXJjZSA6IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotfQ0KLS8qKg0KLSAqDQotICovDQotcHVibGljIHZvaWQgc2V0VGFyZ2V0KCBTdHJpbmcgc3RyVGFyZ2V0ICkgew0KLQlfcHJvcGVydHlUYXJnZXQuc2V0VmFsdWUoIHN0clRhcmdldCAhPSBudWxsID8gc3RyVGFyZ2V0IDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi19DQotLyoqDQotICoNCi0gKiANCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiB1bmRvQ29weShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQlTdHJpbmcgc3RyRXJyb3JNZXNzYWdlID0gbnVsbDsNCi0NCi0JLy8gT3V0cHV0IFVSTA0KLQkvLy0tLS0tLS0tLS0tDQotCVVSTCB1cmxPdXRwdXQgPSBudWxsOw0KLQ0KLQl0cnkgew0KLQkJdXJsT3V0cHV0ID0gbmV3IFVSTChnZXRUYXJnZXQoKSk7DQotCX0NCi0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfVGFyZ2V0X1VSTF9pc19tYWxmb3JtZWQiKSwgZXgpOw0KLQl9DQotDQotCWlmICh1cmxPdXRwdXQgIT0gbnVsbCkgew0KLQ0KLQkJLy8gQ29udmVydCB0aGUgVVJMIHRvIGEgc3RyaW5nDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVN0cmluZyBzdHJGaWxlc3BlYyA9IFVNRWNsaXBzZVRyZWUuZ2V0RmlsZUluUGxhdGZvcm1TdHJpbmcodXJsT3V0cHV0KTsNCi0NCi0JCS8vIERlbGV0ZSB0aGUgZmlsZQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tDQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzdHJGaWxlc3BlYyk7DQotCQlpZiAoZmlsZS5leGlzdHMoKSA9PSB0cnVlKSB7DQotCQkJaWYgKGZpbGUuZGVsZXRlKCkgPT0gZmFsc2UpIHsNCi0JCQkJc3RyRXJyb3JNZXNzYWdlID0gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19kZWxldGVfZmlsZSIpICsgIjogIiArIHN0ckZpbGVzcGVjOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvLyBSZXNldCB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JcmVzZXRBdHRlbXB0Q291bnQoKTsNCi0NCi0JLy8gRXJyb3IgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyRXJyb3JNZXNzYWdlICE9IG51bGwpIHsNCi0JCWlmIChnZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEKSA9PSB0cnVlKQ0KLQkJCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERURfVU5ET19GQUlMRUQpOw0KLQkJZWxzZQ0KLQkJCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19GQUlMRUQpOw0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8vIFN1Y2Nlc3NmdWwgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChnZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEKSA9PSB0cnVlKQ0KLQkJc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRF9VTkRPX1NVQ0NFRURFRCk7DQotCWVsc2UNCi0JCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19TVUNDRUVERUQpOw0KLQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQotICoNCi0gKiANCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiB1bmRvVW56aXAoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JU3RyaW5nIHN0ckVycm9yTWVzc2FnZSA9IG51bGw7DQotDQotCS8vIElucHV0IFVSTA0KLQkvLy0tLS0tLS0tLS0NCi0JVVJMIHVybElucHV0ID0gbnVsbDsNCi0JdHJ5IHsNCi0JCXVybElucHV0ID0gbmV3IFVSTChnZXRTb3VyY2UoKSk7DQotCX0NCi0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfU291cmNlX1VSTF9pc19tYWxmb3JtZWQiKSwgZXgpOw0KLQl9DQotDQotCS8vIE91dHB1dCBVUkwNCi0JLy8tLS0tLS0tLS0tLQ0KLQlVUkwgdXJsT3V0cHV0ID0gbnVsbDsNCi0JdHJ5IHsNCi0JCXVybE91dHB1dCA9IG5ldyBVUkwoZ2V0VGFyZ2V0KCkpOw0KLQl9DQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1RhcmdldF9VUkxfaXNfbWFsZm9ybWVkIiksIGV4KTsNCi0JfQ0KLQ0KLQkvLyBGb3IgcGx1Z2lucyBvciBjb21wb25lbnQvY29uZmlndXJhdGlvbiBqYXIsIA0KLQkvLyBzZXQgdXAgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gbG9vayBmb3INCi0JLy8gVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHN1YnRsZSBkaWZmZXJlbmNlcyBmcm9tIGRvVW56aXAoKQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVZlY3RvciBkaXJOYW1lcyA9IG5ldyBWZWN0b3IoKTsNCi0JQXJyYXlMaXN0IHByb2R1Y3RWSURzID0gbmV3IEFycmF5TGlzdCgpOw0KLQlBcnJheUxpc3QgY29tcG9uZW50VklEcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JQXJyYXlMaXN0IHBsdWdpblZJRHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCUFycmF5TGlzdCBmcmFnbWVudFZJRHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCWlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9QTFVHSU5TICkgew0KLQkJSUNvbXBvbmVudERlc2NyaXB0b3IgY29tcCA9IG51bGw7DQotCQlpZiAoZ2V0RGF0YSgpIGluc3RhbmNlb2YgSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgew0KLQkJCWNvbXAgPSAoKElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIGdldERhdGEoKSkuZ2V0Q29tcG9uZW50RGVzY3JpcHRvcigpOw0KLQkJfSBlbHNlIHsNCi0JCQljb21wID0gKElDb21wb25lbnREZXNjcmlwdG9yKSBnZXREYXRhKCk7DQotCQl9DQotCQlpZiAoY29tcCAhPSBudWxsKSB7DQotCQkJSVBsdWdpbkVudHJ5RGVzY3JpcHRvcltdIHBsdWdpbnMgPSBjb21wLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8cGx1Z2lucy5sZW5ndGg7IGkrKykgew0KLQkJCQlkaXJOYW1lcy5hZGRFbGVtZW50KCBVTUVjbGlwc2VUcmVlLlBMVUdJTlNfRElSICsgIi8iICsgcGx1Z2luc1tpXS5nZXREaXJOYW1lKCkpOw0KLQkJCQlwbHVnaW5WSURzLmFkZChuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKHBsdWdpbnNbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBwbHVnaW5zW2ldLmdldFZlcnNpb25TdHIoKSkpOw0KLQkJCX0NCi0JCQlJRnJhZ21lbnRFbnRyeURlc2NyaXB0b3JbXSBmcmFnbWVudHMgPSBjb21wLmdldEZyYWdtZW50RW50cmllcygpOw0KLQkJCWZvciAoaW50IGk9MDsgaTxmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQkJZGlyTmFtZXMuYWRkRWxlbWVudCggVU1FY2xpcHNlVHJlZS5GUkFHTUVOVFNfRElSICsgIi8iICsgZnJhZ21lbnRzW2ldLmdldERpck5hbWUoKSk7CQ0KLQkJCQlmcmFnbWVudFZJRHMuYWRkKG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIocGx1Z2luc1tpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCksIHBsdWdpbnNbaV0uZ2V0VmVyc2lvblN0cigpKSk7DQotCQkJfQ0KLQkJfSBlbHNlIHsNCi0JCQlzdHJFcnJvck1lc3NhZ2UgPSBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfRXJyb3JfaW5fcmVnaXN0cnkiKTsNCi0JCX0NCi0JfSBlbHNlIGlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9JTlNUQUxMKSB7DQotCQkvLyByYyA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuSU5TVEFMTF9YTUxfTUlTU0lORzsNCi0JCWlmIChnZXREYXRhKCkgaW5zdGFuY2VvZiBJUHJvZHVjdERlc2NyaXB0b3IpIHsNCi0JCQlJUHJvZHVjdERlc2NyaXB0b3IgZGVzYyA9IChJUHJvZHVjdERlc2NyaXB0b3IpIGdldERhdGEoKTsNCi0JCQlkaXJOYW1lcy5hZGRFbGVtZW50KFVNRWNsaXBzZVRyZWUuSU5TVEFMTF9ESVIgKyAiLyIgKyBVTUVjbGlwc2VUcmVlLlBST0RVQ1RTX0RJUiArICIvIiArIGRlc2MuZ2V0RGlyTmFtZSgpICsgIi8iKTsNCi0JCQlwcm9kdWN0VklEcy5hZGQobmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihkZXNjLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgZGVzYy5nZXRWZXJzaW9uU3RyKCkpKTsNCi0JCX0gZWxzZSB7IA0KLQkJCUlDb21wb25lbnREZXNjcmlwdG9yIGRlc2MgPSAoSUNvbXBvbmVudERlc2NyaXB0b3IpIGdldERhdGEoKTsNCi0JCQlkaXJOYW1lcy5hZGRFbGVtZW50KFVNRWNsaXBzZVRyZWUuSU5TVEFMTF9ESVIgKyAiLyIgKyBVTUVjbGlwc2VUcmVlLkNPTVBPTkVOVFNfRElSICsgIi8iICsgZGVzYy5nZXREaXJOYW1lKCkgKyAiLyIpOw0KLQkJCWNvbXBvbmVudFZJRHMuYWRkKG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIoZGVzYy5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGRlc2MuZ2V0VmVyc2lvblN0cigpKSk7DQotCQl9DQotCX0NCi0NCi0JCQ0KLQkvLyBDcmVhdGUgYSBmaWxlIHNwZWNpZmljYXRpb24gZnJvbSB0aGUgaW5wdXQgVVJMDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JU3RyaW5nIHN0ckZpbGVzcGVjID0gVU1FY2xpcHNlVHJlZS5nZXRGaWxlSW5QbGF0Zm9ybVN0cmluZyh1cmxJbnB1dCk7DQotDQotCUphckZpbGUgamFyRmlsZSA9IG51bGw7DQotCQ0KLQl0cnkgew0KLQkJamFyRmlsZSA9IG5ldyBKYXJGaWxlKHN0ckZpbGVzcGVjKTsNCi0JfQ0KLQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19vcGVuX0phcl9maWxlIiksIGV4KTsNCi0JfQ0KLQ0KLQlpZiAoamFyRmlsZSAhPSBudWxsKSB7DQotDQotCQlKYXJFbnRyeSBlbnRyeSA9IG51bGw7DQotDQotCQlpbnQgaUNvdW50ID0gamFyRmlsZS5zaXplKCk7DQotDQotCQkvLyBTZXQgdXAgcHJvZ3Jlc3MgbW9uaXRvcg0KLQkJLy8gQ29tcHV0ZSB0aGUgZmlsZW5hbWUgd2l0aG91dCB0aGUgcGF0aCBpbmZvcm1hdGlvbg0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJU3RyaW5nIHN0ckZpbGVuYW1lID0gc3RyRmlsZXNwZWM7DQotCQlpbnQgaUluZGV4ID0gc3RyRmlsZXNwZWMubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsNCi0JCQ0KLQkJaWYgKGlJbmRleCA+PSAwICYmIGlJbmRleCA8IHN0ckZpbGVzcGVjLmxlbmd0aCgpIC0gMSkgew0KLQkJCXN0ckZpbGVuYW1lID0gc3RyRmlsZXNwZWMuc3Vic3RyaW5nKGlJbmRleCArIDEpOw0KLQkJfQ0KLQkJDQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuZG8iKSArICI6ICIgKyBzdHJGaWxlbmFtZSwgaUNvdW50KTsNCi0NCi0JCS8vIERvIGVhY2ggamFyIGZpbGUgZW50cnkNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCUVudW1lcmF0aW9uIGVudW0gPSBqYXJGaWxlLmVudHJpZXMoKTsNCi0NCi0JCXdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpID09IHRydWUpIHsNCi0JCQllbnRyeSA9IChKYXJFbnRyeSkgZW51bS5uZXh0RWxlbWVudCgpOw0KLQkJCVN0cmluZyBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7DQotCQkJDQotCQkJaWYgKGdldEFjdGlvbigpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9QTFVHSU5TKSkgew0KLQkJCQkvLyBSZW1vdmUgdGhlIHBsdWdpbnMgYW5kIGZyYWdtZW50cy4gIFNraXAgZW50cmllcyBub3QgdW5kZXIgcGx1Z2lucy8gb3IgZnJhZ21lbnRzLyB0cmVlcw0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJaWYgKCghZW50cnlOYW1lLnN0YXJ0c1dpdGgoVU1FY2xpcHNlVHJlZS5QTFVHSU5TX0RJUikpICYmDQotCQkJCQkoIWVudHJ5TmFtZS5zdGFydHNXaXRoKFVNRWNsaXBzZVRyZWUuRlJBR01FTlRTX0RJUikpKSB7DQotCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQkJCQkJCQkJCQkJCQ0KLQkJCQlpZiAoKGVudHJ5TmFtZS5lcXVhbHMoVU1FY2xpcHNlVHJlZS5QTFVHSU5TX0RJUiArICIvIikpIHx8DQotCQkJCQkoZW50cnlOYW1lLmVxdWFscyhVTUVjbGlwc2VUcmVlLkZSQUdNRU5UU19ESVIgKyAiLyIpKSkgew0KLQkJCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSBwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOw0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJLy8gRG9uJ3QgYm90aGVyIGNsZWFuaW5nIHVwIHRoZSBlbnRyaWVzIG5vdCBtYXRjaGluZyB0aGUgZXhwZWN0ZWQgbGlzdA0KLQkJCQkvLyBUaGV5IHdlcmVuJ3QgdW56aXBwZWQgaW4gdGhlIGZpcnN0IHBsYWNlDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJU3RyaW5nIHByZWZpeCA9IGVudHJ5TmFtZTsNCi0JCQkJaW50IHNlY29uZF9zbGFzaCA9IGVudHJ5TmFtZS5pbmRleE9mKCIvIiwgKGVudHJ5TmFtZS5pbmRleE9mKCIvIikrMSkpOw0KLQkJCQlpZiAoc2Vjb25kX3NsYXNoID4gMCkgDQotCQkJCQlwcmVmaXggPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsc2Vjb25kX3NsYXNoKTsNCi0JCQkJaW50IG1hdGNoID0gZGlyTmFtZXMuaW5kZXhPZihwcmVmaXgpOw0KLQkJCQlpZiAobWF0Y2ggPCAwKSB7ICAgLy8gbm90IGEgdmFsaWQgcGx1Z2luDQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCX0gZWxzZSBpZiAoZ2V0QWN0aW9uKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0lOU1RBTEwpKSB7DQotCQkJCS8vIFJlbW92ZSB0aGUgY29tcG9uZW50L3Byb2R1Y3QgaXRlbXMuICBTa2lwIG92ZXIgZW50cmllcyB0aGF0IGRvbid0IG1hdGNoIHRoZSBkaXJuYW1lDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCWlmICghZW50cnlOYW1lLnN0YXJ0c1dpdGgoKFN0cmluZylkaXJOYW1lcy5maXJzdEVsZW1lbnQoKSkpIHsNCi0JCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJfSBlbHNlIGlmIChnZXRBY3Rpb24oKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfQklORElSKSkgew0KLQkJCQkvLyBOby1vcC4gICBUaGUgYmluIGRpcmVjdG9yeSBjb250ZW50cyBjYW5ub3QgYmUgdW5kb25lDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQ0KLQkJCWlmICh1cmxPdXRwdXQgIT0gbnVsbCkgew0KLQkJCQkvLyBCdWlsZCBwYXRobmFtZSB0byBhY3R1YWwgaW5zdGFsbCBsb2NhdGlvbg0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlzdHJGaWxlc3BlYyA9IHVybE91dHB1dC5nZXRGaWxlKCkgKyAiLyIgKyBlbnRyeU5hbWU7DQotCQkJCXN0ckZpbGVzcGVjID0gc3RyRmlsZXNwZWMucmVwbGFjZSgnLycsRmlsZS5zZXBhcmF0b3JDaGFyKTsNCi0JCQkJaW50IGsgPSBzdHJGaWxlc3BlYy5pbmRleE9mKFVNRWNsaXBzZVRyZWUuREVWSUNFX1NFUEFSQVRPUik7DQotCQkJCWlmIChrICE9IC0xICYmIHN0ckZpbGVzcGVjLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7DQotCQkJCQlzdHJGaWxlc3BlYyA9IHN0ckZpbGVzcGVjLnN1YnN0cmluZygxKTsNCi0JCQkJfQ0KLQ0KLQkJCQkvLyBEZWxldGUgdGhlIGZpbGUgb3IgZGlyZWN0b3J5DQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoc3RyRmlsZXNwZWMpOw0KLQkJCQlpZiAoZmlsZS5leGlzdHMoKSA9PSB0cnVlKSB7DQotCQkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQ0KLQkJCQkJCVVwZGF0ZU1hbmFnZXIuY2xlYW51cERpcmVjdG9yeShmaWxlKTsNCi0JCQkJCWlmIChmaWxlLmRlbGV0ZSgpID09IGZhbHNlKSB7DQotCQkJCQkJc3RyRXJyb3JNZXNzYWdlID0gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19kZWxldGVfZmlsZSIpICsgIjogIiArIHN0ckZpbGVzcGVjOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSBwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwkJDQotCQl9IC8vIHdoaWxlDQotDQotCQl0cnkgew0KLQkJCWphckZpbGUuY2xvc2UoKTsNCi0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsNCi0JCQkvLyB1bmNoZWNrZWQNCi0JCX0NCi0JfSAvLyBpZiBqYXJGaWxlIGlzIG5vdCBudWxsDQotDQotCS8vIENhbGwgTGF1bmNoSW5mby5pbnN0YWxsQ29uZmlybWVkIGlmIGFsbCBjbGVhbg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChzdHJFcnJvck1lc3NhZ2UgPT0gbnVsbCkgew0KLQkJaWYgKCFMYXVuY2hJbmZvLmdldEN1cnJlbnQoKS5pbnN0YWxsQ29uZmlybWVkKHByb2R1Y3RWSURzLCBjb21wb25lbnRWSURzLCBwbHVnaW5WSURzLCBmcmFnbWVudFZJRHMpKSB7DQotCQkJc3RyRXJyb3JNZXNzYWdlID0gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0Vycm9yX29jY3VycmVkX2R1cmluZ19pbnN0YWxsYXRpb25fY29tcGxldGlvbiIpOw0KLQkJfQ0KLQl9DQotCQ0KLQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci5kb25lKCk7DQotCQ0KLQkvLyBSZXNldCB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JcmVzZXRBdHRlbXB0Q291bnQoKTsNCi0NCi0JLy8gRXJyb3IgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyRXJyb3JNZXNzYWdlICE9IG51bGwpIHsNCi0JCWlmIChnZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEKSA9PSB0cnVlKQ0KLQkJCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERURfVU5ET19GQUlMRUQpOw0KLQkJZWxzZQ0KLQkJCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19GQUlMRUQpOw0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8vIFN1Y2Nlc3NmdWwgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChnZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEKSA9PSB0cnVlKQ0KLQkJc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRF9VTkRPX1NVQ0NFRURFRCk7DQotCWVsc2UNCi0JCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19TVUNDRUVERUQpOw0KLQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQotICoNCi0gKiANCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiB1bmRvVmVyaWZ5KElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotCQ0KLQlyZXNldEF0dGVtcHRDb3VudCgpOw0KLQkNCi0JaWYgKGdldFN0YXR1cygpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQpID09IHRydWUpDQotCQlzZXRTdGF0dXMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEX1VORE9fU1VDQ0VFREVEKTsNCi0JZWxzZQ0KLQkJc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX0ZBSUxFRF9VTkRPX1NVQ0NFRURFRCk7DQotDQotCXJldHVybiB0cnVlOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uTWFuYWdlclBhcmNlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uTWFuYWdlclBhcmNlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGM3ZDk3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJQYXJjZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgZWl0aGVyIGEgY29tcG9uZW50IG9yIGEgcHJvZHVjdC4gIEEgcGFyY2VsIGNhbg0KLSAqIGhhdmUgc3ViIHBhcmNlbHMsIGFuZCBjb3B5IG9iamVjdHMuICBBdHRyaWJ1dGVzIGFyZSBhY3Rpb24gKGFkZCwgZml4KSwgaWQsIHN0YXR1cyAocGVuZGluZywgY29tcGxldGUpLA0KLSAqIHR5cGUgKGNvbXBvbmVudCAvIHByb2R1Y3QpLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBVTVNlc3Npb25NYW5hZ2VyUGFyY2VsIGV4dGVuZHMgVU1TZXNzaW9uTWFuYWdlckVudHJ5IHsNCi0JDQotCXByb3RlY3RlZCBBcnJheUxpc3QgX2FsUGFyY2VscyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBfYWxPcGVyYXRpb25zICAgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQ0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5UHJvcGVydHkgX3Byb3BlcnR5QWN0aW9uID0gbnVsbDsNCi0JcHJvdGVjdGVkIElMb2dFbnRyeVByb3BlcnR5IF9wcm9wZXJ0eUlEICAgICA9IG51bGw7DQotCXByb3RlY3RlZCBJTG9nRW50cnlQcm9wZXJ0eSBfcHJvcGVydHlUeXBlICAgPSBudWxsOw0KLS8qKg0KLSAqIFVwZGF0ZU1hbmFnZXJQYXJjZWwgY29uc3RydWN0b3IgY29tbWVudC4NCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlclBhcmNlbCggSUxvZ0VudHJ5IGxvZ0VudHJ5ICkgew0KLQlzdXBlciggbG9nRW50cnkgKTsNCi0NCi0JLy8gQWN0aW9uDQotCS8vLS0tLS0tLQ0KLQlfcHJvcGVydHlBY3Rpb24gPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfQUNUSU9OKTsNCi0NCi0JaWYgKF9wcm9wZXJ0eUFjdGlvbiA9PSBudWxsKSB7DQotCQlfcHJvcGVydHlBY3Rpb24gPSBuZXcgTG9nRW50cnlQcm9wZXJ0eShsb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfQUNUSU9OLCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19FTVBUWSApOw0KLQkJbG9nRW50cnkuYWRkUHJvcGVydHkoIF9wcm9wZXJ0eUFjdGlvbiApOw0KLQl9DQotDQotCS8vIElkDQotCS8vLS0tDQotCV9wcm9wZXJ0eUlEID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0lEKTsNCi0NCi0JaWYgKF9wcm9wZXJ0eUlEID09IG51bGwpIHsNCi0JCV9wcm9wZXJ0eUlEID0gbmV3IExvZ0VudHJ5UHJvcGVydHkobG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0lELCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19FTVBUWSApOw0KLQkJbG9nRW50cnkuYWRkUHJvcGVydHkoIF9wcm9wZXJ0eUlEICk7DQotCX0NCi0NCi0JLy8gVHlwZQ0KLQkvLy0tLS0tDQotCV9wcm9wZXJ0eVR5cGUgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVFlQRSk7DQotDQotCWlmIChfcHJvcGVydHlUeXBlID09IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVR5cGUgPSBuZXcgTG9nRW50cnlQcm9wZXJ0eShsb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVFlQRSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlUeXBlICk7DQotCX0NCi19DQotLyoqDQotICogQHBhcmFtIGxvZ0VudHJ5IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkxvZ0VudHJ5DQotICovDQotcHVibGljIHZvaWQgYnVpbGRUcmVlRnJvbUxvZyhJTG9nRW50cnkgbG9nRW50cnkpIHsNCi0NCi0Jc3VwZXIuYnVpbGRUcmVlRnJvbUxvZyggbG9nRW50cnkgKTsNCi0JDQotCS8vIEFjdGlvbg0KLQkvLy0tLS0tLS0NCi0JSUxvZ0VudHJ5UHJvcGVydHkgcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfQUNUSU9OKTsNCi0NCi0JaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCV9wcm9wZXJ0eUFjdGlvbiA9IHByb3BlcnR5Ow0KLQl9DQotDQotCS8vIElkDQotCS8vLS0tDQotCXByb3BlcnR5ID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0lEKTsNCi0NCi0JaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCV9wcm9wZXJ0eUlEID0gcHJvcGVydHk7DQotCX0NCi0NCi0JLy8gVHlwZSAgDQotCS8vLS0tLS0NCi0JcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVFlQRSk7DQotDQotCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7DQotCQlfcHJvcGVydHlUeXBlID0gcHJvcGVydHk7DQotCX0NCi0JCQ0KLQlJTG9nRW50cnlbXSBlbnRyaWVzID0gbG9nRW50cnkuZ2V0Q2hpbGRFbnRyaWVzKCk7DQotDQotCS8vIFBhcmNlbHMNCi0JLy8tLS0tLS0tLQkNCi0JaW50IGlJbmRleCA9IDA7DQotCVVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgcGFyY2VsID0gbnVsbDsNCi0JDQotCWZvciggaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KLQkJaWYgKGVudHJpZXNbaV0gIT0gbnVsbCAmJiBlbnRyaWVzW2ldLmdldE5hbWUoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfUEFSQ0VMKSA9PSB0cnVlKSB7DQotCQkJcGFyY2VsID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwoIGVudHJpZXNbaV0gKTsJCQkNCi0JICAgICAgICBfYWxQYXJjZWxzLmFkZCggcGFyY2VsICk7DQotDQotCSAgICAgICAgcGFyY2VsLmJ1aWxkVHJlZUZyb21Mb2coIGVudHJpZXNbaV0gKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBPcGVyYXRpb25zDQotCS8vLS0tLS0tLS0tLS0NCi0JaUluZGV4ID0gMDsNCi0JVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbiBvcGVyYXRpb24gPSBudWxsOw0KLQkNCi0JZm9yKCBpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7DQotCQlpZiAoZW50cmllc1tpXSAhPSBudWxsICYmIGVudHJpZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19PUEVSQVRJT04pID09IHRydWUpIHsNCi0JCQlvcGVyYXRpb24gPSBuZXcgVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbiggZW50cmllc1tpXSApOwkJCQ0KLQkgICAgICAgIF9hbE9wZXJhdGlvbnMuYWRkKCBvcGVyYXRpb24gKTsNCi0NCi0JICAgICAgICBvcGVyYXRpb24uYnVpbGRUcmVlRnJvbUxvZyggZW50cmllc1tpXSApOw0KLQkJfQ0KLQl9DQotfQ0KLS8qKg0KLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbg0KLSAqIEBwYXJhbSBhY3Rpb25UeXBlIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKSB7DQotDQotCS8vIENyZWF0ZSBhIG5ldyBsb2cgZW50cnkNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlJTG9nRW50cnkgbG9nRW50cnlDaGlsZCA9IG5ldyBMb2dFbnRyeSggX2xvZ0VudHJ5LCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19PUEVSQVRJT04gKTsNCi0JX2xvZ0VudHJ5LmFkZENoaWxkRW50cnkoIGxvZ0VudHJ5Q2hpbGQgKTsNCi0NCi0JLy8gQ3JlYXRlIHRoZSBvcGVyYXRpb24gb2JqZWN0DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlVTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBVTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uKCBsb2dFbnRyeUNoaWxkICk7DQotCV9hbE9wZXJhdGlvbnMuYWRkKCBvcGVyYXRpb24gKTsNCi0JDQotCXJldHVybiBvcGVyYXRpb247DQotfQ0KLS8qKg0KLSAqIENyZWF0ZXMgYSBzdWItcGFyY2VsDQotICogQHJldHVybiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyUGFyY2VsDQotICogQHBhcmFtIGFjdGlvblR5cGUgamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyUGFyY2VsIGNyZWF0ZVBhcmNlbCgpIHsNCi0NCi0JLy8gQ3JlYXRlIGEgbmV3IGxvZyBlbnRyeQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlMb2dFbnRyeSBsb2dFbnRyeUNoaWxkID0gbmV3IExvZ0VudHJ5KCBfbG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1BBUkNFTCApOw0KLQlfbG9nRW50cnkuYWRkQ2hpbGRFbnRyeSggbG9nRW50cnlDaGlsZCApOw0KLQ0KLQkvLyBDcmVhdGUgdGhlIHBhcmNlbCBvYmplY3QNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgcGFyY2VsID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwoIGxvZ0VudHJ5Q2hpbGQgKTsNCi0JX2FsUGFyY2Vscy5hZGQoIHBhcmNlbCApOw0KLQkNCi0JcmV0dXJuIHBhcmNlbDsNCi19DQotLyoqDQotICogRXhlY3V0ZSBhbnkgcGVuZGluZyBvciBmYWlsZWQgdXBkYXRlcy4NCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotDQotCS8vIFN0b3AgaWYgYW55IGZhaWx1cmUgb2NjdXJzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWJvb2xlYW4gYlN1Y2Nlc3MgPSB0cnVlOw0KLQ0KLQkvLyBQYXJjZWxzIG1heSBiZSBzZXF1ZW50aWFsLCBkbyBpbiBmb3J3YXJkIG9yZGVyDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBfYWxQYXJjZWxzLnNpemUoKTsgKytpKSB7DQotDQotCQlpZiAoKChVTVNlc3Npb25NYW5hZ2VyUGFyY2VsKSBfYWxQYXJjZWxzLmdldChpKSkuZXhlY3V0ZShwcm9ncmVzc01vbml0b3IpID09IGZhbHNlKSB7DQotCQkJYlN1Y2Nlc3MgPSBmYWxzZTsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBPcGVyYXRpb25zIG1heSBiZSBzZXF1ZW50aWFsLCBkbyBpbiBmb3J3YXJkIG9yZGVyDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYgKGJTdWNjZXNzID09IHRydWUpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgX2FsT3BlcmF0aW9ucy5zaXplKCk7ICsraSkgew0KLQ0KLQkJCWlmICgoKFVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24pIF9hbE9wZXJhdGlvbnMuZ2V0KGkpKS5leGVjdXRlKHByb2dyZXNzTW9uaXRvcikgPT0gZmFsc2UpIHsNCi0JCQkJYlN1Y2Nlc3MgPSBmYWxzZTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8vIFN0YXR1cw0KLQkvLy0tLS0tLS0NCi0Jc2V0U3RhdHVzKGJTdWNjZXNzID09IHRydWUgPyBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQgOiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRUQpOw0KLQ0KLQlpbmNyZW1lbnRBdHRlbXB0Q291bnQoKTsNCi0NCi0JcmV0dXJuIGJTdWNjZXNzOw0KLX0NCi0vKioNCi0gKiBFeGVjdXRlIGFueSBwZW5kaW5nIG9yIGZhaWxlZCB1cGRhdGVzLg0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGV4ZWN1dGVVbmRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQkvLyBVbmRvIG9ubHkgZmFpbGVkIGF0dGVtcHRzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYgKGdldFN0YXR1cygpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRUQpID09IGZhbHNlKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQkvLyBBdHRlbXB0IGFsbCBldmVuIGlmIGZhaWx1cmUgb2NjdXJzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JDQotCWJvb2xlYW4gYlN1Y2Nlc3MgPSB0cnVlOw0KLQ0KLQkvLyBQYXJjZWxzIG1heSBiZSBzZXF1ZW50aWFsLCB1bmRvIGluIHJldmVyc2Ugb3JkZXINCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWZvciAoaW50IGkgPSBfYWxQYXJjZWxzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7DQotDQotCQlpZiAoKChVTVNlc3Npb25NYW5hZ2VyUGFyY2VsKSBfYWxQYXJjZWxzLmdldChpKSkuZXhlY3V0ZVVuZG8ocHJvZ3Jlc3NNb25pdG9yKSA9PSBmYWxzZSkgew0KLQkJCWJTdWNjZXNzID0gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0JLy8gT3BlcmF0aW9ucyBtYXkgYmUgc2VxdWVudGlhbCwgdW5kbyBpbiByZXZlcnNlIG9yZGVyDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlmb3IgKGludCBpID0gX2FsT3BlcmF0aW9ucy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgew0KLQ0KLQkJaWYgKCgoVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbikgX2FsT3BlcmF0aW9ucy5nZXQoaSkpLmV4ZWN1dGVVbmRvKHByb2dyZXNzTW9uaXRvcikgPT0gZmFsc2UpIHsNCi0JCQliU3VjY2VzcyA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCS8vIFN0YXR1cw0KLQkvLy0tLS0tLS0NCi0Jc2V0U3RhdHVzKGJTdWNjZXNzID09IHRydWUgPyBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19TVUNDRUVERUQgOiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19GQUlMRUQpOw0KLQ0KLQlyZXNldEF0dGVtcHRDb3VudCgpOw0KLQ0KLQlyZXR1cm4gYlN1Y2Nlc3M7DQotfQ0KLS8qKg0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgew0KLQkNCi0JcmV0dXJuIF9wcm9wZXJ0eUFjdGlvbi5nZXRWYWx1ZSgpOw0KLX0NCi0vKioNCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGdldElkKCkgew0KLQkNCi0JcmV0dXJuIF9wcm9wZXJ0eUlELmdldFZhbHVlKCk7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgYWxsIG9wZXJhdGlvbnMNCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb25bXQ0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uW10gZ2V0T3BlcmF0aW9ucygpIHsNCi0NCi0JVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbltdIG9wZXJhdGlvbnMgPSBuZXcgVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbltfYWxPcGVyYXRpb25zLnNpemUoKV07DQotCXJldHVybiAoVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbltdKV9hbE9wZXJhdGlvbnMudG9BcnJheSggb3BlcmF0aW9ucyApOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGFsbCBzdWItcGFyY2Vscw0KLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclBhcmNlbFtdDQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWxbXSBnZXRQYXJjZWxzKCkgew0KLQ0KLQlVTVNlc3Npb25NYW5hZ2VyUGFyY2VsW10gcGFyY2VscyA9IG5ldyBVTVNlc3Npb25NYW5hZ2VyUGFyY2VsW19hbFBhcmNlbHMuc2l6ZSgpXTsNCi0JcmV0dXJuIChVTVNlc3Npb25NYW5hZ2VyUGFyY2VsW10pX2FsUGFyY2Vscy50b0FycmF5KCBwYXJjZWxzICk7DQotfQ0KLS8qKg0KLSAqIEBwYXJhbSBzdHJiIGphdmEubGFuZy5TdHJpbmdCdWZmZXINCi0gKiBAcGFyYW0gaUluZGVudGF0aW9uIGludA0KLSAqLw0KLXB1YmxpYyB2b2lkIGdldFN0YXR1c1N0cmluZyhqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmIsIGludCBpSW5kZW50YXRpb24pIHsNCi0NCi0JaWYgKGdldFN0YXR1cygpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQpID09IHRydWUpIHsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQllbHNlIHsNCi0JCS8vIFBhcmNlbCBsYWJlbA0KLQkJLy8tLS0tLS0tLS0tLS0tDQotCQlJSW5zdGFsbGFibGUgZGVzY3JpcHRvciA9IChJSW5zdGFsbGFibGUpIGdldERhdGEoKTsNCi0NCi0JCWluZGVudChzdHJiLCBpSW5kZW50YXRpb24pOw0KLQkJc3RyYi5hcHBlbmQoIGRlc2NyaXB0b3IuZ2V0TGFiZWwoKSk7DQotDQotDQotCQkvLyBQYXJjZWxzIG1heSBiZSBzZXF1ZW50aWFsLCBkbyBpbiBmb3J3YXJkIG9yZGVyDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlmb3IgKGludCBpID0gMDsgaSA8IF9hbFBhcmNlbHMuc2l6ZSgpOyArK2kpIHsNCi0NCi0JCQkoKFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwpIF9hbFBhcmNlbHMuZ2V0KGkpKS5nZXRTdGF0dXNTdHJpbmcoc3RyYiwgaUluZGVudGF0aW9uICsgMik7DQotCQl9DQotDQotCQkvLyBPcGVyYXRpb25zIG1heSBiZSBzZXF1ZW50aWFsLCBkbyBpbiBmb3J3YXJkIG9yZGVyDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlmb3IgKGludCBpID0gMDsgaSA8IF9hbE9wZXJhdGlvbnMuc2l6ZSgpOyArK2kpIHsNCi0NCi0JCQkoKFVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24pIF9hbE9wZXJhdGlvbnMuZ2V0KGkpKS5nZXRTdGF0dXNTdHJpbmcoc3RyYiwgaUluZGVudGF0aW9uICsgMik7DQotCQl9DQotCX0NCi19DQotLyoqDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLQkNCi0JcmV0dXJuIF9wcm9wZXJ0eVR5cGUuZ2V0VmFsdWUoKTsNCi19DQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRBY3Rpb24oIFN0cmluZyBzdHJBY3Rpb24gKSB7DQotCV9wcm9wZXJ0eUFjdGlvbi5zZXRWYWx1ZSggc3RyQWN0aW9uICE9IG51bGwgPyBzdHJBY3Rpb24gOiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19FTVBUWSApOw0KLX0NCi0vKioNCi0gKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldElkKCBTdHJpbmcgc3RySUQgKSB7DQotCV9wcm9wZXJ0eUlELnNldFZhbHVlKCBzdHJJRCAhPSBudWxsID8gc3RySUQgOiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19FTVBUWSApOw0KLX0NCi0vKioNCi0gKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldFR5cGUoIFN0cmluZyBzdHJUeXBlICkgew0KLQlfcHJvcGVydHlUeXBlLnNldFZhbHVlKCBzdHJUeXBlICE9IG51bGwgPyBzdHJUeXBlIDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk4NTVhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuKjsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNlc3Npb24gaW4gd2hpY2ggdXBkYXRlIG1hbmFnZXIgb3BlcmF0aW9ucyBhcmUNCi0gKiBleGVjdXRlZC4gIFRoaXMgY2xhc3MgY29udGFpbnMgcGFyY2VsIG9iamVjdHMgYW5kIGhhcyBzdGF0dXMgYW5kIHRpbWVzdGFtcA0KLSAqIGFzIGl0cyBhdHRyaWJ1dGVzLiAgVGhlIHRpbWVzdGFtcCBhdHRyaWJ1dGUgaXMgYXV0b21hdGljYWxseSBzZXQgd2hlbiB0aGUgc2Vzc2lvbg0KLSAqIGlzIGNyZWF0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbiBleHRlbmRzIFVNU2Vzc2lvbk1hbmFnZXJFbnRyeSB7DQotCXByb3RlY3RlZCBBcnJheUxpc3QgX2FsUGFyY2VscyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JcHJvdGVjdGVkIElMb2dFbnRyeVByb3BlcnR5IF9wcm9wZXJ0eVRpbWVzdGFtcCA9IG51bGw7DQotLyoqDQotICogVXBkYXRlTWFuYWdlclNlc3Npb24gY29uc3RydWN0b3IgY29tbWVudC4NCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlclNlc3Npb24oSUxvZ0VudHJ5IGxvZ0VudHJ5KSB7DQotCXN1cGVyKCBsb2dFbnRyeSApOw0KLQ0KLQkvLyBUaW1lc3RhbXANCi0JLy8tLS0tLS0tLS0tDQotCV9wcm9wZXJ0eVRpbWVzdGFtcCA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19USU1FU1RBTVApOw0KLQ0KLQlpZiAoX3Byb3BlcnR5VGltZXN0YW1wID09IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVRpbWVzdGFtcCA9IG5ldyBMb2dFbnRyeVByb3BlcnR5KGxvZ0VudHJ5LCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19USU1FU1RBTVAsIG5ldyBEYXRlKCkudG9TdHJpbmcoKSApOw0KLQkJbG9nRW50cnkuYWRkUHJvcGVydHkoIF9wcm9wZXJ0eVRpbWVzdGFtcCApOw0KLQl9DQotfQ0KLS8qKg0KLSAqIEBwYXJhbSBsb2dFbnRyeSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5Mb2dFbnRyeQ0KLSAqLw0KLXB1YmxpYyB2b2lkIGJ1aWxkVHJlZUZyb21Mb2coSUxvZ0VudHJ5IGxvZ0VudHJ5KSB7DQotCQ0KLQlzdXBlci5idWlsZFRyZWVGcm9tTG9nKCBsb2dFbnRyeSApOw0KLQkNCi0JLy8gVGltZXN0YW1wDQotCS8vLS0tLS0tLS0tLQ0KLQlJTG9nRW50cnlQcm9wZXJ0eSBwcm9wZXJ0eSA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19USU1FU1RBTVApOw0KLQ0KLQlpZiAocHJvcGVydHkgIT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5VGltZXN0YW1wID0gcHJvcGVydHk7DQotCX0NCi0NCi0JDQotCUlMb2dFbnRyeVtdIGVudHJpZXMgPSBsb2dFbnRyeS5nZXRDaGlsZEVudHJpZXMoKTsNCi0JDQotCS8vIFBhcmNlbHMNCi0JLy8tLS0tLS0tLQ0KLQlpbnQgaUluZGV4ID0gMDsNCi0JVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBwYXJjZWwgPSBudWxsOw0KLQkNCi0JZm9yKCBpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKSB7DQotCQlpZiAoZW50cmllc1tpXSAhPSBudWxsICYmIGVudHJpZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19QQVJDRUwpID09IHRydWUpIHsNCi0JCQlwYXJjZWwgPSBuZXcgVU1TZXNzaW9uTWFuYWdlclBhcmNlbCggZW50cmllc1tpXSApOwkJCQ0KLQkgICAgICAgIF9hbFBhcmNlbHMuYWRkKCBwYXJjZWwgKTsNCi0NCi0JICAgICAgICBwYXJjZWwuYnVpbGRUcmVlRnJvbUxvZyggZW50cmllc1tpXSApOw0KLQkJfQ0KLQl9DQotfQ0KLS8qKg0KLSAqDQotICogQHJldHVybiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VTVRhc2tNYW5hZ2VyUGFyY2VsDQotICogQHBhcmFtIGFjdGlvblR5cGUgamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyUGFyY2VsIGNyZWF0ZVBhcmNlbCgpIHsNCi0NCi0JLy8gQ3JlYXRlIGEgbmV3IGxvZyBlbnRyeQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlMb2dFbnRyeSBsb2dFbnRyeUNoaWxkID0gbmV3IExvZ0VudHJ5KCBfbG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1BBUkNFTCApOw0KLQlfbG9nRW50cnkuYWRkQ2hpbGRFbnRyeSggbG9nRW50cnlDaGlsZCApOw0KLQ0KLQkvLyBDcmVhdGUgdGhlIGNvcHkgb2JqZWN0DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBwYXJjZWwgPSBuZXcgVU1TZXNzaW9uTWFuYWdlclBhcmNlbCggbG9nRW50cnlDaGlsZCApOw0KLQlfYWxQYXJjZWxzLmFkZCggcGFyY2VsICk7DQotCQ0KLQlyZXR1cm4gcGFyY2VsOw0KLX0NCi0vKioNCi0gKiBFeGVjdXRlIGFueSBwZW5kaW5nIG9yIGZhaWxlZCB1cGRhdGVzLg0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JLy8gQXR0ZW1wdCBhbGwgZXZlbiBpZiBmYWlsdXJlIG9jY3Vycw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQ0KLQlib29sZWFuIGJTdWNjZXNzID0gdHJ1ZTsNCi0NCi0JLy8gUGFyY2VscyBtYXkgYmUgc2VxdWVudGlhbCwgZG8gaW4gZm9yd2FyZCBvcmRlcg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWZvciAoaW50IGkgPSAwOyBpIDwgX2FsUGFyY2Vscy5zaXplKCk7ICsraSkgew0KLQ0KLQkJaWYgKCgoVU1TZXNzaW9uTWFuYWdlclBhcmNlbCkgX2FsUGFyY2Vscy5nZXQoaSkpLmV4ZWN1dGUocHJvZ3Jlc3NNb25pdG9yKSA9PSBmYWxzZSkgew0KLQkJCWJTdWNjZXNzID0gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0JLy8gU3RhdHVzDQotCS8vLS0tLS0tLQ0KLQlzZXRTdGF0dXMoYlN1Y2Nlc3MgPT0gdHJ1ZSA/IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCA6IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX0ZBSUxFRCk7DQotDQotCWluY3JlbWVudEF0dGVtcHRDb3VudCgpOw0KLQ0KLQlyZXR1cm4gYlN1Y2Nlc3M7DQotfQ0KLS8qKg0KLSAqIEV4ZWN1dGUgYW55IHBlbmRpbmcgb3IgZmFpbGVkIHVwZGF0ZXMuDQotICovDQotcHVibGljIGJvb2xlYW4gZXhlY3V0ZVVuZG8ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotDQotCS8vIFVuZG8gb25seSBmYWlsZWQgYXR0ZW1wdHMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoZ2V0U3RhdHVzKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX0ZBSUxFRCkgPT0gZmFsc2UpIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCQ0KLQkvLyBBdHRlbXB0IGFsbCBldmVuIGlmIGZhaWx1cmUgb2NjdXJzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JDQotCWJvb2xlYW4gYlN1Y2Nlc3MgPSB0cnVlOw0KLQ0KLQkvLyBQYXJjZWxzIG1heSBiZSBzZXF1ZW50aWFsLCB1bmRvIGluIHJldmVyc2Ugb3JkZXINCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWZvciAoaW50IGkgPSBfYWxQYXJjZWxzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7DQotDQotCQlpZiAoKChVTVNlc3Npb25NYW5hZ2VyUGFyY2VsKSBfYWxQYXJjZWxzLmdldChpKSkuZXhlY3V0ZVVuZG8ocHJvZ3Jlc3NNb25pdG9yKSA9PSBmYWxzZSkgew0KLQkJCWJTdWNjZXNzID0gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0JLy8gU3RhdHVzDQotCS8vLS0tLS0tLQ0KLQlzZXRTdGF0dXMoYlN1Y2Nlc3MgPT0gdHJ1ZSA/IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX0ZBSUxFRF9VTkRPX1NVQ0NFRURFRCA6IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX0ZBSUxFRF9VTkRPX0ZBSUxFRCk7DQotDQotCXJlc2V0QXR0ZW1wdENvdW50KCk7DQotCQ0KLQlyZXR1cm4gYlN1Y2Nlc3M7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgYWxsIHBhcmNlbHMNCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVNU2Vzc2lvbk1hbmFnZXJQYXJjZWxbXQ0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyUGFyY2VsW10gZ2V0UGFyY2VscygpIHsNCi0NCi0JVU1TZXNzaW9uTWFuYWdlclBhcmNlbFtdIHBhcmNlbHMgPSBuZXcgVU1TZXNzaW9uTWFuYWdlclBhcmNlbFtfYWxQYXJjZWxzLnNpemUoKV07DQotCXJldHVybiAoVU1TZXNzaW9uTWFuYWdlclBhcmNlbFtdKV9hbFBhcmNlbHMudG9BcnJheSggcGFyY2VscyApOw0KLX0NCi0vKioNCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGdldFN0YXR1c1N0cmluZygpIHsNCi0JDQotCVN0cmluZ0J1ZmZlciBzdHJiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQ0KLQlnZXRTdGF0dXNTdHJpbmcoIHN0cmIsIDAgKTsNCi0JDQotCXJldHVybiBzdHJiLnRvU3RyaW5nKCk7DQotfQ0KLS8qKg0KLSAqIEBwYXJhbSBzdHJiIGphdmEubGFuZy5TdHJpbmdCdWZmZXINCi0gKiBAcGFyYW0gaUluZGVudGF0aW9uIGludA0KLSAqLw0KLXB1YmxpYyB2b2lkIGdldFN0YXR1c1N0cmluZyhqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmIsIGludCBpSW5kZW50YXRpb24pIHsNCi0NCi0JU3RyaW5nIHN0clN0YXR1cyA9IGdldFN0YXR1cygpOw0KLQ0KLQlpZiAoc3RyU3RhdHVzLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQpID09IHRydWUpIHsNCi0JCXN0cmIuYXBwZW5kKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19JbnN0YWxsYXRpb25zX2hhdmVfY29tcGxldGVkX3N1Y2Nlc3NmdWxseSIpKTsNCi0JCXN0cmIuYXBwZW5kKCJcbiIpOw0KLQkJc3RyYi5hcHBlbmQoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1lvdV9tdXN0X3Jlc3RhcnRfdGhlX3dvcmtiZW5jaF90b19hY3RpdmF0ZV9hbnlfY2hhbmdlcyIpKTsNCi0JfQ0KLQ0KLQllbHNlIHsNCi0JCXN0cmIuYXBwZW5kKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19Bbl9pbnN0YWxsYXRpb25fZXJyb3Jfb3JfY2FuY2VsbGF0aW9uX2hhc19vY2N1cnJlZCIpKTsNCi0NCi0JCS8vIFBhcmNlbHMgbWF5IGJlIHNlcXVlbnRpYWwsIGRvIGluIGZvcndhcmQgb3JkZXINCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgX2FsUGFyY2Vscy5zaXplKCk7ICsraSkgew0KLQ0KLQkJCSgoVU1TZXNzaW9uTWFuYWdlclBhcmNlbCkgX2FsUGFyY2Vscy5nZXQoaSkpLmdldFN0YXR1c1N0cmluZyhzdHJiLCAyKTsNCi0JCX0NCi0JfQ0KLX0NCi0vKioNCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGdldFRpbWVzdGFtcCgpIHsNCi0JDQotCXJldHVybiBfcHJvcGVydHlUaW1lc3RhbXAuZ2V0VmFsdWUoKTsNCi19DQotLyoqDQotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2Vzc2lvbiBpcyBjb21wbGV0ZQ0KLSAqIEByZXR1cm4gYm9vbGVhbg0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7DQotDQotCXJldHVybiBfcHJvcGVydHlTdGF0dXMuZ2V0VmFsdWUoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEKSB8fA0KLQkJICAgX3Byb3BlcnR5U3RhdHVzLmdldFZhbHVlKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX0ZBSUxFRF9VTkRPX1NVQ0NFRURFRCk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZWVkNjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVVJMSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53ZWJkYXYuaHR0cC5jbGllbnQuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud2ViZGF2LmNsaWVudC5XZWJEQVZGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53ZWJkYXYuQ29udGV4dDsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBVUkxIYW5kbGVyIGV4dGVuZHMgQmFzZVVSTEhhbmRsZXIgew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBIdHRwQ2xpZW50IGh0dHAgPSBudWxsOw0KLQlwcml2YXRlIHN0YXRpYyBXZWJEQVZGYWN0b3J5IGZhY3RvcnkgPSBudWxsOw0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFAgPSAiaHR0cCI7DQotCQ0KLQlzdGF0aWMgY2xhc3MgUmVzcG9uc2UgZXh0ZW5kcyBCYXNlVVJMSGFuZGxlci5SZXNwb25zZSB7DQotCQlwcml2YXRlIG9yZy5lY2xpcHNlLndlYmRhdi5odHRwLmNsaWVudC5SZXNwb25zZSByID0gbnVsbDsNCi0JCXByaXZhdGUgUmVzcG9uc2Uob3JnLmVjbGlwc2Uud2ViZGF2Lmh0dHAuY2xpZW50LlJlc3BvbnNlIHIpIHsNCi0JCQl0aGlzLnIgPSByOw0KLQkJfQ0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCQlyZXR1cm4gci5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJfQ0KLQkJcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsNCi0JCQlyZXR1cm4gci5nZXRDb250ZW50TGVuZ3RoKCk7DQotCQl9DQotCQlwdWJsaWMgaW50IGdldFJlc3BvbnNlQ29kZSgpIHsNCi0JCQlyZXR1cm4gci5nZXRTdGF0dXNDb2RlKCk7DQotCQl9DQotCQlwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlTWVzc2FnZSgpIHsNCi0JCQlyZXR1cm4gci5nZXRTdGF0dXNNZXNzYWdlKCk7DQotCQl9DQotCX0NCi0NCi1wcml2YXRlIFVSTEhhbmRsZXIoKSB7fQ0KLXB1YmxpYyBzdGF0aWMgQmFzZVVSTEhhbmRsZXIuUmVzcG9uc2Ugb3BlbihVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQ0KLQlpZiAodXJsPT1udWxsKSByZXR1cm4gbnVsbDsNCi0NCi0JaWYgKCF1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoSFRUUCkpIHsNCi0JCVVSTENvbm5lY3Rpb24gYyA9IHVybC5vcGVuQ29ubmVjdGlvbigpOw0KLQkJQ29udGV4dCBjdHggPSBmYWN0b3J5Lm5ld0NvbnRleHQoKTsNCi0JCWludCBpID0gMTsNCi0JCVN0cmluZyBuYW1lID0gbnVsbDsNCi0JCXdoaWxlICgobmFtZSA9IGMuZ2V0SGVhZGVyRmllbGRLZXkoaSkpICE9IG51bGwpIHsNCi0JCQljdHgucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgYy5nZXRIZWFkZXJGaWVsZChpKSk7DQotCQkJaSsrOw0KLQkJfQkNCi0JCUlucHV0U3RyZWFtIGlzID0gYy5nZXRJbnB1dFN0cmVhbSgpOwkNCi0JCXJldHVybiBuZXcgUmVzcG9uc2UobmV3IG9yZy5lY2xpcHNlLndlYmRhdi5odHRwLmNsaWVudC5SZXNwb25zZShVTktOT1dOX1NUQVRVUyxVTktOT1dOX01TRyxjdHgsaXMpKTsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChodHRwPT1udWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19IVFRQX2NsaWVudF9ub3Rfc2V0IikpOwkNCi0JCVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCJHRVQiLCB1cmwsIG51bGwpOw0KLQkJcmV0dXJuIG5ldyBSZXNwb25zZShodHRwLmludm9rZShyZXF1ZXN0KSk7DQotCX0JDQotfQ0KLXByb3RlY3RlZCBCYXNlVVJMSGFuZGxlci5SZXNwb25zZSBvcGVuVVJMKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCXJldHVybiBVUkxIYW5kbGVyLm9wZW4odXJsKTsNCi19DQotcHVibGljIHN0YXRpYyB2b2lkIHNldEh0dHBDbGllbnQoSHR0cENsaWVudCBjKSB7DQotDQotCWlmIChodHRwPT1udWxsKSB7DQotCQlodHRwID0gYzsNCi0JCWZhY3RvcnkgPSBuZXcgV2ViREFWRmFjdG9yeSgpOw0KLQ0KLQkJLy8gc2V0dXAgdGhpcyBoYW5kbGVyIGFzIHRoZSBoYW5kbGVyIGZvciBib290IHBvcnRpb24gb2YgdXBkYXRlIG1hbmFnZXINCi0JCUJhc2VVUkxIYW5kbGVyLnNldFVSTEhhbmRsZXIobmV3IFVSTEhhbmRsZXIoKSk7DQotCX0NCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1Njg4NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC5MYXVuY2hJbmZvOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QuTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLklDb21wb25lbnREZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLklDb21wb25lbnRFbnRyeURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuSUZyYWdtZW50RW50cnlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLklJbnN0YWxsYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JUGx1Z2luRW50cnlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLklQcm9kdWN0RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JVU1SZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JVVJMTmFtZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuTG9nU3RvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuVU1FY2xpcHNlVHJlZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5VTVJlZ2lzdHJ5TWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5VcGRhdGVNYW5hZ2VyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5KYXJWZXJpZmljYXRpb25TZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIFVwZGF0ZSBNYW5hZ2VyIHVwZGF0ZXMgYSB3b3Jrc3RhdGlvbiBpbiBvbmUgb2YgdGhyZWUgbW9kZXM6DQotICogPG9sPg0KLSAqIDxsaT5sb2NhbDwvbGk+DQotICogPGxpPnJlbW90ZTwvbGk+DQotICogPGxpPnJlbW90ZSBjYWNoZWQ8L2xpPg0KLSAqIDwvb2w+DQotICogVXNhZ2U6DQotICogPG9sPg0KLSAqIDxsaT5DcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzczwvbGk+DQotICogPGxpPlNldCBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYXMgcmVxdWlyZWQ8L2xpPg0KLSAqIDx1bD4NCi0gKiA8bGk+bW9kZTwvbGk+DQotICogPGxpPnVwZGF0ZSBsb2cgVVJMPC9saT4NCi0gKiA8bGk+aGlzdG9yeSBsb2cgVVJMPC9saT4NCi0gKiA8L3VsPg0KLSAqIDxsaT5DYWxsIHRoZSBpbml0aWFsaXplIGZ1bmN0aW9uPC9saT4NCi0gKiA8bGk+Q2FsbCB0aGUgdXBkYXRlIGZ1bmN0aW9uPC9saT4NCi0gKiA8L29sPg0KLSAqIFBlcnNpc3RlbnQgcHJvcGVydGllcyBhcmUgbG9hZGVkIGJlZm9yZSBhbnkgYXJlIGNoYW5nZWQsIGFuZCBzYXZlZCBhZnRlciBhbnkNCi0gKiBhcmUgY2hhbmdlZC4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuYWdlciB7DQotDQotCS8vIFBhY2thZ2UgbmFtZSBmb3IgdGhpcyBjbGFzcw0KLQkvLyBVc2VkIGJ5IFVwZGF0ZU1hbmFnZXJTdHJpbmdzIHRvIG9idGFpbiBpdHMgcmVzb3VyY2UgYnVuZGxlIHByb3BlcnRpZXMgZmlsZQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfc3RyUGFja2FnZU5hbWUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUiOw0KLQlwdWJsaWMgc3RhdGljIFVwZGF0ZU1hbmFnZXIgX3VwZGF0ZU1hbmFnZXJJbnN0YW5jZSA9IG51bGw7DQotCQ0KLQkvLyBQZXJzaXN0ZW50IHByb3BlcnRpZXMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCXByb3RlY3RlZCBpbnQgICAgX2lNb2RlICAgICAgICAgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk1PREVfTE9DQUw7DQotCXByb3RlY3RlZCBTdHJpbmcgX3N0clVwZGF0ZUxvZ1VSTCAgPSBudWxsOw0KLQlwcm90ZWN0ZWQgU3RyaW5nIF9zdHJIaXN0b3J5TG9nVVJMID0gbnVsbDsNCi0NCi0JLy8gSW5zdGFuY2Ugc3RhdGUgZGF0YQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCXByb3RlY3RlZCBVTVJlZ2lzdHJ5TWFuYWdlciBfcmVnaXN0cnlNYW5hZ2VyID0gbnVsbDsNCi0JcHJvdGVjdGVkIFVNU2Vzc2lvbk1hbmFnZXIgIF9zZXNzaW9uTWFuYWdlciAgPSBudWxsOw0KLQlwcm90ZWN0ZWQgU2hlbGwgICAgICAgICAgICAgX3NoZWxsICAgICAgICAgICA9IG51bGw7DQotCQ0KLQlwcm90ZWN0ZWQgSmFyVmVyaWZpY2F0aW9uU2VydmljZSBfamFyVmVyaWZpZXIgPSBudWxsOw0KLS8qKg0KLSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgdGhlbiBpbml0aWFsaXplcyBieSBsb2FkaW5nIGl0cyBwZXJzaXN0ZW50IHByb3BlcnRpZXMNCi0gKi8NCi1wdWJsaWMgVXBkYXRlTWFuYWdlcigpIHsNCi19DQotLyoqDQotICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCB0aGVuIGluaXRpYWxpemVzIGJ5IGxvYWRpbmcgaXRzIHBlcnNpc3RlbnQgcHJvcGVydGllcw0KLSAqLw0KLXB1YmxpYyBVcGRhdGVNYW5hZ2VyKCBTaGVsbCBzaGVsbCApIHsNCi0JX3VwZGF0ZU1hbmFnZXJJbnN0YW5jZSA9IHRoaXM7DQotCV9zaGVsbCA9IHNoZWxsOw0KLX0NCi0vKioNCi0gKiBEZWxldGVzIGFsbCBmaWxlcyBpbiB0aGUgc3RhZ2luZyBhcmVhLg0KLSAqLw0KLXB1YmxpYyB2b2lkIGNsZWFudXAoKSB7DQotCVN0cmluZyBzdHJTdGFnaW5nRGlyZWN0b3J5ID0gVU1FY2xpcHNlVHJlZS5nZXRGaWxlSW5QbGF0Zm9ybVN0cmluZyhVTUVjbGlwc2VUcmVlLmdldFN0YWdpbmdBcmVhKCkpOw0KLQ0KLQlGaWxlIGZpbGVTdGFnaW5nRGlyZWN0b3J5ID0gbmV3IEZpbGUoc3RyU3RhZ2luZ0RpcmVjdG9yeSk7DQotDQotCWlmIChmaWxlU3RhZ2luZ0RpcmVjdG9yeS5leGlzdHMoKSA9PSB0cnVlKSB7DQotCQlGaWxlW10gZmlsZXMgPSBmaWxlU3RhZ2luZ0RpcmVjdG9yeS5saXN0RmlsZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsNCi0JCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSA9PSB0cnVlKSB7DQotCQkJCWNsZWFudXBEaXJlY3RvcnkoZmlsZXNbaV0pOw0KLQkJCX0NCi0JCQlib29sZWFuIGJTdWNjZXNzZnVsID0gZmlsZXNbaV0uZGVsZXRlKCk7DQotCQkJDQotCQl9DQotCX0NCi19DQotLyoqDQotICovDQotcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXBEaXJlY3RvcnkoRmlsZSBmaWxlRGlyZWN0b3J5KSB7DQotDQotCUZpbGVbXSBmaWxlcyA9IGZpbGVEaXJlY3RvcnkubGlzdEZpbGVzKCk7DQotCQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7DQotCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSA9PSB0cnVlKSB7DQotCQkJY2xlYW51cERpcmVjdG9yeShmaWxlc1tpXSk7DQotCQl9DQotDQotCQlib29sZWFuIGJTdWNjZXNzZnVsID0gZmlsZXNbaV0uZGVsZXRlKCk7DQotLy8JCWlmICghYlN1Y2Nlc3NmdWwpDQotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm9vb3BzISIgKyBmaWxlc1tpXSk7DQotCX0NCi19DQotLyoqDQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIGNyZWF0ZVNlc3Npb24oSUluc3RhbGxhYmxlW10gZGVzY3JpcHRvcnMsIGJvb2xlYW4gYlZlcmlmeUphcnMpIHRocm93cyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uIHsNCi0NCi0JLy8gRk9SIE5PVyBETyBOT1QgRE8gSkFSIFZFUklGSUNBVElPTg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWJWZXJpZnlKYXJzID0gZmFsc2U7DQotDQotCS8vIENyZWF0ZSBhIG5ldyB1cGRhdGUgc2Vzc2lvbg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbiA9IF9zZXNzaW9uTWFuYWdlci5jcmVhdGVVcGRhdGVTZXNzaW9uKCk7DQotDQotCS8vIENyZWF0ZSBhIGRlZmluZXIgdGhhdCBjYW4gZGVmaW5lIHRoZSBvcGVyYXRpb25zIHJlcXVpcmVkDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlTZXNzaW9uRGVmaW5lciBzZXNzaW9uRGVmaW5lciA9IG5ldyBVTVNlc3Npb25EZWZpbmVyUmVmZXJlbmNlVXBkYXRlKCk7DQotCQ0KLQkvLyBEZWZpbmUgYSBzZXQgb2Ygb3BlcmF0aW9ucw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlzZXNzaW9uRGVmaW5lci5kZWZpbmVPcGVyYXRpb25zKHNlc3Npb24sIGRlc2NyaXB0b3JzLCBiVmVyaWZ5SmFycyk7DQotDQotCS8vIFNhdmUgdGhlIHVwZGF0ZSBsb2cNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQl0cnkgew0KLQkJX3Nlc3Npb25NYW5hZ2VyLnNhdmVVcGRhdGVMb2coKTsNCi0JfQ0KLQljYXRjaCAoTG9nU3RvcmVFeGNlcHRpb24gZXgpIHsNCi0JCXRocm93IG5ldyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7DQotCX0NCi0NCi0JcmV0dXJuIHNlc3Npb247DQotfQ0KLS8qKg0KLSAqIFVwZGF0ZXMgdGhlIGxvY2FsIG1hY2hpbmUgYnk6DQotICogPG9sPg0KLSAqIDxsaT5kZWZpbmluZyB0aGUgb3BlcmF0aW9uczwvbGk+DQotICogPGxpPmRvd25sb2FkaW5nIGFueSBuZXcgb2JqZWN0czwvbGk+DQotICogPGxpPmFwcGx5aW5nIGFueSBkb3dubG9hZGVkIHVwZGF0ZXM8L2xpPg0KLSAqIDxsaT5kaXNwbGF5aW5nIGEgcHJvZ3Jlc3MgbW9uaXRvcjwvbGk+DQotICogPC9vbD4NCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gZXhlY3V0ZVNlc3Npb24oIFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIHNlc3Npb24sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yICkgdGhyb3dzIFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24gew0KLQ0KLQkvLyBUaHJvdyBhbnkgZXhjZXB0aW9uIHdoZW4gY29tcGxldGUNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVVwZGF0ZU1hbmFnZXJFeGNlcHRpb24gdW1FeGNlcHRpb24gPSBudWxsOw0KLQkNCi0JLy8gRXhlY3V0ZSB0aGUgc2Vzc2lvbg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCV9zZXNzaW9uTWFuYWdlci5leGVjdXRlU2Vzc2lvbiggc2Vzc2lvbiwgcHJvZ3Jlc3NNb25pdG9yICk7DQotDQotCS8vIE1vdmUgc3VjY2Vzc2Z1bCBzZXNzaW9ucyBmcm9tIHVwZGF0ZSBsb2cgdG8gaGlzdG9yeSBsb2cNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQl0cnkgew0KLQkJX3Nlc3Npb25NYW5hZ2VyLnVwZGF0ZUFuZFNhdmVMb2dzKCk7DQotCX0NCi0JY2F0Y2ggKExvZ1N0b3JlRXhjZXB0aW9uIGV4KSB7DQotCQlpZiAodW1FeGNlcHRpb24gIT0gbnVsbCkgew0KLQkJCXVtRXhjZXB0aW9uID0gbmV3IFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24oIlNfVW5hYmxlX3RvX3NhdmVfdXBkYXRlX2xvZ3MiKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBUaHJvdyBhbnkgZXhjZXB0aW9ucyBmb3VuZA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAodW1FeGNlcHRpb24gIT0gbnVsbCkgew0KLQkJdGhyb3cgdW1FeGNlcHRpb247DQotCX0NCi0NCi0JcmV0dXJuIHNlc3Npb247DQotfQ0KLS8qKg0KLSAqIFVwZGF0ZXMgdGhlIGxvY2FsIG1hY2hpbmUgYnk6DQotICogPG9sPg0KLSAqIDxsaT5kZWZpbmluZyB0aGUgb3BlcmF0aW9uczwvbGk+DQotICogPGxpPmRvd25sb2FkaW5nIGFueSBuZXcgb2JqZWN0czwvbGk+DQotICogPGxpPmFwcGx5aW5nIGFueSBkb3dubG9hZGVkIHVwZGF0ZXM8L2xpPg0KLSAqIDxsaT5kaXNwbGF5aW5nIGEgcHJvZ3Jlc3MgbW9uaXRvcjwvbGk+DQotICogPC9vbD4NCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gZXhlY3V0ZVNlc3Npb25VbmRvKCBVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbiBzZXNzaW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciApIHRocm93cyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uIHsNCi0NCi0JLy8gVGhyb3cgYW55IGV4Y2VwdGlvbiB3aGVuIGNvbXBsZXRlDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uIHVtRXhjZXB0aW9uID0gbnVsbDsNCi0JDQotCS8vIEV4ZWN1dGUgdGhlIHNlc3Npb24NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlfc2Vzc2lvbk1hbmFnZXIuZXhlY3V0ZVNlc3Npb25VbmRvKCBzZXNzaW9uLCBwcm9ncmVzc01vbml0b3IgKTsNCi0NCi0JLy8gTW92ZSBzdWNjZXNzZnVsIHNlc3Npb25zIGZyb20gdXBkYXRlIGxvZyB0byBoaXN0b3J5IGxvZw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCXRyeSB7DQotCQlfc2Vzc2lvbk1hbmFnZXIudXBkYXRlQW5kU2F2ZUxvZ3MoKTsNCi0JfQ0KLQljYXRjaCAoTG9nU3RvcmVFeGNlcHRpb24gZXgpIHsNCi0JCWlmICh1bUV4Y2VwdGlvbiAhPSBudWxsKSB7DQotCQkJdW1FeGNlcHRpb24gPSBuZXcgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbigiUyBVbmFibGUgdG8gc2F2ZSB1cGRhdGUgbG9ncyIpOw0KLQkJfQ0KLQl9DQotDQotCS8vIFRocm93IGFueSBleGNlcHRpb25zIGZvdW5kDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmICh1bUV4Y2VwdGlvbiAhPSBudWxsKSB7DQotCQl0aHJvdyB1bUV4Y2VwdGlvbjsNCi0JfQ0KLQ0KLQlyZXR1cm4gc2Vzc2lvbjsNCi19DQotLyoqDQotICovDQotcHVibGljIHN0YXRpYyBVcGRhdGVNYW5hZ2VyIGdldEN1cnJlbnRJbnN0YW5jZSgpIHsNCi0JcmV0dXJuIF91cGRhdGVNYW5hZ2VySW5zdGFuY2U7DQotfQ0KLS8qKg0KLSAqIFRha2VzIGEgc3RyaW5nIHdpdGggYW4gSWQgKyAnXycgKyBWZXJzaW9uLCBhbmQgcmV0dXJucyB0aGUgSWQuDQotICovDQotcHJpdmF0ZSBTdHJpbmcgZ2V0SWRGcm9tSW5mb1N0cmluZyhTdHJpbmcgc3RySW5mbykgew0KLQ0KLQlTdHJpbmcgc3RySWQgPSBudWxsOw0KLQ0KLQlpbnQgaUluZGV4ID0gc3RySW5mby5sYXN0SW5kZXhPZignXycpOw0KLQkNCi0JaWYgKGlJbmRleCA+PSAwKSB7DQotCQlzdHJJZCA9IHN0ckluZm8uc3Vic3RyaW5nKDAsIGlJbmRleCk7DQotCX0NCi0NCi0JZWxzZSB7DQotCQlzdHJJZCA9IHN0ckluZm87DQotCX0NCi0NCi0JcmV0dXJuIHN0cklkOw0KLX0NCi0vLyByZXR1cm4gdGhlIGphciB2ZXJpZmllcg0KLQ0KLXB1YmxpYyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlIGdldEphclZlcmlmaWVyKCkgew0KLQlpZiAoX2phclZlcmlmaWVyID09IG51bGwpCQ0KLQkJX2phclZlcmlmaWVyID0gbmV3IEphclZlcmlmaWNhdGlvblNlcnZpY2UoIF9zaGVsbCApOw0KLQlyZXR1cm4gX2phclZlcmlmaWVyOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGEgbGlzdCBvZiBjb21wb25lbnRzIHRoYXQgcmVxdWlyZSB1cGRhdGluZyBieToNCi0gKjxvbD4NCi0gKjxsaT5Mb2FkaW5nIGFsbCBwcm9kdWN0L2NvbXBvbmVudCBtYW5pZmVzdHMgZnJvbSAuaW5zdGFsbC90cmVlIDwvbGk+DQotICo8bGk+RGV0ZXJtaW5pbmcgd2hpY2ggY29tcG9uZW50cyByZXF1aXJlIHVwZGF0aW5nIGJ5OjwvbGk+DQotICo8b2w+DQotICo8bGk+Q29sbGVjdGluZyB1cGRhdGUgVVJMcyBmcm9tIGVhY2ggY29tcG9uZW50PC9saT4NCi0gKjxsaT5Db2xsZWN0aW5nIHVwZGF0ZSBVUkxzIGZyb20gcHJvZHVjdHMgdGhhdCBjb21wb25lbnRzIGFyZSBhIHBhcnQgb2Y8L2xpPg0KLSAqPC9vbD4NCi0gKjxsaT5EZXRlcm1pbmluZyB3aGF0IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSBieTo8L2xpPg0KLSAqPG9sPg0KLSAqPGxpPkFjY2Vzc2luZyB0aGUgdXBkYXRlIFVSTDwvbGk+DQotICo8bGk+RGV0ZXJtaW5pbmcgaWYgdGhlIGNvbXBvbmVudCBpcyBhIG5ld2VyIHZlcnNpb24gb2YgdGhlIGV4aXN0aW5nIG9uZTwvbGk+DQotICo8L29sPg0KLSAqPGxpPg0KLSAqPC9vbD4NCi0gKi8NCi1wdWJsaWMgSVVSTE5hbWVQYWlyW10gZ2V0TG9jYWxEaXNjb3ZlcnlVUkxzKCkgew0KLQ0KLQlJVVJMTmFtZVBhaXJbXSB1cmxOUHMgPSBudWxsOw0KLQkNCi0JLy8gT2J0YWluIHRoZSBsb2NhbCByZWdpc3RyeQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlVTVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gX3JlZ2lzdHJ5TWFuYWdlci5nZXRMb2NhbFJlZ2lzdHJ5KCk7DQotDQotCS8vIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIFVSTHMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlUcmVlU2V0IHNldFVSTHMgPSBuZXcgVHJlZVNldCggbmV3IFVwZGF0ZU1hbmFnZXJVUkxDb21wYXJhdG9yKCkgKTsNCi0NCi0JLy8gT2J0YWluIGEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIGNvbXBvbmVudHMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JSUNvbXBvbmVudERlc2NyaXB0b3JbXSBjb21wb25lbnREZXNjcmlwdG9ycyA9IHJlZ2lzdHJ5LmdldENvbXBvbmVudERlc2NyaXB0b3JzKCk7DQotDQotCS8vIE9idGFpbiBhIGxpc3Qgb2YgZGlzY292ZXJ5IFVSTHMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudERlc2NyaXB0b3JzLmxlbmd0aDsgKytpKSB7DQotCQl1cmxOUHMgPSBjb21wb25lbnREZXNjcmlwdG9yc1tpXS5nZXREaXNjb3ZlcnlVUkxzKCk7DQotDQotCQlmb3IgKGludCBqID0gMDsgaiA8IHVybE5Qcy5sZW5ndGg7ICsraikgew0KLQkJCXNldFVSTHMuYWRkKHVybE5Qc1tqXSk7DQotCQl9DQotCX0NCi0NCi0JLy8gT2J0YWluIGEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIHByb2R1Y3RzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlJUHJvZHVjdERlc2NyaXB0b3JbXSBwcm9kdWN0RGVzY3JpcHRvcnMgPSByZWdpc3RyeS5nZXRQcm9kdWN0RGVzY3JpcHRvcnMoKTsNCi0NCi0JLy8gT2J0YWluIGEgbGlzdCBvZiBkaXNjb3ZlcnkgVVJMcw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvZHVjdERlc2NyaXB0b3JzLmxlbmd0aDsgKytpKSB7DQotCQl1cmxOUHMgPSBwcm9kdWN0RGVzY3JpcHRvcnNbaV0uZ2V0RGlzY292ZXJ5VVJMcygpOw0KLQ0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCB1cmxOUHMubGVuZ3RoOyArK2opIHsNCi0JCQlzZXRVUkxzLmFkZCh1cmxOUHNbal0pOw0KLQkJfQ0KLQl9DQotDQotCXVybE5QcyA9IG5ldyBJVVJMTmFtZVBhaXJbIHNldFVSTHMuc2l6ZSgpIF07DQotCVN5c3RlbS5hcnJheWNvcHkoc2V0VVJMcy50b0FycmF5KCksIDAsIHVybE5QcywgMCwgc2V0VVJMcy5zaXplKCkgKTsNCi0JDQotCXJldHVybiB1cmxOUHM7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgYSBsaXN0IG9mIGNvbXBvbmVudHMgdGhhdCByZXF1aXJlIHVwZGF0aW5nIGJ5Og0KLSAqPG9sPg0KLSAqPGxpPkxvYWRpbmcgYWxsIHByb2R1Y3QvY29tcG9uZW50IG1hbmlmZXN0cyBmcm9tIC5pbnN0YWxsL3RyZWUgPC9saT4NCi0gKjxsaT5EZXRlcm1pbmluZyB3aGljaCBjb21wb25lbnRzIHJlcXVpcmUgdXBkYXRpbmcgYnk6PC9saT4NCi0gKjxvbD4NCi0gKjxsaT5Db2xsZWN0aW5nIHVwZGF0ZSBVUkxzIGZyb20gZWFjaCBjb21wb25lbnQ8L2xpPg0KLSAqPGxpPkNvbGxlY3RpbmcgdXBkYXRlIFVSTHMgZnJvbSBwcm9kdWN0cyB0aGF0IGNvbXBvbmVudHMgYXJlIGEgcGFydCBvZjwvbGk+DQotICo8L29sPg0KLSAqPGxpPkRldGVybWluaW5nIHdoYXQgdXBkYXRlcyBhcmUgYXZhaWxhYmxlIGJ5OjwvbGk+DQotICo8b2w+DQotICo8bGk+QWNjZXNzaW5nIHRoZSB1cGRhdGUgVVJMPC9saT4NCi0gKjxsaT5EZXRlcm1pbmluZyBpZiB0aGUgY29tcG9uZW50IGlzIGEgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgZXhpc3Rpbmcgb25lPC9saT4NCi0gKjwvb2w+DQotICo8bGk+DQotICo8L29sPg0KLSAqLw0KLXB1YmxpYyBJVVJMTmFtZVBhaXJbXSBnZXRMb2NhbFVwZGF0ZVVSTHMoKSB7DQotDQotCUlVUkxOYW1lUGFpcltdIHVybE5QcyA9IG51bGw7DQotCQ0KLQkvLyBPYnRhaW4gdGhlIGxvY2FsIHJlZ2lzdHJ5DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JSVVNUmVnaXN0cnkgcmVnaXN0cnkgPSBfcmVnaXN0cnlNYW5hZ2VyLmdldExvY2FsUmVnaXN0cnkoKTsNCi0NCi0JLy8gQ3JlYXRlIGEgbGlzdCBvZiBhbGwgVVJMcw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVRyZWVTZXQgc2V0VVJMcyA9IG5ldyBUcmVlU2V0KCBuZXcgVXBkYXRlTWFuYWdlclVSTENvbXBhcmF0b3IoKSApOw0KLQ0KLQkvLyBPYnRhaW4gYSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgY29tcG9uZW50cw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlJQ29tcG9uZW50RGVzY3JpcHRvcltdIGNvbXBvbmVudERlc2NyaXB0b3JzID0gcmVnaXN0cnkuZ2V0Q29tcG9uZW50RGVzY3JpcHRvcnMoKTsNCi0NCi0JLy8gT2J0YWluIGEgbGlzdCBvZiBkaXNjb3ZlcnkgVVJMcw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50RGVzY3JpcHRvcnMubGVuZ3RoOyArK2kpIHsNCi0JCXVybE5QcyA9IGNvbXBvbmVudERlc2NyaXB0b3JzW2ldLmdldFVwZGF0ZVVSTHMoKTsNCi0NCi0JCWZvciAoaW50IGogPSAwOyBqIDwgdXJsTlBzLmxlbmd0aDsgKytqKSB7DQotCQkJc2V0VVJMcy5hZGQodXJsTlBzW2pdKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBPYnRhaW4gYSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgcHJvZHVjdHMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlQcm9kdWN0RGVzY3JpcHRvcltdIHByb2R1Y3REZXNjcmlwdG9ycyA9IHJlZ2lzdHJ5LmdldFByb2R1Y3REZXNjcmlwdG9ycygpOw0KLQ0KLQkvLyBPYnRhaW4gYSBsaXN0IG9mIGRpc2NvdmVyeSBVUkxzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9kdWN0RGVzY3JpcHRvcnMubGVuZ3RoOyArK2kpIHsNCi0JCXVybE5QcyA9IHByb2R1Y3REZXNjcmlwdG9yc1tpXS5nZXRVcGRhdGVVUkxzKCk7DQotDQotCQlmb3IgKGludCBqID0gMDsgaiA8IHVybE5Qcy5sZW5ndGg7ICsraikgew0KLQkJCXNldFVSTHMuYWRkKHVybE5Qc1tqXSk7DQotCQl9DQotCX0NCi0NCi0JdXJsTlBzID0gbmV3IElVUkxOYW1lUGFpclsgc2V0VVJMcy5zaXplKCkgXTsNCi0JU3lzdGVtLmFycmF5Y29weShzZXRVUkxzLnRvQXJyYXkoKSwgMCwgdXJsTlBzLCAwLCBzZXRVUkxzLnNpemUoKSApOw0KLQkNCi0JcmV0dXJuIHVybE5QczsNCi19DQotLy8gcmV0dXJuIHRoZSBsb2NhbCAoY3VycmVudCkgcmVnaXN0cnkNCi0NCi1wdWJsaWMgSVVNUmVnaXN0cnkgZ2V0UmVnaXN0cnlBdChVUkwgdXJsKSB7DQotCQ0KLQlyZXR1cm4gX3JlZ2lzdHJ5TWFuYWdlci5nZXRSZWdpc3RyeUF0KCB1cmwgKTsNCi19DQotLyoqDQotICovDQotcHVibGljIFVNUmVnaXN0cnlNYW5hZ2VyIGdldFJlZ2lzdHJ5TWFuYWdlcigpIHsNCi0JcmV0dXJuIF9yZWdpc3RyeU1hbmFnZXI7DQotfQ0KLS8qKg0KLSAqIEluaXRpYWxpemVzIHRoZSB1cGRhdGUgYW5kIGhpc3RvcnkgbG9nIFVSTHMsY3JlYXRlcyBhIHNlc3Npb24gbWFuYWdlciwNCi0gKiBhbmQgY3JlYXRlcyBhIHJlZ2lzdHJ5IG1hbmFnZXIuDQotICovDQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHRocm93cyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uew0KLQ0KLQkvLyBPYnRhaW4gaW5zdGFsbCBVUkwNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVVSTCB1cmxCYXNlID0gVU1FY2xpcHNlVHJlZS5nZXRCYXNlSW5zdGFsbFVSTCgpOw0KLQlTdHJpbmcgc3RyVXJsQmFzZSA9IHVybEJhc2UudG9FeHRlcm5hbEZvcm0oKTsNCi0JU3RyaW5nIHN0clVybEluc3RhbGwgPSBzdHJVcmxCYXNlICsgImluc3RhbGwvIjsNCi0NCi0JU3RyaW5nIHN0clVybFVwZGF0ZUxvZyA9IHN0clVybEluc3RhbGwgKyAidXBkYXRlLmxvZyI7DQotCVN0cmluZyBzdHJVcmxIaXN0b3J5TG9nID0gc3RyVXJsSW5zdGFsbCArICJoaXN0b3J5LmxvZyI7DQotDQotCXNldFVwZGF0ZUxvZ1VSTChzdHJVcmxVcGRhdGVMb2cpOw0KLQlzZXRIaXN0b3J5TG9nVVJMKHN0clVybEhpc3RvcnlMb2cpOw0KLQ0KLQkvLyBDcmVhdGUgYSBzZXNzaW9uIG1hbmFnZXINCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCXRyeSB7DQotCQlfc2Vzc2lvbk1hbmFnZXIgPSBuZXcgVU1TZXNzaW9uTWFuYWdlcihuZXcgVVJMKF9zdHJVcGRhdGVMb2dVUkwpLCBuZXcgVVJMKF9zdHJIaXN0b3J5TG9nVVJMKSwgdHJ1ZSk7DQotCX0NCi0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQkJdGhyb3cgbmV3IFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24oIkludmFsaWQgbG9nIFVSTCBzcGVjaWZpY2F0aW9uIik7DQotCX0NCi0JY2F0Y2ggKExvZ1N0b3JlRXhjZXB0aW9uIGV4KSB7DQotCQl0aHJvdyBuZXcgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOw0KLQl9DQotDQotCS8vIFJlZ2lzdHJ5IE1hbmFnZXINCi0JLy8tLS0tLS0tLS0tLS0tLS0tLQ0KLQlfcmVnaXN0cnlNYW5hZ2VyID0gbmV3IFVNUmVnaXN0cnlNYW5hZ2VyKHVybEJhc2UpOw0KLX0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgdm9pZCByZW1vdmVDb21wb25lbnQoSUNvbXBvbmVudERlc2NyaXB0b3IgY29tcG9uZW50RGVzY3JpcHRvcikgew0KLQlyZW1vdmVDb21wb25lbnQoY29tcG9uZW50RGVzY3JpcHRvciwgbnVsbCk7DQotfQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyB2b2lkIHJlbW92ZUNvbXBvbmVudChJQ29tcG9uZW50RGVzY3JpcHRvciBjb21wb25lbnREZXNjcmlwdG9yLCBJUHJvZHVjdERlc2NyaXB0b3IgcHJvZHVjdERlc2NyaXB0b3IpIHsNCi0NCi0JaWYoIGNvbXBvbmVudERlc2NyaXB0b3IgPT0gbnVsbCApDQotCQlyZXR1cm47DQotCQkNCi0JTGF1bmNoSW5mbyBsYXVuY2hJbmZvID0gTGF1bmNoSW5mby5nZXRDdXJyZW50KCk7DQotCUxhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBudWxsOw0KLQ0KLQkvLyBQbHVnaW5zDQotCS8vLS0tLS0tLS0NCi0JSVBsdWdpbkVudHJ5RGVzY3JpcHRvcltdIHBsdWdpbkVudHJpZXMgPSBjb21wb25lbnREZXNjcmlwdG9yLmdldFBsdWdpbkVudHJpZXMoKTsNCi0NCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgKytpKSB7DQotCQl2aWQgPSBuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKHBsdWdpbkVudHJpZXNbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25TdHIoKSk7DQotCQlsYXVuY2hJbmZvLnJlbW92ZVBsdWdpbih2aWQpOw0KLQl9DQotDQotCS8vIEZyYWdtZW50cw0KLQkvLy0tLS0tLS0tLS0NCi0JSUZyYWdtZW50RW50cnlEZXNjcmlwdG9yW10gZnJhZ21lbnRFbnRyaWVzID0gY29tcG9uZW50RGVzY3JpcHRvci5nZXRGcmFnbWVudEVudHJpZXMoKTsNCi0NCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudEVudHJpZXMubGVuZ3RoOyArK2kpIHsNCi0JCXZpZCA9IG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIoZnJhZ21lbnRFbnRyaWVzW2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uU3RyKCkpOw0KLQkJbGF1bmNoSW5mby5yZW1vdmVGcmFnbWVudCh2aWQpOw0KLQl9DQotDQotCS8vIENvbXBvbmVudA0KLQkvLy0tLS0tLS0tLS0NCi0JdmlkID0gbmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihjb21wb25lbnREZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgY29tcG9uZW50RGVzY3JpcHRvci5nZXRWZXJzaW9uU3RyKCkpOw0KLQlsYXVuY2hJbmZvLnJlbW92ZUNvbXBvbmVudCh2aWQpOw0KLQlfcmVnaXN0cnlNYW5hZ2VyLnJlbW92ZUNvbXBvbmVudERlc2NyaXB0b3JGcm9tTG9jYWwoY29tcG9uZW50RGVzY3JpcHRvciwgcHJvZHVjdERlc2NyaXB0b3IpOw0KLQkNCi0JcmV0dXJuOw0KLX0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgdm9pZCByZW1vdmVQcm9kdWN0KElQcm9kdWN0RGVzY3JpcHRvciBwcm9kdWN0RGVzY3JpcHRvcikgew0KLQ0KLQlpZiggcHJvZHVjdERlc2NyaXB0b3IgPT0gbnVsbCApDQotCQlyZXR1cm47DQotCQkNCi0JLy8gQ29tcG9uZW50cw0KLQkvLy0tLS0tLS0tLS0tDQotCUlDb21wb25lbnRFbnRyeURlc2NyaXB0b3JbXSBjb21wb25lbnRFbnRyaWVzID0gcHJvZHVjdERlc2NyaXB0b3IuZ2V0Q29tcG9uZW50RW50cmllcygpOw0KLQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudEVudHJpZXMubGVuZ3RoOyArK2kpIHsNCi0JCUlDb21wb25lbnREZXNjcmlwdG9yIGNvbXBvbmVudERlc2NyaXB0b3IgPSBjb21wb25lbnRFbnRyaWVzW2ldLmdldENvbXBvbmVudERlc2NyaXB0b3IoKTsNCi0JCWlmIChjb21wb25lbnREZXNjcmlwdG9yLmlzUmVtb3ZhYmxlKHByb2R1Y3REZXNjcmlwdG9yKSkNCi0JCQlyZW1vdmVDb21wb25lbnQoY29tcG9uZW50RGVzY3JpcHRvciwgcHJvZHVjdERlc2NyaXB0b3IpOw0KLQl9DQotDQotCS8vIFByb2R1Y3QNCi0JLy8tLS0tLS0tLQ0KLQlMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gbmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihwcm9kdWN0RGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCksIHByb2R1Y3REZXNjcmlwdG9yLmdldFZlcnNpb25TdHIoKSk7DQotCUxhdW5jaEluZm8uZ2V0Q3VycmVudCgpLnJlbW92ZUNvbmZpZ3VyYXRpb24odmlkKTsNCi0JX3JlZ2lzdHJ5TWFuYWdlci5yZW1vdmVQcm9kdWN0RGVzY3JpcHRvckZyb21Mb2NhbChwcm9kdWN0RGVzY3JpcHRvcik7DQotfQ0KLS8qKg0KLSAqIFNldHMgdGhlIFVSTCBmb3IgdGhlIGhpc3RvcnkgbG9nLiAgVGhpcyBwcm9wZXJ0eSBpcyBwZXJzaXN0ZW50Lg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldEhpc3RvcnlMb2dVUkwoU3RyaW5nIHN0clVSTCkgdGhyb3dzIFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24gew0KLQ0KLQkvLyBDaGVjayBmb3IgdmFsaWQgVVJMDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JdHJ5IHsNCi0JCW5ldyBVUkwoc3RyVVJMKTsNCi0JfQ0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7DQotCQl0aHJvdyBuZXcgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbigiSW52YWxpZCBsb2cgVVJMIHNwZWNpZmljYXRpb24iKTsNCi0JfQ0KLQ0KLQkvLyBDaGFuZ2UgdGhlIHByb3BlcnR5DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JX3N0ckhpc3RvcnlMb2dVUkwgPSBzdHJVUkw7DQotfQ0KLS8qKg0KLSAqIFNldHMgdGhlIFVSTCBmb3IgdGhlIHVwZGF0ZSBsb2cuICBUaGlzIHByb3BlcnR5IGlzIHBlcnNpc3RlbnQuDQotICovDQotcHVibGljIHZvaWQgc2V0VXBkYXRlTG9nVVJMKFN0cmluZyBzdHJVUkwpIHRocm93cyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uIHsNCi0JDQotCS8vIENoZWNrIGZvciB2YWxpZCBVUkwNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQl0cnkgew0KLQkJbmV3IFVSTChzdHJVUkwpOw0KLQl9DQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCXRocm93IG5ldyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uKCJJbnZhbGlkIGxvZyBVUkwgc3BlY2lmaWNhdGlvbiIpOw0KLQl9DQotDQotCS8vIENoYW5nZSB0aGUgcHJvcGVydHkNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlfc3RyVXBkYXRlTG9nVVJMID0gc3RyVVJMOw0KLX0NCi0vKioNCi0gKiBVcGRhdGVzIHRoZSBib290IGxvYWRlcidzIGxhdW5jaCBpbmZvcm1hdGlvbiB3aXRoIHdoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZC4NCi0gKi8NCi1wdWJsaWMgdm9pZCB1cGRhdGVMYXVuY2hJbmZvQW5kUmVnaXN0cnkoVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbikgew0KLQ0KLQkvLyBVcGRhdGUgbGF1bmNoIGluZm8gZXZlbiBpZiB0aGlzIHNlc3Npb24gaGFkIGEgZmFpbHVyZQ0KLQkvLyBPbmUgb3IgbW9yZSBwYXJjZWxzIGNvdWxkIGhhdmUgc3VjY2VlZGVkDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChzZXNzaW9uICE9IG51bGwpIHsNCi0JCQ0KLQkJTGF1bmNoSW5mbyBsYXVuY2hJbmZvID0gTGF1bmNoSW5mby5nZXRDdXJyZW50KCk7DQotDQotCQkvLyBPYnRhaW4gcHJvZHVjdC9jb21wb25lbnQgaW5mb3JtYXRpb24NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJVU1TZXNzaW9uTWFuYWdlclBhcmNlbFtdIHBhcmNlbHMgPSBzZXNzaW9uLmdldFBhcmNlbHMoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyY2Vscy5sZW5ndGg7ICsraSkgew0KLQkJCXVwZGF0ZUxhdW5jaEluZm9BbmRSZWdpc3RyeVBhcmNlbCggcGFyY2Vsc1tpXSwgbGF1bmNoSW5mbyApOw0KLQkJfQ0KLQl9DQotfQ0KLS8qKg0KLSAqIFJlY3Vyc2l2ZWx5IHVwZGF0ZXMgdGhlIGJvb3QgbG9hZGVyJ3MgaW5mb3JtYXRpb24gZm9yIHRoaXMgcGFyY2VsIGFuZCBzdWItcGFyY2Vscy4NCi0gKi8NCi1wcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYXVuY2hJbmZvQW5kUmVnaXN0cnlQYXJjZWwoVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBwYXJjZWwsIExhdW5jaEluZm8gbGF1bmNoSW5mbykgew0KLQ0KLQkvLyBVcGRhdGUgdGhlIHByb2ZpbGUgb25seSBpZiB0aGUgaW5zdGFsbCB3YXMgc3VjY2Vzc2Z1bA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAocGFyY2VsICE9IG51bGwgJiYgcGFyY2VsLmdldFN0YXR1cygpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQpID09IHRydWUpIHsNCi0NCi0JCU9iamVjdCBvYmpEYXRhID0gcGFyY2VsLmdldERhdGEoKTsNCi0NCi0JCS8vIFByb2R1Y3QNCi0JCS8vLS0tLS0tLS0NCi0JCWlmIChvYmpEYXRhIGluc3RhbmNlb2YgSVByb2R1Y3REZXNjcmlwdG9yKSB7DQotCQkJdXBkYXRlTGF1bmNoSW5mb1Byb2R1Y3QoKElQcm9kdWN0RGVzY3JpcHRvcikgb2JqRGF0YSwgbGF1bmNoSW5mbyk7DQotCQkJX3JlZ2lzdHJ5TWFuYWdlci5hZGRQcm9kdWN0RGVzY3JpcHRvclRvTG9jYWwoKElQcm9kdWN0RGVzY3JpcHRvcikgb2JqRGF0YSk7DQotCQl9DQotDQotCQkvLyBDb21wb25lbnQNCi0JCS8vLS0tLS0tLS0tLQ0KLQkJZWxzZSBpZiAob2JqRGF0YSBpbnN0YW5jZW9mIElDb21wb25lbnREZXNjcmlwdG9yKSB7DQotCQkJdXBkYXRlTGF1bmNoSW5mb0NvbXBvbmVudCgoSUNvbXBvbmVudERlc2NyaXB0b3IpIG9iakRhdGEsIGxhdW5jaEluZm8pOw0KLQkJCV9yZWdpc3RyeU1hbmFnZXIuYWRkQ29tcG9uZW50RGVzY3JpcHRvclRvTG9jYWwoKElDb21wb25lbnREZXNjcmlwdG9yKSBvYmpEYXRhLCB0cnVlKTsNCi0JCX0NCi0JCQkNCi0JCS8vIENvbXBvbmVudCBFbnRyeQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tDQotCQllbHNlIGlmIChvYmpEYXRhIGluc3RhbmNlb2YgSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgew0KLQkJCUlDb21wb25lbnREZXNjcmlwdG9yIGNvbXAgPSAoKElDb21wb25lbnRFbnRyeURlc2NyaXB0b3Ipb2JqRGF0YSkuZ2V0Q29tcG9uZW50RGVzY3JpcHRvcigpOw0KLQkJCXVwZGF0ZUxhdW5jaEluZm9Db21wb25lbnQoY29tcCwgbGF1bmNoSW5mbyk7DQotCQkJX3JlZ2lzdHJ5TWFuYWdlci5hZGRDb21wb25lbnREZXNjcmlwdG9yVG9Mb2NhbChjb21wLCBmYWxzZSk7DQotCQl9DQotDQotCQkvLyBEbyBjaGlsZCBwYXJjZWxzDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tDQotCQlVTVNlc3Npb25NYW5hZ2VyUGFyY2VsW10gcGFyY2VsQ2hpbGRyZW4gPSBwYXJjZWwuZ2V0UGFyY2VscygpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJjZWxDaGlsZHJlbi5sZW5ndGg7ICsraSkgew0KLQkJCXVwZGF0ZUxhdW5jaEluZm9BbmRSZWdpc3RyeVBhcmNlbChwYXJjZWxDaGlsZHJlbltpXSwgbGF1bmNoSW5mbyk7DQotCQl9DQotCX0NCi19DQotLyoqDQotICogVXBkYXRlcyB0aGUgYm9vdCBsb2FkZXIncyBsYXVuY2ggaW5mb3JtYXRpb24gd2l0aCB3aGF0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQuDQotICovDQotcHVibGljIHZvaWQgdXBkYXRlTGF1bmNoSW5mb0NvbXBvbmVudChJQ29tcG9uZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBMYXVuY2hJbmZvIGxhdW5jaEluZm8pIHsNCi0NCi0JLy8gQ29tcG9uZW50DQotCS8vLS0tLS0tLS0tLQ0KLQlsYXVuY2hJbmZvLnNldENvbXBvbmVudChuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKGRlc2NyaXB0b3IuZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBkZXNjcmlwdG9yLmdldFZlcnNpb25TdHIoKSkpOw0KLQ0KLQkvLyBQbHVnaW5zDQotCS8vLS0tLS0tLS0NCi0JSVBsdWdpbkVudHJ5RGVzY3JpcHRvcltdIHBsdWdpbkRlc2NyaXB0b3JzID0gZGVzY3JpcHRvci5nZXRQbHVnaW5FbnRyaWVzKCk7DQotDQotCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRGVzY3JpcHRvcnMubGVuZ3RoOyArK2kpIHsNCi0JCXVwZGF0ZUxhdW5jaEluZm9QbHVnaW4ocGx1Z2luRGVzY3JpcHRvcnNbaV0sIGxhdW5jaEluZm8pOw0KLQl9DQotDQotCS8vIEZyYWdtZW50cw0KLQkvLy0tLS0tLS0tLS0NCi0JSUZyYWdtZW50RW50cnlEZXNjcmlwdG9yW10gZnJhZ21lbnREZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3IuZ2V0RnJhZ21lbnRFbnRyaWVzKCk7DQotDQotCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnREZXNjcmlwdG9ycy5sZW5ndGg7ICsraSkgew0KLQkJdXBkYXRlTGF1bmNoSW5mb0ZyYWdtZW50KGZyYWdtZW50RGVzY3JpcHRvcnNbaV0sIGxhdW5jaEluZm8pOw0KLQl9DQotfQ0KLS8qKg0KLSAqIFVwZGF0ZXMgdGhlIGJvb3QgbG9hZGVyJ3MgbGF1bmNoIGluZm9ybWF0aW9uIHdpdGggd2hhdCBpcyBjdXJyZW50bHkgaW5zdGFsbGVkLg0KLSAqLw0KLXB1YmxpYyB2b2lkIHVwZGF0ZUxhdW5jaEluZm9GcmFnbWVudChJRnJhZ21lbnRFbnRyeURlc2NyaXB0b3IgZGVzY3JpcHRvciwgTGF1bmNoSW5mbyBsYXVuY2hJbmZvKSB7DQotDQotCWxhdW5jaEluZm8uc2V0RnJhZ21lbnQobmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihkZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSxkZXNjcmlwdG9yLmdldFZlcnNpb25TdHIoKSkpOw0KLX0NCi0vKioNCi0gKiBVcGRhdGVzIHRoZSBib290IGxvYWRlcidzIGxhdW5jaCBpbmZvcm1hdGlvbiB3aXRoIHdoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZC4NCi0gKi8NCi1wdWJsaWMgdm9pZCB1cGRhdGVMYXVuY2hJbmZvUGx1Z2luKElQbHVnaW5FbnRyeURlc2NyaXB0b3IgZGVzY3JpcHRvciwgTGF1bmNoSW5mbyBsYXVuY2hJbmZvKSB7DQotDQotCWxhdW5jaEluZm8uc2V0UGx1Z2luKG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIoZGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCksZGVzY3JpcHRvci5nZXRWZXJzaW9uU3RyKCkpKTsNCi19DQotLyoqDQotICogVXBkYXRlcyB0aGUgYm9vdCBsb2FkZXIncyBsYXVuY2ggaW5mb3JtYXRpb24gd2l0aCB3aGF0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQuDQotICovDQotcHVibGljIHZvaWQgdXBkYXRlTGF1bmNoSW5mb1Byb2R1Y3QoSVByb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIExhdW5jaEluZm8gbGF1bmNoSW5mbykgew0KLQ0KLQlsYXVuY2hJbmZvLnNldENvbmZpZ3VyYXRpb24obmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihkZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSxkZXNjcmlwdG9yLmdldFZlcnNpb25TdHIoKSksIGRlc2NyaXB0b3IuZ2V0QXBwbGljYXRpb24oKSk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyRXhjZXB0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWRlMzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbiAgZXh0ZW5kcyBFeGNlcHRpb24gew0KLS8qKg0KLSAqIFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24gY29uc3RydWN0b3IgY29tbWVudC4NCi0gKi8NCi1wdWJsaWMgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbiggU3RyaW5nIHN0ck1lc3NhZ2UgKSB7DQotCXN1cGVyKCBzdHJNZXNzYWdlICk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyUGx1Z2luLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWQyNWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLS8qKg0KLSAqLw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud2ViZGF2Lmh0dHAuY2xpZW50Lkh0dHBDbGllbnQ7DQotDQotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmFnZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gew0KLQlwcml2YXRlIHN0YXRpYyBVcGRhdGVNYW5hZ2VyUGx1Z2luIF9wbHVnaW5JbnN0YW5jZSA9IG51bGw7DQotCXByaXZhdGUJSHR0cENsaWVudCBjbGllbnQgPW51bGw7DQotLyoqDQotICogVXBkYXRlTWFuYWdlclBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50Lg0KLSAqLw0KLXB1YmxpYyBVcGRhdGVNYW5hZ2VyUGx1Z2luKCBJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yICkgew0KLQlzdXBlciggcGx1Z2luRGVzY3JpcHRvciApOw0KLQ0KLQlfcGx1Z2luSW5zdGFuY2UgPSB0aGlzOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIG9mIGFuIGltYWdlIGZpbGUgcmVsYXRpdmUgdG8gdGhpcyBwbHVnaW4NCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcg0KLSAqIEBwYXJhbSBzdHJJbWFnZSBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBzdHJJbWFnZSkgew0KLQ0KLQlVcGRhdGVNYW5hZ2VyUGx1Z2luIHBsdWdpbiA9IGdldFBsdWdpbkluc3RhbmNlKCk7DQotDQotCWlmIChwbHVnaW4gIT0gbnVsbCkgew0KLQ0KLQkJLy8gT2J0YWluIG15IHBsdWdpbiBkZXNjcmlwdG9yDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBwbHVnaW4uZ2V0RGVzY3JpcHRvcigpOw0KLQ0KLQkJLy8gRGV0ZXJtaW5lIHdoZXJlIEkgYW0gaW5zdGFsbGVkDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVVSTCBwYXRoID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7DQotDQotCQkvLyBBZGQgdGhlIHJlbGF0aXZlIGZpbGUgbG9jYXRpb24gdG8gdGhlIGluc3RhbGwgbG9jYXRpb24NCi0JCS8vIENyZWF0ZSB0aGUgaW1hZ2UgZGVzY3JpcHRvcg0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlVUkwgdXJsRnVsbFBhdGhTdHJpbmcgPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQl1cmxGdWxsUGF0aFN0cmluZyA9IG5ldyBVUkwocGF0aCwgc3RySW1hZ2UpOw0KLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmxGdWxsUGF0aFN0cmluZyk7DQotCQl9DQotDQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gbnVsbDsNCi19DQotLyoqDQotICogQHJldHVybiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyUGx1Z2luDQotICovDQotcHVibGljIHN0YXRpYyBVcGRhdGVNYW5hZ2VyUGx1Z2luIGdldFBsdWdpbkluc3RhbmNlKCkgew0KLQlyZXR1cm4gX3BsdWdpbkluc3RhbmNlOw0KLX0NCi0vKioNCi0gKiBTaHV0cyBkb3duIHRoaXMgcGx1Zy1pbiBhbmQgZGlzY2FyZHMgYWxsIHBsdWctaW4gc3RhdGUuDQotICogPHA+DQotICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlLWltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIGRvIHNvbWV0aGluZw0KLSAqIHdoZW4gdGhlIHBsdWctaW4gaXMgc2h1dCBkb3duLiAgSW1wbGVtZW50b3JzIHNob3VsZCBjYWxsIHRoZSBpbmhlcml0ZWQgbWV0aG9kDQotICogdG8gZW5zdXJlIHRoYXQgYW55IHN5c3RlbSByZXF1aXJlbWVudHMgY2FuIGJlIG1ldC4NCi0gKiA8L3A+DQotICogPHA+DQotICogUGx1Zy1pbiBzaHV0ZG93biBjb2RlIHNob3VsZCBiZSByb2J1c3QuIEluIHBhcnRpY3VsYXIsIHRoaXMgbWV0aG9kDQotICogc2hvdWxkIGFsd2F5cyBtYWtlIGFuIGVmZm9ydCB0byBzaHV0IGRvd24gdGhlIHBsdWctaW4uIEZ1cnRoZXJtb3JlLA0KLSAqIHRoZSBjb2RlIHNob3VsZCBub3QgYXNzdW1lIHRoYXQgdGhlIHBsdWctaW4gd2FzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LA0KLSAqIGFzIHRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIGR1cmluZyBzdGFydHVwLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiBOb3RlIDE6IElmIGEgcGx1Zy1pbiBoYXMgYmVlbiBzdGFydGVkLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkNCi0gKiBpbnZva2VkIGJ5IHRoZSBwbGF0Zm9ybSB3aGVuIHRoZSBwbGF0Zm9ybSBpcyBzaHV0IGRvd24uDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIE5vdGUgMjogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gcGVyZm9ybSBzaW1wbGUgdGVybWluYXRpb24NCi0gKiBvZiB0aGUgcGx1Zy1pbiBlbnZpcm9ubWVudC4gVGhlIHBsYXRmb3JtIG1heSB0ZXJtaW5hdGUgaW52b2NhdGlvbnMNCi0gKiB0aGF0IGRvIG5vdCBjb21wbGV0ZSBpbiBhIHRpbWVseSBmYXNoaW9uLg0KLSAqIDwvcD4NCi0gKiA8Yj5DbGllbnMgbXVzdCBuZXZlciBleHBsaWNpdGx5IGNhbGwgdGhpcyBtZXRob2QuPC9iPg0KLSAqDQotICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGZhaWxzIHRvIHNodXQgZG93bg0KLSAqICAgdGhpcyBwbHVnLWluIA0KLSAqLw0KLXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQlpZihjbGllbnQhPW51bGwpIGNsaWVudC5jbG9zZSgpOyANCi19DQotLyoqDQotICogU3RhcnRzIHVwIHRoaXMgcGx1Zy1pbi4NCi0gKiA8cD4NCi0gKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkbyBzb21ldGhpbmcNCi0gKiB3aGVuIHRoaXMgcGx1Zy1pbiBpcyBzdGFydGVkLiAgSW1wbGVtZW50b3JzIHNob3VsZCBjYWxsIHRoZSBpbmhlcml0ZWQgbWV0aG9kDQotICogdG8gZW5zdXJlIHRoYXQgYW55IHN5c3RlbSByZXF1aXJlbWVudHMgY2FuIGJlIG1ldC4NCi0gKiA8L3A+DQotICogPHA+DQotICogSWYgdGhpcyBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgaXQgaXMgdGFrZW4gYXMgYW4gaW5kaWNhdGlvbiB0aGF0DQotICogcGx1Zy1pbiBpbml0aWFsaXphdGlvbiBoYXMgZmFpbGVkOyBhcyBhIHJlc3VsdCwgdGhlIHBsdWctaW4gd2lsbCBub3QNCi0gKiBiZSBhY3RpdmF0ZWQ7IG1vcmVvdmVyLCB0aGUgcGx1Zy1pbiB3aWxsIGJlIG1hcmtlZCBhcyBkaXNhYmxlZCBhbmQgDQotICogaW5lbGlnaWJsZSBmb3IgYWN0aXZhdGlvbiBmb3IgdGhlIGR1cmF0aW9uLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiBQbHVnLWluIHN0YXJ0dXAgY29kZSBzaG91bGQgYmUgcm9idXN0LiBJbiB0aGUgZXZlbnQgb2YgYSBzdGFydHVwIGZhaWx1cmUsDQotICogdGhlIHBsdWctaW4ncyA8Y29kZT5zaHV0ZG93bjwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBhdXRvbWF0aWNhbGx5LA0KLSAqIGluIGFuIGF0dGVtcHQgdG8gY2xvc2Ugb3BlbiBmaWxlcywgZXRjLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiBOb3RlIDE6IFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgaW52b2tlZCBieSB0aGUgcGxhdGZvcm0gDQotICogdGhlIGZpcnN0IHRpbWUgYW55IGNvZGUgaW4gdGhlIHBsdWctaW4gaXMgZXhlY3V0ZWQuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIE5vdGUgMjogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gcGVyZm9ybSBzaW1wbGUgaW5pdGlhbGl6YXRpb24gDQotICogb2YgdGhlIHBsdWctaW4gZW52aXJvbm1lbnQuIFRoZSBwbGF0Zm9ybSBtYXkgdGVybWluYXRlIGluaXRpYWxpemVycyANCi0gKiB0aGF0IGRvIG5vdCBjb21wbGV0ZSBpbiBhIHRpbWVseSBmYXNoaW9uLg0KLSAqIDwvcD4NCi0gKiA8Yj5DbGllbnMgbXVzdCBuZXZlciBleHBsaWNpdGx5IGNhbGwgdGhpcyBtZXRob2QuPC9iPg0KLSAqDQotICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIHRoaXMgcGx1Zy1pbiBkaWQgbm90IHN0YXJ0IHVwIHByb3Blcmx5DQotICovDQotcHVibGljIHZvaWQgc3RhcnR1cCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JLy8gU2V0dXAgSFRUUCBjbGllbnQNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0NCi0JY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsNCi0JY2xpZW50LnNldEF1dGhlbnRpY2F0b3IobmV3IEF1dGhvcml6YXRpb25EYXRhYmFzZSgpKTsNCi0JVVJMSGFuZGxlci5zZXRIdHRwQ2xpZW50KGNsaWVudCk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyU3RyaW5ncy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclN0cmluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiN2VjZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyU3RyaW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGxvYWRzIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGZyb20gYSByZXNvdXJjZSBidW5kbGUgcHJvcGVydGllcyBmaWxlLg0KLSAqLw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmFnZXJTdHJpbmdzDQotew0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBfcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLS8qKg0KLSAqIE9idGFpbnMgYSBOTCB0cmFuc2xhdGVkIHN0cmluZyBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlDQotICogQHBhcmFtIHN0cktleSBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKCBTdHJpbmcgc3RyS2V5ICkgDQotew0KLQlTdHJpbmcgc3RyVHJhbnNsYXRlZCA9IHN0cktleTsNCi0NCi0JLy8gT2J0YWluIHRoZSBzZXQgb2YgdHJhbnNsYXRlZCBzdHJpbmdzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiggX3Jlc291cmNlQnVuZGxlID09IG51bGwgKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlfcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIFVwZGF0ZU1hbmFnZXIuX3N0clBhY2thZ2VOYW1lICsgIi51cGRhdGVtYW5hZ2Vyc3RyaW5ncyIgKTsNCi0JCX0NCi0JCWNhdGNoKCBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXggKQ0KLQkJew0KLQkJCV9yZXNvdXJjZUJ1bmRsZSA9IG51bGw7DQotCQl9DQotCX0NCi0NCi0JLy8gT2J0YWluIHRoZSB0cmFuc2xhdGVkIHN0cmluZw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmKCBfcmVzb3VyY2VCdW5kbGUgIT0gbnVsbCApDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCXN0clRyYW5zbGF0ZWQgPSBfcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKCBzdHJLZXkgKTsNCi0JCX0NCi0JCWNhdGNoKCBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXggKQ0KLQkJew0KLQkJCXN0clRyYW5zbGF0ZWQgPSBzdHJLZXk7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHN0clRyYW5zbGF0ZWQ7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyVVJMQ29tcGFyYXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclVSTENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlNDc0NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyVVJMQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLS8qKg0KLSAqIA0KLSAqLw0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsNCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuYWdlclVSTENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yew0KLS8qKg0KLSAqIFVwZGF0ZU1hbmFnZXJUcmVlSXRlbUNvbXBhcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4NCi0gKi8NCi1wdWJsaWMgVXBkYXRlTWFuYWdlclVSTENvbXBhcmF0b3IoKSB7DQotCXN1cGVyKCk7DQotfQ0KLS8qKg0KLSAqIENvbXBhcmVzIHR3byBzdHJpbmdzIGluZGVwZW5kZW50IG9mIGNhc2UuDQotICogDQotICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUNCi0gKiAgICAgICAgIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUNCi0gKiAgICAgICAgIHNlY29uZC4gDQotICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIGFyZ3VtZW50cycgdHlwZXMgcHJldmVudCB0aGVtIGZyb20NCi0gKiAgICAgICAgIGJlaW5nIGNvbXBhcmVkIGJ5IHRoaXMgQ29tcGFyYXRvci4NCi0gKi8NCi1wdWJsaWMgaW50IGNvbXBhcmUoamF2YS5sYW5nLk9iamVjdCBvMSwgamF2YS5sYW5nLk9iamVjdCBvMikgew0KLQ0KLQlpZiAobzEgaW5zdGFuY2VvZiBVUkxOYW1lUGFpciAmJiBvMiBpbnN0YW5jZW9mIFVSTE5hbWVQYWlyKSB7DQotCQlyZXR1cm4gKChVUkxOYW1lUGFpcikgbzEpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkudG9Mb3dlckNhc2UoKS5jb21wYXJlVG8oKChVUkxOYW1lUGFpcikgbzIpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkudG9Mb3dlckNhc2UoKSk7DQotCX0NCi0NCi0JcmV0dXJuIDA7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS91cGRhdGVtYW5hZ2Vyc3RyaW5ncy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvdXBkYXRlbWFuYWdlcnN0cmluZ3MucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlYzAwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS91cGRhdGVtYW5hZ2Vyc3RyaW5ncy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLVNfQWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFkZA0KLVNfQWRkaXRpb25hbF9Mb2NhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFkZGl0aW9uYWwgTG9jYXRpb25zDQotU19Bbl9pbnN0YWxsYXRpb25fZXJyb3Jfb3JfY2FuY2VsbGF0aW9uX2hhc19vY2N1cnJlZCAgICAgID0gQW4gaW5zdGFsbGF0aW9uIGVycm9yIG9yIGNhbmNlbGxhdGlvbiBoYXMgb2NjdXJyZWQNCi1TX0F0X3RoZV9mb2xsb3dpbmdfZG9tYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBdCB0aGUgZm9sbG93aW5nIGRvbWFpbg0KLVNfQXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEF2YWlsYWJsZQ0KLVNfQ2FuY2VsX2NvbXBvbmVudF9pbnN0YWxsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9IENhbmNlbCBjb21wb25lbnQgaW5zdGFsbGF0aW9uDQotU19Db21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ29tcG9uZW50DQotU19Db21wb25lbnRfaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ29tcG9uZW50IGlkZW50aWZpZXINCi1TX0NvbXBvbmVudF9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDb21wb25lbnQgbmFtZQ0KLVNfQ29uZmlndXJhdGlvbl9DaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IENvbmZpZ3VyYXRpb24gQ2hhbmdlDQotU19Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ29weQ0KLVNfQ3VycmVudF9pbnN0YWxsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEN1cnJlbnQgaW5zdGFsbGF0aW9uDQotU19EZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRGVzY3JpcHRpb24NCi1TX0VuY291bnRlcmVkX2phcl9lbnRyeV9zZWN1cml0eV9leGNlcHRpb24gICAgICAgICAgICAgICAgPSBFbmNvdW50ZXJlZCBqYXIgZW50cnkgc2VjdXJpdHkgZXhjZXB0aW9uDQotU19FbnRlcl9hX3VzZXJfbmFtZV9hbmRfcGFzc3dvcmRfZm9yICAgICAgICAgICAgICAgICAgICAgID0gRW50ZXIgYSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGZvcg0KLVNfRXJyb3JfY2xvc2luZ19vdXRwdXRfc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVycm9yIGNsb3Npbmcgb3V0cHV0IHN0cmVhbQ0KLVNfRXJyb3JfaW5fcmVnaXN0cnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVycm9yIGluIHJlZ2lzdHJ5DQotU19FcnJvcl9vY2N1cnJlZF9kdXJpbmdfaW5zdGFsbGF0aW9uX2NvbXBsZXRpb24gICAgICAgICAgID0gRXJyb3Igb2NjdXJyZWQgZHVyaW5nIGluc3RhbGxhdGlvbiBjb21wbGV0aW9uDQotU19FcnJvcl9vY2N1cnJlZF9kdXJpbmdfaW5zdGFsbGF0aW9uX3NldHVwICAgICAgICAgICAgICAgID0gRXJyb3Igb2NjdXJyZWQgZHVyaW5nIGluc3RhbGxhdGlvbiBzZXR1cA0KLVNfRXJyb3Jfb2NjdXJyZWRfZHVyaW5nX3ZlcmlmaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICA9IEVycm9yIG9jY3VycmVkIGR1cmluZyB2ZXJpZmljYXRpb24NCi1TX0Vycm9yX3JlYWRpbmdfZnJvbV9pbnB1dF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgPSBFcnJvciByZWFkaW5nIGZyb20gaW5wdXQgc3RyZWFtDQotU19FcnJvcl93cml0aW5nX3RvX291dHB1dF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgID0gRXJyb3Igd3JpdGluZyB0byBvdXRwdXQgc3RyZWFtDQotU19FeGFtaW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRXhhbWluaW5nDQotU19GaWxlX2lzX25vdF9hX3ZhbGlkX0pBUl9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRmlsZSBpcyBub3QgYSB2YWxpZCBKQVIgZmlsZQ0KLVNfRmlsZV9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEZpbGUgbmFtZQ0KLVNfSFRUUF9jbGllbnRfbm90X3NldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEhUVFAgY2xpZW50IG5vdCBzZXQNCi1TX0lkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJZGVudGlmaWVyDQotU19JbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSW5mb3JtYXRpb24NCi1TX0luc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJbnN0YWxsDQotU19JbnN0YWxsX2NvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSW5zdGFsbCBjb21wb25lbnQNCi1TX0luc3RhbGxfQ29tcG9uZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJbnN0YWxsIENvbXBvbmVudHMNCi1TX0luc3RhbGxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJbnN0YWxsYXRpb24NCi1TX0luc3RhbGxhdGlvbl9jYW5jZWxsZWRfYnlfdXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJbnN0YWxsYXRpb24gY2FuY2VsbGVkIGJ5IHVzZXINCi1TX0luc3RhbGxhdGlvbl9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJbnN0YWxsYXRpb24gY29tcGxldGVkDQotU19JbnN0YWxsYXRpb25zX2hhdmVfY29tcGxldGVkX3N1Y2Nlc3NmdWxseSAgICAgICAgICAgICAgID0gSW5zdGFsbGF0aW9ucyBoYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkNCi1TX0luc3RhbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJbnN0YWxsZWQNCi1TX0luc3RhbGxlZF9Db21wb25lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJbnN0YWxsZWQgQ29tcG9uZW50cw0KLVNfSW5zdGFsbGluZ190aGlzX2NvbXBvbmVudF9tYXlfY29ycnVwdF95b3VyX2luc3RhbGxhdGlvbiA9IEluc3RhbGxpbmcgdGhpcyBjb21wb25lbnQgbWF5IGNvcnJ1cHQgeW91ciBpbnN0YWxsYXRpb24NCi1TX0xvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMb2NhdGlvbg0KLVNfTmV3X0NvbXBvbmVudF9VcGRhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5ldyBDb21wb25lbnQgVXBkYXRlcw0KLVNfTmV3X0NvbXBvbmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5ldyBDb21wb25lbnRzDQotU19Ob19pbnN0YWxsYWJsZV9pdGVtc193ZXJlX2ZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgID0gTm8gaW5zdGFsbGFibGUgaXRlbXMgd2VyZSBmb3VuZA0KLVNfbm90X2F2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5vdCBhdmFpbGFibGUNCi1TX25vdF9jb21wYXRpYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBub3QgY29tcGF0aWJsZQ0KLVNfbm90X25ld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5vdCBuZXdlcg0KLVNfbm90X3VwZGF0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5vdCB1cGRhdGFibGUNCi1TX051bWJlcl9vZl9pbnN0YWxsYXRpb25faGlzdG9yaWVzX3RvX2tlZXAgICAgICAgICAgICAgICAgPSBOdW1iZXIgb2YgaW5zdGFsbGF0aW9uIGhpc3RvcmllcyB0byBrZWVwDQotU19PYnRhaW5pbmdfaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gT2J0YWluaW5nIGluZm9ybWF0aW9uDQotU19PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gT0sNCi1TX29wdGlvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBvcHRpb25hbA0KLVNfUGFzc3dvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFBhc3N3b3JkDQotU19QYXNzd29yZF9SZXF1aXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUGFzc3dvcmQgUmVxdWlyZWQNCi1TX1ByZWRlZmluZWRfTG9jYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBQcmVkZWZpbmVkIExvY2F0aW9ucw0KLVNfUHJvdmlkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFByb3ZpZGVyDQotU19SZWFkaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUmVhZGluZw0KLVNfUmVtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFJlbW92ZQ0KLVNfUmVtb3ZlX3NlbGVjdGVkX2NvbXBvbmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFJlbW92ZSBzZWxlY3RlZCBjb21wb25lbnRzDQotU19SZXZlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUmV2ZXJ0DQotU19SZXZlcnRfdG9fYV9QcmV2aW91c19JbnN0YWxsYXRpb24gICAgICAgICAgICAgICAgICAgICAgID0gUmV2ZXJ0IHRvIGEgUHJldmlvdXMgSW5zdGFsbGF0aW9uDQotU19SZXZlcnRfdG9fYW5vdGhlcl9pbnN0YWxsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgID0gUmV2ZXJ0IHRvIGFub3RoZXIgaW5zdGFsbGF0aW9uDQotU19TZWFyY2hfZm9yX21vcmVfcmVjZW50X3ZlcnNpb25zX3RvX2luc3RhbGwgICAgICAgICAgICAgID0gU2VhcmNoIGZvciBtb3JlIHJlY2VudCB2ZXJzaW9ucyB0byBpbnN0YWxsDQotU19TZWFyY2hfZm9yX25ld19jb21wb25lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU2VhcmNoIGZvciBuZXcgY29tcG9uZW50cw0KLVNfU2VhcmNoX2Zvcl91cGRhdGVzX2Zvcl9hbGxfY29tcG9uZW50cyAgICAgICAgICAgICAgICAgICA9IFNlYXJjaCBmb3IgdXBkYXRlcyBmb3IgYWxsIGNvbXBvbmVudHMNCi1TX1NlYXJjaF9mb3JfdXBkYXRlc19mb3Jfc2VsZWN0ZWRfY29tcG9uZW50cyAgICAgICAgICAgICAgPSBTZWFyY2ggZm9yIHVwZGF0ZXMgZm9yIHNlbGVjdGVkIGNvbXBvbmVudHMNCi1TX1NlbGVjdF9hX3ByZXZpb3VzX2luc3RhbGxhdGlvbl90b19yZXZlcnRfdG8gICAgICAgICAgICAgPSBTZWxlY3QgYSBwcmV2aW91cyBpbnN0YWxsYXRpb24gdG8gcmV2ZXJ0IHRvDQotU19TZWxlY3RfYW55X29wdGlvbmFsX2NvbXBvbmVudHNfdG9faW5zdGFsbCAgICAgICAgICAgICAgID0gU2VsZWN0IGFueSBvcHRpb25hbCBjb21wb25lbnRzIHRvIGluc3RhbGwNCi1TX1NlbGVjdF9hdmFpbGFibGVfdmVyc2lvbnNfdG9faW5zdGFsbCAgICAgICAgICAgICAgICAgICAgPSBTZWxlY3QgYXZhaWxhYmxlIHZlcnNpb25zIHRvIGluc3RhbGwNCi1TX1NlbGVjdF9jb21wb25lbnRzX3RvX2luc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBTZWxlY3QgY29tcG9uZW50cyB0byBpbnN0YWxsDQotU19TZWxlY3RfbG9jYXRpb25zX3RvX3VwZGF0ZV9mcm9tICAgICAgICAgICAgICAgICAgICAgICAgID0gU2VsZWN0IGxvY2F0aW9ucyB0byB1cGRhdGUgZnJvbQ0KLVNfU2hvd19vbmx5X21vc3RfcmVjZW50X3ZlcnNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICA9IFNob3cgb25seSBtb3N0IHJlY2VudCB2ZXJzaW9ucw0KLVNfU29mdHdhcmVfVXBkYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFNvZnR3YXJlIFVwZGF0ZXMNCi1TX1NvdXJjZV9sb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBTb3VyY2UgbG9jYXRpb24NCi1TX1NvdXJjZV9VUkxfaXNfbWFsZm9ybWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBTb3VyY2UgVVJMIGlzIG1hbGZvcm1lZA0KLVNfU3BlY2lmeV9zZWFyY2hfbG9jYXRpb25zX2Zvcl9uZXdfY29tcG9uZW50cyAgICAgICAgICAgICA9IFNwZWNpZnkgc2VhcmNoIGxvY2F0aW9ucyBmb3IgbmV3IGNvbXBvbmVudHMNCi1TX1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBTdGF0dXMNCi1TX1RhcmdldF9VUkxfaXNfbWFsZm9ybWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBUYXJnZXQgVVJMIGlzIG1hbGZvcm1lZA0KLVNfVGhlX2NlcnRpZmljYXRlc191c2VkX3RvX2F1dGhlbnRpY2F0ZV90aGlzX2NvbXBvbmVudF9hcmVfbm90X3JlY29nbml6ZWQgPSBUaGUgY2VydGlmaWNhdGVzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgY29tcG9uZW50IGFyZSBub3QgcmVjb2duaXplZA0KLVNfVGhlX2NvbnRlbnRfb2ZfdGhpc19jb21wb25lbnRfaGFzX2JlZW5fY29ycnVwdGVkICAgICAgICA9IFRoZSBjb250ZW50IG9mIHRoaXMgY29tcG9uZW50IGhhcyBiZWVuIGNvcnJ1cHRlZA0KLVNfVGhlX2ZvbGxvd2luZ19pbnN0YWxsYXRpb25fd2lsbF9iZWNvbWVfYWN0aXZlX3doZW5fdGhlX3dvcmtiZW5jaF9pc19yZXN0YXJ0ZWQgPSBUaGUgZm9sbG93aW5nIGluc3RhbGxhdGlvbiB3aWxsIGJlY29tZSBhY3RpdmUgd2hlbiB0aGUgd29ya2JlbmNoIGlzIHJlc3RhcnRlZA0KLVNfVGhlX2ZvbGxvd2luZ19pdGVtc193aWxsX2JlX2luc3RhbGxlZCAgICAgICAgICAgICAgICAgICA9IFRoZSBmb2xsb3dpbmcgaXRlbXMgd2lsbCBiZSBpbnN0YWxsZWQNCi1TX1RoZV9mb2xsb3dpbmdfaXRlbXNfd2lsbF9iZV91cGRhdGVkICAgICAgICAgICAgICAgICAgICAgPSBUaGUgZm9sbG93aW5nIGl0ZW1zIHdpbGwgYmUgdXBkYXRlZA0KLVNfVGhlX2luc3RhbGxhdGlvbl9wcm9jZXNzX3dpbGxfYmVfYWJvcnRlZCAgICAgICAgICAgICAgICA9IFRoZSBpbnN0YWxsYXRpb24gcHJvY2VzcyB3aWxsIGJlIGFib3J0ZWQNCi1TX1RoZV9wcm92aWRlcl9vZl90aGlzX2NvbXBvbmVudF9jYW5ub3RfYmVfdmVyaWZpZWQgICAgICAgPSBUaGUgcHJvdmlkZXIgb2YgdGhpcyBjb21wb25lbnQgY2Fubm90IGJlIHZlcmlmaWVkDQotU19UaGlzX2NvbXBvbmVudF9oYXNfbm90X2JlZW5fZGlnaXRhbGx5X3NpZ25lZCAgICAgICAgICAgID0gVGhpcyBjb21wb25lbnQgaGFzIG5vdCBiZWVuIGRpZ2l0YWxseSBzaWduZWQNCi1TX1RoaXNfY29tcG9uZW50X3dpbGxfbm90X2JlX2luc3RhbGxlZCAgICAgICAgICAgICAgICAgICAgPSBUaGlzIGNvbXBvbmVudCB3aWxsIG5vdCBiZSBpbnN0YWxsZWQNCi1TX1VwZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBVcGRhdGUNCi1TX1VwZGF0ZV9BbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBVcGRhdGUgQWxsDQotU19VcGRhdGVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVXBkYXRlcyBjb21wbGV0ZWQNCi1TX1VuYWJsZV90b19hY2Nlc3NfdGhlX2ZvbGxvd2luZ19sb2NhdGlvbnMgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gYWNjZXNzIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zDQotU19VbmFibGVfdG9fY29ubmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIGNvbm5lY3QNCi1TX1VuYWJsZV90b19jcmVhdGVfZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gY3JlYXRlIGZpbGUNCi1TX1VuYWJsZV90b19jcmVhdGVfamFyX2VudHJ5X1VSTCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gY3JlYXRlIGphciBlbnRyeSBVUkwNCi1TX1VuYWJsZV90b19jcmVhdGVfb3V0cHV0X2ZpbGVfZm9yX0phcl9lbnRyeSAgICAgICAgICAgICAgPSBVbmFibGUgdG8gY3JlYXRlIG91dHB1dCBmaWxlIGZvciBKYXIgZW50cnkNCi1TX1VuYWJsZV90b19kZWxldGVfZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gZGVsZXRlIGZpbGUNCi1TX1VuYWJsZV90b19maW5kX2luc3RhbGxfbWFuaWZlc3RfZmlsZV9pbl9KYXIgICAgICAgICAgICAgPSBVbmFibGUgdG8gZmluZCBpbnN0YWxsIG1hbmlmZXN0IGZpbGUgaW4gSmFyDQotU19VbmFibGVfdG9fZmluZF9kZWZpbmVkX2NvbnRlbnRzX2luX0phciAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIGZpbmQgZGVmaW5lZCBjb250ZW50cyBpbiBKYXINCi1TX1VuYWJsZV90b19vYnRhaW5fc291cmNlX2lucHV0X3N0cmVhbSAgICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gb2J0YWluIHNvdXJjZSBpbnB1dCBzdHJlYW0NCi1TX1VuYWJsZV90b19vYnRhaW5fdGFyZ2V0X291dHB1dF9zdHJlYW0gICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gb2J0YWluIHRhcmdldCBvdXRwdXQgc3RyZWFtDQotU19VbmFibGVfdG9fb3Blbl9lcnJvcl9sb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIG9wZW4gZXJyb3JfbG9ncw0KLVNfVW5hYmxlX3RvX29wZW5famFyX2VudHJ5X2lucHV0X3N0cmVhbSAgICAgICAgICAgICAgICAgICA9IFVuYWJsZSB0byBvcGVuIGphciBlbnRyeSBpbnB1dCBzdHJlYW0NCi1TX1VuYWJsZV90b19vcGVuX0phcl9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gb3BlbiBKYXIgZmlsZQ0KLVNfVW5kZWZpbmVkX2NvbnRlbnRzX2ZvdW5kX2luX0phciAgICAgICAgICAgICAgICAgICAgICAgICA9IFVuZGVmaW5lZCBjb250ZW50cyBmb3VuZCBpbiBKYXINCi1TX1VuZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBVbmRvDQotU19Vc2VyX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVXNlciBuYW1lDQotU19WZXJpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVmVyaWZpY2F0aW9uDQotU19WZXJpZmljYXRpb25fY2FuY2VsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVmVyaWZpY2F0aW9uIGNhbmNlbGxlZA0KLVNfVmVyaWZ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFZlcmlmeQ0KLVNfVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFZlcnNpb24NCi1TX1lvdV9hcmVfYWJvdXRfdG9faW5zdGFsbF9hX3NpZ25lZF9jb21wb25lbnQgICAgICAgICAgICAgPSBZb3UgYXJlIGFib3V0IHRvIGluc3RhbGwgYSBzaWduZWQgY29tcG9uZW50DQotU19Zb3VfYXJlX2Fib3V0X3RvX2luc3RhbGxfYW5fdW5zaWduZWRfY29tcG9uZW50ICAgICAgICAgID0gWW91IGFyZSBhYm91dCB0byBpbnN0YWxsIGFuIHVuc2lnbmVkIGNvbXBvbmVudA0KLVNfWW91X21heV9jaG9vc2VfdG9faW5zdGFsbF90aGVfY29tcG9uZW50X29yX2NhbmNlbF9pdHNfaW5zdGFsbGF0aW9uID0gWW91IG1heSBjaG9vc2UgdG8gaW5zdGFsbCB0aGUgY29tcG9uZW50IG9yIGNhbmNlbCBpdHMgaW5zdGFsbGF0aW9uDQotU19Zb3VfbXVzdF9yZXN0YXJ0X3RoZV93b3JrYmVuY2hfdG9fYWN0aXZhdGVfYW55X2NoYW5nZXMgID0gWW91IG11c3QgcmVzdGFydCB0aGUgd29ya2JlbmNoIHRvIGFjdGl2YXRlIGFueSBjaGFuZ2VzDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0F1dGhvcml6YXRpb25EYXRhYmFzZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0F1dGhvcml6YXRpb25EYXRhYmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDJhZjE1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9BdXRob3JpemF0aW9uRGF0YWJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud2ViZGF2Lmh0dHAuY2xpZW50LklBdXRoZW50aWNhdG9yOw0KLQ0KLS8qKg0KLSAqIEEgdHJhbnNpZW50IGRhdGFiYXNlIHRoYXQgcmVtZW1iZXJzIGluZm9ybWF0aW9uLCBzdWNoIGFzIHVzZXJuYW1lcyBhbmQNCi0gKiBwYXNzd29yZHMuICBUaGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIG1lbW9yeSBvbmx5IGFuZCBpcyBkaXNjYXJ0ZWQNCi0gKiB3aGVuIHRoZSBQbGFmb3JtIHNodXRzIGRvd24uDQotICovDQotcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EYXRhYmFzZSBpbXBsZW1lbnRzIElBdXRoZW50aWNhdG9yIHsNCi0NCi0JLyoqDQotCSAqIFRoZSBNYXAgY29udGFpbmluZyB0aGUgdXNlcmlkIGFuZCBwYXNzd29yZA0KLQkgKi8NCi0JcHJpdmF0ZSBNYXAgcmVzdWx0ID0gbmV3IEhhc2h0YWJsZSgpOw0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRBdXRoZW50aWNhdGlvbkluZm8oVVJMIHNlcnZlclVybCwgU3RyaW5nIHJlYWxtLCBTdHJpbmcgc2NoZW1lLCBNYXAgaW5mbykgew0KLQkJdHJ5IHsNCi0JCQlQbGF0Zm9ybS5hZGRBdXRob3JpemF0aW9uSW5mbyhzZXJ2ZXJVcmwsIHJlYWxtLCBzY2hlbWUsIGluZm8pOw0KLQkJfQ0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZU1hbmFnZXJQbHVnaW4uZ2V0UGx1Z2luSW5zdGFuY2UoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkUHJvdGVjdGlvblNwYWNlKFVSTCByZXNvdXJjZVVybCwgU3RyaW5nIHJlYWxtKSB7DQotCQl0cnkgew0KLQkJCVBsYXRmb3JtLmFkZFByb3RlY3Rpb25TcGFjZShyZXNvdXJjZVVybCwgcmVhbG0pOw0KLQkJfQ0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZU1hbmFnZXJQbHVnaW4uZ2V0UGx1Z2luSW5zdGFuY2UoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7DQotCQl9DQotDQotCX0NCi0JLyoqDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgTWFwIGdldEF1dGhlbnRpY2F0aW9uSW5mbyhVUkwgc2VydmVyVXJsLCBTdHJpbmcgcmVhbG0sIFN0cmluZyBzY2hlbWUpIHsNCi0NCi0JCXJldHVybiBQbGF0Zm9ybS5nZXRBdXRob3JpemF0aW9uSW5mbyhzZXJ2ZXJVcmwsIHJlYWxtLCBzY2hlbWUpOw0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdGVjdGlvblNwYWNlKFVSTCByZXNvdXJjZVVybCkgew0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldFByb3RlY3Rpb25TcGFjZShyZXNvdXJjZVVybCk7DQotCX0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIE1hcCByZXF1ZXN0QXV0aGVudGljYXRpb25JbmZvKGZpbmFsIFVSTCByZXNvdXJjZVVybCwgZmluYWwgU3RyaW5nIHJlYWxtLCBmaW5hbCBTdHJpbmcgc2NoZW1lKSB7DQotDQotCQlyZXN1bHQgPSBuZXcgSGFzaHRhYmxlKCk7DQotCQlpZiAoc2NoZW1lLmVxdWFsc0lnbm9yZUNhc2UoIkJhc2ljIikpIHsNCi0NCi0JCQlEaXNwbGF5IGRpc3AgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsNCi0JCQlpZiAoZGlzcCAhPSBudWxsKSB7DQotCQkJCXByb21wdEZvclBhc3N3b3JkKHJlc291cmNlVXJsLCByZWFsbSwgcmVzdWx0KTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsNCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCi0JCQkJCQlwcm9tcHRGb3JQYXNzd29yZChyZXNvdXJjZVVybCwgcmVhbG0sIHJlc3VsdCk7DQotCQkJCQl9DQotCQkJCX0pOw0KLQkJCX07DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb21wdEZvclBhc3N3b3JkKFVSTCByZXNvdXJjZVVybCwgU3RyaW5nIHJlYWxtLCBNYXAgaW5mbykgew0KLQ0KLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsNCi0JCVVzZXJWYWxpZGF0aW9uRGlhbG9nIHVpID0gbmV3IFVzZXJWYWxpZGF0aW9uRGlhbG9nKHNoZWxsLCByZXNvdXJjZVVybCwgcmVhbG0sICIiKTsNCi0JCXVpLnNldFVzZXJuYW1lTXV0YWJsZSh0cnVlKTsNCi0JCXVpLnNldEJsb2NrT25PcGVuKHRydWUpOw0KLQkJdWkub3BlbigpOw0KLQ0KLQkJaWYgKHVpLmdldFJldHVybkNvZGUoKSAhPSB1aS5DQU5DRUwpIHsNCi0JCQlpbmZvLnB1dCgidXNlcm5hbWUiLCB1aS5nZXRVc2VyaWQoKSk7DQotCQkJaW5mby5wdXQoInBhc3N3b3JkIiwgdWkuZ2V0UGFzc3dvcmQoKSk7DQotCQl9DQotCQlzaGVsbC5kaXNwb3NlKCk7DQotDQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0luc3RhbGxhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0luc3RhbGxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTZmODIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9JbnN0YWxsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QuTGF1bmNoSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LkxhdW5jaEluZm8uSGlzdG9yeTsNCi0vKioNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW5zdGFsbGF0aW9uIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19JRCA9ICItaWQiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0xJU1QgPSAiLWxpc3QiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0xPQ0FUSU9OID0gIi1sb2NhdGlvbiI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfU0VUID0gIi1zZXQiOw0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gX2JMaXN0ID0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiBfYlNldCA9IGZhbHNlOw0KLQlwcml2YXRlIFN0cmluZyBfc3RyTG9jYXRpb24gPSBudWxsOw0KLQlwcml2YXRlIFN0cmluZyBfc3RySWQgPSBudWxsOw0KLQlwcml2YXRlIGludCBfaUlkID0gLTE7DQotCXByaXZhdGUgTGF1bmNoSW5mbyBfbGF1bmNoSW5mbyA9IG51bGw7DQotCS8qKg0KLQkgKiBJbnN0YWxsYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4NCi0JICovDQotCXB1YmxpYyBJbnN0YWxsYXRpb24oKSB7DQotCQlzdXBlcigpOw0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgU3RyaW5nIGNoZWNrQ29tbWFuZExpbmVPcHRpb25zKCkgew0KLQ0KLQkJLy8gQ29tbWFuZA0KLQkJLy8tLS0tLS0tLQ0KLQkJaWYgKF9iTGlzdCA9PSB0cnVlKSB7DQotCQkJaWYgKF9iU2V0ID09IHRydWUpIHsNCi0JCQkJcmV0dXJuICJJbnZhbGlkIG9wdGlvbiBzeW50YXgiOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWVsc2UgaWYgKF9iU2V0ID09IHRydWUpIHsNCi0JCQlpZiAoX2JMaXN0ID09IHRydWUpIHsNCi0JCQkJcmV0dXJuICJJbnZhbGlkIG9wdGlvbiBzeW50YXgiOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWVsc2Ugew0KLQkJCXJldHVybiAiQ29tbWFuZCBtaXNzaW5nIjsNCi0JCX0NCi0NCi0JCS8vIExvY2F0aW9uDQotCQkvLy0tLS0tLS0tLQ0KLQkJaWYgKF9zdHJMb2NhdGlvbiA9PSBudWxsIHx8IF9zdHJMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSB7DQotCQkJcmV0dXJuICJMb2NhdGlvbiBtaXNzaW5nIjsNCi0JCX0NCi0NCi0JCVVSTCB1cmxMb2NhdGlvbiA9IG51bGw7DQotDQotCQl0cnkgew0KLQkJCXVybExvY2F0aW9uID0gbmV3IFVSTChfc3RyTG9jYXRpb24pOw0KLQkJfQ0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQkJCXJldHVybiAiSW52YWxpZCBsb2NhdGlvbiBzeW50YXgiOw0KLQkJfQ0KLQ0KLQkJLy8gU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8JTGF1bmNoSW5mby5zdGFydHVwKHVybExvY2F0aW9uKTsNCi0JCV9sYXVuY2hJbmZvID0gTGF1bmNoSW5mby5nZXRDdXJyZW50KCk7DQotDQotCQkvLyBTZXQNCi0JCS8vLS0tLQ0KLQkJaWYgKF9iU2V0ID09IHRydWUpIHsNCi0JCQlpZiAoX3N0cklkID09IG51bGwgfHwgX3N0cklkLmxlbmd0aCgpID09IDApIHsNCi0JCQkJcmV0dXJuICJJbnN0YWxsYXRpb24gaWRlbnRpZmllciBudW1iZXIgbWlzc2luZyI7DQotCQkJfQ0KLQ0KLQkJCXRyeSB7DQotCQkJCV9pSWQgPSBuZXcgSW50ZWdlcihfc3RySWQpLmludFZhbHVlKCk7DQotCQkJfQ0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsNCi0JCQkJcmV0dXJuICJJbnZhbGlkIGlkZW50aWZpZXIgc3ludGF4IjsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZG9MaXN0KCkgew0KLQ0KLQkJTGF1bmNoSW5mbyBsYXVuY2hJbmZvRm9ybWVyID0gbnVsbDsNCi0NCi0JCUxhdW5jaEluZm8uSGlzdG9yeVtdIGhpc3RvcmllcyA9IF9sYXVuY2hJbmZvLmdldExhdW5jaEluZm9IaXN0b3J5KCk7DQotDQotCQlpZiAoaGlzdG9yaWVzLmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiAiTm8gaGlzdG9yaWVzIGZvdW5kIjsNCi0NCi0JCWlmIChoaXN0b3JpZXMubGVuZ3RoID09IDEgJiYgaGlzdG9yaWVzWzBdLmdldExhdW5jaEluZm9EYXRlKCkgPT0gbnVsbCkNCi0JCQlyZXR1cm4gIk5vIGhpc3RvcmllcyBmb3VuZCI7DQotDQotCQkvLyBTYW1lIG9yZGVyIGFzIGRvU2V0KCkNCi0JCS8vIE1vc3QgcmVjZW50IHRvIG9sZGVzdCBvcmRlcg0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpbnQgaUluZGV4ID0gMTsNCi0NCi0JCWZvciAoaW50IGkgPSBoaXN0b3JpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsNCi0NCi0JCQlEYXRlIGRhdGUgPSBoaXN0b3JpZXNbaV0uZ2V0TGF1bmNoSW5mb0RhdGUoKTsNCi0NCi0JCQkvLyBPbGRlciBwcm9maWxlDQotCQkJLy8tLS0tLS0tLS0tLS0tLQ0KLQkJCWlmIChkYXRlICE9IG51bGwpIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKEludGVnZXIudG9TdHJpbmcoaUluZGV4KyspICsgIiAiICsgaGlzdG9yaWVzW2ldLmdldExhdW5jaEluZm9EYXRlKCkudG9TdHJpbmcoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBkb1NldCgpIHsNCi0NCi0JCUxhdW5jaEluZm8uSGlzdG9yeVtdIGhpc3RvcmllcyA9IF9sYXVuY2hJbmZvLmdldExhdW5jaEluZm9IaXN0b3J5KCk7DQotDQotCQlpZiAoX2lJZCA8IGhpc3Rvcmllcy5sZW5ndGgpIHsNCi0NCi0JCQlpbnQgaUluZGV4ID0gMTsNCi0NCi0JCQkvLyBTYW1lIGFsZ29yaXRobSBhcyBkb0xpc3QoKQ0KLQkJCS8vIE1vc3QgcmVjZW50IHRvIG9sZGVzdCBvcmRlcg0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCWZvciAoaW50IGkgPSBoaXN0b3JpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsNCi0NCi0JCQkJRGF0ZSBkYXRlID0gaGlzdG9yaWVzW2ldLmdldExhdW5jaEluZm9EYXRlKCk7DQotDQotCQkJCS8vIE9sZGVyIHByb2ZpbGUNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLQ0KLQkJCQlpZiAoZGF0ZSAhPSBudWxsKSB7DQotCQkJCQlpZiAoaUluZGV4ID09IF9pSWQpIHsNCi0JCQkJCQlfbGF1bmNoSW5mby5yZXZlcnRUbyhoaXN0b3JpZXNbaV0pOw0KLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkYXRlLnRvU3RyaW5nKCkpOw0KLQkJCQkJCXJldHVybiBudWxsOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSB7DQotCQkJCQkJaUluZGV4Kys7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gIklkZW50aWZpZXIgbm90IGZvdW5kIjsNCi0JfQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCi0NCi0JCUluc3RhbGxhdGlvbiBpbnN0YWxsYXRpb24gPSBuZXcgSW5zdGFsbGF0aW9uKCk7DQotDQotCQlpbnN0YWxsYXRpb24ucGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJncyk7DQotDQotCQlTdHJpbmcgc3RyRXJyb3IgPSBpbnN0YWxsYXRpb24uY2hlY2tDb21tYW5kTGluZU9wdGlvbnMoKTsNCi0NCi0JCWlmIChzdHJFcnJvciA9PSBudWxsKSB7DQotCQkJaWYgKGluc3RhbGxhdGlvbi5fYkxpc3QgPT0gdHJ1ZSkNCi0JCQkJc3RyRXJyb3IgPSBpbnN0YWxsYXRpb24uZG9MaXN0KCk7DQotDQotCQkJZWxzZSBpZiAoaW5zdGFsbGF0aW9uLl9iU2V0ID09IHRydWUpDQotCQkJCXN0ckVycm9yID0gaW5zdGFsbGF0aW9uLmRvU2V0KCk7DQotCQl9DQotDQotCQlpZiAoc3RyRXJyb3IgIT0gbnVsbCkgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJFcnJvcik7DQotCQkJcHJpbnRVc2FnZSgpOw0KLQkJCVN5c3RlbS5leGl0KC0xKTsNCi0JCX0NCi0JfQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyB2b2lkIHBhcnNlQ29tbWFuZExpbmVPcHRpb25zKFN0cmluZ1tdIHN0cmFBcmdzKSB7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmFBcmdzLmxlbmd0aDsgKytpKSB7DQotDQotCQkJLy8gQ29tbWFuZDogTGlzdA0KLQkJCS8vLS0tLS0tLS0tLS0tLS0NCi0JCQlpZiAoc3RyYUFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZShTVFJJTkdfTElTVCkgPT0gdHJ1ZSkgew0KLQkJCQlfYkxpc3QgPSB0cnVlOw0KLQkJCX0NCi0NCi0JCQkvLyBDb21tYW5kOiBTZXQNCi0JCQkvLy0tLS0tLS0tLS0tLS0NCi0JCQllbHNlIGlmIChzdHJhQXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFNUUklOR19TRVQpID09IHRydWUpIHsNCi0JCQkJX2JTZXQgPSB0cnVlOw0KLQkJCX0NCi0NCi0JCQkvLyBMb2NhdGlvbiB0byBpbnN0YWxsIGZyb20NCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQllbHNlIGlmIChzdHJhQXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFNUUklOR19MT0NBVElPTikgPT0gdHJ1ZSAmJiBpIDwgc3RyYUFyZ3MubGVuZ3RoIC0gMSkgew0KLQkJCQlfc3RyTG9jYXRpb24gPSBzdHJhQXJnc1srK2ldOw0KLQkJCX0NCi0NCi0JCQkvLyBJZGVudGlmaWVyDQotCQkJLy8tLS0tLS0tLS0tLQ0KLQkJCWVsc2UgaWYgKHN0cmFBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoU1RSSU5HX0lEKSA9PSB0cnVlICYmIGkgPCBzdHJhQXJncy5sZW5ndGggLSAxKSB7DQotCQkJCV9zdHJJZCA9IHN0cmFBcmdzWysraV07DQotCQkJfQ0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOw0KLQkJU3lzdGVtLm91dC5wcmludGxuKCItbGlzdCAtbG9jYXRpb24gdXJsUGF0aCIpOw0KLQkJU3lzdGVtLm91dC5wcmludGxuKCItc2V0ICAtbG9jYXRpb24gdXJsUGF0aCAtaWQgbnVtYmVyIik7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0phclZlcmlmaWNhdGlvbkRpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0phclZlcmlmaWNhdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDUzODlkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9KYXJWZXJpZmljYXRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9KYXJWZXJpZmljYXRpb25SZXN1bHQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9KYXJWZXJpZmljYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxMTE4MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvSmFyVmVyaWZpY2F0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi0vKioNCi0gKiBSZXN1bHQgb2YgdGhlIHNlcnZpY2UNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmFyVmVyaWZpY2F0aW9uUmVzdWx0IHsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMX0lOU1RBTEwgPSAwOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19UT19JTlNUQUxMID0gMTsNCi0NCi0JcHJpdmF0ZSBpbnQgcmVzdWx0Q29kZTsNCi0JcHJpdmF0ZSBFeGNlcHRpb24gcmVzdWx0RXhjZXB0aW9uOw0KLQkvKioNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UmVzdWx0Q29kZSgpIHsNCi0JCXJldHVybiByZXN1bHRDb2RlOw0KLQl9DQotCS8qKg0KLQkgKi8NCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRSZXN1bHRFeGNlcHRpb24oKSB7DQotCQlyZXR1cm4gcmVzdWx0RXhjZXB0aW9uOw0KLQl9DQotCS8qKg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0Q29kZShpbnQgbmV3UmVzdWx0Q29kZSkgew0KLQkJcmVzdWx0Q29kZSA9IG5ld1Jlc3VsdENvZGU7DQotCX0NCi0JLyoqDQotCSAqIGNhbGxlZCBieSBKYXJWZXJpZmljYXRpb25TZXJ2aWNlIG9ubHkNCi0JICovDQotCXZvaWQgc2V0UmVzdWx0RXhjZXB0aW9uKEV4Y2VwdGlvbiBuZXdSZXN1bHRFeGNlcHRpb24pIHsNCi0JCXJlc3VsdEV4Y2VwdGlvbiA9IG5ld1Jlc3VsdEV4Y2VwdGlvbjsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvSmFyVmVyaWZpY2F0aW9uU2VydmljZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliNDMzOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvSmFyVmVyaWZpY2F0aW9uU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0phclZlcmlmaWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvSmFyVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhMTFkNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvSmFyVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9LZXlTdG9yZXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9LZXlTdG9yZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4NGUwYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvS2V5U3RvcmVzLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvTWFpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmMDM2Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOw0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOw0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KLS8qKg0KLSAqIFN0YXJ0dXAgY2xhc3MgZm9yIEVjbGlwc2UuIENyZWF0ZXMgYSBjbGFzcyBsb2FkZXIgdXNpbmcNCi0gKiBzdXBwbGllZCBVUkwgb2YgcGxhdGZvcm0gaW5zdGFsbGF0aW9uLCBsb2FkcyBhbmQgY2FsbHMNCi0gKiB0aGUgRWNsaXBzZSBCb290IExvYWRlcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNYWluIHsNCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsNCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNhZ2UgPSBmYWxzZTsNCi0JcHJvdGVjdGVkIFN0cmluZyBib290TG9jYXRpb24gPSBudWxsOw0KLQlwcm90ZWN0ZWQgU3RyaW5nIGFwcGxpY2F0aW9uOw0KLQlwcm90ZWN0ZWQgVVJMIHBsdWdpblBhdGhMb2NhdGlvbjsNCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsNCi0NCi0JLy8gY29uc3RhbnRzDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTiA9ICItYXBwbGljYXRpb24iOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVCA9ICItYm9vdCI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVRyA9ICItZGVidWciOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0UgPSAiLT8iOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVExPQURFUiA9ICJvcmcuZWNsaXBzZS5jb3JlLmJvb3QuQm9vdExvYWRlciI7DQotDQotCS8vIFRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIGJvb3QgbG9hZGVyIGNvZGUuICBUaGlzIGlzIHVzZWQgdG8gY29uc3RydWN0DQotCS8vIHRoZSBjb3JyZWN0IGNsYXNzIHBhdGggZm9yIHJ1bm5pbmcgaW4gVkFKIGFuZCBWQU1FLg0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIkVjbGlwc2UgQ29yZSBCb290IjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpblZBSjsNCi0Jc3RhdGljIHsNCi0JCXRyeSB7DQotCQkJQ2xhc3MuZm9yTmFtZSgiY29tLmlibS51dm0ubGFuZy5Qcm9qZWN0Q2xhc3NMb2FkZXIiKTsNCi0JCQlpblZBSiA9IHRydWU7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCWluVkFKID0gZmFsc2U7DQotCQl9DQotCX0NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpblZBTUU7DQotCXN0YXRpYyB7DQotCQl0cnkgew0KLQkJCUNsYXNzLmZvck5hbWUoImNvbS5pYm0uZWNsaXBzZS5WQU1FIik7DQotCQkJaW5WQU1FID0gdHJ1ZTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJaW5WQU1FID0gZmFsc2U7DQotCQl9DQotCX0NCi0NCi1wcm90ZWN0ZWQgdm9pZCBiYXNpY1J1bihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JQ2xhc3MgY2xhenogPSBnZXRCb290TG9hZGVyKGJvb3RMb2NhdGlvbik7DQotCU1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZCgicnVuIiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIFVSTC5jbGFzcywgU3RyaW5nLmNsYXNzLCBTdHJpbmdbXS5jbGFzcyB9KTsNCi0JdHJ5IHsNCi0JCW1ldGhvZC5pbnZva2UoY2xhenosIG5ldyBPYmplY3RbXSB7IGFwcGxpY2F0aW9uLCBwbHVnaW5QYXRoTG9jYXRpb24sIGxvY2F0aW9uLCBhcmdzIH0pOw0KLQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCi0JCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgRXJyb3IpDQotCQkJdGhyb3cgKEVycm9yKSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOw0KLQkJZWxzZQ0KLQkJCXRocm93IGU7DQotCX0NCi19DQotcHVibGljIENsYXNzIGdldEJvb3RMb2FkZXIoU3RyaW5nIGJhc2UpIHRocm93cyBFeGNlcHRpb24gew0KLQlVUkxDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgZ2V0Qm9vdFVSTChiYXNlKX0sIG51bGwpOw0KLQlyZXR1cm4gbG9hZGVyLmxvYWRDbGFzcyhCT09UTE9BREVSKTsNCi19DQotLyoqDQotICogUmV0dXJucyB0aGUgPGNvZGU+VVJMPC9jb2RlPiB3aGVyZSB0aGUgYm9vdCBjbGFzc2VzIGFyZSBsb2NhdGVkLg0KLSAqLw0KLXByb3RlY3RlZCBVUkwgZ2V0Qm9vdFVSTChTdHJpbmcgYmFzZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCVVSTCB1cmwgPSBudWxsOw0KLQlpZiAoYmFzZSAhPSBudWxsKSANCi0JCXJldHVybiBuZXcgVVJMKGJhc2UpOw0KLQkvLyBDcmVhdGUgYSBVUkwgYmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mIHRoaXMgY2xhc3MnIGNvZGUuDQotCS8vIHN0cmlwIG9mZiBqYXIgZmlsZSBhbmQvb3IgbGFzdCBkaXJlY3RvcnkgdG8gZ2V0IA0KLQkvLyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgcHJvamVjdHMuDQotCXVybCA9IGdldENsYXNzKCkuZ2V0UHJvdGVjdGlvbkRvbWFpbigpLmdldENvZGVTb3VyY2UoKS5nZXRMb2NhdGlvbigpOw0KLQlTdHJpbmcgcGF0aCA9IHVybC5nZXRGaWxlKCk7DQotCWlmIChwYXRoLmVuZHNXaXRoKCIuamFyIikpDQotCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZigiLyIpKTsNCi0JaWYgKHBhdGguZW5kc1dpdGgoIi8iKSkNCi0JCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gMSk7DQotCWlmIChpblZBSiB8fCBpblZBTUUpIHsNCi0JCWludCBpeCA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsNCi0JCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBpeCArIDEpOw0KLQkJcGF0aCA9IHBhdGggKyBQUk9KRUNUX05BTUUgKyAiLyI7DQotCX0gZWxzZQ0KLQkJcGF0aCA9IHBhdGggKyAiL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ib290L2Jvb3QuamFyIjsNCi0JcmV0dXJuIG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksIHBhdGgpOw0KLX0NCi0vKioNCi0gKiBQcmludCB0aGUgdXNhZ2Ugb2YgdGhpcyBsYXVuY2hlciBvbiB0aGUgc3lzdGVtIGNvbnNvbGUNCi0gKi8NCi1wcm90ZWN0ZWQgdm9pZCBwcmludFVzYWdlKFByaW50V3JpdGVyIG91dCkgew0KLQlvdXQucHJpbnRsbigiVGhlIGdlbmVyYWwgZm9ybSBvZiB1c2luZyB0aGUgUGxhdGZvcm0gYm9vdHN0cmFwIG1haW4gaXM6Iik7DQotCW91dC5wcmludGxuKCIgICAgICBqYXZhIDxtYWluIGNsYXNzPiAtYXBwbGljYXRpb24gPG5hbWU+IFtvcHRpb24gbGlzdF0iKTsNCi0Jb3V0LnByaW50bG4oIndoZXJlIHRoZSByZXF1aXJlZCBhcmd1bWVudHMgYXJlOiIpOw0KLQlvdXQucHJpbnRsbigiICAgICAgLWFwcGxpY2F0aW9uIDxuYW1lPiA6IHRoZSBhcHBsaWNhdGlvbiB0byBydW4gIik7DQotCW91dC5wcmludGxuKCJhbmQgd2hlcmUgdGhlIG9wdGlvbiBsaXN0IGNhbiBiZSBhbnkgbnVtYmVyIG9mIHRoZSBmb2xsb3dpbmc6Iik7DQotCW91dC5wcmludGxuKCIgICAgICAtcGxhdGZvcm0gPGxvY2F0aW9uPiA6IHJ1biBpbiB0aGUgZ2l2ZW4gbG9jYXRpb24iKTsNCi0Jb3V0LnByaW50bG4oIiAgICAgIC1kZWJ1ZyBbZGVidWcgb3B0aW9ucyBmaWxlXSA6IHR1cm4gb24gZGVidWcgbW9kZS4gIFJlYWQgZGVidWcgb3B0aW9ucyBmcm9tICIpOw0KLQlvdXQucHJpbnRsbigiICAgICAgICAgIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBmcm9tIC4vLm9wdGlvbnMgaWYgbm90IHNwZWNpZmllZC4iKTsNCi0Jb3V0LnByaW50bG4oIiAgICAgIC0/IDogcHJpbnQgdGhpcyBtZXNzYWdlIik7DQotCW91dC5mbHVzaCgpOw0KLX0NCi1wcm90ZWN0ZWQgU3RyaW5nW10gcHJvY2Vzc0NvbW1hbmRMaW5lKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gew0KLQlpbnRbXSBjb25maWdBcmdzID0gbmV3IGludFsxMDBdOw0KLQljb25maWdBcmdzWzBdID0gLTE7IC8vIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmlyc3QgZWxlbWVudCB0byBzb21ldGhpbmcgdGhhdCBjb3VsZCBub3QgYmUgYW4gaW5kZXguDQotCWludCBjb25maWdBcmdJbmRleCA9IDA7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgew0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aG91dCBwYXJhbWV0ZXJzIChpLmUuLCBhIGZsYWcgYXJnKQ0KLQkJLy8gY2hlY2sgaWYgZGVidWcgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoZSBlbnRpcmUgcGxhdGZvcm0NCi0JCWlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoREVCVUcpKSB7DQotCQkJZGVidWcgPSB0cnVlOw0KLQkJCS8vIHBhc3NlZCB0aHJ1IHRoaXMgYXJnIChpLmUuLCBkbyBub3Qgc2V0IGZvdW5kID0gdHJ1ZQ0KLQkJfQ0KLQ0KLQkJLy8gbG9vayBmb3IgdGhlIHVzYWdlIGZsYWcNCi0JCWlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoVVNBR0UpKSB7DQotCQkJdXNhZ2UgPSB0cnVlOw0KLQkJCS8vIHBhc3NlZCB0aHJ1IHRoaXMgYXJnIChpLmUuLCBkbyBub3Qgc2V0IGZvdW5kID0gdHJ1ZQ0KLQkJfQ0KLQ0KLQkJaWYgKGZvdW5kKSB7DQotCQkJY29uZmlnQXJnc1tjb25maWdBcmdJbmRleCsrXSA9IGk7DQotCQkJY29udGludWU7DQotCQl9DQotCQkvLyBjaGVjayBmb3IgYXJncyB3aXRoIHBhcmFtZXRlcnMuIElmIHdlIGFyZSBhdCB0aGUgbGFzdCBhcmd1bWVudCBvciBpZiB0aGUgbmV4dCBvbmUNCi0JCS8vIGhhcyBhICctJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyLCB0aGVuIHdlIGNhbid0IGhhdmUgYW4gYXJnIHdpdGggYSBwYXJtIHNvIGNvbnRpbnVlLg0KLQkJaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxIHx8IGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgew0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJU3RyaW5nIGFyZyA9IGFyZ3NbKytpXTsNCi0NCi0JCS8vIGxvb2sgZm9yIHRoZSBsYXVjaGVyIHRvIHJ1bg0KLQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoQk9PVCkpIHsNCi0JCQlmb3VuZCA9IHRydWU7DQotCQkJYm9vdExvY2F0aW9uID0gYXJnOw0KLQkJfQ0KLQ0KLQkJLy8gbG9vayBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1bg0KLQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoQVBQTElDQVRJT04pKSB7DQotCQkJZm91bmQgPSB0cnVlOw0KLQkJCWFwcGxpY2F0aW9uID0gYXJnOw0KLQkJfQ0KLQ0KLQkJLy8gZG9uZSBjaGVja2luZyBmb3IgYXJncy4gIFJlbWVtYmVyIHdoZXJlIGFuIGFyZyB3YXMgZm91bmQgDQotCQlpZiAoZm91bmQpIHsNCi0JCQljb25maWdBcmdzW2NvbmZpZ0FyZ0luZGV4KytdID0gaSAtIDE7DQotCQkJY29uZmlnQXJnc1tjb25maWdBcmdJbmRleCsrXSA9IGk7DQotCQl9DQotCX0NCi0NCi0JLy8gcmVtb3ZlIGFsbCB0aGUgYXJndW1lbnRzIGNvbnN1bWVkIGJ5IHRoaXMgYXJndW1lbnQgcGFyc2luZw0KLQlpZiAoY29uZmlnQXJnSW5kZXggPT0gMCkNCi0JCXJldHVybiBhcmdzOw0KLQlTdHJpbmdbXSBwYXNzVGhydUFyZ3MgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoIC0gY29uZmlnQXJnSW5kZXhdOw0KLQljb25maWdBcmdJbmRleCA9IDA7DQotCWludCBqID0gMDsNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7DQotCQlpZiAoaSA9PSBjb25maWdBcmdzW2NvbmZpZ0FyZ0luZGV4XSkNCi0JCQljb25maWdBcmdJbmRleCsrOw0KLQkJZWxzZQ0KLQkJCXBhc3NUaHJ1QXJnc1tqKytdID0gYXJnc1tpXTsNCi0JfQ0KLQlyZXR1cm4gcGFzc1RocnVBcmdzOw0KLX0NCi1wdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCVN0cmluZ1tdIHBhc3NUaHJ1QXJncyA9IHByb2Nlc3NDb21tYW5kTGluZShhcmdzKTsNCi0JaWYgKHVzYWdlKSB7DQotCQlwcmludFVzYWdlKG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSk7DQotCQlyZXR1cm47DQotCX0NCi0JYmFzaWNSdW4ocGFzc1RocnVBcmdzKTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTUFwcGxpY2F0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmI3OTJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi0vKiANCi0gKiBVcGRhdGUgTWFuYWdlciBJbnN0YWxsIEFwcGxpY2F0aW9uDQotICoNCi0gKiBDb21tYW5kIHRvIHJ1biBmcm9tIGNvbW1hbmQgbGluZToNCi0gKg0KLSAqLlxqcmVcYmluXGphdmEgLXZlcmlmeSAtY3Agc3RhcnR1cC5qYXIgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5VSU1haW4gLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS51cGRhdGVNYW5hZ2VyIC1pbnN0YWxsIC11cmwgaHR0cDovL2tsaWNuaWsudG9yb2xhYi5pYm0uY29tL2VjbGlwc2Uvc2l0ZS8gLWlkIG9yZy5lY2xpcHNlLnNkayAlKg0KLSAqDQotICoNCi0gKiBBcmd1bWVudHMgYXJlOg0KLSAqICAgLWluc3RhbGwgICBJbnN0YWxsIGNvbW1hbmQNCi0gKiAgIC11cmwgW3VybF0gTG9jYXRpb24gZnJvbSB3aGljaCB0byBpbnN0YWxsIGZyb20NCi0gKiAgIC1pZCAgW2lkXSAgSWRlbnRpZmllciBvZiB0aGUgbWFuaWZlc3QgdG8gaW5zdGFsbA0KLSAqDQotICogU2FtcGxlOg0KLSAqICAgLWluc3RhbGwgLXVybCBmaWxlOi9jOi90ZW1wL3VwZGF0ZXNpdGUvIC1pZCBvcmcuZWNsaXBzZS5zZGsNCi0gKi8NCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsNCi0NCi1wdWJsaWMgY2xhc3MgVU1BcHBsaWNhdGlvbiBleHRlbmRzIE1haW4gew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BUFBMSUNBVElPTiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudXBkYXRlTWFuYWdlciI7DQotCXB1YmxpYyBVTUFwcGxpY2F0aW9uKCkgew0KLQkJc3VwZXIoKTsNCi0JCWFwcGxpY2F0aW9uID0gREVGQVVMVF9BUFBMSUNBVElPTjsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotDQotCQlpbnQgaVJldHVybkNvZGUgPSAwOw0KLQ0KLQkJdHJ5IHsNCi0JCQluZXcgVU1BcHBsaWNhdGlvbigpLnJ1bihhcmdzKTsNCi0JCX0NCi0NCi0JCWNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJfQ0KLQ0KLQkJU3lzdGVtLmV4aXQoMCk7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNQXBwbGljYXRpb25Vc2VySW50ZXJmYWNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvblVzZXJJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0M2JjMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvblVzZXJJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTUFwcGxpY2F0aW9uVXNlckludGVyZmFjZVByb3BlcnRpZXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTUFwcGxpY2F0aW9uVXNlckludGVyZmFjZVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM4NGIwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvblVzZXJJbnRlcmZhY2VQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvbldpbmRvdy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNQXBwbGljYXRpb25XaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2Mzk0Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvbldpbmRvdy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5ODkzNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTURpYWxvZ0FjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNRGlhbG9nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZGQzZDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNRGlhbG9nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1QcmVmZXJlbmNlUGFnZVNldHRpbmdzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1QcmVmZXJlbmNlUGFnZVNldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YTI3MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNUHJlZmVyZW5jZVBhZ2VTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkYmMwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VDb21wbGV0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUNvbXBsZXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkM2E3ZWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUNvbXBsZXRlLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlSW5zdGFsbGFibGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VJbnN0YWxsYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjgwM2Q0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VJbnN0YWxsYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuSUNvbXBvbmVudERlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JTWFuaWZlc3REZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLklQcm9kdWN0RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JVU1SZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5VTUVjbGlwc2VUcmVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLlVSTE5hbWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLlVwZGF0ZU1hbmFnZXJDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuQmFzZVVSTEhhbmRsZXIuUmVzcG9uc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGF5b3V0RGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VUkxIYW5kbGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyU3RyaW5nczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud2ViZGF2Lmh0dHAuY2xpZW50LklTdGF0dXNDb2RlczsNCi0NCi0vKioNCi0gKiBQcmVzZW50cyBwcm9kdWN0cyBhbmQgY29tcG9uZW50cyB0aGF0IG1heSBiZSBzZWxlY3RlZCBmb3IgaW5zdGFsbGF0aW9uLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBVTVdpemFyZFBhZ2VJbnN0YWxsYWJsZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBNb3VzZU1vdmVMaXN0ZW5lciwgTW91c2VUcmFja0xpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciB7DQotCXByb3RlY3RlZCBib29sZWFuIF9iUmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsNCi0JcHJvdGVjdGVkIFVNV2l6YXJkIF93aXphcmQgPSBudWxsOw0KLQlwcm90ZWN0ZWQgVGFibGVUcmVlIF90YWJsZVRyZWVJdGVtcyA9IG51bGw7DQotCXByb3RlY3RlZCBIYXNodGFibGUgX2hhc2hSZWdpc3RyeUNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOw0KLQlwcm90ZWN0ZWQgVHJlZVNldCBfdHJlZVNldEl0ZW1zID0gbnVsbDsNCi0JcHJvdGVjdGVkIFRyZWVTZXQgX3RyZWVTZXRMb2NhdGlvbnMgPSBudWxsOw0KLQlwcm90ZWN0ZWQgVGV4dCBfdGV4dERlc2NyaXB0aW9uID0gbnVsbDsNCi0JcHJvdGVjdGVkIFN0cmluZyBfc3RyRGVzY3JpcHRpb24gPSBudWxsOw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBfYlVwZGF0ZU1vZGUgPSBmYWxzZTsNCi0JcHJvdGVjdGVkIFNhc2hGb3JtIF9zYXNoRm9ybVRvcEJvdHRvbSA9IG51bGw7DQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIF9wcm9ncmVzc01vbml0b3IgPSBudWxsOw0KLQlwcm90ZWN0ZWQgVVJMTmFtZVBhaXJbXSBfdXJsTmFtZVBhaXJzID0gbnVsbDsNCi0JcHJvdGVjdGVkIEJ1dHRvbiBfYnV0dG9uU2hvd0xhdGVzdE9ubHkgPSBudWxsOw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBfYlNob3dMYXRlc3RPbmx5ID0gdHJ1ZTsNCi0JLyoqDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgVU1XaXphcmRQYWdlSW5zdGFsbGFibGUoVU1XaXphcmQgd2l6YXJkLCBTdHJpbmcgc3RyTmFtZSwgYm9vbGVhbiBiVXBkYXRlTW9kZSkgew0KLQkJc3VwZXIoc3RyTmFtZSk7DQotCQlfd2l6YXJkID0gd2l6YXJkOw0KLQkJX2JVcGRhdGVNb2RlID0gYlVwZGF0ZU1vZGU7DQotDQotCQlpZiAoYlVwZGF0ZU1vZGUgPT0gdHJ1ZSkgew0KLQkJCXRoaXMuc2V0VGl0bGUoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX05ld19Db21wb25lbnRfVXBkYXRlcyIpKTsNCi0JCQl0aGlzLnNldERlc2NyaXB0aW9uKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19TZWxlY3RfYXZhaWxhYmxlX3ZlcnNpb25zX3RvX2luc3RhbGwiKSk7DQotCQl9DQotCQllbHNlIHsNCi0JCQl0aGlzLnNldFRpdGxlKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19OZXdfQ29tcG9uZW50cyIpKTsNCi0JCQl0aGlzLnNldERlc2NyaXB0aW9uKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19TZWxlY3RfY29tcG9uZW50c190b19pbnN0YWxsIikpOw0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZExvY2F0aW9uVG9UcmVlKElVTVJlZ2lzdHJ5IHJlZ2lzdHJ5UmVtb3RlLCBJVU1SZWdpc3RyeSByZWdpc3RyeUxvY2FsLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQkJVU1XaXphcmRUcmVlSXRlbSBpdGVtUHJvZHVjdCA9IG51bGw7DQotCQlVTVdpemFyZFRyZWVJdGVtIGl0ZW1Db21wb25lbnQgPSBudWxsOw0KLQkJVU1XaXphcmRUcmVlSXRlbSBpdGVtQ29tcG9uZW50RW50cnkgPSBudWxsOw0KLQkJVU1XaXphcmRUcmVlSXRlbSBpdGVtTG9jYXRpb24gPSBudWxsOw0KLQkJVU1XaXphcmRUcmVlSXRlbSBpdGVtQ29tcG9uZW50Q2F0ZWdvcnkgPSBudWxsOw0KLQkJVU1XaXphcmRUcmVlSXRlbSBpdGVtUHJvZHVjdENhdGVnb3J5ID0gbnVsbDsNCi0NCi0JCUlQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yTG9jYWxQcm9kdWN0ID0gbnVsbDsNCi0JCUlQcm9kdWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzUHJvZHVjdCA9IG51bGw7DQotCQlJQ29tcG9uZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yTG9jYWxDb21wb25lbnQgPSBudWxsOw0KLQkJSUNvbXBvbmVudERlc2NyaXB0b3JbXSBkZXNjcmlwdG9yc0NvbXBvbmVudCA9IG51bGw7DQotCQlJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnNFbnRyeSA9IG51bGw7DQotDQotCQkvLyBPYnRhaW4gZGVzY3JpcHRvcnMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKF9iU2hvd0xhdGVzdE9ubHkgPT0gdHJ1ZSkgew0KLQkJCWRlc2NyaXB0b3JzUHJvZHVjdCA9IHJlZ2lzdHJ5UmVtb3RlLmdldFByb2R1Y3REZXNjcmlwdG9ycygpOw0KLQkJCWRlc2NyaXB0b3JzQ29tcG9uZW50ID0gcmVnaXN0cnlSZW1vdGUuZ2V0Q29tcG9uZW50RGVzY3JpcHRvcnMoKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWRlc2NyaXB0b3JzUHJvZHVjdCA9IHJlZ2lzdHJ5UmVtb3RlLmdldEFsbFByb2R1Y3REZXNjcmlwdG9ycygpOw0KLQkJCWRlc2NyaXB0b3JzQ29tcG9uZW50ID0gcmVnaXN0cnlSZW1vdGUuZ2V0QWxsQ29tcG9uZW50RGVzY3JpcHRvcnMoKTsNCi0JCX0NCi0NCi0JCWlmIChkZXNjcmlwdG9yc1Byb2R1Y3QubGVuZ3RoICsgZGVzY3JpcHRvcnNDb21wb25lbnQubGVuZ3RoID4gMCkgew0KLQ0KLQkJCWl0ZW1Mb2NhdGlvbiA9IG5ldyBVTVdpemFyZFRyZWVJdGVtKCk7DQotCQkJaXRlbUxvY2F0aW9uLl9pVHlwZSA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9VUkw7DQotCQkJaXRlbUxvY2F0aW9uLl9zdHJEZXNjcmlwdGlvbiA9IHJlZ2lzdHJ5UmVtb3RlLmdldFJlZ2lzdHJ5QmFzZVVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkJaXRlbUxvY2F0aW9uLl9zdHJOYW1lID0gZ2V0VVJMRGVzY3JpcHRpb24oaXRlbUxvY2F0aW9uLl9zdHJEZXNjcmlwdGlvbik7DQotCQkJaXRlbUxvY2F0aW9uLl9zdHJVUkxVcGRhdGUgPSBpdGVtTG9jYXRpb24uX3N0ck5hbWU7DQotDQotCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfRXhhbWluaW5nIikgKyAiOiIsIGRlc2NyaXB0b3JzUHJvZHVjdC5sZW5ndGggKyBkZXNjcmlwdG9yc0NvbXBvbmVudC5sZW5ndGgpOw0KLQkJCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKGl0ZW1Mb2NhdGlvbi5fc3RyTmFtZSk7DQotDQotCQkJSU1hbmlmZXN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzU2VsZWN0ZWQgPSBfd2l6YXJkLl9tYW5pZmVzdERlc2NyaXB0b3JzOw0KLQ0KLQkJCWJvb2xlYW4gYkluY2x1ZGVUaGlzT25lID0gZmFsc2U7DQotDQotCQkJLy8gUHJvZHVjdHMNCi0JCQkvLy0tLS0tLS0tLQ0KLQkJCWlmIChkZXNjcmlwdG9yc1Byb2R1Y3QubGVuZ3RoID4gMCkgew0KLQ0KLQkJCQlpdGVtUHJvZHVjdENhdGVnb3J5ID0gbmV3IFVNV2l6YXJkVHJlZUl0ZW0oKTsNCi0JCQkJaXRlbVByb2R1Y3RDYXRlZ29yeS5faVR5cGUgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfUFJPRFVDVF9DQVRFR09SWTsNCi0JCQkJaXRlbVByb2R1Y3RDYXRlZ29yeS5fc3RyTmFtZSA9ICJwcm9kdWN0cyI7DQotDQotCQkJCS8vIEFkZCBwcm9kdWN0IGNhdGVnb3J5IHRvIGxvY2F0aW9uIHRyZWUgbGF0ZXINCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlJUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvclByb2R1Y3RTZWxlY3RlZCA9IG51bGw7DQotDQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnNQcm9kdWN0Lmxlbmd0aDsgKytpKSB7DQotDQotCQkJCQkvLyBJbmNsdWRlIGFsbCBpZiBzZWxlY3RlZCBkZXNjcmlwdG9ycyBpcyBudWxsDQotCQkJCQkvLyBPdGhlcndpc2UsIGluY2x1ZGUgb25seSB0aG9zZSBzZWxlY3RlZA0KLQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJYkluY2x1ZGVUaGlzT25lID0gdHJ1ZTsNCi0NCi0JCQkJCWlmIChkZXNjcmlwdG9yc1NlbGVjdGVkICE9IG51bGwpIHsNCi0JCQkJCQliSW5jbHVkZVRoaXNPbmUgPSBmYWxzZTsNCi0NCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JzU2VsZWN0ZWQubGVuZ3RoOyArK2opIHsNCi0JCQkJCQkJaWYgKGRlc2NyaXB0b3JzU2VsZWN0ZWRbal0gaW5zdGFuY2VvZiBJUHJvZHVjdERlc2NyaXB0b3IpIHsNCi0JCQkJCQkJCWRlc2NyaXB0b3JQcm9kdWN0U2VsZWN0ZWQgPSAoSVByb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yc1NlbGVjdGVkW2pdOw0KLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3JQcm9kdWN0U2VsZWN0ZWQuZ2V0VW5pcXVlSWRlbnRpZmllcigpICE9IG51bGwpIHsNCi0JCQkJCQkJCQlpZiAoZGVzY3JpcHRvclByb2R1Y3RTZWxlY3RlZC5nZXRVbmlxdWVJZGVudGlmaWVyKCkuZXF1YWxzKGRlc2NyaXB0b3JzUHJvZHVjdFtpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCkpID09IHRydWUpIHsNCi0JCQkJCQkJCQkJYkluY2x1ZGVUaGlzT25lID0gdHJ1ZTsNCi0JCQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCQkJfQ0KLQkJCQkJCQkJfQ0KLQkJCQkJCQl9DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJLy8gRGlzcGxheSBvbmx5IG5vbi1pbnN0YWxsZWQgaXRlbXMNCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQlpZiAoX2JVcGRhdGVNb2RlID09IGZhbHNlKSB7DQotCQkJCQkJaWYgKHJlZ2lzdHJ5TG9jYWwuZ2V0UHJvZHVjdERlc2NyaXB0b3IoZGVzY3JpcHRvcnNQcm9kdWN0W2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKSkgIT0gbnVsbCkgew0KLQkJCQkJCQliSW5jbHVkZVRoaXNPbmUgPSBmYWxzZTsNCi0JCQkJCQl9DQotCQkJCQl9DQotDQotCQkJCQlpZiAoYkluY2x1ZGVUaGlzT25lID09IHRydWUpIHsNCi0JCQkJCQlpdGVtUHJvZHVjdCA9IG5ldyBVTVdpemFyZFRyZWVJdGVtKCk7DQotCQkJCQkJaXRlbVByb2R1Y3QuX2lUeXBlID0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX1BST0RVQ1Q7DQotCQkJCQkJaXRlbVByb2R1Y3QuX3N0ckRlc2NyaXB0aW9uID0gZGVzY3JpcHRvcnNQcm9kdWN0W2ldLmdldERlc2NyaXB0aW9uKCk7DQotCQkJCQkJaXRlbVByb2R1Y3QuX3N0ck5hbWUgPSBkZXNjcmlwdG9yc1Byb2R1Y3RbaV0uZ2V0TGFiZWwoKTsNCi0JCQkJCQlpdGVtUHJvZHVjdC5fc3RySWQgPSBkZXNjcmlwdG9yc1Byb2R1Y3RbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpOw0KLQkJCQkJCWl0ZW1Qcm9kdWN0Ll9zdHJWZW5kb3JOYW1lID0gZGVzY3JpcHRvcnNQcm9kdWN0W2ldLmdldFByb3ZpZGVyTmFtZSgpOw0KLQkJCQkJCWl0ZW1Qcm9kdWN0Ll9zdHJWZXJzaW9uQXZhaWxhYmxlID0gZGVzY3JpcHRvcnNQcm9kdWN0W2ldLmdldFZlcnNpb25TdHIoKTsNCi0JCQkJCQlpdGVtUHJvZHVjdC5fZGVzY3JpcHRvckF2YWlsYWJsZSA9IGRlc2NyaXB0b3JzUHJvZHVjdFtpXTsNCi0NCi0JCQkJCQlkZXNjcmlwdG9yTG9jYWxQcm9kdWN0ID0gcmVnaXN0cnlMb2NhbC5nZXRQcm9kdWN0RGVzY3JpcHRvcihpdGVtUHJvZHVjdC5fc3RySWQpOw0KLQ0KLQkJCQkJCWlmIChkZXNjcmlwdG9yTG9jYWxQcm9kdWN0ICE9IG51bGwpIHsNCi0JCQkJCQkJaXRlbVByb2R1Y3QuX2Rlc2NyaXB0b3JDdXJyZW50ID0gZGVzY3JpcHRvckxvY2FsUHJvZHVjdDsNCi0JCQkJCQkJaXRlbVByb2R1Y3QuX3N0clZlcnNpb25DdXJyZW50ID0gZGVzY3JpcHRvckxvY2FsUHJvZHVjdC5nZXRWZXJzaW9uU3RyKCk7DQotCQkJCQkJfQ0KLQ0KLQkJCQkJCWl0ZW1Qcm9kdWN0Q2F0ZWdvcnkuYWRkQ2hpbGRJdGVtKGl0ZW1Qcm9kdWN0KTsNCi0NCi0JCQkJCQkvLyBDb21wb25lbnQgZW50cmllcyBvZiB0aGUgcHJvZHVjdA0KLQkJCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQkJZGVzY3JpcHRvcnNFbnRyeSA9IGRlc2NyaXB0b3JzUHJvZHVjdFtpXS5nZXRDb21wb25lbnRFbnRyaWVzKCk7DQotDQotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yc0VudHJ5Lmxlbmd0aDsgKytqKSB7DQotDQotCQkJCQkJCS8vIFR1cm4gb2ZmIHNlbGVjdGVkIGZsYWcNCi0JCQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJCQlkZXNjcmlwdG9yc0VudHJ5W2pdLmlzU2VsZWN0ZWQoZmFsc2UpOw0KLQkJCQkJCQlpdGVtQ29tcG9uZW50RW50cnkgPSBuZXcgVU1XaXphcmRUcmVlSXRlbSgpOw0KLQkJCQkJCQlpdGVtQ29tcG9uZW50RW50cnkuX2lUeXBlID0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX0NPTVBPTkVOVF9FTlRSWTsNCi0JCQkJCQkJaXRlbUNvbXBvbmVudEVudHJ5Ll9zdHJOYW1lID0gZGVzY3JpcHRvcnNFbnRyeVtqXS5nZXRMYWJlbCgpOw0KLQkJCQkJCQlpdGVtQ29tcG9uZW50RW50cnkuX3N0cklkID0gZGVzY3JpcHRvcnNFbnRyeVtqXS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7DQotCQkJCQkJCWl0ZW1Db21wb25lbnRFbnRyeS5fc3RyVmVyc2lvbkF2YWlsYWJsZSA9IGRlc2NyaXB0b3JzRW50cnlbal0uZ2V0VmVyc2lvblN0cigpOw0KLQkJCQkJCQlpdGVtQ29tcG9uZW50RW50cnkuX2Rlc2NyaXB0b3JFbnRyeSA9IGRlc2NyaXB0b3JzRW50cnlbal07DQotDQotCQkJCQkJCWRlc2NyaXB0b3JMb2NhbENvbXBvbmVudCA9IHJlZ2lzdHJ5TG9jYWwuZ2V0Q29tcG9uZW50RGVzY3JpcHRvcihpdGVtQ29tcG9uZW50RW50cnkuX3N0cklkKTsNCi0NCi0JCQkJCQkJaWYgKGRlc2NyaXB0b3JMb2NhbENvbXBvbmVudCAhPSBudWxsKSB7DQotCQkJCQkJCQlpdGVtQ29tcG9uZW50RW50cnkuX3N0clZlcnNpb25DdXJyZW50ID0gZGVzY3JpcHRvckxvY2FsQ29tcG9uZW50LmdldFZlcnNpb25TdHIoKTsNCi0JCQkJCQkJCWl0ZW1Db21wb25lbnRFbnRyeS5fc3RyVmVuZG9yTmFtZSA9IGRlc2NyaXB0b3JMb2NhbENvbXBvbmVudC5nZXRQcm92aWRlck5hbWUoKTsNCi0JCQkJCQkJCWl0ZW1Db21wb25lbnRFbnRyeS5fZGVzY3JpcHRvckN1cnJlbnQgPSBkZXNjcmlwdG9yTG9jYWxDb21wb25lbnQ7DQotCQkJCQkJCX0NCi0NCi0JCQkJCQkJaXRlbVByb2R1Y3QuYWRkQ2hpbGRJdGVtKGl0ZW1Db21wb25lbnRFbnRyeSk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJfQ0KLQ0KLQkJCQkvLyBBZGQgY29tcG9uZW50IGNhdGVnb3J5IGlmIHRoZXJlIGFyZSBhbnkgY29tcG9uZW50cw0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlpZiAoaXRlbVByb2R1Y3RDYXRlZ29yeS5fdmVjdG9yQ2hpbGRyZW4gIT0gbnVsbCAmJiBpdGVtUHJvZHVjdENhdGVnb3J5Ll92ZWN0b3JDaGlsZHJlbi5zaXplKCkgPiAwKSB7DQotCQkJCQlpdGVtTG9jYXRpb24uYWRkQ2hpbGRJdGVtKGl0ZW1Qcm9kdWN0Q2F0ZWdvcnkpOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIENvbXBvbmVudHMNCi0JCQkvLy0tLS0tLS0tLS0tDQotCQkJaWYgKGRlc2NyaXB0b3JzQ29tcG9uZW50Lmxlbmd0aCA+IDApIHsNCi0NCi0JCQkJaXRlbUNvbXBvbmVudENhdGVnb3J5ID0gbmV3IFVNV2l6YXJkVHJlZUl0ZW0oKTsNCi0JCQkJaXRlbUNvbXBvbmVudENhdGVnb3J5Ll9pVHlwZSA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlRfQ0FURUdPUlk7DQotCQkJCWl0ZW1Db21wb25lbnRDYXRlZ29yeS5fc3RyTmFtZSA9ICJjb21wb25lbnRzIjsNCi0NCi0JCQkJLy8gQWRkIHByb2R1Y3QgY2F0ZWdvcnkgdG8gbG9jYXRpb24gdHJlZSBsYXRlcg0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCUlDb21wb25lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3JDb21wb25lbnRTZWxlY3RlZCA9IG51bGw7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnNDb21wb25lbnQubGVuZ3RoOyArK2kpIHsNCi0NCi0JCQkJCS8vIEluY2x1ZGUgYWxsIGlmIHNlbGVjdGVkIGRlc2NyaXB0b3JzIGlzIG51bGwNCi0JCQkJCS8vIE90aGVyd2lzZSwgaW5jbHVkZSBvbmx5IHRob3NlIHNlbGVjdGVkDQotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQliSW5jbHVkZVRoaXNPbmUgPSB0cnVlOw0KLQkJCQkJaWYgKGRlc2NyaXB0b3JzU2VsZWN0ZWQgIT0gbnVsbCkgew0KLQkJCQkJCWJJbmNsdWRlVGhpc09uZSA9IGZhbHNlOw0KLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcnNTZWxlY3RlZC5sZW5ndGg7ICsraikgew0KLQkJCQkJCQlpZiAoZGVzY3JpcHRvcnNTZWxlY3RlZFtqXSBpbnN0YW5jZW9mIElDb21wb25lbnREZXNjcmlwdG9yKSB7DQotCQkJCQkJCQlkZXNjcmlwdG9yQ29tcG9uZW50U2VsZWN0ZWQgPSAoSUNvbXBvbmVudERlc2NyaXB0b3IpIGRlc2NyaXB0b3JzU2VsZWN0ZWRbal07DQotCQkJCQkJCQlpZiAoZGVzY3JpcHRvckNvbXBvbmVudFNlbGVjdGVkLmdldFVuaXF1ZUlkZW50aWZpZXIoKSAhPSBudWxsKSB7DQotCQkJCQkJCQkJaWYgKGRlc2NyaXB0b3JDb21wb25lbnRTZWxlY3RlZC5nZXRVbmlxdWVJZGVudGlmaWVyKCkuZXF1YWxzKGRlc2NyaXB0b3JzQ29tcG9uZW50W2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKSkgPT0gdHJ1ZSkgew0KLQkJCQkJCQkJCQliSW5jbHVkZVRoaXNPbmUgPSB0cnVlOw0KLQkJCQkJCQkJCQlicmVhazsNCi0JCQkJCQkJCQl9DQotCQkJCQkJCQl9DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQl9DQotDQotCQkJCQkvLyBEaXNwbGF5IG9ubHkgbm9uLWluc3RhbGxlZCBpdGVtcw0KLQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJCWlmIChfYlVwZGF0ZU1vZGUgPT0gZmFsc2UpIHsNCi0JCQkJCQlpZiAocmVnaXN0cnlMb2NhbC5nZXRDb21wb25lbnREZXNjcmlwdG9yKGRlc2NyaXB0b3JzQ29tcG9uZW50W2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKSkgIT0gbnVsbCkgew0KLQkJCQkJCQliSW5jbHVkZVRoaXNPbmUgPSBmYWxzZTsNCi0JCQkJCQl9DQotCQkJCQl9DQotDQotCQkJCQlpZiAoYkluY2x1ZGVUaGlzT25lID09IHRydWUpIHsNCi0JCQkJCQlpdGVtQ29tcG9uZW50ID0gbmV3IFVNV2l6YXJkVHJlZUl0ZW0oKTsNCi0JCQkJCQlpdGVtQ29tcG9uZW50Ll9pVHlwZSA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlQ7DQotCQkJCQkJaXRlbUNvbXBvbmVudC5fc3RyRGVzY3JpcHRpb24gPSBkZXNjcmlwdG9yc0NvbXBvbmVudFtpXS5nZXREZXNjcmlwdGlvbigpOw0KLQkJCQkJCWl0ZW1Db21wb25lbnQuX3N0ck5hbWUgPSBkZXNjcmlwdG9yc0NvbXBvbmVudFtpXS5nZXRMYWJlbCgpOw0KLQkJCQkJCWl0ZW1Db21wb25lbnQuX3N0cklkID0gZGVzY3JpcHRvcnNDb21wb25lbnRbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpOw0KLQkJCQkJCWl0ZW1Db21wb25lbnQuX3N0clZlbmRvck5hbWUgPSBkZXNjcmlwdG9yc0NvbXBvbmVudFtpXS5nZXRQcm92aWRlck5hbWUoKTsNCi0JCQkJCQlpdGVtQ29tcG9uZW50Ll9zdHJWZXJzaW9uQXZhaWxhYmxlID0gZGVzY3JpcHRvcnNDb21wb25lbnRbaV0uZ2V0VmVyc2lvblN0cigpOw0KLQkJCQkJCWl0ZW1Db21wb25lbnQuX2Rlc2NyaXB0b3JBdmFpbGFibGUgPSBkZXNjcmlwdG9yc0NvbXBvbmVudFtpXTsNCi0NCi0JCQkJCQlkZXNjcmlwdG9yTG9jYWxDb21wb25lbnQgPSByZWdpc3RyeUxvY2FsLmdldENvbXBvbmVudERlc2NyaXB0b3IoaXRlbUNvbXBvbmVudC5fc3RySWQpOw0KLQ0KLQkJCQkJCWlmIChkZXNjcmlwdG9yTG9jYWxDb21wb25lbnQgIT0gbnVsbCkgew0KLQkJCQkJCQlpdGVtQ29tcG9uZW50Ll9zdHJWZXJzaW9uQ3VycmVudCA9IGRlc2NyaXB0b3JMb2NhbENvbXBvbmVudC5nZXRWZXJzaW9uU3RyKCk7DQotCQkJCQkJCWl0ZW1Db21wb25lbnQuX2Rlc2NyaXB0b3JDdXJyZW50ID0gZGVzY3JpcHRvckxvY2FsQ29tcG9uZW50Ow0KLQkJCQkJCX0NCi0NCi0JCQkJCQlpdGVtQ29tcG9uZW50Q2F0ZWdvcnkuYWRkQ2hpbGRJdGVtKGl0ZW1Db21wb25lbnQpOw0KLQkJCQkJfQ0KLQkJCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJfQ0KLQ0KLQkJCQkvLyBBZGQgY29tcG9uZW50IGNhdGVnb3J5IGlmIHRoZXJlIGFyZSBhbnkgY29tcG9uZW50cw0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlpZiAoaXRlbUNvbXBvbmVudENhdGVnb3J5Ll92ZWN0b3JDaGlsZHJlbiAhPSBudWxsICYmIGl0ZW1Db21wb25lbnRDYXRlZ29yeS5fdmVjdG9yQ2hpbGRyZW4uc2l6ZSgpID4gMCkgew0KLQkJCQkJaXRlbUxvY2F0aW9uLmFkZENoaWxkSXRlbShpdGVtQ29tcG9uZW50Q2F0ZWdvcnkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXByb2dyZXNzTW9uaXRvci5kb25lKCk7DQotDQotCQkJLy8gQWRkIGxvY2F0aW9uIGlmIHRoZXJlIGFyZSBhbnkgcHJvZHVjdHMvY29tcG9uZW50cw0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIA0KLQkJCWlmIChpdGVtTG9jYXRpb24uX3ZlY3RvckNoaWxkcmVuICE9IG51bGwgJiYgaXRlbUxvY2F0aW9uLl92ZWN0b3JDaGlsZHJlbi5zaXplKCkgPiAwKSB7DQotCQkJCV90cmVlU2V0SXRlbXMuYWRkKGl0ZW1Mb2NhdGlvbik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKg0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29ubmVjdFRvVHJlZSgpIHsNCi0NCi0JCS8vIFJlbW92ZSBhbGwgZXhpc3RpbmcgdHJlZSBpdGVtcw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlfdGFibGVUcmVlSXRlbXMucmVtb3ZlQWxsKCk7DQotDQotCQlVTVdpemFyZFRyZWVJdGVtIGl0ZW0gPSBudWxsOw0KLQ0KLQkJSXRlcmF0b3IgaXRlciA9IF90cmVlU2V0SXRlbXMuaXRlcmF0b3IoKTsNCi0NCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSA9PSB0cnVlKSB7DQotDQotCQkJaXRlbSA9IChVTVdpemFyZFRyZWVJdGVtKSBpdGVyLm5leHQoKTsNCi0NCi0JCQkvLyBDcmVhdGUgYSBuZXcgdHJlZSBpdGVtIGZvciB0aGUgdG9wIGxldmVsIChVUkwpDQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCVRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbShfdGFibGVUcmVlSXRlbXMsIFNXVC5OVUxMKTsNCi0NCi0JCQlpZiAoaXRlbS5fc3RyTmFtZSAhPSBudWxsKQ0KLQkJCQl0cmVlSXRlbS5zZXRUZXh0KDAsIGl0ZW0uX3N0ck5hbWUpOw0KLQ0KLQkJCWlmIChpdGVtLl9zdHJWZW5kb3JOYW1lICE9IG51bGwpDQotCQkJCXRyZWVJdGVtLnNldFRleHQoNCwgaXRlbS5fc3RyVmVuZG9yTmFtZSk7DQotDQotCQkJdHJlZUl0ZW0uc2V0RGF0YShpdGVtKTsNCi0NCi0JCQkvLyBDcmVhdGUgY2hpbGQgdHJlZSBpdGVtcw0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJaWYgKGl0ZW0uX3ZlY3RvckNoaWxkcmVuICE9IG51bGwpIHsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtLl92ZWN0b3JDaGlsZHJlbi5zaXplKCk7ICsraSkgew0KLQkJCQkJY29ubmVjdFRvVHJlZSgoVU1XaXphcmRUcmVlSXRlbSkgaXRlbS5fdmVjdG9yQ2hpbGRyZW4uZWxlbWVudEF0KGkpLCB0cmVlSXRlbSk7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7DQotCQl9DQotCX0NCi0JLyoqDQotCSAqIENvbm5lY3RzIGl0ZW1zIHRvIGEgbmV3IHRyZWUgd2lkZ2V0Lg0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29ubmVjdFRvVHJlZShVTVdpemFyZFRyZWVJdGVtIGl0ZW0sIFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW1QYXJlbnQpIHsNCi0NCi0JCS8vIElnbm9yZSBwcm9kdWN0IGNhdGVnb3J5IGFuZCBjb21wb25lbnQgY2F0ZWdvcnkgaXRlbXMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW0gPSB0cmVlSXRlbVBhcmVudDsNCi0NCi0JCS8vIENyZWF0ZSBhIG5ldyB0cmVlIGl0ZW0NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWlmIChpdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfUFJPRFVDVCB8fCBpdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UIHx8IGl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlRfRU5UUlkpIHsNCi0NCi0JCQl0cmVlSXRlbSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRyZWVJdGVtUGFyZW50LCBTV1QuTlVMTCk7DQotCQkJdHJlZUl0ZW0uc2V0VGV4dCgwLCBpdGVtLl9zdHJOYW1lKTsNCi0JCQl0cmVlSXRlbS5zZXREYXRhKGl0ZW0pOw0KLQ0KLQkJCS8vIFRhYmxlIHRleHQNCi0JCQkvLy0tLS0tLS0tLS0tDQotCQkJaWYgKGl0ZW0uX3N0clZlcnNpb25DdXJyZW50ICE9IG51bGwpDQotCQkJCXRyZWVJdGVtLnNldFRleHQoMSwgaXRlbS5fc3RyVmVyc2lvbkN1cnJlbnQpOw0KLQ0KLQkJCWlmIChpdGVtLl9zdHJWZXJzaW9uQXZhaWxhYmxlICE9IG51bGwpDQotCQkJCXRyZWVJdGVtLnNldFRleHQoMiwgaXRlbS5fc3RyVmVyc2lvbkF2YWlsYWJsZSk7DQotDQotCQkJaWYgKGl0ZW0uX3N0clZlbmRvck5hbWUgIT0gbnVsbCkNCi0JCQkJdHJlZUl0ZW0uc2V0VGV4dCg0LCBpdGVtLl9zdHJWZW5kb3JOYW1lKTsNCi0NCi0JCQkvLyBTdGF0dXMgdGV4dA0KLQkJCS8vLS0tLS0tLS0tLS0tDQotCQkJYm9vbGVhbiBiSW5zdGFsbGFibGUgPSBmYWxzZTsNCi0NCi0JCQlpZiAoaXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX1BST0RVQ1QpIHsNCi0JCQkJaW50IGlJbnN0YWxsYWJsZSA9IGlzSW5zdGFsbGFibGVQcm9kdWN0KHRyZWVJdGVtKTsNCi0JCQkJdHJlZUl0ZW0uc2V0VGV4dCgzLCBjb252ZXJ0SW5zdGFsbGFibGVUb1N0cmluZyhpSW5zdGFsbGFibGUpKTsNCi0JCQl9DQotDQotCQkJZWxzZSBpZiAoaXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX0NPTVBPTkVOVCkgew0KLQkJCQlpbnQgaUluc3RhbGxhYmxlID0gaXNJbnN0YWxsYWJsZUNvbXBvbmVudCh0cmVlSXRlbSk7DQotCQkJCXRyZWVJdGVtLnNldFRleHQoMywgY29udmVydEluc3RhbGxhYmxlVG9TdHJpbmcoaUluc3RhbGxhYmxlKSk7DQotCQkJfQ0KLQ0KLQkJCWVsc2UgaWYgKGl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlRfRU5UUlkpIHsNCi0NCi0JCQkJaW50IGlJbnN0YWxsYWJsZSA9IGlzSW5zdGFsbGFibGVDb21wb25lbnRFbnRyeSh0cmVlSXRlbSk7DQotCQkJCXRyZWVJdGVtLnNldFRleHQoMywgY29udmVydEluc3RhbGxhYmxlVG9TdHJpbmcoaUluc3RhbGxhYmxlKSk7DQotDQotCQkJCWlmIChpSW5zdGFsbGFibGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PS19UT19JTlNUQUxMKSB7DQotCQkJCQkvLyBPcHRpb25hbCBpbnN0YWxsYXRpb24NCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCi0JCQkJCWlmIChpdGVtLl9kZXNjcmlwdG9yRW50cnkuaXNPcHRpb25hbEZvckluc3RhbGwoKSA9PSB0cnVlKSB7DQotCQkJCQkJdHJlZUl0ZW0uc2V0VGV4dCgzLCBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfb3B0aW9uYWwiKSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQl0cmVlSXRlbS5zZXRUZXh0KDMsIGNvbnZlcnRJbnN0YWxsYWJsZVRvU3RyaW5nKGlJbnN0YWxsYWJsZSkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gQ3JlYXRlIGNoaWxkIHRyZWUgaXRlbXMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAoaXRlbS5fdmVjdG9yQ2hpbGRyZW4gIT0gbnVsbCkgew0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbS5fdmVjdG9yQ2hpbGRyZW4uc2l6ZSgpOyArK2kpIHsNCi0JCQkJY29ubmVjdFRvVHJlZSgoVU1XaXphcmRUcmVlSXRlbSkgaXRlbS5fdmVjdG9yQ2hpbGRyZW4uZWxlbWVudEF0KGkpLCB0cmVlSXRlbSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gRXhwYW5kIG9ubHkgYWZ0ZXIgY2hpbGRyZW4gaGF2ZSBiZWVuIGNyZWF0ZWQNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAoaXRlbS5faVR5cGUgIT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX1BST0RVQ1QpDQotCQkJdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7DQotDQotCQlyZXR1cm47DQotCX0NCi0JLyoqDQotCSAqIENvbnZlcnRzIGluc3RhbGxhYmxlIGNvbnN0YW50IHRvIGEgZGlzcGxheWFibGUgc3RyaW5nDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJbnN0YWxsYWJsZVRvU3RyaW5nKGludCBpSW5zdGFsbGFibGUpIHsNCi0NCi0JCXN3aXRjaCAoaUluc3RhbGxhYmxlKSB7DQotCQkJY2FzZSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk5PVF9DT01QQVRJQkxFIDoNCi0JCQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19ub3RfY29tcGF0aWJsZSIpOw0KLQkJCWNhc2UgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5OT1RfTkVXRVIgOg0KLQkJCQlyZXR1cm4gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX25vdF9uZXdlciIpOw0KLQkJCWNhc2UgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5OT1RfVVBEQVRBQkxFIDoNCi0JCQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19ub3RfdXBkYXRhYmxlIik7DQotCQkJY2FzZSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk5PVF9BVkFJTEFCTEUgOg0KLQkJCQlyZXR1cm4gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX25vdF9hdmFpbGFibGUiKTsNCi0JCQlkZWZhdWx0IDoNCi0JCQkJcmV0dXJuICIiOw0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiBjcmVhdGVDb250ZW50cyBtZXRob2QgY29tbWVudC4NCi0JICovDQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZVBhcmVudCkgew0KLQkJLy8gQ29udGVudA0KLQkJLy8tLS0tLS0tLQ0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZUNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZVBhcmVudCwgU1dULk5VTEwpOw0KLQ0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJY29tcG9zaXRlQ29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsNCi0NCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7DQotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCi0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsNCi0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOw0KLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOw0KLQkJY29tcG9zaXRlQ29udGVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0NCi0JCS8vIENoZWNrYm94OiBTaG93IG1vc3QgcmVjZW50IHZlcnNpb25zIG9ubHkNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCV9idXR0b25TaG93TGF0ZXN0T25seSA9IG5ldyBCdXR0b24oY29tcG9zaXRlQ29udGVudCwgU1dULkNIRUNLKTsNCi0JCV9idXR0b25TaG93TGF0ZXN0T25seS5zZXRUZXh0KFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19TaG93X29ubHlfbW9zdF9yZWNlbnRfdmVyc2lvbnMiKSk7DQotCQlfYnV0dG9uU2hvd0xhdGVzdE9ubHkuc2V0U2VsZWN0aW9uKF9iU2hvd0xhdGVzdE9ubHkpOw0KLQkJX2J1dHRvblNob3dMYXRlc3RPbmx5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOw0KLQ0KLQkJLy8gU2FzaFBhbmUgVG9wL0JvdHRvbQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJX3Nhc2hGb3JtVG9wQm90dG9tID0gbmV3IFNhc2hGb3JtKGNvbXBvc2l0ZUNvbnRlbnQsIFNXVC5WRVJUSUNBTCk7DQotDQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCi0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsNCi0JCV9zYXNoRm9ybVRvcEJvdHRvbS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0NCi0JCS8vIFRyZWU6IEluc3RhbGxhYmxlDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJX3RhYmxlVHJlZUl0ZW1zID0gbmV3IFRhYmxlVHJlZShfc2FzaEZvcm1Ub3BCb3R0b20sIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIgfCBTV1QuQ0hFQ0spOw0KLQ0KLQkJU3RyaW5nW10gY29sdW1uVGl0bGVzID0geyBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfQ29tcG9uZW50IiksIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19JbnN0YWxsZWQiKSwgVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0F2YWlsYWJsZSIpLCBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfU3RhdHVzIiksIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19Qcm92aWRlciIpfTsNCi0JCWludFtdIGlDb2x1bW5XZWlnaHQgPSB7IDQwLCAxNSwgMTUsIDE1LCAxNSB9Ow0KLQkJVGFibGVMYXlvdXQgbGF5b3V0VGFibGUgPSBuZXcgVGFibGVMYXlvdXQoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uVGl0bGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oX3RhYmxlVHJlZUl0ZW1zLmdldFRhYmxlKCksIFNXVC5OT05FKTsNCi0JCQl0YWJsZUNvbHVtbi5zZXRUZXh0KGNvbHVtblRpdGxlc1tpXSk7DQotCQkJQ29sdW1uTGF5b3V0RGF0YSBjTGF5b3V0ID0gbmV3IENvbHVtbldlaWdodERhdGEoaUNvbHVtbldlaWdodFtpXSwgdHJ1ZSk7DQotCQkJbGF5b3V0VGFibGUuYWRkQ29sdW1uRGF0YShjTGF5b3V0KTsNCi0JCX0NCi0NCi0JCV90YWJsZVRyZWVJdGVtcy5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsNCi0JCV90YWJsZVRyZWVJdGVtcy5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7DQotCQlfdGFibGVUcmVlSXRlbXMuZ2V0VGFibGUoKS5zZXRMYXlvdXQobGF5b3V0VGFibGUpOw0KLQkJX3RhYmxlVHJlZUl0ZW1zLmdldFRhYmxlKCkuYWRkTW91c2VNb3ZlTGlzdGVuZXIodGhpcyk7DQotCQlfdGFibGVUcmVlSXRlbXMuZ2V0VGFibGUoKS5hZGRNb3VzZVRyYWNrTGlzdGVuZXIodGhpcyk7DQotDQotCQlfdGFibGVUcmVlSXRlbXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7DQotDQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCi0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsNCi0JCV90YWJsZVRyZWVJdGVtcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0NCi0JCS8vIFRleHQ6IERlc2NyaXB0aW9uDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJX3RleHREZXNjcmlwdGlvbiA9IG5ldyBUZXh0KF9zYXNoRm9ybVRvcEJvdHRvbSwgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7DQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNTA7DQotCQlfdGV4dERlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOw0KLQ0KLQkJX3Nhc2hGb3JtVG9wQm90dG9tLnNldFdlaWdodHMobmV3IGludFtdIHsgODAsIDIwIH0pOw0KLQ0KLQkJc2V0Q29udHJvbChjb21wb3NpdGVDb250ZW50KTsNCi0NCi0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7DQotCX0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIElVTVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5QXQoU3RyaW5nIHN0ckxvY2F0aW9uKSB7DQotDQotCQlJVU1SZWdpc3RyeSByZWdpc3RyeSA9IChJVU1SZWdpc3RyeSkgX2hhc2hSZWdpc3RyeUNhY2hlLmdldChzdHJMb2NhdGlvbik7DQotDQotCQkvLyBDcmVhdGUgbmV3IGVudHJ5IGlmIG5vdCBmb3VuZA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWlmIChyZWdpc3RyeSA9PSBudWxsKSB7DQotCQkJVVJMIHVybCA9IG51bGw7DQotDQotCQkJdHJ5IHsNCi0JCQkJdXJsID0gbmV3IFVSTChzdHJMb2NhdGlvbik7DQotCQkJfQ0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQ0KLQkJCXJlZ2lzdHJ5ID0gX3dpemFyZC5fdXBkYXRlTWFuYWdlci5nZXRSZWdpc3RyeUF0KHVybCk7DQotDQotCQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsNCi0JCQkJX2hhc2hSZWdpc3RyeUNhY2hlLnB1dChzdHJMb2NhdGlvbiwgcmVnaXN0cnkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiByZWdpc3RyeTsNCi0JfQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgVU1XaXphcmRUcmVlSXRlbVtdIGdldFNlbGVjdGVkSXRlbXMoKSB7DQotDQotCQlVTVdpemFyZFRyZWVJdGVtW10gaXRlbXMgPSBudWxsOw0KLQ0KLQkJLy8gT2J0YWluIGFsbCBzZWxlY3RlZCBpdGVtcw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJVGFibGVUcmVlSXRlbVtdIHRyZWVJdGVtQ2hpbGRyZW4gPSBfdGFibGVUcmVlSXRlbXMuZ2V0SXRlbXMoKTsNCi0NCi0JCS8vIFBsYWNlIHRoZW0gaW50byBhbiBhcnJheQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlIYXNodGFibGUgaGFzaFByb2R1Y3RzID0gbmV3IEhhc2h0YWJsZSgpOw0KLQkJSGFzaHRhYmxlIGhhc2hDb21wb25lbnRzID0gbmV3IEhhc2h0YWJsZSgpOw0KLQkJSGFzaHRhYmxlIGhhc2hDb21wb25lbnRFbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlSXRlbUNoaWxkcmVuLmxlbmd0aDsgKytpKSB7DQotCQkJZ2V0U2VsZWN0ZWRJdGVtc1JlY3Vyc2l2ZSh0cmVlSXRlbUNoaWxkcmVuW2ldLCBoYXNoUHJvZHVjdHMsIGhhc2hDb21wb25lbnRzLCBoYXNoQ29tcG9uZW50RW50cmllcyk7DQotCQl9DQotDQotCQkvLyBDb3B5IGl0ZW1zIHRvIGFuIGFycmF5DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpdGVtcyA9IG5ldyBVTVdpemFyZFRyZWVJdGVtW2hhc2hQcm9kdWN0cy5zaXplKCkgKyBoYXNoQ29tcG9uZW50cy5zaXplKCkgKyBoYXNoQ29tcG9uZW50RW50cmllcy5zaXplKCldOw0KLQ0KLQkJLy8gUHJvZHVjdHMNCi0JCS8vLS0tLS0tLS0tDQotCQlPYmplY3RbXSBvYmpBcnJheSA9IGhhc2hQcm9kdWN0cy52YWx1ZXMoKS50b0FycmF5KCk7DQotCQlTeXN0ZW0uYXJyYXljb3B5KG9iakFycmF5LCAwLCBpdGVtcywgMCwgb2JqQXJyYXkubGVuZ3RoKTsNCi0NCi0JCS8vIENvbXBvbmVudHMNCi0JCS8vLS0tLS0tLS0tLS0NCi0JCW9iakFycmF5ID0gaGFzaENvbXBvbmVudHMudmFsdWVzKCkudG9BcnJheSgpOw0KLQkJU3lzdGVtLmFycmF5Y29weShvYmpBcnJheSwgMCwgaXRlbXMsIGhhc2hQcm9kdWN0cy5zaXplKCksIG9iakFycmF5Lmxlbmd0aCk7DQotDQotCQkvLyBDb21wb25lbnQgRW50cmllcw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCW9iakFycmF5ID0gaGFzaENvbXBvbmVudEVudHJpZXMudmFsdWVzKCkudG9BcnJheSgpOw0KLQkJU3lzdGVtLmFycmF5Y29weShvYmpBcnJheSwgMCwgaXRlbXMsIGhhc2hQcm9kdWN0cy5zaXplKCkgKyBoYXNoQ29tcG9uZW50cy5zaXplKCksIG9iakFycmF5Lmxlbmd0aCk7DQotDQotCQlyZXR1cm4gaXRlbXM7DQotCX0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZ2V0U2VsZWN0ZWRJdGVtc1JlY3Vyc2l2ZShUYWJsZVRyZWVJdGVtIHRyZWVJdGVtLCBIYXNodGFibGUgaGFzaFByb2R1Y3RzLCBIYXNodGFibGUgaGFzaENvbXBvbmVudHMsIEhhc2h0YWJsZSBoYXNoQ29tcG9uZW50RW50cmllcykgew0KLQ0KLQkJLy8gT2J0YWluIGFsbCBzZWxlY3RlZCBpdGVtcw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtID0gbnVsbDsNCi0NCi0JCWlmICh0cmVlSXRlbS5nZXRDaGVja2VkKCkgPT0gdHJ1ZSkgew0KLQkJCXVtVHJlZUl0ZW0gPSAoVU1XaXphcmRUcmVlSXRlbSkgdHJlZUl0ZW0uZ2V0RGF0YSgpOw0KLQ0KLQkJCWlmICh1bVRyZWVJdGVtICE9IG51bGwpIHsNCi0JCQkJaWYgKHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9QUk9EVUNUKSB7DQotDQotCQkJCQkvLyBSZW1vdmUgZHVwbGljYXRlcyBieSBzdG9yaW5nIG5ld2VyIG9uZXMgb25seQ0KLQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJCWlmIChoYXNoUHJvZHVjdHMuY29udGFpbnNLZXkodW1UcmVlSXRlbS5fc3RySWQpID09IHRydWUpIHsNCi0JCQkJCQlVTVdpemFyZFRyZWVJdGVtIHVtVHJlZUl0ZW1QcmV2aW91cyA9IChVTVdpemFyZFRyZWVJdGVtKSBoYXNoUHJvZHVjdHMuZ2V0KHVtVHJlZUl0ZW0uX3N0cklkKTsNCi0JCQkJCQlpZiAoKChJUHJvZHVjdERlc2NyaXB0b3IpIHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JBdmFpbGFibGUpLmNvbXBhcmUoKElQcm9kdWN0RGVzY3JpcHRvcikgdW1UcmVlSXRlbVByZXZpb3VzLl9kZXNjcmlwdG9yQXZhaWxhYmxlKSA+IDApIHsNCi0JCQkJCQkJaGFzaFByb2R1Y3RzLnJlbW92ZSh1bVRyZWVJdGVtLl9zdHJJZCk7DQotCQkJCQkJCWhhc2hQcm9kdWN0cy5wdXQodW1UcmVlSXRlbS5fc3RySWQsIHVtVHJlZUl0ZW0pOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCWhhc2hQcm9kdWN0cy5wdXQodW1UcmVlSXRlbS5fc3RySWQsIHVtVHJlZUl0ZW0pOw0KLQkJCQkJfQ0KLQkJCQl9DQotDQotCQkJCWVsc2UgaWYgKHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlQpIHsNCi0NCi0JCQkJCS8vIFJlbW92ZSBkdXBsaWNhdGVzIGJ5IHN0b3JpbmcgbmV3ZXIgb25lcyBvbmx5DQotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJaWYgKGhhc2hDb21wb25lbnRzLmNvbnRhaW5zS2V5KHVtVHJlZUl0ZW0uX3N0cklkKSA9PSB0cnVlKSB7DQotCQkJCQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtUHJldmlvdXMgPSAoVU1XaXphcmRUcmVlSXRlbSkgaGFzaENvbXBvbmVudHMuZ2V0KHVtVHJlZUl0ZW0uX3N0cklkKTsNCi0JCQkJCQlpZiAoKChJQ29tcG9uZW50RGVzY3JpcHRvcikgdW1UcmVlSXRlbS5fZGVzY3JpcHRvckF2YWlsYWJsZSkuY29tcGFyZSgoSUNvbXBvbmVudERlc2NyaXB0b3IpIHVtVHJlZUl0ZW1QcmV2aW91cy5fZGVzY3JpcHRvckF2YWlsYWJsZSkgPiAwKSB7DQotCQkJCQkJCWhhc2hDb21wb25lbnRzLnJlbW92ZSh1bVRyZWVJdGVtLl9zdHJJZCk7DQotCQkJCQkJCWhhc2hDb21wb25lbnRzLnB1dCh1bVRyZWVJdGVtLl9zdHJJZCwgdW1UcmVlSXRlbSk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJZWxzZSB7DQotCQkJCQkJaGFzaENvbXBvbmVudHMucHV0KHVtVHJlZUl0ZW0uX3N0cklkLCB1bVRyZWVJdGVtKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQ0KLQkJCQllbHNlIGlmICh1bVRyZWVJdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UX0VOVFJZKSB7DQotDQotCQkJCQkvLyBBZGQgb25seSBpZiB0aGUgcGFyZW50IHByb2R1Y3QgaGFzIG5vdCBiZWVuIHNlbGVjdGVkDQotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQlUYWJsZVRyZWVJdGVtIHRyZWVJdGVtUGFyZW50ID0gdHJlZUl0ZW0uZ2V0UGFyZW50SXRlbSgpOw0KLQkJCQkJaWYgKHRyZWVJdGVtUGFyZW50LmdldENoZWNrZWQoKSA9PSBmYWxzZSkgew0KLQ0KLQkJCQkJCS8vIFJlbW92ZSBkdXBsaWNhdGVzIGJ5IHN0b3JpbmcgbmV3ZXIgb25lcyBvbmx5DQotCQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJCQlpZiAoaGFzaENvbXBvbmVudEVudHJpZXMuY29udGFpbnNLZXkodW1UcmVlSXRlbS5fc3RySWQpID09IHRydWUpIHsNCi0JCQkJCQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtUHJldmlvdXMgPSAoVU1XaXphcmRUcmVlSXRlbSkgaGFzaENvbXBvbmVudEVudHJpZXMuZ2V0KHVtVHJlZUl0ZW0uX3N0cklkKTsNCi0JCQkJCQkJaWYgKCgoSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgdW1UcmVlSXRlbS5fZGVzY3JpcHRvckVudHJ5KS5jb21wYXJlKChJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSB1bVRyZWVJdGVtUHJldmlvdXMuX2Rlc2NyaXB0b3JFbnRyeSkgPiAwKSB7DQotCQkJCQkJCQloYXNoQ29tcG9uZW50RW50cmllcy5yZW1vdmUodW1UcmVlSXRlbS5fc3RySWQpOw0KLQkJCQkJCQkJaGFzaENvbXBvbmVudEVudHJpZXMucHV0KHVtVHJlZUl0ZW0uX3N0cklkLCB1bVRyZWVJdGVtKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCQllbHNlIHsNCi0JCQkJCQkJaGFzaENvbXBvbmVudEVudHJpZXMucHV0KHVtVHJlZUl0ZW0uX3N0cklkLCB1bVRyZWVJdGVtKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQkvLyBEbyBjaGlsZCBpdGVtcw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0NCi0JCVRhYmxlVHJlZUl0ZW1bXSB0cmVlSXRlbUNoaWxkcmVuID0gdHJlZUl0ZW0uZ2V0SXRlbXMoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUl0ZW1DaGlsZHJlbi5sZW5ndGg7ICsraSkgew0KLQkJCWdldFNlbGVjdGVkSXRlbXNSZWN1cnNpdmUodHJlZUl0ZW1DaGlsZHJlbltpXSwgaGFzaFByb2R1Y3RzLCBoYXNoQ29tcG9uZW50cywgaGFzaENvbXBvbmVudEVudHJpZXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuOw0KLQl9DQotCS8qKg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRVUkxEZXNjcmlwdGlvbihTdHJpbmcgc3RyVVJMKSB7DQotDQotCQlpZiAoX3RyZWVTZXRMb2NhdGlvbnMgIT0gbnVsbCAmJiBfdHJlZVNldExvY2F0aW9ucy5zaXplKCkgPiAwKSB7DQotCQkJSXRlcmF0b3IgaXRlciA9IF90cmVlU2V0TG9jYXRpb25zLml0ZXJhdG9yKCk7DQotCQkJVVJMTmFtZVBhaXIgcGFpciA9IG51bGw7DQotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpID09IHRydWUpIHsNCi0JCQkJcGFpciA9IChVUkxOYW1lUGFpcikgaXRlci5uZXh0KCk7DQotCQkJCWlmIChwYWlyLl9nZXRVUkwoKS5lcXVhbHMoc3RyVVJMKSA9PSB0cnVlKSB7DQotCQkJCQlpZiAocGFpci5fZ2V0TmFtZSgpICE9IG51bGwgJiYgcGFpci5fZ2V0TmFtZSgpLmxlbmd0aCgpID4gMCkgew0KLQkJCQkJCXJldHVybiBwYWlyLl9nZXROYW1lKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gc3RyVVJMOw0KLQl9DQotCS8qKg0KLQkgKiBPYnRhaW5zIGEgbGlzdCBvZiByZWdpc3RlcmVkIGNvbXBvbmVudCBVUkxzIGZyb20gdGhlIGxvY2FsIHVwZGF0ZSByZWdpc3RyeS4NCi0JICogT2J0YWlucyBhIGxpc3Qgb2YgYm9va21hcmtlZCBVUkxzIGZyb20gdGhlIHBlcnNpc3RlbnQgZGF0YS4NCi0JICogQ3JlYXRlcyBhIHRyZWUgZm9yIGFsbCBvZiB0aGUgVVJMcy4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb250ZW50KCkgew0KLQ0KLQkJaWYgKF9iUmVmcmVzaFJlcXVpcmVkID09IGZhbHNlKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJLy8gQWRkIGFsbCBzZWxlY3RlZCBsb2NhdGlvbnMgdG8gYSBzZXQNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlfdHJlZVNldExvY2F0aW9ucyA9IG5ldyBUcmVlU2V0KG5ldyBVTVdpemFyZFVSTE5hbWVQYWlyQ29tcGFyYXRvcigpKTsNCi0NCi0JCS8vIE9idGFpbiBwcmVkZWZpbmVkIGxvY2F0aW9ucyBzdHJpbmdzIGZyb20gbG9jYXRpb24gcGFnZQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlVTVdpemFyZFBhZ2VMb2NhdGlvbnMgcGFnZUxvY2F0aW9ucyA9IChVTVdpemFyZFBhZ2VMb2NhdGlvbnMpIF93aXphcmQuZ2V0UGFnZSgibG9jYXRpb25zIik7DQotDQotCQlVUkxOYW1lUGFpcltdIHBhaXJzID0gcGFnZUxvY2F0aW9ucy5nZXRTZWxlY3RlZFByZWRlZmluZWRMb2NhdGlvbnMoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyArK2kpIHsNCi0JCQlfdHJlZVNldExvY2F0aW9ucy5hZGQocGFpcnNbaV0pOw0KLQkJfQ0KLQ0KLQkJLy8gT2J0YWluIGFkZGl0aW9uYWwgbG9jYXRpb25zIHN0cmluZ3MgZnJvbSBsb2NhdGlvbiBwYWdlDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCXBhaXJzID0gcGFnZUxvY2F0aW9ucy5nZXRTZWxlY3RlZEFkZGl0aW9uYWxMb2NhdGlvbnMoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyArK2kpIHsNCi0JCQlfdHJlZVNldExvY2F0aW9ucy5hZGQocGFpcnNbaV0pOw0KLQkJfQ0KLQ0KLQkJLy8gT2J0YWluIGxvY2FsIHJlZ2lzdHJ5IGluIGNhc2UgdGhlcmUgYXJlIGluc3RhbGxlZCB2ZXJzaW9ucw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJZmluYWwgSVVNUmVnaXN0cnkgcmVnaXN0cnlMb2NhbCA9IF93aXphcmQuX3VwZGF0ZU1hbmFnZXIuZ2V0UmVnaXN0cnlNYW5hZ2VyKCkuZ2V0Q3VycmVudFJlZ2lzdHJ5KCk7DQotDQotCQlmaW5hbCBWZWN0b3IgdmVjdG9yUmVnaXN0cmllcyA9IG5ldyBWZWN0b3IoKTsNCi0JCWZpbmFsIFZlY3RvciB2ZWN0b3JVUkxzRmFpbGVkID0gbmV3IFZlY3RvcigpOw0KLQ0KLQkJX3RhYmxlVHJlZUl0ZW1zLnNldFJlZHJhdyhmYWxzZSk7DQotDQotCQkvLyBDcmVhdGUgYW4gb3BlcmF0aW9uIHRoYXQgcmVhZCBhbmQgY3JlYXRlIGEgcmVnaXN0cnkgZm9yIGVhY2ggbG9jYXRpb24NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gew0KLQ0KLQkJCQlfcHJvZ3Jlc3NNb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOw0KLQ0KLQkJCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19SZWFkaW5nIikgKyAiOiIsIF90cmVlU2V0TG9jYXRpb25zLnNpemUoKSk7DQotDQotCQkJCVVSTE5hbWVQYWlyIHBhaXIgPSBudWxsOw0KLQkJCQlJVU1SZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7DQotDQotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBfdHJlZVNldExvY2F0aW9ucy5pdGVyYXRvcigpOw0KLQ0KLQkJCQlib29sZWFuIGJVcmxPayA9IGZhbHNlOw0KLQ0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgPT0gdHJ1ZSkgew0KLQ0KLQkJCQkJYlVybE9rID0gZmFsc2U7DQotDQotCQkJCQkvLyBPYnRhaW4gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgVVJMDQotCQkJCQkvLyBUaGlzIHdpbGwgZG93bmxvYWQgdGhlIGluZm9ybWF0aW9uDQotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQlwYWlyID0gKFVSTE5hbWVQYWlyKSBpdGVyLm5leHQoKTsNCi0NCi0JCQkJCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKHBhaXIuX2dldE5hbWUoKSk7DQotDQotCQkJCQkvLyBBdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQ0KLQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJCXRyeSB7DQotCQkJCQkJVVJMIHVybCA9IG5ldyBVUkwocGFpci5fZ2V0VVJMKCkpOw0KLQkJCQkJCXVybCA9IFVNRWNsaXBzZVRyZWUuYXBwZW5kVHJhaWxpbmdTbGFzaCh1cmwpOw0KLQkJCQkJCVJlc3BvbnNlIHJlc3BvbnNlID0gVVJMSGFuZGxlci5vcGVuKHVybCk7DQotCQkJCQkJLy8gd2Ugb3BlbiB0aGUgdXJsIHRvIGdldCBhdXRoZW50aWNhdGVkLiAgcmVzcG9uc2UgY29kZSBub3QNCi0JCQkJCQkvLyBpbXBvcnRhbnQgYXQgdGhpcyBwb2ludA0KLQkJCQkJLyoJaWYgKHJlc3BvbnNlLmdldFJlc3BvbnNlQ29kZSgpID09IElTdGF0dXNDb2Rlcy5IVFRQX09LKSB7DQotCQkJCQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IHJlc3BvbnNlLmdldElucHV0U3RyZWFtKCk7DQotDQotCQkJCQkJCWlmIChzdHJlYW0gIT0gbnVsbCkgew0KLQkJCQkJCQkJc3RyZWFtLmNsb3NlKCk7Ki8NCi0JCQkJCQkJCWJVcmxPayA9IHRydWU7DQotCQkJCQkvLwkJfQ0KLQkJCQkJLy8JfQ0KLQkJCQkJfQ0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLQkJCQkJfQ0KLQ0KLQkJCQkJaWYgKGJVcmxPayA9PSB0cnVlKSB7IA0KLQkJCQkJCXJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnlBdChwYWlyLl9nZXRVUkwoKSk7DQotDQotCQkJCQkJLy8gQWRkIGl0IHRvIHRoZSBsaXN0DQotCQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpDQotCQkJCQkJCXZlY3RvclJlZ2lzdHJpZXMuYWRkKHJlZ2lzdHJ5KTsNCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCXZlY3RvclVSTHNGYWlsZWQuYWRkKHBhaXIpOw0KLQkJCQkJfQ0KLQ0KLQkJCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJfQ0KLQkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOw0KLQ0KLQkJCQlfcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsNCi0JCQl9DQotCQl9Ow0KLQ0KLQkJLy8gUnVuIHRoZSBvcGVyYXRpb24NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCQl0cnkgew0KLQkJCV93aXphcmQuZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7DQotCQl9DQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJfQ0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLQkJfQ0KLQ0KLQkJLy8gQ3JlYXRlIGEgbmV3IHRyZWUNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlfdHJlZVNldEl0ZW1zID0gbmV3IFRyZWVTZXQobmV3IFVNV2l6YXJkVHJlZUl0ZW1Db21wYXJhdG9yKCkpOw0KLQ0KLQkJLy8gQ3JlYXRlIGFuIG9wZXJhdGlvbiB0aGF0IHdpbGwgZmlsbCB0aGUgdHJlZSB3aXRoIGluZm9ybWF0aW9uDQotCQkvLyBMb2NhdGlvbiBVUkwgQQ0KLQkJLy8gICBwcm9kdWN0cw0KLQkJLy8gICAgIFByb2R1Y3QgQQ0KLQkJLy8gICAgIFByb2R1Y3QgQg0KLQkJLy8gICBjb21wb25lbnRzDQotCQkvLyAgICAgQ29tcG9uZW50IEENCi0JCS8vICAgICBDb21wb25lbnQgQg0KLQkJLy8gTG9jYXRpb24gVVJMIEINCi0JCS8vIC4uLg0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgew0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gew0KLQ0KLQkJCQlJVU1SZWdpc3RyeSByZWdpc3RyeVJlbW90ZSA9IG51bGw7DQotDQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yUmVnaXN0cmllcy5zaXplKCk7ICsraSkgew0KLQkJCQkJcmVnaXN0cnlSZW1vdGUgPSAoSVVNUmVnaXN0cnkpIHZlY3RvclJlZ2lzdHJpZXMuZWxlbWVudEF0KGkpOw0KLQkJCQkJYWRkTG9jYXRpb25Ub1RyZWUocmVnaXN0cnlSZW1vdGUsIHJlZ2lzdHJ5TG9jYWwsIHByb2dyZXNzTW9uaXRvcik7DQotCQkJCX0NCi0JCQl9DQotCQl9Ow0KLQ0KLQkJLy8gUnVuIHRoZSBvcGVyYXRpb24NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCQl0cnkgew0KLQkJCV93aXphcmQuZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wZXJhdGlvbik7DQotCQl9DQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybjsNCi0JCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKCAiSW50ZXJydXB0ZWQiICk7DQotCQl9DQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7DQotCQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggIkludm9jYXRpb24iICk7DQotCQl9DQotDQotCQlfdGFibGVUcmVlSXRlbXMuc2V0UmVkcmF3KHRydWUpOw0KLQ0KLQkJLy8gQ3JlYXRlIHRyZWUgd2lkZ2V0IGl0ZW1zIGZvciBlYWNoIHVwZGF0ZSBtYW5hZ2VyIHRyZWUgaXRlbQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJY29ubmVjdFRvVHJlZSgpOw0KLQ0KLQkJU3RyaW5nQnVmZmVyIHN0cmJNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQ0KLQkJLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgYXJlIGFueSB1cGRhdGFibGUgaXRlbXMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAoX3RhYmxlVHJlZUl0ZW1zLmdldEl0ZW1Db3VudCgpID09IDApDQotCQkJc3RyYk1lc3NhZ2UuYXBwZW5kKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19Ob19pbnN0YWxsYWJsZV9pdGVtc193ZXJlX2ZvdW5kIikgKyAiXG5cbiIpOw0KLQ0KLQkJLy8gRGV0ZXJtaW5lIGlmIGFueSBsb2NhdGlvbnMgY291bGQgbm90IGJlIGFjY2Vzc2VkDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWlmICh2ZWN0b3JVUkxzRmFpbGVkLnNpemUoKSA+IDApIHsNCi0JCQlzdHJiTWVzc2FnZS5hcHBlbmQoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19hY2Nlc3NfdGhlX2ZvbGxvd2luZ19sb2NhdGlvbnMiKSArICI6Iik7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3JVUkxzRmFpbGVkLnNpemUoKTsgKytpKSB7DQotCQkJCXN0cmJNZXNzYWdlLmFwcGVuZCgiXG4gICAiKTsNCi0JCQkJc3RyYk1lc3NhZ2UuYXBwZW5kKCgoVVJMTmFtZVBhaXIpIHZlY3RvclVSTHNGYWlsZWQuZWxlbWVudEF0KGkpKS5fZ2V0TmFtZSgpKTsNCi0JCQkJc3RyYk1lc3NhZ2UuYXBwZW5kKCIgKCIpOw0KLQkJCQlzdHJiTWVzc2FnZS5hcHBlbmQoKChVUkxOYW1lUGFpcikgdmVjdG9yVVJMc0ZhaWxlZC5lbGVtZW50QXQoaSkpLl9nZXRVUkwoKSk7DQotCQkJCXN0cmJNZXNzYWdlLmFwcGVuZCgiKSIpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChzdHJiTWVzc2FnZS5sZW5ndGgoKSA+IDApIHsNCi0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0luZm9ybWF0aW9uIiksIHN0cmJNZXNzYWdlLnRvU3RyaW5nKCkpOw0KLQkJfQ0KLQ0KLQkJLy8gUmVzZXQgcmVmcmVzaCBmbGFnDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCV9iUmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7DQotDQotCQlyZXR1cm47DQotCX0NCi0JLyoqDQotCSAqLw0KLQlwdWJsaWMgaW50IGlzSW5zdGFsbGFibGVDb21wb25lbnQoVGFibGVUcmVlSXRlbSB0cmVlSXRlbUNvbXBvbmVudCkgew0KLQ0KLQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtID0gKFVNV2l6YXJkVHJlZUl0ZW0pIHRyZWVJdGVtQ29tcG9uZW50LmdldERhdGEoKTsNCi0NCi0JCS8vIEZhbHNlIGlmIG5vbmUgYXZhaWxhYmxlIHRvIGluc3RhbGwNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWlmICh1bVRyZWVJdGVtLl9kZXNjcmlwdG9yQXZhaWxhYmxlID09IG51bGwpIHsNCi0JCQlyZXR1cm4gLTE7DQotCQl9DQotDQotCQkvLyBUcnVlIGlmIG5vdCB5ZXQgaW5zdGFsbGVkDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAodW1UcmVlSXRlbS5fZGVzY3JpcHRvckN1cnJlbnQgPT0gbnVsbCkgew0KLQkJCXJldHVybiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9LX1RPX0lOU1RBTEw7DQotCQl9DQotDQotCQkvLyBUcnVlIGlmIGluc3RhbGxhYmxlDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlyZXR1cm4gKChJQ29tcG9uZW50RGVzY3JpcHRvcikgdW1UcmVlSXRlbS5fZGVzY3JpcHRvckF2YWlsYWJsZSkuaXNJbnN0YWxsYWJsZSgoSUNvbXBvbmVudERlc2NyaXB0b3IpIHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JDdXJyZW50KTsNCi0JfQ0KLQkvKioNCi0JICogQHJldHVybiBpbnQNCi0JICogQHBhcmFtIHRyZWVJdGVtQ29tcG9uZW50IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbQ0KLQkgKi8NCi0JcHVibGljIGludCBpc0luc3RhbGxhYmxlQ29tcG9uZW50RW50cnkoVGFibGVUcmVlSXRlbSB0cmVlSXRlbUNvbXBvbmVudEVudHJ5KSB7DQotDQotCQlVTVdpemFyZFRyZWVJdGVtIHVtVHJlZUl0ZW0gPSAoVU1XaXphcmRUcmVlSXRlbSkgdHJlZUl0ZW1Db21wb25lbnRFbnRyeS5nZXREYXRhKCk7DQotDQotCQkvLyBGYWxzZSBpZiBub25lIGF2YWlsYWJsZSB0byBpbnN0YWxsDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAodW1UcmVlSXRlbS5fZGVzY3JpcHRvckVudHJ5ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gLTE7DQotCQl9DQotDQotCQkvLyBJcyB0aGUgcHJvZHVjdCBpbnN0YWxsYWJsZT8NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJVGFibGVUcmVlSXRlbSB0cmVlSXRlbVByb2R1Y3QgPSB0cmVlSXRlbUNvbXBvbmVudEVudHJ5LmdldFBhcmVudEl0ZW0oKTsNCi0NCi0JCWludCBpUHJvZHVjdEluc3RhbGxhYmxlID0gaXNJbnN0YWxsYWJsZVByb2R1Y3QodHJlZUl0ZW1Qcm9kdWN0KTsNCi0NCi0JCS8vIElmIHRoZSBwcm9kdWN0IGlzIG5vdCBpbnN0YWxsYWJsZSwgZGlzYWJsZSBpZiBtYW5kYXRvcnkgY29tcG9uZW50DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKGlQcm9kdWN0SW5zdGFsbGFibGUgIT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PS19UT19JTlNUQUxMKSB7DQotCQkJaWYgKHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JFbnRyeS5pc09wdGlvbmFsRm9ySW5zdGFsbCgpID09IGZhbHNlKSB7DQotCQkJCXJldHVybiBpUHJvZHVjdEluc3RhbGxhYmxlOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiB1bVRyZWVJdGVtLl9kZXNjcmlwdG9yRW50cnkuaXNJbnN0YWxsYWJsZSgoSUNvbXBvbmVudERlc2NyaXB0b3IpIHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JDdXJyZW50KTsNCi0JfQ0KLQkvKioNCi0JICogQHJldHVybiBpbnQNCi0JICogQHBhcmFtIHRyZWVJdGVtQ29tcG9uZW50IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbQ0KLQkgKi8NCi0JcHVibGljIGludCBpc0luc3RhbGxhYmxlUHJvZHVjdChUYWJsZVRyZWVJdGVtIHRyZWVJdGVtUHJvZHVjdCkgew0KLQ0KLQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtID0gKFVNV2l6YXJkVHJlZUl0ZW0pIHRyZWVJdGVtUHJvZHVjdC5nZXREYXRhKCk7DQotDQotCQkvLyBGYWxzZSBpZiBub25lIGF2YWlsYWJsZSB0byBpbnN0YWxsDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAodW1UcmVlSXRlbS5fZGVzY3JpcHRvckF2YWlsYWJsZSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIC0xOw0KLQkJfQ0KLQ0KLQkJLy8gVHJ1ZSBpZiBub3QgeWV0IGluc3RhbGxlZA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJZWxzZSBpZiAodW1UcmVlSXRlbS5fZGVzY3JpcHRvckN1cnJlbnQgPT0gbnVsbCkgew0KLQkJCXJldHVybiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9LX1RPX0lOU1RBTEw7DQotCQl9DQotDQotCQkvLyBUcnVlIGlmIGluc3RhbGxhYmxlDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlyZXR1cm4gKChJUHJvZHVjdERlc2NyaXB0b3IpIHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JBdmFpbGFibGUpLmlzSW5zdGFsbGFibGUoKElQcm9kdWN0RGVzY3JpcHRvcikgdW1UcmVlSXRlbS5fZGVzY3JpcHRvckN1cnJlbnQpOw0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSW5zdGFsbGFibGVSZWN1cnNpdmUoVGFibGVUcmVlSXRlbSB0cmVlSXRlbSkgew0KLQ0KLQkJYm9vbGVhbiBiSW5zdGFsbGFibGUgPSBmYWxzZTsNCi0NCi0JCVVNV2l6YXJkVHJlZUl0ZW0gdW1UcmVlSXRlbSA9IChVTVdpemFyZFRyZWVJdGVtKSB0cmVlSXRlbS5nZXREYXRhKCk7DQotDQotCQkvLyBUcnVlIGlmIHByb2R1Y3Qgb3IgY29tcG9uZW50IGlzIGNoZWNrZWQNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKHRyZWVJdGVtLmdldENoZWNrZWQoKSA9PSB0cnVlKSB7DQotCQkJaWYgKHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlQgfHwgdW1UcmVlSXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX1BST0RVQ1QgfHwgdW1UcmVlSXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX0NPTVBPTkVOVF9FTlRSWSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQkvLyBDaGVjayBhbGwgY2hpbGRyZW4NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJVGFibGVUcmVlSXRlbVtdIHRyZWVJdGVtQ2hpbGRyZW4gPSB0cmVlSXRlbS5nZXRJdGVtcygpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlSXRlbUNoaWxkcmVuLmxlbmd0aDsgKytpKSB7DQotCQkJaWYgKGlzSW5zdGFsbGFibGVSZWN1cnNpdmUodHJlZUl0ZW1DaGlsZHJlbltpXSkgPT0gdHJ1ZSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JLyoqDQotCSAqIFNlbnQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBwYXNzZXMgaW50byB0aGUgYXJlYSBvZg0KLQkgKiB0aGUgc2NyZWVuIGNvdmVyZWQgYnkgYSBjb250cm9sLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgbW91c2VFbnRlcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQgZSkgew0KLQl9DQotCS8qKg0KLQkgKiBTZW50IHdoZW4gdGhlIG1vdXNlIHBvaW50ZXIgcGFzc2VzIG91dCBvZiB0aGUgYXJlYSBvZg0KLQkgKiB0aGUgc2NyZWVuIGNvdmVyZWQgYnkgYSBjb250cm9sLiAgRXJhc2VzIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGFyZWEuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7DQotCQlpZiAoX3N0ckRlc2NyaXB0aW9uICE9IF93aXphcmQuX3N0ckVtcHR5KSB7DQotCQkJX3RleHREZXNjcmlwdGlvbi5zZXRUZXh0KF93aXphcmQuX3N0ckVtcHR5KTsNCi0JCQlfc3RyRGVzY3JpcHRpb24gPSBfd2l6YXJkLl9zdHJFbXB0eTsNCi0JCX0NCi0JfQ0KLQkvKioNCi0JICogU2VudCB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGhvdmVycyAodGhhdCBpcywgc3RvcHMgbW92aW5nDQotCSAqIGZvciBhbiAob3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpZWQpIHBlcmlvZCBvZiB0aW1lKSBvdmVyDQotCSAqIGEgY29udHJvbC4NCi0JICovDQotCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7DQotCX0NCi0JLyoqDQotCSAqIERldGVybWluZXMgd2hpY2ggaXRlbSB0aGUgbW91c2UgaXMgb3Zlci4gIFNldHMgdGhlIHRleHQgaW4gdGhlIGRlc2NyaXB0aW9uIHRleHQgYXJlYSB0byB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGl0ZW0uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7DQotDQotCQkvLyBUYWJsZSBpdGVtDQotCQkvLy0tLS0tLS0tLS0tDQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gX3RhYmxlVHJlZUl0ZW1zLmdldFRhYmxlKCkuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsNCi0NCi0JCS8vIFRhYmxlVHJlZSBpdGVtDQotCQkvLy0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKHRhYmxlSXRlbSAhPSBudWxsKSB7DQotDQotCQkJVGFibGVUcmVlSXRlbSB0YWJsZVRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pIHRhYmxlSXRlbS5nZXREYXRhKCk7DQotDQotCQkJLy8gVU1XaXphcmRUcmVlSXRlbQ0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSANCi0JCQlpZiAodGFibGVUcmVlSXRlbSAhPSBudWxsKSB7DQotDQotCQkJCVVNV2l6YXJkVHJlZUl0ZW0gaXRlbSA9IChVTVdpemFyZFRyZWVJdGVtKSB0YWJsZVRyZWVJdGVtLmdldERhdGEoKTsNCi0NCi0JCQkJLy8gRGVzY3JpcHRpb24gc3RyaW5nDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7DQotCQkJCQlpZiAoaXRlbS5fc3RyRGVzY3JpcHRpb24gIT0gbnVsbCkgew0KLQkJCQkJCWlmIChfc3RyRGVzY3JpcHRpb24gIT0gaXRlbS5fc3RyRGVzY3JpcHRpb24pIHsNCi0JCQkJCQkJX3RleHREZXNjcmlwdGlvbi5zZXRUZXh0KGl0ZW0uX3N0ckRlc2NyaXB0aW9uKTsNCi0JCQkJCQkJX3N0ckRlc2NyaXB0aW9uID0gaXRlbS5fc3RyRGVzY3JpcHRpb247DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJZWxzZSB7DQotCQkJCQkJaWYgKF9zdHJEZXNjcmlwdGlvbiAhPSBfd2l6YXJkLl9zdHJFbXB0eSkgew0KLQkJCQkJCQlfdGV4dERlc2NyaXB0aW9uLnNldFRleHQoX3dpemFyZC5fc3RyRW1wdHkpOw0KLQkJCQkJCQlfc3RyRGVzY3JpcHRpb24gPSBfd2l6YXJkLl9zdHJFbXB0eTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJZWxzZSBpZiAoX3N0ckRlc2NyaXB0aW9uICE9IF93aXphcmQuX3N0ckVtcHR5KSB7DQotCQkJCQlfdGV4dERlc2NyaXB0aW9uLnNldFRleHQoX3dpemFyZC5fc3RyRW1wdHkpOw0KLQkJCQkJX3N0ckRlc2NyaXB0aW9uID0gX3dpemFyZC5fc3RyRW1wdHk7DQotCQkJCX0NCi0NCi0JCQl9DQotCQl9DQotCQllbHNlIGlmIChfc3RyRGVzY3JpcHRpb24gIT0gX3dpemFyZC5fc3RyRW1wdHkpIHsNCi0JCQlfdGV4dERlc2NyaXB0aW9uLnNldFRleHQoX3dpemFyZC5fc3RyRW1wdHkpOw0KLQkJCV9zdHJEZXNjcmlwdGlvbiA9IF93aXphcmQuX3N0ckVtcHR5Ow0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiBAcmV0dXJuIGJvb2xlYW4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7DQotDQotCQlpZiAoX3Byb2dyZXNzTW9uaXRvciA9PSBudWxsKQ0KLQkJCXJldHVybiB0cnVlOw0KLQ0KLQkJX3Byb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkvKioNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIHNldENoZWNrZWRDb21wb25lbnQoVGFibGVUcmVlSXRlbSB0cmVlSXRlbUNvbXBvbmVudCkgew0KLQ0KLQkJaWYgKHRyZWVJdGVtQ29tcG9uZW50LmdldENoZWNrZWQoKSA9PSBmYWxzZSkgew0KLQkJCWludCBpSW5zdGFsbGFibGUgPSBpc0luc3RhbGxhYmxlQ29tcG9uZW50KHRyZWVJdGVtQ29tcG9uZW50KTsNCi0NCi0JCQlzZXRUcmVlSXRlbUNoZWNrZWQodHJlZUl0ZW1Db21wb25lbnQsIGlJbnN0YWxsYWJsZSA9PSAwKTsNCi0JCQlyZXR1cm4gaUluc3RhbGxhYmxlID09IDA7DQotCQl9DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKioNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIHNldENoZWNrZWRDb21wb25lbnRFbnRyeShUYWJsZVRyZWVJdGVtIHRyZWVJdGVtQ29tcG9uZW50RW50cnkpIHsNCi0NCi0JCWlmICh0cmVlSXRlbUNvbXBvbmVudEVudHJ5LmdldENoZWNrZWQoKSA9PSBmYWxzZSkgew0KLQ0KLQkJCVVNV2l6YXJkVHJlZUl0ZW0gdW1UcmVlSXRlbSA9IChVTVdpemFyZFRyZWVJdGVtKSB0cmVlSXRlbUNvbXBvbmVudEVudHJ5LmdldERhdGEoKTsNCi0NCi0JCQlpbnQgaUluc3RhbGxhYmxlID0gaXNJbnN0YWxsYWJsZUNvbXBvbmVudEVudHJ5KHRyZWVJdGVtQ29tcG9uZW50RW50cnkpOw0KLQ0KLQkJCWlmIChpSW5zdGFsbGFibGUgPT0gMCkgew0KLQ0KLQkJCQkvLyBTZXQgY2hlY2tlZCB0aGUgcHJvZHVjdCBhbmQgYWxsIG9mIGl0cyBtYW5kYXRvcnkgY29tcG9uZW50cw0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlUYWJsZVRyZWVJdGVtIHRyZWVJdGVtUHJvZHVjdCA9IHRyZWVJdGVtQ29tcG9uZW50RW50cnkuZ2V0UGFyZW50SXRlbSgpOw0KLQ0KLQkJCQlib29sZWFuIGJJbnN0YWxsYWJsZVByb2R1Y3QgPSBzZXRDaGVja2VkUHJvZHVjdCh0cmVlSXRlbVByb2R1Y3QpOw0KLQ0KLQkJCQkvLyBJZiB0aGUgcHJvZHVjdCBpcyBub3QgaW5zdGFsbGFibGUsIGRpc2FibGUgaWYgbWFuZGF0b3J5IGNvbXBvbmVudA0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlpZiAoYkluc3RhbGxhYmxlUHJvZHVjdCA9PSBmYWxzZSkgew0KLQ0KLQkJCQkJaWYgKHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JFbnRyeS5pc09wdGlvbmFsRm9ySW5zdGFsbCgpID09IGZhbHNlKSB7DQotCQkJCQkJaWYgKHRyZWVJdGVtQ29tcG9uZW50RW50cnkuZ2V0Q2hlY2tlZCgpID09IHRydWUpDQotCQkJCQkJCXRyZWVJdGVtQ29tcG9uZW50RW50cnkuc2V0Q2hlY2tlZChmYWxzZSk7DQotCQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCXNldFRyZWVJdGVtQ2hlY2tlZCh0cmVlSXRlbUNvbXBvbmVudEVudHJ5LCBpSW5zdGFsbGFibGUgPT0gMCk7DQotCQkJdW1UcmVlSXRlbS5fZGVzY3JpcHRvckVudHJ5LmlzU2VsZWN0ZWQoaUluc3RhbGxhYmxlID09IDApOw0KLQ0KLQkJCXJldHVybiBpSW5zdGFsbGFibGUgPT0gMDsNCi0JCX0NCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCS8qKg0KLQkgKiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHRoZSBjaGVja2JveCB3YXMgdW5jaGVja2VkIGFuZCBpcyBjdXJyZW50bHkgY2hlY2tlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q2hlY2tlZFByb2R1Y3QoVGFibGVUcmVlSXRlbSB0cmVlSXRlbVByb2R1Y3QpIHsNCi0NCi0JCWlmICh0cmVlSXRlbVByb2R1Y3QuZ2V0Q2hlY2tlZCgpID09IGZhbHNlKSB7DQotDQotCQkJaW50IGlJbnN0YWxsYWJsZSA9IGlzSW5zdGFsbGFibGVQcm9kdWN0KHRyZWVJdGVtUHJvZHVjdCk7DQotDQotCQkJc2V0VHJlZUl0ZW1DaGVja2VkKHRyZWVJdGVtUHJvZHVjdCwgaUluc3RhbGxhYmxlID09IDApOw0KLQ0KLQkJCWlmIChpSW5zdGFsbGFibGUgPT0gMCkgew0KLQ0KLQkJCQlUYWJsZVRyZWVJdGVtW10gdHJlZUl0ZW1DaGlsZHJlbiA9IHRyZWVJdGVtUHJvZHVjdC5nZXRJdGVtcygpOw0KLQ0KLQkJCQlVTVdpemFyZFRyZWVJdGVtIHVtVHJlZUl0ZW0gPSBudWxsOw0KLQ0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWVJdGVtQ2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsNCi0JCQkJCXNldENoZWNrZWRDb21wb25lbnRFbnRyeSh0cmVlSXRlbUNoaWxkcmVuW2ldKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQlyZXR1cm4gaUluc3RhbGxhYmxlID09IDA7DQotCQl9DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKioNCi0JICogVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgY2hlY2tib3ggd2FzIHVuY2hlY2tlZCBhbmQgaXMgY3VycmVudGx5IGNoZWNrZWQuDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDaGVja2VkVVJMKFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW1VUkwpIHsNCi0NCi0JCVRhYmxlVHJlZUl0ZW1bXSB0cmVlSXRlbUNoaWxkcmVuID0gdHJlZUl0ZW1VUkwuZ2V0SXRlbXMoKTsNCi0JCVVNV2l6YXJkVHJlZUl0ZW0gdW1UcmVlSXRlbSA9IG51bGw7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWVJdGVtQ2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsNCi0JCQl1bVRyZWVJdGVtID0gKFVNV2l6YXJkVHJlZUl0ZW0pIHRyZWVJdGVtQ2hpbGRyZW5baV0uZ2V0RGF0YSgpOw0KLQ0KLQkJCWlmICh1bVRyZWVJdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfUFJPRFVDVCkgew0KLQkJCQlzZXRDaGVja2VkUHJvZHVjdCh0cmVlSXRlbUNoaWxkcmVuW2ldKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAodW1UcmVlSXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX0NPTVBPTkVOVCkgew0KLQkJCQlzZXRDaGVja2VkQ29tcG9uZW50KHRyZWVJdGVtQ2hpbGRyZW5baV0pOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIEFsd2F5cyBjaGVja2VkDQotCQkvLy0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKHRyZWVJdGVtVVJMLmdldENoZWNrZWQoKSA9PSBmYWxzZSkNCi0JCQl0cmVlSXRlbVVSTC5zZXRDaGVja2VkKHRydWUpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyoqDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUcmVlSXRlbUNoZWNrZWQoVGFibGVUcmVlSXRlbSB0cmVlSXRlbSwgYm9vbGVhbiBiQ2hlY2tlZCkgew0KLQ0KLQkJaWYgKGJDaGVja2VkID09IHRydWUpIHsNCi0JCQlpZiAodHJlZUl0ZW0uZ2V0Q2hlY2tlZCgpID09IGZhbHNlKQ0KLQkJCQl0cmVlSXRlbS5zZXRDaGVja2VkKHRydWUpOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaWYgKHRyZWVJdGVtLmdldENoZWNrZWQoKSA9PSB0cnVlKQ0KLQkJCQl0cmVlSXRlbS5zZXRDaGVja2VkKGZhbHNlKTsNCi0JCX0NCi0JfQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRyZWVJdGVtQ2hlY2tlZChib29sZWFuIGJDaGVja2VkKSB7DQotCX0NCi0JLyoqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUcmVlSXRlbVVuY2hlY2tlZFJlY3Vyc2l2ZUJhY2t3YXJkKFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW0pIHsNCi0NCi0JCWlmICh0cmVlSXRlbS5nZXRDaGVja2VkKCkgIT0gZmFsc2UpIHsNCi0JCQl0cmVlSXRlbS5zZXRDaGVja2VkKGZhbHNlKTsNCi0JCX0NCi0NCi0JCVRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW1QYXJlbnQgPSB0cmVlSXRlbS5nZXRQYXJlbnRJdGVtKCk7DQotDQotCQlpZiAodHJlZUl0ZW1QYXJlbnQgIT0gbnVsbCkgew0KLQkJCXNldFRyZWVJdGVtVW5jaGVja2VkUmVjdXJzaXZlQmFja3dhcmQodHJlZUl0ZW1QYXJlbnQpOw0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VHJlZUl0ZW1VbmNoZWNrZWRSZWN1cnNpdmVGb3J3YXJkKFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW0pIHsNCi0NCi0JCWlmICh0cmVlSXRlbS5nZXRDaGVja2VkKCkgIT0gZmFsc2UpIHsNCi0NCi0JCQl0cmVlSXRlbS5zZXRDaGVja2VkKGZhbHNlKTsNCi0JCQkvKg0KLQkJCQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtID0gKFVNV2l6YXJkVHJlZUl0ZW0pIHRyZWVJdGVtLmdldERhdGEoKTsNCi0JCQkNCi0JCQkJCWlmICh1bVRyZWVJdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UX0VOVFJZKSB7DQotCQkJDQotCQkJCQkJaWYgKHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JFbnRyeS5pc09wdGlvbmFsRm9ySW5zdGFsbCgpID09IHRydWUpIHsNCi0JCQkJCQkJdW1UcmVlSXRlbS5fZGVzY3JpcHRvckVudHJ5LmlzU2VsZWN0ZWQoZmFsc2UpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkqLw0KLQkJfQ0KLQ0KLQkJVGFibGVUcmVlSXRlbVtdIHRyZWVJdGVtQ2hpbGRyZW4gPSB0cmVlSXRlbS5nZXRJdGVtcygpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlSXRlbUNoaWxkcmVuLmxlbmd0aDsgKytpKSB7DQotCQkJc2V0VHJlZUl0ZW1VbmNoZWNrZWRSZWN1cnNpdmVGb3J3YXJkKHRyZWVJdGVtQ2hpbGRyZW5baV0pOw0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiBiVmlzaWJsZSkgew0KLQ0KLQkJc3VwZXIuc2V0VmlzaWJsZShiVmlzaWJsZSk7DQotDQotCQlpZiAoYlZpc2libGUgPT0gdHJ1ZSkgew0KLQkJCV9zYXNoRm9ybVRvcEJvdHRvbS5sYXlvdXQoKTsNCi0JCQlpbml0aWFsaXplQ29udGVudCgpOw0KLQ0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiBTZW50IHdoZW4gZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgew0KLQl9DQotCS8qKg0KLQkgKiBTZW50IHdoZW4gc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4NCi0JICovDQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgew0KLQ0KLQkJLy8gQ2hlY2tib3g6IFNob3cgbGF0ZXN0IHZlcnNpb25zIG9ubHkNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAoZS53aWRnZXQgPT0gX2J1dHRvblNob3dMYXRlc3RPbmx5KSB7DQotCQkJX2JTaG93TGF0ZXN0T25seSA9IF9idXR0b25TaG93TGF0ZXN0T25seS5nZXRTZWxlY3Rpb24oKTsNCi0JCQlfYlJlZnJlc2hSZXF1aXJlZCA9IHRydWU7DQotCQkJaW5pdGlhbGl6ZUNvbnRlbnQoKTsNCi0JCX0NCi0NCi0JCS8vIFRhYmxlVHJlZUl0ZW06IENoZWNrYm94DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gX3RhYmxlVHJlZUl0ZW1zICYmIGUuZGV0YWlsID09IFNXVC5DSEVDSykgew0KLQ0KLQkJCS8vIFNldCBwYWdlIGNvbXBsZXRlIHRvIGZhbHNlIGluIGNhc2UgdGhlcmUgYXJlDQotCQkJLy8gbm8gc2VsZWN0ZWQgaXRlbXMsIG9yIHVudGlsIHNlbGVjdGlvbiBpcyBkZXRlcm1pbmVkIHRvIGJlIHZhbGlkDQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCi0NCi0JCQlUYWJsZVRyZWVJdGVtIHRyZWVJdGVtID0gKFRhYmxlVHJlZUl0ZW0pIGUuaXRlbTsNCi0NCi0JCQlVTVdpemFyZFRyZWVJdGVtIHVtVHJlZUl0ZW0gPSAoVU1XaXphcmRUcmVlSXRlbSkgdHJlZUl0ZW0uZ2V0RGF0YSgpOw0KLQ0KLQkJCWJvb2xlYW4gYkNoZWNrZWQgPSB0cmVlSXRlbS5nZXRDaGVja2VkKCk7DQotDQotCQkJLy8gQ2hlY2sNCi0JCQkvLy0tLS0tLQ0KLQkJCWlmIChiQ2hlY2tlZCA9PSB0cnVlKSB7DQotCQkJCS8vIFRlbXBvcmFyaWx5IHVuY2hlY2sNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQl0cmVlSXRlbS5zZXRDaGVja2VkKGZhbHNlKTsNCi0NCi0JCQkJaWYgKHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9VUkwpDQotCQkJCQlzZXRDaGVja2VkVVJMKHRyZWVJdGVtKTsNCi0NCi0JCQkJZWxzZSBpZiAodW1UcmVlSXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX1BST0RVQ1QpDQotCQkJCQlzZXRDaGVja2VkUHJvZHVjdCh0cmVlSXRlbSk7DQotDQotCQkJCWVsc2UgaWYgKHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlQpDQotCQkJCQlzZXRDaGVja2VkQ29tcG9uZW50KHRyZWVJdGVtKTsNCi0NCi0JCQkJZWxzZSBpZiAodW1UcmVlSXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX0NPTVBPTkVOVF9FTlRSWSkNCi0JCQkJCXNldENoZWNrZWRDb21wb25lbnRFbnRyeSh0cmVlSXRlbSk7DQotCQkJfQ0KLQ0KLQkJCS8vIFVuY2hlY2sNCi0JCQkvLy0tLS0tLS0tDQotCQkJZWxzZSB7DQotCQkJCXN3aXRjaCAodW1UcmVlSXRlbS5faVR5cGUpIHsNCi0JCQkJCWNhc2UgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX0NPTVBPTkVOVF9FTlRSWSA6DQotCQkJCQkJdW1UcmVlSXRlbS5fZGVzY3JpcHRvckVudHJ5LmlzU2VsZWN0ZWQoZmFsc2UpOw0KLQkJCQkJCWlmICh1bVRyZWVJdGVtLl9kZXNjcmlwdG9yRW50cnkuaXNPcHRpb25hbEZvckluc3RhbGwoKSA9PSBmYWxzZSkNCi0JCQkJCQkJc2V0VHJlZUl0ZW1VbmNoZWNrZWRSZWN1cnNpdmVCYWNrd2FyZCh0cmVlSXRlbSk7DQotCQkJCQkJYnJlYWs7DQotDQotCQkJCQlkZWZhdWx0IDoNCi0JCQkJCQlzZXRUcmVlSXRlbVVuY2hlY2tlZFJlY3Vyc2l2ZUJhY2t3YXJkKHRyZWVJdGVtKTsNCi0JCQkJCQlzZXRUcmVlSXRlbVVuY2hlY2tlZFJlY3Vyc2l2ZUZvcndhcmQodHJlZUl0ZW0pOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIERldGVybWluZSBpZiBwYWdlIGlzIGNvbXBsZXRlDQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQlib29sZWFuIGJQYWdlQ29tcGxldGUgPSBmYWxzZTsNCi0NCi0JCQlUYWJsZVRyZWVJdGVtW10gdHJlZUl0ZW1zID0gX3RhYmxlVHJlZUl0ZW1zLmdldEl0ZW1zKCk7DQotDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlSXRlbXMubGVuZ3RoOyArK2kpIHsNCi0JCQkJaWYgKGlzSW5zdGFsbGFibGVSZWN1cnNpdmUodHJlZUl0ZW1zW2ldKSA9PSB0cnVlKSB7DQotCQkJCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybjsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlSW5zdGFsbGluZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUluc3RhbGxpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViMWJiOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlSW5zdGFsbGluZy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUxhdW5jaEhpc3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VMYXVuY2hIaXN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODk2MTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUxhdW5jaEhpc3RvcnkuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VMYXVuY2hIaXN0b3J5Q29tcGxldGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VMYXVuY2hIaXN0b3J5Q29tcGxldGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhOWQ2MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlTGF1bmNoSGlzdG9yeUNvbXBsZXRlLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlTG9jYXRpb25zLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlTG9jYXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MWJmYmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUxvY2F0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZVVSTENvbXBsZXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlVVJMQ29tcGxldGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyYzg0Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlVVJMQ29tcGxldGUuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VVUkxJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlVVJMSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDU3YTE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VVUkxJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlVVJMSW5zdGFsbGFibGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VVUkxJbnN0YWxsYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTg3YzE5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VVUkxJbnN0YWxsYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZVVSTEluc3RhbGxpbmcuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VVUkxJbnN0YWxsaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDljMzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZVVSTEluc3RhbGxpbmcuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBlcnNpc3RlbnRQcm9wZXJ0aWVzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQZXJzaXN0ZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QxYWY3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBlcnNpc3RlbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQcm9kdWN0Q29tcG9uZW50TmV3LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQcm9kdWN0Q29tcG9uZW50TmV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjNhNDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUHJvZHVjdENvbXBvbmVudE5ldy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUHJvZHVjdENvbXBvbmVudFJldmVydC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUHJvZHVjdENvbXBvbmVudFJldmVydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDhkNTQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFByb2R1Y3RDb21wb25lbnRSZXZlcnQuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFByb2R1Y3RDb21wb25lbnRVUkxJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQcm9kdWN0Q29tcG9uZW50VVJMSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzA4OTQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFByb2R1Y3RDb21wb25lbnRVUkxJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQcm9kdWN0Q29tcG9uZW50VXBkYXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQcm9kdWN0Q29tcG9uZW50VXBkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ODZkNjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUHJvZHVjdENvbXBvbmVudFVwZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkVHJlZUl0ZW0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFRyZWVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZWJmNGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkVHJlZUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFRyZWVJdGVtQ29tcGFyYXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkVHJlZUl0ZW1Db21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YzE5ODEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkVHJlZUl0ZW1Db21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi0vKioNCi0gKiANCi0gKi8NCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotcHVibGljIGNsYXNzIFVNV2l6YXJkVHJlZUl0ZW1Db21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7DQotCS8qKg0KLQkgKiBVcGRhdGVNYW5hZ2VyVHJlZUl0ZW1Db21wYXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuDQotCSAqLw0KLQlwdWJsaWMgVU1XaXphcmRUcmVlSXRlbUNvbXBhcmF0b3IoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotCS8qKg0KLQkgKiBDb21wYXJlcyBpdHMgdHdvIGFyZ3VtZW50cyBmb3Igb3JkZXIuICBSZXR1cm5zIGEgbmVnYXRpdmUgaW50ZWdlciwNCi0JICogemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsDQotCSAqIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC48cD4NCi0JICoNCi0JICogVGhlIGltcGxlbWVudG9yIG11c3QgZW5zdXJlIHRoYXQgPHR0PnNnbihjb21wYXJlKHgsIHkpKSA9PQ0KLQkgKiAtc2duKGNvbXBhcmUoeSwgeCkpPC90dD4gZm9yIGFsbCA8dHQ+eDwvdHQ+IGFuZCA8dHQ+eTwvdHQ+LiAgKFRoaXMNCi0JICogaW1wbGllcyB0aGF0IDx0dD5jb21wYXJlKHgsIHkpPC90dD4gbXVzdCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW5kIG9ubHkNCi0JICogaWYgPHR0PmNvbXBhcmUoeSwgeCk8L3R0PiB0aHJvd3MgYW4gZXhjZXB0aW9uLik8cD4NCi0JICoNCi0JICogVGhlIGltcGxlbWVudG9yIG11c3QgYWxzbyBlbnN1cmUgdGhhdCB0aGUgcmVsYXRpb24gaXMgdHJhbnNpdGl2ZToNCi0JICogPHR0PigoY29tcGFyZSh4LCB5KSZndDswKSAmYW1wOyZhbXA7IChjb21wYXJlKHksIHopJmd0OzApKTwvdHQ+IGltcGxpZXMNCi0JICogPHR0PmNvbXBhcmUoeCwgeikmZ3Q7MDwvdHQ+LjxwPg0KLQkgKg0KLQkgKiBGaW5hbGx5LCB0aGUgaW1wbGVtZW50ZXIgbXVzdCBlbnN1cmUgdGhhdCA8dHQ+Y29tcGFyZSh4LCB5KT09MDwvdHQ+DQotCSAqIGltcGxpZXMgdGhhdCA8dHQ+c2duKGNvbXBhcmUoeCwgeikpPT1zZ24oY29tcGFyZSh5LCB6KSk8L3R0PiBmb3IgYWxsDQotCSAqIDx0dD56PC90dD4uPHA+DQotCSAqDQotCSAqIEl0IGlzIGdlbmVyYWxseSB0aGUgY2FzZSwgYnV0IDxpPm5vdDwvaT4gc3RyaWN0bHkgcmVxdWlyZWQgdGhhdCANCi0JICogPHR0Pihjb21wYXJlKHgsIHkpPT0wKSA9PSAoeC5lcXVhbHMoeSkpPC90dD4uICBHZW5lcmFsbHkgc3BlYWtpbmcsDQotCSAqIGFueSBjb21wYXJhdG9yIHRoYXQgdmlvbGF0ZXMgdGhpcyBjb25kaXRpb24gc2hvdWxkIGNsZWFybHkgaW5kaWNhdGUNCi0JICogdGhpcyBmYWN0LiAgVGhlIHJlY29tbWVuZGVkIGxhbmd1YWdlIGlzICJOb3RlOiB0aGlzIGNvbXBhcmF0b3INCi0JICogaW1wb3NlcyBvcmRlcmluZ3MgdGhhdCBhcmUgaW5jb25zaXN0ZW50IHdpdGggZXF1YWxzLiINCi0JICogDQotCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlDQotCSAqICAgICAgICAgZmlyc3QgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZQ0KLQkgKiAgICAgICAgIHNlY29uZC4gDQotCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudHMnIHR5cGVzIHByZXZlbnQgdGhlbSBmcm9tDQotCSAqICAgICAgICAgYmVpbmcgY29tcGFyZWQgYnkgdGhpcyBDb21wYXJhdG9yLg0KLQkgKi8NCi0JcHVibGljIGludCBjb21wYXJlKGphdmEubGFuZy5PYmplY3QgbzEsIGphdmEubGFuZy5PYmplY3QgbzIpIHsNCi0NCi0JCWlmIChvMSBpbnN0YW5jZW9mIFVNV2l6YXJkVHJlZUl0ZW0gJiYgbzIgaW5zdGFuY2VvZiBVTVdpemFyZFRyZWVJdGVtKSB7DQotCQkJaWYgKCgoVU1XaXphcmRUcmVlSXRlbSkgbzEpLl9zdHJOYW1lICE9IG51bGwgJiYgKChVTVdpemFyZFRyZWVJdGVtKSBvMikuX3N0ck5hbWUgIT0gbnVsbCkgew0KLQkJCQlyZXR1cm4gKChVTVdpemFyZFRyZWVJdGVtKSBvMSkuX3N0ck5hbWUuY29tcGFyZVRvKCgoVU1XaXphcmRUcmVlSXRlbSkgbzIpLl9zdHJOYW1lKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gMDsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRVUkxOYW1lUGFpckNvbXBhcmF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFVSTE5hbWVQYWlyQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWNkMzEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFVSTE5hbWVQYWlyQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VzZXJWYWxpZGF0aW9uRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXNlclZhbGlkYXRpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0NTI4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXNlclZhbGlkYXRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIK